Wie können Sie feststellen, ob ein Signal vorhanden ist (wenn Ihr Signal stark nach Rauschen aussieht)?

11

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.)

Daniel R Hicks
quelle
"Dies ist wieder mein Schnarchdetektor" - könnten Sie bitte auf Ihre vorherige Frage verweisen (wo Sie sie vermutlich ausführlich beschrieben haben) oder in dieser Frage einige Details zu Ihrem Detektor hinzufügen?
Lorem Ipsum

Antworten:

5

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

Pichenettes
quelle
Ein Problem ist, dass die Art des Klangs von Individuum zu Individuum und sogar für ein einzelnes Individuum im Laufe einer Nacht so unterschiedlich ist. Aber danke für die Hinweise - ich werde sie untersuchen.
Daniel R Hicks
Wenn Ihr Trainingssatz groß genug ist, ist dies möglicherweise mit maschinellen Lerntechniken noch möglich.
Pichenettes
Ich habe mehr als 50 Datensätze. Leider versagt ein Algorithmus, der bei einem Satz perfekt funktioniert, beim nächsten kläglich. Einige haben Fernseher im Hintergrund, andere haben rumpelnde Luftbehandlungsgeräte usw. Das Atmen / Schnarchen kann kaum hörbar sein oder sich abblättern. Ein Subjekt kann seine Position ändern und die Art seines Schnarchens vollständig ändern. Es ist eindeutig eine Art Selbstoptimierungsschema erforderlich.
Daniel R Hicks
Welche Funktionen verwenden Sie für die Klassifizierung?
Pichenettes
In erster Linie nur "Spektraldifferenz" (auch als "Spektralfluss" bezeichnet), um "Einsetzen" und "Versatz" zu erfassen. Aber mein aktuelles Schema unterteilt das Spektrum in Bänder und "gewichtet" jedes Band basierend auf der scheinbaren Signalstärke in diesem Band (die anhand des Ausmaßes der Variation der spektralen Differenz beurteilt wird, die bei etwa 1/2 Hz auftritt). Dies funktioniert gut, um das Atmen / Schnarchen über den gesamten Lautstärkebereich hinweg zu erkennen, selbst bei erheblichen Geräuschen, verliert jedoch effektiv alle Hinweise auf die tatsächliche Lautstärke. Und das einfache Betrachten des gleichzeitigen Gesamtschallpegels funktioniert aufgrund des Geräuschproblems nicht.
Daniel R Hicks
0

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.

hotpaw2
quelle
Das denke ich mir.
Daniel R Hicks