Це знову мій детектор хропіння.
Я дуже добре розпізнав сигнал, коли там щось є - можна відстежувати від хропування стіни вниз до дихання, якого ви навіть не чуєте під час запису. Проблема в тому, що я не можу сказати, коли сигнал опустився нижче рівня детектування, і додаток просто "чує речі". І, на жаль, хропіння / дихання часто досить нерегулярне, що проста автокореляція або подібна схема інтервалу часу навряд чи багато допоможе. (І насправді ймовірно, що в деяких випадках шум є більш регулярним, ніж дихання.)
Отже, чи є якісь хитрощі, які мені не вистачає для з'ясування, коли немає сигналу? Здається, я тут проти важкого місця, враховуючи, що "сигнал" починає так шумно.
(І, можливо, це пов’язано з іншою проблемою, яка виникає у мене. Дивно, я не можу точно (або навіть приблизно) виміряти рівень сигналу, навіть коли досить гучний. Оскільки мені потрібно використовувати ковзаючі середні значення і коефіцієнти, щоб виявити сигнал у будь-якому випадку, інформація про рівень втрачається. Я шукаю кілька хитрощів для її відновлення.)
Основна техніка
(Для Йоди)
Звуковий сигнал дискретизується (як правило, з різних причин 8000 Гц), а потім FFTed у 1024 блоках. (У моїх експериментах фільтри Хеммінга та блоки, що перекриваються, здаються, мають незначний ефект, хоча вони можуть бути переглянуті пізніше.)
FFT ділиться на "смуги" (в даний час 5, трохи перекошені за розміром, щоб розмістити більше деталей на нижньому кінці) і "спектральна різниця" та рівень кожної смуги підсумовуються. Довгострокові середні значення пікових обмежених значень використовуються як "пороги", а подальше коригування зміщення використовується для підтримки приблизно 20% "перевищення граничного значення".
Кожному значенню "понад поріг" надається вага 1 (під пороговим значенням задається вага 0), але потім ця вага коригується за очевидною "мінливістю" (приблизно в 2 Гц) в діапазоні, щоб надати більше ваги смугам які несуть більш очевидний сигнал.
Ваги смуг підсумовуються, а потім підсумовуються ваги наступних блоків підсумовуються протягом приблизно секунди для отримання бігової "оцінки". Це знову порівнюється з середньою межею потоку (плюс кілька евристик) для виявлення виникнення / зсуву хропіння.
Оновлення
Мені раптом прийшло в голову, що якщо мій алгоритм ефективно підтримує сигнал постійного рівня (за моєю проблемою рівня сигналу), спосіб ефективного вимірювання SNR - це вимірювання шуму, коли сигналу немає.
Зручно, що хропіння є переривчастими, між ними багато "мертвого повітря". І я вже виявляю конверти хропіння. Тому все, що знаходиться поза конвертом (між кінцем одного хропіння і початком наступного), імовірно, є шумом! Це я можу (з деяким скромним ступенем точності / повторюваності) виміряти. (Треба було три спроби придумати на півдорозі гідний алгоритм, звичайно - реальність ніколи не відповідає теорії.)
Тож у мене ще немає повної відповіді, але я просунувся.
(Хоча вищезазначена методика дає мені досить хороший проксі для SNR, у мене все ще виникають проблеми з оцінкою фактичного рівня сигналу. Мої "відносні рівні" показники можуть бути поза шкалою для ледь чутного вдиху і так для віконного брязкальця. Мені потрібен якийсь проксі для абсолютного рівня.)