Wie berechne ich das SNR des verrauschten Signals?


14

Ich habe Probleme zu verstehen, wie man es praktisch macht

Ich habe eine WAV-Datei, die reine Sprache enthält, und eine andere Ave-Datei, die nur die Hintergrundgeräusche enthält (dies können verschiedene Dinge sein, z. B. weißes Rauschen, Menschenmengengeräusche, Aufzeichnungen von wehendem Wind usw.). Dies sind entweder reine Sprache oder reine Geräusche. Ich nehme also an, ich kann daraus einen SNR-Wert erhalten, indem ich die entsprechenden Samples (oder den Durchschnitt eines Frame von Samples) in beide Dateien aufteile. Ich kombiniere sie dann in Kühnheit, um eine laute Sprachdatei zu erhalten. Ich vermute, diese Datei wird immer noch das gleiche SNR haben.

Jetzt leite ich diese Datei durch mein Rauschunterdrückungsprogramm und erhalte als Ergebnis eine andere Datei. Wie berechne ich den SNR dieser "Noise Reduced" -Datei?

--- EDIT ---

Folgefrage HIER gepostet

Antworten:


8

Die gebräuchliche Definition von SNR ist die Leistung des Nutzsignals geteilt durch die Rauschleistung. Angenommen, Sie haben das gewünschte und das Rauschsignal als Arrays erhalten. Die Berechnung des SNR in Matlab vor der Rauschunterdrückung kann folgendermaßen erfolgen:

snr_before = mean( signal .^ 2 ) / mean( noise .^ 2 );
snr_before_db = 10 * log10( snr_before ) % in dB

Nach der Rauschunterdrückung kann das Restrauschen als Differenz des Nutzsignals und des Istsignals berechnet werden. Die Berechnung des SNR ist dann einfach:

residual_noise = signal - noise_reduced_signal; 
snr_after = mean( signal .^ 2 ) / mean( residual_noise .^ 2 ); 
snr_after_db = 10 * log10( snr_after )

1
signal und noise_reduced_signal müssen in ihrem fall zeitlich abgestimmt sein.
dspGuru

@dspGuru Richtig, ich bin davon ausgegangen, dass der Rauschunterdrückungsalgorithmus keine Zeitverzögerung einführt.
Deve

@DspGuru und Dev: An diesen Stellen, anstatt die Var und den Mittelwert des gesamten Signals zu nehmen, was ist, wenn ich einen Teil des Signals spezifiziere, der definitiv Sprache enthält? Ersetzen Sie beispielsweise das Signal in Matlab durch ein Signal (start_speech: end_speech), da mein Signal 5 Sekunden lang ist und zwischen den Wörtern eine Pause
eingelegt wird

@ user13267 Von welchem ​​Signal? Vor oder nach der Geräuschreduzierung? Je länger das von Ihnen analysierte Signal ist, desto besser ist im Allgemeinen Ihre Schätzung des SNR.
Deve

beide. Was ich damit meine, ist, dass mein Soundbeispiel jemanden hat, der einen kurzen Satz spricht, sodass ich, wenn ich es in Audacity öffne, die Bereiche mit hoher und niedriger Intensität der Wellenform sehen kann (Vorhandensein von Wörtern und Stille zwischen Wörtern, die ich denke). Ich möchte also nur die Samples auswählen, die Wörter enthalten, und nicht die Samples, die Stille enthalten.
user13267

3

Auf der eingangsseite:

  1. Berechne DB1 = 10 * log10 (var (noiseSignal))
  2. Berechne DB2 = 10 * log10 (var (cleanSpeechSignal))

Das SNR lautet = DB2 - DB1

Ausgangsseitig:

  1. Senden Sie das saubere Sprachsignal durch Ihren Rauschunterdrückungsalgo. Bezeichnen Sie den Ausgang Y1.
  2. Senden Sie das verrauschte Sprachsignal durch Ihren Rauschunterdrückungsalgo. Bezeichnen Sie diesen Ausgang Y2.
  3. Berechnen Sie Z = Y2 - Y1
  4. residualNoiseDB = 10 * log10 (var (Z))
  5. speechDB = 10 * log10 (var (Y1))
  6. SNR = speechDB - residualNoiseDB

Ist es wirklich notwendig, das saubere Sprachsignal auch durch den Rauschunterdrückungsalgorithmus zu leiten? Sollte das Sprachsignal nicht vor und nach dem Rauschunterdrückungsalgorithmus gleich sein, damit wir einen gemeinsamen Bezugspunkt haben?
user13267

Das hängt ganz von Ihrem Algorithmus ab. Wahrscheinlich stimmt der Ausgang aufgrund von Verzögerung und Filterung nicht mit dem sauberen Eingang überein.
dspGuru

Die Ausgabe (wenn saubere Sprache durch den Rauschunterdrückungsalgorithmus geleitet wird) stimmt in der Tat nicht mit der Eingabe überein, aber ich bin ziemlich sicher, dass der Algorithmus keine Verzögerungen einführt. Bitte überprüfen Sie meine Folgefrage (der Link wurde in diese Frage geändert). Es hat die Wellenformen sauberer Sprache vor (oben in der Abbildung) Rauschunterdrückung und nach (unten in der Abbildung) Rauschunterdrückung. Es gibt keine Verzögerung, aber eine sehr hohe Verstärkung und ein Teil der Sprache wurde herausgefiltert.
user13267
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.