Der beste Weg, um die „Qualität“ der Autokorrelation zu bewerten?

9

Dies ist ein Abstecher von meiner Schnarch-App .

Ich hatte ein Problem damit, eine Autokorrelation des Audiosignals zu erzeugen, um zu sehen, ob dies sehr gut mit Schnarchen / Atmen "korreliert". Ich habe einen einfachen Algorithmus (erzeugt 1.0 als nulltes Element, was ein gutes Vorzeichen ist), aber ich frage mich, wie ich das Ergebnis bewerten soll, um festzustellen, ob die Autokorrelation stark ist, und vielleicht weiter, wie ich es zum Trennen verwenden kann verschiedene mögliche Schallquellen.

Frage 1: Ist der Effektivwert der Autokorrelation (Überspringen des Elements Null) so gut wie jede andere "Qualitäts" -Metrik oder gibt es etwas Besseres?

Um es näher zu erläutern: Ich möchte einfach eine numerische Methode (im Gegensatz zum "Betrachten" eines Diagramms), um ein stark autokorreliertes Signal von einem weniger gut autokorrelierten Signal zu unterscheiden.

(Ich weiß nicht genug, um zu wissen, welche anderen Fragen ich stellen soll.)

Einige frühe Ergebnisse: In einigen Fällen zeigt die Autokorrelation (entweder RMS oder Peak) einen dramatischen Schnarchsprung - genau die Reaktion, die ich gerne sehen würde. In anderen Fällen ist bei diesen Maßnahmen überhaupt keine Bewegung erkennbar (und dies können zwei aufeinanderfolgende Schnarchen mit den beiden Reaktionen sein), und in Situationen mit hohem Rauschen sinken die Messungen während eines Schnarchens tatsächlich (leicht).

Update - 22. Mai: Ich habe endlich Zeit, noch etwas daran zu arbeiten. (Ich wurde von einer anderen App abgezogen, die buchstäblich schmerzhaft ist.) Ich habe die Ausgabe der Autokorrelation in eine FFT eingespeist und die Ausgabe ist etwas interessant - sie zeigt einen ziemlich dramatischen Peak in der Nähe des Ursprungs, wenn ein Schnarchen beginnt.

Jetzt stehe ich also vor dem Problem, diesen Peak irgendwie zu quantisieren. Seltsamerweise treten die höchsten Peaks, gemessen an der absoluten Größe, zu anderen Zeiten auf, aber ich habe das Verhältnis von Peak zu arithmetischem Mittel ausprobiert und das lässt sich ziemlich gut verfolgen. Was sind also einige gute Möglichkeiten, um die "Peakedness" der FFT zu messen? (Und bitte sag nicht, dass ich eine FFT davon nehmen muss - dieses Ding ist schon kurz davor, seinen eigenen Schwanz zu schlucken. :))

Außerdem kam mir der Gedanke, dass die Qualität der FFT etwas verbessert werden könnte, wenn ich die eingespeisten Autokorrelationsergebnisse mit Null (was per Definition 1,0 ist) in der Mitte spiegelreflektiere. Dies würde die "Schwänze" an beiden Enden setzen. Ist das (möglicherweise) eine gute Idee? Sollte das Spiegelbild aufrecht oder invertiert sein? (Natürlich werde ich es versuchen, unabhängig davon, was Sie sagen, aber ich dachte, ich könnte vielleicht ein paar Hinweise zu den Details bekommen.)

Versuchte Flachheit--

Meine Testfälle lassen sich grob in die Kategorien "gut erzogen" und "Problemkinder" einteilen.

Für die "gut erzogenen" Testfälle sinkt die Ebenheit der FFT der Autokorrelation dramatisch und das Verhältnis von Peak zu durchschnittlicher Autokorrelation steigt während eines Schnarchens an. Das Verhältnis dieser beiden Zahlen (Spitzenverhältnis geteilt durch Ebenheit) ist besonders empfindlich und zeigt einen 5-10-fachen Anstieg während eines Atems / Schnarchens.

Für die "Problemkinder" gehen die Zahlen jedoch genau in die entgegengesetzte Richtung. Das Peak / Average-Verhältnis sinkt leicht, während die Ebenheit tatsächlich um 50-100% zunimmt

Der Unterschied zwischen diesen beiden Kategorien ist (meistens) dreifach:

  1. Die Geräuschpegel sind (normalerweise) bei den "Problemkindern" höher.
  2. Die Audiopegel sind bei den "Problemkindern" (so gut wie immer) niedriger.
  3. Die "Problemkinder" bestehen in der Regel aus mehr Atmung und weniger tatsächlichem Schnarchen (und ich muss beides erkennen).

Irgendwelche Ideen?

Update - 25.05.2012: Es ist etwas verfrüht, einen Siegestanz zu haben, aber als ich die Autokorrelation über einen Punkt reflektierte, die FFT davon nahm und dann die spektrale Ebenheit durchführte, zeigte mein kombiniertes Verhältnisschema einen guten Sprung verschiedene Umgebungen. Das Reflektieren der Autokorrelation scheint die Qualität der FFT zu verbessern.

Ein kleiner Punkt ist jedoch, dass, da die "DC-Komponente" des reflektierten "Signals" Null ist, das nullte FFT-Ergebnis immer Null ist und dies irgendwie ein geometrisches Mittel bricht, das Null enthält. Das Überspringen des nullten Elements scheint jedoch zu funktionieren.

Das Ergebnis, das ich erhalte, ist bei weitem nicht ausreichend, um Schnarchen / Atemzüge selbst zu identifizieren, aber es scheint eine ziemlich sensible "Bestätigung" zu sein - wenn ich den "Sprung" nicht bekomme, ist es wahrscheinlich kein Schnarchen / Atemzug.

Ich habe es nicht genau analysiert, aber ich vermute, dass irgendwo während des Atems / Schnarchens ein Pfeifgeräusch auftritt und dass Pfeifen erkannt wird.

Daniel R Hicks
quelle
Was das Korrelationsmaß „Stärke“ betrifft, müssen Sie Ihre beiden korrelierten Signale normalisieren, bevor Sie eine Korrelation durchführen. (Nach der Normalisierung sollte die Summe jedes Signals 1 sein.) Dann liegt der Korrelationspeak immer zwischen -1 und 1. Dies ist Ihre Stärke. Ich bin mir über den Rest Ihrer Frage nicht sicher, vielleicht können Sie ein wenig bearbeiten.
Spacey
Ich habe es mit Autokorrelation zu tun, daher sind die beiden Signale ein und dasselbe und per Definition relativ zueinander "normalisiert". Mit "Stärke" meine ich, wie viel Autokorrelation es gibt.
Daniel R Hicks
Ich verstehe nicht, was Sie wollen, aber ich würde denken, Sie möchten den Maximalwert des Autokorrelationspeaks messen, nicht den Effektivwert des Ganzen.
Endolith
@endolith Ich denke, er fragt nach einem Maß für die "Peakiness" Ihrer Autokorrelationsfunktion, um ein Signal mit einem Delta (Autokorrelation des Rauschens) von einem Signal mit vielen Peaks zu unterscheiden. (Autokorrelation des Signals mit den Harmonischen). Vielleicht kann hier auch das Maß für die spektrale Ebenheit verwendet werden ...
Spacey
Es klingt so, als ob spektrale Flachheit das ist, was er will. Daniel: Möchten Sie feststellen, wie unterschiedlich das Signal vom weißen Rauschen ist?
Emre

Antworten:

3

Vorbereitungen

Diese Demonstration ist mit dem MATLAB-Paket audioread einfacher, mit dem MP3-Dateien gelesen / geschrieben werden können. Alternativ können Sie die MP3-Datei im Beispiel manuell in WAV konvertieren.

Einfacher Fall

Bevor wir Ihre problematische Datei untersuchen, gehen wir zu SoundCloud und schnarchen ordentlich, damit wir wissen, was uns erwartet, wenn das SNR hoch ist. Dies ist ein 52s Stereo 44,1KHz MP3. Laden Sie es in einen Ordner im Pfad von MATLAB herunter .

Berechnen wir nun das Spektrogramm (ich habe ein Hann-Fenster mit 8192 Stichproben gewählt) und die spektrale Ebenheit:

[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

Spektrale Flachheit von Brobars Schnarchen

Die großen Einbrüche in der spektralen Flachheit (dh Abweichung vom weißen Rauschen) schreien "Ich schnarche". Wir können es leicht klassifizieren, indem wir die Abweichung von der Grundlinie (Median) betrachten:

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

Die klassifizierte spektrale Flachheit von Brobars Schnarchen

Wir hatten mehr als zwei Standardabweichungen der Kopffreiheit. Die Standardvariante selbst ist als Referenz 6.8487 .

Schwerer Fall

Schauen wir uns nun Ihre Datei an . Es ist eine 10-minütige 8-kHz-WAV-Datei. Da der Pegel so niedrig ist, hilft es, das Signal zu kompandieren .

[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);

Spektrale Ebenheit der verrauschten Datei

Sehen Sie diese schönen Dips, die jedes Schnarchen begleiten? Ich auch nicht. Wie wäre es mit den schönen Gipfeln? Sie schnarchen nicht, aber das Geräusch des sich bewegenden Motivs. Die Standardabweichung beträgt nur 0,9388

Fazit

Sie müssen ein saubereres Signal erhalten, wenn Sie sich auf die spektrale Ebenheit verlassen möchten! Ich hatte es nur um etwas zu hören. Wenn ein niedriges SNR festgestellt wird, fordern Sie den Benutzer auf, das Telefon näher zu platzieren, oder verwenden Sie ein Mikrofon wie das mit dem Headset gelieferte Telefon.

Die gute Nachricht ist , dass es ist möglich , selbst in dem problematischen Fall Schnarchen zu erkennen. Da es bei dieser Frage jedoch nicht nur um die Schnarcherkennung ging, werde ich hier aufhören und in Ihrer anderen Frage erklären, wie das geht .

Emre
quelle
Jetzt hast du ein Gefühl dafür, womit ich es zu tun habe. Diese Probe war von "mittlerer" Qualität unter den Proben, mit denen ich arbeiten muss - es gibt viel schlechtere. Und ich kann dieses Beispiel mit meinen vorhandenen Algorithmen ziemlich gut lesen.
Daniel R Hicks
Welche Algorithmen sind das?
Emre
Kurz gesagt: Der Ton wird 8 Mal pro Sekunde durch die FFT geleitet, das Spektrum wird in 5 Frequenzbänder unterteilt, die Leistung und die spektrale Differenz für jedes Band werden berechnet, und die Ergebnisse werden so bewertet, dass die auftretenden Bänder stärker gewichtet werden mit der richtigen Geschwindigkeit variieren.
Daniel R Hicks
@Emre Ich folge Ihren Links, habe ein Soundcloud-Konto erstellt, kann aber nicht sehen, wie genau Sie dieses Schnarchen heruntergeladen haben. Es gibt keinen Download-Button daneben oder irgendwo anders.
Spacey
@Mohammad: Ich habe einen Download-Link bereitgestellt.
Emre
1

Die Autokorrelation steht in direktem Zusammenhang mit der inversen DFT der spektralen Leistungsdichte Ihres Signals. In diesem Sinne sind alle Informationen, die im Größenquadrat Ihrer DFT enthalten sind, auch in der Autokorrelationsfunktion enthalten.

Das einzige, was die Autokorrelation Ihnen sagen kann, ist das Vorhandensein von Harmonischen. (Der Abstand vom Mittelgipfel zum nächsthöheren). Vielleicht hat das Schnarchen gegen die Atmung unterschiedliche grundlegende Harmonische, und wenn ja, wäre die "Autokorrelationsmethode" sicherlich ein guter Ausgangspunkt, damit Merkmale (in diesem Fall Harmonische) extrahiert werden können.

Somit ist die Autokorrelation von weißem Rauschen eine Delta-Funktion und weist keine sekundären Peaks (oder andere Peaks für diese Angelegenheit) außerhalb ihres mittleren Peaks auf. Wenn das Signal dagegen Oberschwingungen aufweist, enthält seine Autokorrelationsfunktion sekundäre und tertiäre Spitzen, die der vorhandenen Grundschwingung entsprechen. Der Abstand vom Hauptpeak (Mittelpeak) zum Sekundärpeak ist die Periode Ihrer Grundfrequenz.

BEARBEITEN:

Ich denke, was Sie suchen, ist ein Maß - eine Zahl -, das kodiert, wie ähnlich eine Autokorrelationsfunktion einem Delta ist, im Vergleich zu einer Autokorrelationsfunktion, die so aussieht, als hätte sie viele Peaks. Zu diesem Zweck kann das Maß für die spektrale Ebenheit anwendbar sein, oder in einem allgemeineren Fall die Messung Ihres geometrischen Mittelwerts zum arithmetischen Mittelwert.

Spacey
quelle
Ich hatte den Eindruck, dass Autokorrelation (rhythmisches) Signal besser von (zufälligem) Rauschen unterscheiden würde - Rauschen würde nahe Null autokorrelieren. Eine DFT, OTOH, repräsentiert Rauschen als Rauschen - ein Spreizspektrum. Zumindest ist dies die "Theorie", wie ich sie verstehe.
Daniel R Hicks
Bitte beachten Sie meine Änderungen.
Spacey