Как вы можете определить, есть ли сигнал (когда ваш сигнал очень похож на шум)?

11

Это снова мой детектор храпа.

Я довольно хорошо обнаружил сигнал, когда там что-то есть - может отслеживать от храпа стены до дыхания, которое вы даже не можете услышать в записи. Проблема в том, что я не могу сказать, когда сигнал упал ниже обнаруживаемого уровня, а приложение просто «слышит». И, к сожалению, храп / дыхание часто бывает нерегулярным, поэтому простая автокорреляционная или подобная временная схема интервалов вряд ли сильно поможет. (И вполне вероятно, что в некоторых случаях шум более равномерный, чем дыхание.)

Итак, есть ли какие-то хитрости, которые мне не хватает для выяснения, когда нет сигнала? Кажется, что я нахожусь здесь в трудном положении, учитывая, что «сигнал» с самого начала такой шумный.

(И, возможно, это связано с другой проблемой, с которой я столкнулся: странно, я не могу точно (или даже приблизительно) измерить уровень сигнала, даже если он достаточно громкий. Так как мне все равно нужно использовать скользящие средние и отношения для обнаружения сигнала, информация об уровне теряется. Я ищу некоторые приемы, чтобы восстановить ее.)

Основная техника

(Для йоды)

Аудиосигнал дискретизируется (как правило, на 8000 Гц по разным причинам), а затем FFT-форматируется в 1024 блоках. (В моих экспериментах фильтры Хемминга и перекрывающиеся блоки, похоже, оказали небольшое влияние, хотя они могут быть пересмотрены позже.)

БПФ делится на «полосы» (в настоящее время 5, слегка искаженные по размеру, чтобы разместить больше деталей на нижнем уровне), и «спектральная разность» и уровень каждой полосы суммируются. Долгосрочные средние значения ограниченных пиков используются в качестве «пороговых значений», а дальнейшие корректировки смещения используются для поддержания «порогового» уровня примерно на 20%.

Каждому значению «за порог» присваивается вес 1 (под порогом присваивается вес 0), но затем этот вес корректируется с помощью кажущейся «изменчивости» (примерно на 2 Гц) в полосе, чтобы придать полосам больший вес которые несут более очевидный сигнал.

Веса полос суммируются, а затем суммированные веса последующих блоков суммируются в течение примерно секунды, чтобы получить текущий «счет». Это снова сравнивается со скользящим средним порогом (плюс несколько эвристик) для обнаружения начала / смещения храпа.

Обновить

Мне вдруг пришло в голову, что, если мой алгоритм эффективно поддерживает сигнал постоянного уровня (в соответствии с моей проблемой уровня сигнала), способ эффективно измерить SNR - это измерение шума, когда сигнала нет.

Удобно, что храп прерывист, с большим количеством "мертвого воздуха" между ними. И я уже обнаруживаю конверты храпа. Поэтому все, что находится за пределами конверта (между концом одного храпа и началом следующего), по-видимому, является шумом! Это я могу (с некоторой скромной степенью точности / повторяемости) измерить. (Конечно, потребовалось три попытки, чтобы придумать наполовину приличный алгоритм - реальность никогда не соответствует теории.)

У меня пока нет полного ответа, но я добился прогресса.

(Хотя описанная выше методика дает мне довольно хороший прокси-сервер для SNR, у меня все еще возникают проблемы с оценкой фактического уровня сигнала. Мои индикаторы «относительного уровня» могут быть за пределами шкалы для едва слышимого дыхания и, тем более, для шумового окна. Мне нужен какой-то прокси для абсолютного уровня.)

Даниэль Р Хикс
источник
«Это снова мой детектор храпа» - не могли бы вы дать ссылку на свой предыдущий вопрос (где вы, вероятно, подробно его описали) или добавить некоторые подробности о вашем детекторе в этом вопросе?
Lorem Ipsum

Ответы:

5

До сих пор вы, кажется, идентифицировали храп по наличию сильной периодической картины в аудио. Если вы скажете мне, что могут быть другие источники с таким же свойством, пришло время перейти и сосредоточиться на свойстве сигнала, более специфического для храпа; и я бы посоветовал более точно изучить тембр самого записанного звука. Учитывая, что слушатель может различить храп и дыхание, вы можете прибегнуть к традиционному подходу к классификации аудиосигналов. Вычисляйте такие функции, как MFCC и шаблоны колебаний на ваших аудиоданных, и обучайте байесовский классификатор (или более сложный), чтобы отличить храп от дыхания.

Возможно, пришло время ознакомиться с литературой по этой теме ... Например, я нашел это: http://web.itu.edu.tr/kamasak/pubs/pdf/pm7_8_007.pdf

pichenettes
источник
Одна из проблем заключается в том, что характер звука очень сильно варьируется от человека к человеку и даже для одного человека в течение ночи. Но спасибо за подсказки - я посмотрю на них.
Даниэль Р Хикс
Если ваш тренировочный набор достаточно велик, это все еще возможно при использовании методов машинного обучения.
pichenettes
У меня более 50 наборов данных. К сожалению, алгоритм, который отлично работает на одном наборе, с треском проваливается на следующем. У некоторых телевизор работает в фоновом режиме, у некоторых - грохочущие устройства управления воздухом и т. Д. Дыхание / храп едва слышны или шелушатся от краски. Субъект может изменить положение и полностью изменить характер своего храпа. Необходима какая-то схема самонастройки.
Даниэль Р Хикс
какие функции вы используете для классификации?
pichenettes
Прежде всего просто «спектральная разница» (также называемая «спектральный поток») для обнаружения «начала» и «смещения». Но моя текущая схема делит спектр на полосы и «взвешивает» каждую полосу на основе кажущейся силы сигнала в этой полосе (что определяется величиной вариации спектральной разности, возникающей при частоте около 1/2 Гц). Это хорошо работает, чтобы обнаружить дыхание / храп во всем диапазоне громкости, даже при значительном шуме, но оно фактически теряет все показания фактического объема. А простой просмотр общего уровня звука не работает из-за проблемы с шумом.
Даниэль Р Хикс
0

Возможно, вам потребуется создать динамический классификатор, который может адаптироваться к текущему предмету, фазе сна и звуковой среде, а не настраиваться на фиксированный тренировочный набор.

hotpaw2
источник
Вот о чем я думаю.
Даниэль Р Хикс