Dies ist wieder mein Schnarchdetektor.
Ich bin ziemlich gut darin geworden, ein Signal zu erkennen, wenn etwas da ist - kann von einem Schnarchen an der Wand bis zum Atmen, das Sie in der Aufnahme nicht einmal hören können, nachverfolgen. Das Problem ist, ich kann nicht sagen, wann das Signal unter den erkennbaren Pegel gefallen ist und die App nur "Dinge hört". Und leider ist Schnarchen / Atmen oft so unregelmäßig, dass eine einfache Autokorrelation oder ein ähnliches Intervall-Timing-Schema wahrscheinlich nicht viel hilft. (Und es ist tatsächlich wahrscheinlich, dass in einigen Fällen das Geräusch regelmäßiger ist als das Atmen.)
Gibt es also Tricks, die ich vermisse, um herauszufinden, wann kein Signal vorhanden ist? Es scheint, als hätte ich es hier mit einem harten Ort zu tun, da das "Signal" anfangs so rauschartig ist.
(Und vielleicht hängt dies mit einem anderen Problem zusammen, das ich habe: Seltsamerweise kann ich den Signalpegel nicht genau (oder sogar annähernd) messen, selbst wenn er ziemlich laut ist. Da ich ohnehin gleitende Durchschnitte und Verhältnisse verwenden muss, um das Signal zu erkennen, Die Level-Informationen gehen irgendwie verloren. Ich suche nach Tricks, um sie wiederherzustellen.)
Grundtechnik
(Für Yoda)
Das Audiosignal wird abgetastet (im Allgemeinen mit 8000 Hz aus verschiedenen Gründen) und dann in 1024 Blöcken FFTed. (In meinen Experimenten scheinen Hamming-Filter und überlappende Blöcke wenig Wirkung zu haben, obwohl diese später möglicherweise noch einmal überprüft werden.)
Die FFT ist in "Bänder" unterteilt (derzeit 5, leicht verzerrt, um mehr Details am unteren Ende zu platzieren), und die "spektrale Differenz" und der Pegel jedes Bandes werden summiert. Langzeitmittelwerte der spitzenbegrenzten Werte werden als "Schwellenwerte" verwendet, und weitere Vorspannungsanpassungen werden verwendet, um eine "über dem Schwellenwert" liegende Rate von ungefähr 20% aufrechtzuerhalten.
Jeder "Überschwellenwert" erhält ein Gewicht von 1 (unter dem Schwellenwert ein Gewicht von 0), aber dann wird dieses Gewicht durch die scheinbare "Variabilität" (bei ungefähr 2 Hz) im Band angepasst, um den Bändern mehr Gewicht zu verleihen die mehr offensichtliches Signal tragen.
Die Gewichte der Bänder werden summiert und dann werden die summierten Gewichte der nachfolgenden Blöcke über ungefähr eine Sekunde summiert, um eine laufende "Punktzahl" zu erzeugen. Dies wird erneut mit einem laufenden Durchschnittsschwellenwert (plus mehreren Heuristiken) verglichen, um das Einsetzen / Versetzen des Schnarchens zu erfassen.
Aktualisieren
Mir fiel plötzlich ein, dass, wenn mein Algorithmus ein Signal mit konstantem Pegel effektiv aufrechterhält (gemäß meinem Signalpegelproblem), die Möglichkeit, das SNR effektiv zu messen, darin besteht, das Rauschen zu messen, wenn kein Signal vorhanden ist.
Praktischerweise ist das Schnarchen zeitweise mit viel "toter Luft" dazwischen. Und ich erkenne bereits die Schnarchumschläge. Alles außerhalb des Umschlags (zwischen dem Ende eines Schnarchens und dem Beginn des nächsten) ist also vermutlich Rauschen! Dies kann ich (mit einem bescheidenen Grad an Genauigkeit / Wiederholbarkeit) messen. (Es dauerte natürlich drei Versuche, um einen halbwegs anständigen Algorithmus zu entwickeln - die Realität entspricht nie der Theorie.)
Ich habe also noch keine vollständige Antwort, aber ich habe Fortschritte gemacht.
(Während die obige Technik mir einen ziemlich guten Proxy für das SNR gibt, habe ich immer noch Probleme, den tatsächlichen Signalpegel abzuschätzen. Meine "relativen Pegel" -Anzeigen können für einen kaum hörbaren Atemzug und so weiter für einen Fensterrassler außerhalb der Skala liegen. Ich brauche eine Art Proxy für das absolute Level.)
Antworten:
Bisher schienen Sie das Schnarchen durch das Vorhandensein eines starken periodischen Musters im Audio zu identifizieren. Wenn Sie mir sagen, dass es möglicherweise andere Quellen mit derselben Eigenschaft gibt, ist es an der Zeit, sich auf eine Eigenschaft des Signals zu konzentrieren, die spezifischer für das Schnarchen ist. und ich würde vorschlagen, das Timbre des aufgenommenen Klangs selbst genauer zu untersuchen. Angesichts der Tatsache, dass ein menschlicher Zuhörer nicht nur schnarchen, sondern auch atmen kann, können Sie auf den herkömmlichen Ansatz zur Klassifizierung von Audiosignalen zurückgreifen. Berechnen Sie Funktionen wie MFCCs und Fluktuationsmuster für Ihre Audiodaten und trainieren Sie einen Bayes'schen Klassifikator (oder einen komplexeren), um Schnarchen von Atmung zu unterscheiden.
Es könnte auch Zeit sein, die Literatur zu diesem Thema zu überprüfen ... Zum Beispiel fand ich dies: http://web.itu.edu.tr/kamasak/pubs/pdf/pm7_8_007.pdf
quelle
Möglicherweise müssen Sie einen dynamischen Klassifikator erstellen, der sich an das aktuelle Thema, die Schlafphase und die Audioumgebung anpassen kann, anstatt sich auf einen festen Trainingssatz einzustellen.
quelle