come posso calcolare SNR del segnale rumoroso?


14

Sto riscontrando problemi nel capire come farlo praticamente

Ho un file wav che contiene puro discorso e un altro file ave che contiene solo il rumore di fondo (possono essere varie cose, come il rumore bianco, il rumore della folla, una registrazione del vento che soffia, ecc.). Questi sono puramente parole o puramente rumore. Quindi suppongo di poter ottenere un valore SNR da essi semplicemente dividendo i campioni corrispondenti (o la media di un frame di campioni) in entrambi i file. Poi li combino in audacia per ottenere un file vocale rumoroso. Immagino che questo file abbia ancora lo stesso SNR.

Ora passo questo file attraverso il mio programma di riduzione del rumore e di conseguenza ottengo un altro file. Come posso calcolare il SNR di questo file "noise noise"?

--- MODIFICARE ---

domanda di follow-up pubblicata QUI

Risposte:


8

La definizione comune di SNR è la potenza del segnale desiderato divisa per la potenza del rumore. Supponiamo di aver ottenuto il segnale desiderato e il rumore come array, il calcolo del SNR in Matlab prima che la riduzione del rumore possa essere eseguita in questo modo:

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

Dopo la riduzione del rumore, il rumore residuo può essere calcolato come la differenza del segnale desiderato e del segnale effettivo. Il calcolo del SNR è quindi semplice:

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

1
signal e noise_reduced_signal devono essere allineati nel tempo nel tuo caso.
dspGuru,

@dspGuru Vero, ho ipotizzato che l'algoritmo di riduzione del rumore non presenti un ritardo.
Deve il

@DspGuru e Dev: In questi luoghi, invece di prendere la var e la media dell'intero segnale, cosa succede se specifico una parte del segnale che contiene sicuramente il parlato? Ad esempio, sostituisci segnale per segnale (start_speech: end_speech) in Matlab, poiché il mio segnale è lungo 5 secondi con una pausa tra le parole
user13267

@ user13267 Di quale segnale? Prima o dopo la riduzione del rumore? Generalmente, più lungo è il segnale che si analizza, migliore sarà la stima del SNR.
Deve l'

entrambi. Quello che voglio dire è che il mio campione sonoro ha qualcuno che parla una breve frase, quindi quando lo apro in audacia posso vedere la forma d'onda ad alta intensità e aree a bassa intensità (presenza di parole e silenzio tra parole penso). Quindi voglio solo selezionare quei campioni che contengono parole e non includere quei campioni che contengono silenzio.
user13267

3

Sul lato input:

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

SNR è = DB2 - DB1

Dal lato dell'uscita:

  1. Invia il segnale vocale pulito attraverso il tuo algo di soppressione del rumore. Indica l'uscita Y1.
  2. Invia il segnale vocale rumoroso attraverso il tuo algo di soppressione del rumore. Indica quell'uscita Y2.
  3. Calcola Z = Y2 - Y1
  4. residualNoiseDB = 10 * log10 (var (Z))
  5. speechDB = 10 * log10 (var (Y1))
  6. SNR = speechDB - residualNoiseDB

È davvero necessario trasmettere anche il segnale vocale pulito attraverso l'algoritmo di riduzione del rumore? Il segnale vocale non dovrebbe essere lo stesso prima e dopo l'algoritmo di riduzione del rumore in modo da avere un punto di riferimento comune?
user13267

Dipende totalmente dal tuo algoritmo. Molto probabilmente l'uscita non corrisponderà all'ingresso pulito a causa di ritardi e filtri.
dspGuru,

L'output (quando il parlato pulito viene passato attraverso l'algoritmo di riduzione del rumore) non corrisponde effettivamente all'ingresso, ma sono abbastanza sicuro che l'algoritmo non introduca alcun ritardo. Controlla la mia domanda di follow-up (il link è stato modificato in questa domanda). Ha le forme d'onda del parlato pulito prima della riduzione del rumore (in alto nella figura) e dopo la riduzione del rumore (in basso nella figura). Non ci sono ritardi, ma c'è un'amplificazione molto elevata e parte del discorso è stato filtrato.
user13267,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.