2016-07-04 10 views
1

Ich habe die Posts des Stack-Überlaufs durchgegangen, aber ich verstehe nicht, wie man zischenden Sound aus meinem Audio vom Mikrofon entfernt entfernen.Entfernen von Audio-Rauschen (Zischen) in C++ von 16bit PCM

Ich habe einen einfachen Tiefpassfilter implementiert, aber ich muss etwas falsch machen.

unsigned short *buf = "audio data in PCM format"; 
double out_sample = 0; 
int sample_size = "number of samples of audio"; 
for (int n = 0; n < sample_size/2; n++) 
{ 
    out_sample = (out_sample * 90 + buf[n] * 10)/100; 
    buf[n] = (unsigned short) out_sample; 
} 

Das obige erzeugt wirklich korruptes Audio.

Ich weiß, ich muss einen Tiefpassfilter auf den PCM-Daten machen. Kann jemand etwas Licht in das tun, was ich falsch mache?

Vielen Dank im Voraus.

+0

Warum 'sample_size/2'? Ich bin auch nicht vertraut mit LPF, die Sie als 'out_sample' bereitgestellt haben, hängt von all Ihren früheren Samples ab. Sie sollten auch beachten, dass Sie sich innerhalb der Zeitdomäne und nicht in der Frequenzdomäne bewegen. – Logman

+0

Was Sie haben, ist ein IIR (Infinite Impulse Response) Filter mit einem langsamen exponentiellen Abfall. Es ist eine ziemlich schwere LPF. Außerdem muss die Struktur der Daten klarer sein. sample_size/2 legt nahe, dass es sich um Stereodaten handelt, die wahrscheinlich verschachtelt sind, was typisch für PCM ist, aber Ihr Code zeigt das nicht. Dies würde die Dinge ziemlich durcheinander bringen. – doug

+0

Außerdem gibt es kostenlose Apps, die Ihnen das Spektrum des Rauschens von Ihrem Mikrofon zeigen. Sie sollten Ihre LPF darauf basierend abstimmen. Zusätzlich kann eine dynamische Verstärkung während relativ ruhiger Perioden angewendet werden, um Rauschen zu minimieren. Nichts davon ist sehr schwer, aber Sie sollten wahrscheinlich einige Werkzeuge bekommen, um die benötigten Filter zu erzeugen. Octave oder Matlab sind gut darin. – doug

Antwort

2

PCM-Daten sind praktisch immer unterzeichnet Daten. Sie sehen wahrscheinlich, dass jeder negative Wert plötzlich als großer Wert behandelt wird (> 32768). Dies wird dann durch Ihren "Tiefpassfilter" als Doppelwerte gefiltert. Angenommen, Sie hatten Null DC-Offset für den Anfang, wird Ihr Filter einen DC-Durchschnitt in der Nähe von 32768, aber mit einem eher unvorhersehbaren und nicht akustisch sinnvollen Signal an der Spitze produzieren.