Ich versuche, einen Algorithmus zu schreiben, der automatisch ein Stück Audio mit Vogelrufaufzeichnungen segmentiert. Meine Eingabedaten sind Wave-Dateien mit einer Länge von 1 Minute. Für die Ausgabe möchte ich separate Aufrufe zur weiteren Analyse erhalten. Das Problem ist, dass das Signal-Rausch-Verhältnis aufgrund der Umgebungsbedingungen und der schlechten Qualität eines Mikrofons (Mono, 8-kHz-Abtastung) ziemlich schrecklich ist.
Ich wäre sehr dankbar für Ratschläge, wie Sie mit der Geräuschreduzierung fortfahren können.
Hier ist ein Beispiel für meine Eingabe, eine Minute Audioaufnahme im Wave-Format: http://goo.gl/16fG8P
So sieht das Signal aus:
Die Bandpassfilterung, bei der ich nur etwas zwischen 1500 und 2500 Hz behalte, verbessert die Situation zwar, ist aber weit von den Erwartungen entfernt. In diesem Spektrum ist noch viel Rauschen vorhanden.
Ich habe auch die langfristige durchschnittliche Energie (über 32 Stichprobenintervalle) aufgezeichnet und einige Klicks daraus entfernt. Hier ist das Ergebnis:
Bei all dem verbleibenden Rauschen muss ich einen sehr niedrigen Schwellenwert für den Erkennungsalgorithmus festlegen, um die letzten 10 Sekunden der Vogelrufe zu erfassen. Das Problem ist, wenn ich es so optimiere, kann ich bei der nächsten Aufnahme eine Menge falsch positiver Ergebnisse erhalten.
Filter mit gleitendem Durchschnitt hilft ein bisschen bei Windgeräuschen. Irgendwelche anderen Ideen? Ich dachte an "Spektrale Subtraktion", aber hier scheint es mir, dass ich eine Art Henne-Ei-Problem habe - um einen Nur-Rausch-Bereich zu finden, muss ich das Audio segmentieren und das Audio segmentieren, das ich brauche, um das Rauschen zu entfernen. Kennen Sie Bibliotheken mit diesem Algorithmus oder einige Implementierungen in Pseudocode? Methinks Audacity verwendet eine solche Methode, um Rauschen zu entfernen. Es ist sehr effektiv, aber es bleibt dem Benutzer überlassen, nur den Bereich mit Rauschen zu markieren.
Ich schreibe in Python und es ist ein kostenloses Open-Source-Projekt.
Danke fürs Lesen!
quelle
Antworten:
Am Ende erwies sich die Onset-Erkennung anhand des Hochfrequenz- oder Energiegehalts als die beste Lösung. Bevor es funktionieren konnte, musste ich ein Hochpassfilter verwenden, um die ersten 1 kHz auszuschalten, da es zu viel Rauschen enthielt.
Sobald ich einen Nur-Rausch-Bereich hatte, konnte ich sein Profil verwenden, um das Rauschen vom Rest der Probe zu reduzieren.
Eine Bibliothek, die ich besonders nützlich fand, war Aubio . Es enthält eine Reihe guter Beispiele und bietet eine Vielzahl von Algorithmen zur Erkennung des Beginns.
quelle
Ich weiß nicht viel über die Reduzierung von Audio-Rauschen, aber nach einer schnellen und schmutzigen Rausch-Subtraktion vom gefilterten Durchlassbereich (ca. 1500-3000 Hz) erhalte ich Folgendes:
https://dl.dropboxusercontent.com/u/98395391/signal_denoised.wav
Ich denke, es klingt nur ein bisschen besser von den gefilterten und ursprünglichen Signalen.
Mit einem einfachen Wiener Filter erhalte ich sehr ähnliche Ergebnisse.
quelle