To znowu mój detektor chrapania.
Jestem całkiem dobry w wykrywaniu sygnału, gdy coś tam jest - może śledzić od chrapania po ścianach po oddychanie, którego nawet nie słyszysz na nagraniu. Problem polega na tym, że nie wiem, kiedy sygnał spadnie poniżej wykrywalnego poziomu, a aplikacja po prostu „słyszy rzeczy”. I niestety chrapanie / oddychanie jest często na tyle nieregularne, że prosta autokorelacja lub podobny schemat pomiaru interwałów raczej nie pomoże. (I w rzeczywistości jest prawdopodobne, że w niektórych przypadkach hałas jest bardziej regularny niż oddychanie).
Czy są jakieś sztuczki, których mi brakuje, aby dowiedzieć się, kiedy nie ma sygnału? Wygląda na to, że stoję tu przed trudnym miejscem, biorąc pod uwagę, że „sygnał” jest na początku bardzo podobny do szumu.
(I może jest to związane z innym problemem, który mam: o dziwo, nie jestem w stanie dokładnie (lub nawet w przybliżeniu) zmierzyć poziomu sygnału, nawet gdy jest dość głośny. Ponieważ muszę mimo to użyć średnich kroczących i współczynników do wykrycia sygnału, informacje o poziomie gubią się. Szukam kilku sztuczek, aby je odtworzyć.)
Podstawowa technika
(Dla Yoda)
Sygnał audio jest próbkowany (ogólnie z 8000 Hz, z różnych powodów), a następnie poddawany FFT w 1024 blokach. (W moich eksperymentach filtry Hamminga i nakładające się na siebie bloki wydają się mieć niewielki wpływ, choć można je później ponownie odwiedzić.)
FFT jest podzielony na „prążki” (obecnie 5, nieco skośny, aby umieścić więcej szczegółów na dolnym końcu), a „różnica widmowa” i poziom każdego pasma jest sumowany. Długoterminowe średnie wartości ograniczonych wartości szczytowych są stosowane jako „progi”, a dalsze korekty odchylenia są stosowane w celu utrzymania około 20% wskaźnika „powyżej progu”.
Każdej wartości „powyżej progu” przypisuje się wagę 1 (poniżej progu podaje się wagę 0), ale następnie tę wagę koryguje się na podstawie widocznej „zmienności” (w przybliżeniu 2 Hz) w paśmie, aby nadać większą wagę pasmom które niosą bardziej widoczny sygnał.
Wagi pasm są sumowane, a następnie sumowane wagi kolejnych bloków są sumowane przez około sekundę, aby uzyskać bieżący „wynik”. Jest to ponownie porównywane z progiem średniej bieżącej (plus kilka heurystyk) w celu wykrycia wystąpienia / przesunięcia chrapania.
Aktualizacja
Nagle przyszło mi do głowy, że jeśli mój algorytm skutecznie utrzymuje sygnał o stałym poziomie (według mojego problemu z poziomem sygnału), sposobem na skuteczne zmierzenie SNR jest pomiar szumu, gdy nie ma sygnału.
Dogodnie chrapania są przerywane, a pomiędzy nimi jest mnóstwo „martwego powietrza”. I już wykrywam koperty z chrapaniem. Więc wszystko poza kopertą (między końcem jednego chrapania a początkiem następnego) jest prawdopodobnie hałasem! To mogę (z niewielkim stopniem dokładności / powtarzalności) zmierzyć. (Oczywiście trzeba było trzykrotnie wymyślić przyzwoity algorytm - rzeczywistość nigdy nie pasuje do teorii).
Nie mam jeszcze pełnej odpowiedzi, ale zrobiłem postęp.
(Chociaż powyższa technika daje mi dość dobre przybliżenie dla SNR, wciąż mam problemy z oszacowaniem rzeczywistego poziomu sygnału. Moje wskazania „względnego poziomu” mogą być poza skalą dla ledwie słyszalnego oddechu i tak dalej dla grzechotki okiennej. Potrzebuję jakiegoś proxy dla poziomu absolutnego).