Rauschunterdrückung durch sehr lautes Audio

8

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:

Mein Eingangssignal (8 kHz).  Markierte Bereiche zeigen Vogelstimmen an

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.

Spektrogramm

Ich habe auch die langfristige durchschnittliche Energie (über 32 Stichprobenintervalle) aufgezeichnet und einige Klicks daraus entfernt. Hier ist das Ergebnis:

Langfristige durchschnittliche Energie

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!

Lukasz Tracewski
quelle
Willkommen bei DSP.SE. Das ist eine großartige Frage! Ich hoffe, Sie können hier einige gute Hinweise bekommen.
Phonon
@ Lukasas Tracewski Respektierter Herr: Obwohl es zu spät ist, aber ich arbeite an demselben Projekt, habe ich ein Problem damit, wie ich ein Spektrogramm aus einer WAV-Datei erstellen kann. Sie können meine weitere Zeit sparen, da ich versuche, dieses Problem aus den letzten 2 Monaten zu lösen. Vielen Dank im Voraus. Jeder Hel wäre sehr dankbar
Mubeen Khan
@MubeenKhan Du meinst Hilfe bei der Erstellung eines Spektrogramms aus einer Audiodatei? Es gibt Dutzende von Tools und Bibliotheken, die für diesen Zweck geeignet sind. Benötigen Sie eine Empfehlung? Oder fragen Sie nach Rauschunterdrückung?
Lukasz Tracewski

Antworten:

4

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.

Lukasz Tracewski
quelle
0

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.

Yozek
quelle
Wenn ich Sie nicht missverstanden habe, beziehen Sie sich anscheinend auf etwas, das ich bereits im zweiten Absatz meiner Frage getan habe (direkt unter der ersten Grafik). Mit der in meiner Antwort beschriebenen Methode konnte ich alle Einsätze finden und dann die spektrale Subtraktion anwenden, was zu noch besseren Ergebnissen führt. Bedauerlicherweise erzeugt es auch sogenannte "Musiktöne", die jetzt mein Hauptanliegen sind. Danke trotzdem!
Lukasz Tracewski