Wenn man sich die Screenshots der Quell-Audiodateien ansieht, wäre eine einfache Möglichkeit, eine Änderung des Geräuschpegels zu erkennen, die Durchführung einer numerische Integration der Proben, um die "Energie" der Welle zu einem bestimmten Zeitpunkt zu ermitteln.
Ein grober Algorithmus würde lauten:
- Teilen Sie die Proben in Abschnitte ein
- Berechnen Sie die Energie der einzelnen Abschnitte
- Nehmen Sie das Verhältnis der Energien zwischen dem vorherigen Fenster und dem aktuellen Fenster
- Wenn das Verhältnis einen bestimmten Schwellenwert überschreitet, stellen Sie fest, dass ein plötzliches lautes Geräusch aufgetreten ist.
Pseudocode
samples = load_audio_samples() // Array containing audio samples
WINDOW_SIZE = 1000 // Sample window of 1000 samples (example)
for (i = 0; i < samples.length; i += WINDOW_SIZE):
// Perform a numerical integration of the current window using simple
// addition of current sample to a sum.
for (j = 0; j < WINDOW_SIZE; j++):
energy += samples[i+j]
// Take ratio of energies of last window and current window, and see
// if there is a big difference in the energies. If so, there is a
// sudden loud noise.
if (energy / last_energy > THRESHOLD):
sudden_sound_detected()
last_energy = energy
energy = 0;
Ich sollte hinzufügen, dass ich das noch nicht ausprobiert habe.
Dieser Weg sollte möglich sein, ohne dass alle Proben vorher aufgezeichnet werden müssen. Solange ein Puffer einer gewissen Länge vorhanden ist ( WINDOW_SIZE
im Beispiel), kann eine numerische Integration durchgeführt werden, um die Energie des Schallabschnitts zu berechnen. Dies bedeutet jedoch, dass es eine Verzögerung bei der Verarbeitung gibt, die von der Länge des WINDOW_SIZE
. Ein weiteres Anliegen ist die Bestimmung einer guten Länge für einen Klangabschnitt.
Wie man in Abschnitte unterteilt
In der ersten Audiodatei scheint die Dauer des Geräuschs beim Schließen der Tür 0,25 Sekunden zu betragen, so dass das für die numerische Integration verwendete Fenster wahrscheinlich höchstens die Hälfte oder sogar eher ein Zehntel davon betragen sollte, damit der Unterschied zwischen der Stille und dem plötzlichen Geräusch wahrgenommen werden kann, selbst wenn sich das Fenster zwischen dem leisen Abschnitt und dem Geräuschabschnitt überschneidet.
Wenn das Integrationsfenster beispielsweise 0,5 Sekunden beträgt und das erste Fenster die 0,25 Sekunden Stille und die 0,25 Sekunden des Türschließens abdeckt, während das zweite Fenster die 0,25 Sekunden des Türschließens und die 0,25 Sekunden der Stille abdeckt, könnte es so aussehen, als ob die beiden Geräuschabschnitte den gleichen Geräuschpegel hätten und daher die Geräuscherkennung nicht auslösen würden. Ich könnte mir vorstellen, dass ein kurzes Fenster dieses Problem etwas abmildern würde.
Ein zu kurzes Fenster bedeutet jedoch, dass der Anstieg des Schalls möglicherweise nicht vollständig in ein Fenster passt, und es kann der Eindruck entstehen, dass der Energieunterschied zwischen den benachbarten Abschnitten gering ist, was dazu führen kann, dass der Schall nicht wahrgenommen wird.
Ich glaube, die WINDOW_SIZE
y THRESHOLD
müssen beide empirisch für den zu erfassenden Ton bestimmt werden.
Um zu bestimmen, wie viele Stichproben dieser Algorithmus im Speicher behalten muss, nehmen wir an, dass die WINDOW_SIZE
ist 1/10 des Geräuschs beim Schließen der Tür, was etwa 0,025 Sekunden entspricht. Bei einer Abtastrate von 4 kHz sind das 100 Samples. Das scheint kein allzu großer Speicherbedarf zu sein. Bei 16-Bit-Samples sind das 200 Byte.
Vorteile/Nachteile
Der Vorteil dieser Methode ist, dass die Verarbeitung mit einfacher Ganzzahlarithmetik erfolgen kann, wenn die Audioquelle als Ganzzahl eingespeist wird. Der Nachteil ist, wie bereits erwähnt, dass die Echtzeitverarbeitung je nach Größe des zu integrierenden Abschnitts eine Verzögerung aufweist.
Es gibt einige Probleme, die mir bei diesem Ansatz einfallen:
- Wenn das Hintergrundgeräusch zu laut ist, kann der Energieunterschied zwischen dem Hintergrundgeräusch und dem Schließen der Tür nicht leicht unterschieden werden, so dass das Schließen der Tür möglicherweise nicht erkannt werden kann.
- Jedes plötzliche Geräusch, wie z. B. ein Klatschen, könnte als Schließen der Tür gewertet werden.
Vielleicht sollte man die Vorschläge aus den anderen Antworten kombinieren und versuchen, die Frequenzsignatur des Türschließens mit Hilfe der Fourier-Analyse zu analysieren, was zwar mehr Rechenarbeit erfordern würde, aber weniger fehleranfällig wäre.
Es wird wahrscheinlich einige Experimente erfordern, bevor wir eine Lösung für dieses Problem finden.
0 Stimmen
Ist ein Beschleunigungsmesser eine Option?
0 Stimmen
Ich habe einen Drei-Achsen-Beschleunigungsmesser auf dem Board. Übrigens sind auch ein Drucksensor, ein Lichtsensor, eine Türschaltererkennung, GPS und eine Kamera vorhanden. Obwohl diese Optionen verfügbar sind, wird das Design im Idealfall nur das Mikrofon für die Erkennung der Türschließung benötigen.
0 Stimmen
Nur ein zufälliger Gedanke - wenn es fast immer clippt, wenn es schließt - warum nicht einfach für den Clip erkennen?
0 Stimmen
@aronchick - weil es so viele Geräusche im Auto gibt, die auch laut genug sind, um sie zu beschneiden, aber auf andere Weise anders sind.