Najlepszy sposób oceny „jakości” autokorelacji?

9

To poboczna podróż z mojej aplikacji do chrapania .

Miałem problem z wytworzeniem autokorelacji sygnału audio, aby zobaczyć, czy to „koreluje” z chrapaniem / oddychaniem bardzo dobrze. Mam prosty algorytm (daje 1,0 jako element zerowy, co jest dobrym znakiem), ale zastanawiam się, jak ocenić wynik, aby ustalić, czy autokorelacja jest silna, a być może dalej, jak użyć go do oddzielenia różne możliwe źródła dźwięku.

Pytanie nr 1: Czy RMS autokorelacji (pomijanie elementu zero) jest równie dobrą miarą „jakości”, czy jest coś lepszego?

Aby rozwinąć: Chcę po prostu w sposób numeryczny (w przeciwieństwie do „patrzenia” na wykres), aby odróżnić sygnał silnie skorelowany od gorzej skorelowanego.

(Naprawdę nie wiem wystarczająco dużo, aby wiedzieć, jakie inne pytania zadać).

Niektóre wczesne wyniki: w niektórych przypadkach autokorelacja (RMS lub szczyt) pokazuje dramatyczny skok na chrapanie - dokładnie taką odpowiedź, którą chciałbym zobaczyć. W innych przypadkach nie ma widocznego ruchu w tych środkach (i mogą to być dwa kolejne chrapania z dwiema odpowiedziami), aw sytuacjach o wysokim poziomie hałasu pomiary faktycznie spadają (nieznacznie) podczas chrapania.

Aktualizacja - 22 maja: Nareszcie mam trochę czasu, żeby nad tym popracować. (Zostałem wciągnięty w inną aplikację, która jest dosłownie bólem). Podałem wynik autokorelacji do FFT, a wynik jest dość interesujący - pokazuje dość dramatyczny szczyt w pobliżu źródła, gdy zaczyna się chrapanie.

Więc teraz mam problem z kwantyfikacją tego szczytu. Co dziwne, najwyższe szczyty, pod względem wielkości bezwzględnej, występują w innych momentach, ale próbowałem stosunku szczytu do średniej arytmetycznej i to całkiem nieźle. Jakie są więc dobre sposoby pomiaru „szczytowości” FFT. (I proszę nie mów, że muszę wziąć FFT z tego - ta rzecz jest już blisko połknięcia własnego ogona. :))

Przyszło mi również do głowy, że jakość FFT mogłaby się nieco poprawić, jeśli odbijam lustrzanie wprowadzane wyniki autokorelacji, z zerowym (co z definicji 1,0 wielkości) pośrodku. To położyłoby „ogony” na obu końcach. Czy to (prawdopodobnie) dobry pomysł? Czy odbicie lustrzane powinno być pionowe czy odwrócone? (Oczywiście, spróbuję tego bez względu na to, co powiesz, ale pomyślałem, że może uda mi się uzyskać wskazówki na temat szczegółów.)

Wypróbowana płaskość

Moje przypadki testowe można z grubsza podzielić na kategorię „dobrze wychowanych” i „problematycznych dzieci”.

W przypadku „dobrze wychowanych” przypadków testowych płaskość FFT autokorelacji gwałtownie spada, a stosunek szczytowej do średniej autokorelacji wzrasta podczas chrapania. Stosunek tych dwóch liczb (stosunek pików podzielony przez płaskość) jest szczególnie czuły, wykazując 5-10-krotny wzrost podczas oddechu / chrapania.

Jednak w przypadku „problematycznych dzieci” liczby zmierzają dokładnie w przeciwnym kierunku. Stosunek szczyt / średnia nieznacznie spada, podczas gdy płaskość faktycznie wzrasta o 50-100%

Różnica między tymi dwiema kategoriami jest (głównie) trzykrotna:

  1. Poziomy hałasu są (zwykle) wyższe u „dzieci z problemami”
  2. Poziomy dźwięku są (prawie zawsze) niższe w „problematycznych dzieciach”
  3. „Dzieci z problemami” zwykle składają się z większego oddychania i mniej faktycznego chrapania (i muszę je wykryć)

Jakieś pomysły?

Aktualizacja - 25.05.2012: Trochę przedwcześnie jest mieć taniec zwycięstwa, ale kiedy zastanawiałem się nad autokorelacją o punkcie, wziąłem FFT, a następnie wykonałem płaskość spektralną, mój kombinowany schemat proporcji pokazał dobry skok w kilka różnych środowisk. Odzwierciedlenie autokorelacji wydaje się poprawiać jakość FFT.

Jednym drobnym punktem jest to, że ponieważ „składowa prądu stałego” odbijanego „sygnału” wynosi zero, zerowy wynik FFT jest zawsze równy zero, a ten rodzaj łamie średnią geometryczną obejmującą zero. Ale pomijanie elementu zerowego wydaje się działać.

Rezultat, który otrzymuję, jest daleki od wystarczającego do samodzielnego rozpoznania chrapania / oddechów, ale wydaje się, że jest to dość wrażliwe „potwierdzenie” - jeśli nie dostanę „skoku”, prawdopodobnie nie jest to chrapanie / oddech.

Nie analizowałem go dokładnie, ale podejrzewam, że dzieje się tak, że podczas oddechu / chrapania dochodzi gdzieś dźwięk gwizdka, a ten gwizd jest wykrywany.

Daniel R. Hicks
źródło
Jeśli chodzi o miarę „siły” korelacji, to przed wykonaniem korelacji należy znormalizować korelację dwóch sygnałów. (Po normalizacji suma każdego sygnału powinna wynosić 1). Wtedy szczyt korelacji zawsze będzie istniał między -1 a 1. To jest twoja siła. Nie jestem pewien co do reszty twojego pytania, być może możesz trochę edytować.
Spacey
Mam do czynienia z autokorelacją, więc dwa sygnały są takie same i z definicji są „znormalizowane” względem siebie. Przez „siłę” rozumiem, ile jest autokorelacji.
Daniel R Hicks
Nie rozumiem, czego chcesz, ale sądzę, że chcesz zmierzyć maksymalną wartość piku autokorelacji, a nie wartość RMS całości.
endolith
@endolith Myślę , że może on pytać o miarę szczytowości twojej funkcji autokorelacji, aby odróżnić sygnał z jedną deltą (autokorelacja szumu) od sygnału wielu szczytów? (autokorelacja sygnału z harmonicznymi). Być może można tu również zastosować miarę płaskości widmowej ...
Spacey
Brzmi jak spektralna płaskość jest tym, czego chce. Daniel: Czy chcesz ustalić, jak różni się sygnał od białego szumu?
Emre,

Odpowiedzi:

3

Czynności wstępne

Demonstracja jest łatwiejsza dzięki pakietowi audioread MATLAB , który umożliwia odczyt / zapis plików MP3. Alternatywnie możesz ręcznie przekonwertować plik MP3 w tym pliku na WAV.

Łatwa skrzynka

Zanim przeanalizujemy problematyczny plik, przejdźmy do SoundCloud i weźmy porządne chrapanie , abyśmy wiedzieli, czego się spodziewać, gdy SNR będzie wysoki. To jest MP3 52s stereo 44,1 KHz MP3. Pobierz go do folderu na ścieżce MATLAB.

Teraz obliczmy spektrogram (wybrałem okno Hann z próbką 8192) i płaskość spektralną:

[snd1,fs1]=mp3read('snoring - brobar.mp3'); % use wavread if you converted manually
[s1,f,t,p1]=spectrogram(mean(snd1,2),hann(8192));
sf1=10*log10(geomean(p1)./mean(p1)); % spectral flatness
plot(linspace(0,length(snd1)/fs1,length(sf1)),sf1); axis tight

Widmowa płaskość chrapania brobara

Ogromne spadki płaskości spektralnej (tj. Odchylenie od białego szumu) krzyczą „Chrapię”. Możemy go łatwo sklasyfikować, patrząc na odchylenie od linii podstawowej (mediana):

stem(linspace(0,length(snd1)/fs1,length(sf1)),median(sf1)-sf1>2*std(sf1)); axis tight

Sklasyfikowana płaskość widmowa chrapania Brobara

Mieliśmy więcej niż dwa standardowe odchylenia nadproża. Dla porównania sama standardowa odmiana wynosi 6,8487 .

Ciężki przypadek

Teraz spójrzmy na twój plik . Jest to 10-minutowy plik WAV 8KHz. Ponieważ poziom jest tak niski, pomaga w kompandowaniu sygnału.

[snd,fs]=wavread('recordedFile20120408010300_first_ten_minutes');
cmp=compand(snd,255,1);
wavwrite(cmp,'companded'); % used for listening purposes
[s,f,t,p]=spectrogram(snd,hann(8192));
sf=10*log10(geomean(p)./mean(p));
plot(linspace(0,600,length(sf)),sf);

Widmowa płaskość hałaśliwego pliku

Widzisz te fajne spadki towarzyszące każdemu chrapaniu? Ja też nie. A co z ładnymi szczytami? Nie chrapią, ale dźwięk poruszającego się obiektu. Odchylenie standardowe to marne 0,9388

Wniosek

Musisz uzyskać czystszy sygnał, jeśli chcesz polegać na płaskości spektralnej! Musiałem to po prostu usłyszeć. W przypadku wykrycia niskiego SNR, nakłoń użytkownika do umieszczenia telefonu bliżej lub skorzystania z mikrofonu takiego jak telefon dostarczany z zestawem słuchawkowym.

Dobrą wiadomością jest to, że jest to możliwe do wykrycia chrapania nawet w przypadku problematycznej. Ponieważ jednak to pytanie nie dotyczyło wyłącznie wykrywania chrapania, zatrzymam się tutaj i wyjaśnię, jak to zrobić w drugim pytaniu .

Emre
źródło
Teraz rozumiesz, co mam przeciwko. Ta próbka była „średniej” jakości wśród próbek, z którymi muszę pracować - jest znacznie gorzej. I mogę całkiem dobrze odczytać tę próbkę za pomocą moich istniejących algorytmów.
Daniel R Hicks
Jakie to są algorytmy?
Emre
W skrócie: Dźwięk jest przepuszczany przez FFT 8 razy na sekundę, widmo jest dzielone na 5 pasm częstotliwości, obliczana jest moc i różnica widmowa dla każdego pasma, a następnie wyniki są oceniane w sposób, który nadaje większą wagę pasmom, które się pojawiają zmieniać się we właściwym tempie.
Daniel R Hicks
@ Emre Śledzę twoje linki, założyłem konto SoundCloud, ale nie widzę, jak dokładnie pobrałeś tego chrapania. Nie ma przycisku pobierania obok niego ani nigdzie indziej.
Spacey,
@Mohammad: Podałem link do pobrania.
Emre,
1

Autokorelacja jest bezpośrednio związana z odwrotnym DFT gęstości widmowej mocy twojego sygnału. W tym sensie, każda informacja zawarta w kwadracie wielkości twojego DFT jest również zawarta w funkcji autokorelacji.

To powiedziawszy jednak, jedyną rzeczą, którą autokorelacja może powiedzieć, jest obecność harmonicznych. (Odległość od środkowego szczytu do następnego najwyższego). Być może chrapanie podczas oddychania VS ma różne podstawowe harmoniczne, a jeśli tak, to „metoda autokorelacji” byłaby z pewnością dobrym punktem wyjścia do wydobycia cech (w tym przypadku harmonicznych).

Zatem autokorelacja białego szumu będzie funkcją delta i nie będzie miała żadnych pików wtórnych (ani żadnych innych pików o tej materii) poza swoim pikiem środkowym. W przeciwieństwie do tego, jeśli sygnał ma harmoniczne, wówczas jego funkcja autokorelacji będzie zawierać drugorzędowe i trzeciorzędowe piki, proporcjonalne do występującej podstawowej harmonicznej. Odległość od głównego (środkowego) szczytu do drugiego szczytu okres podstawowej częstotliwości.

EDYTOWAĆ:

Myślę, że to, czego szukasz, to miara - liczba - kodująca, jak podobna jest funkcja autokorelacji do delty, a VS funkcja autokorelacji wyglądająca, jakby zawierała wiele pików. W tym celu można zastosować miarę płaskości widmowej lub, w bardziej ogólnym przypadku, pomiar średniej geometrycznej do średniej arytmetycznej.

Spacey
źródło
Miałem wrażenie, że autokorelacja lepiej odróżniałaby (rytmiczny) sygnał od (losowego) szumu - szum byłby autokorelowany blisko zera. DFT, OTOH, będzie reprezentować hałas jako hałas - widmo rozproszone. Przynajmniej taka jest teoria, jaką rozumiem.
Daniel R Hicks
Proszę zobaczyć moje zmiany.
Spacey