¿Cómo calculo la SNR de la señal ruidosa?

14

Tengo problemas para entender cómo hacerlo prácticamente

Tengo un archivo wav que contiene voz pura y otro archivo ave que solo contiene el ruido de fondo (pueden ser varias cosas, como ruido blanco, ruido de masas, una grabación de viento que sopla, etc.). Estos son puramente habla o puramente ruido. Así que supongo que puedo obtener un valor de SNR de ellos por simple división de las muestras correspondientes (o el promedio de un marco de muestras) en ambos archivos. Luego los combino con audacia para obtener un archivo de voz ruidoso. Supongo que este archivo seguirá teniendo la misma SNR.

Ahora paso este archivo a través de mi programa de reducción de ruido y como resultado obtengo otro archivo. ¿Cómo calculo la SNR de este archivo de "reducción de ruido"?

--- EDITAR ---

pregunta de seguimiento publicada AQUÍ

usuario13267
fuente

Respuestas:

8

La definición común de SNR es la potencia de la señal deseada dividida por la potencia de ruido. Supongamos que ha obtenido la señal deseada y la señal de ruido como matrices, el cálculo de la SNR en Matlab antes de la reducción de ruido se puede hacer así:

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

Después de la reducción de ruido, el ruido residual se puede calcular como la diferencia de la señal deseada y la señal real. El cálculo de SNR es entonces sencillo:

residual_noise = signal - noise_reduced_signal; 
snr_after = mean( signal .^ 2 ) / mean( residual_noise .^ 2 ); 
snr_after_db = 10 * log10( snr_after )
Deve
fuente
1
signal and noise_reduced_signal tiene que estar alineado en el tiempo en su caso.
dspGuru
@dspGuru Cierto, supuse que el algoritmo de reducción de ruido no introduce un retraso de tiempo.
Deve
@DspGuru y Dev: en estos lugares, en lugar de tomar la var y la media de la señal completa, ¿qué sucede si especifico alguna parte de la señal que definitivamente contiene voz? Por ejemplo, reemplace señal por señal (start_speech: end_speech) en Matlab, ya que mi señal es de 5 segundos de duración con pausa entre palabras
user13267
@ user13267 ¿De qué señal? ¿Antes o después de la reducción de ruido? En general, cuanto más larga sea la señal que analice, mejor será su estimación de la SNR.
Deve
ambos. Lo que quiero decir es que mi muestra de sonido tiene a alguien que habla una oración corta, así que cuando la abro con audacia puedo ver la forma de onda de alta intensidad y áreas de baja intensidad (creo que presencia de palabras y silencio entre palabras). Así que solo quiero seleccionar aquellas muestras que contienen palabras y no incluir aquellas que contienen silencio.
user13267
3

En el lado de entrada:

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

El SNR es = DB2 - DB1

En el lado de salida:

  1. Envíe la señal de voz limpia a través de su supresión de ruido. Denota la salida Y1.
  2. Envíe la señal de voz ruidosa a través de su supresión de ruido. Denote esa salida Y2.
  3. Calcule Z = Y2 - Y1
  4. residualNoiseDB = 10 * log10 (var (Z))
  5. speechDB = 10 * log10 (var (Y1))
  6. SNR = vozDB - residualNoiseDB
dspGuru
fuente
¿Es realmente necesario pasar también la señal de voz limpia a través del algoritmo de reducción de ruido? ¿No debería ser la señal de voz la misma antes y después del algoritmo de reducción de ruido para que tengamos un punto de referencia común?
user13267
Eso depende totalmente de tu algoritmo. Lo más probable es que la salida no coincida con la entrada limpia, debido al retraso y al filtrado.
dspGuru
La salida (cuando se pasa una voz limpia a través del algoritmo de reducción de ruido) no coincide con la entrada, pero estoy bastante seguro de que el algoritmo no introduce demoras. Por favor revise mi pregunta de seguimiento (el enlace ha sido editado en esta pregunta). Tiene las formas de onda del habla limpia antes (arriba de la figura) de reducción de ruido y después (abajo de la figura) de reducción de ruido. No hay demora, pero hay una amplificación muy alta y parte del discurso se ha filtrado.
user13267