como faço para calcular o SNR do sinal barulhento?

14

Estou tendo problemas para entender como fazê-lo praticamente

Eu tenho um arquivo wav que contém fala pura e outro arquivo ave que contém apenas o ruído de fundo (podem ser várias coisas, como ruído branco, ruído de multidão, uma gravação de vento soprando, etc.). Estes são puramente fala ou puramente ruído. Então, suponho que posso obter um valor SNR deles pela simples divisão das amostras correspondentes (ou a média de um quadro de amostras) nos dois arquivos. Eu então os combinei com audácia para obter um arquivo de fala barulhento. Acho que esse arquivo ainda terá o mesmo SNR.

Agora passo esse arquivo pelo meu programa de redução de ruído e, como resultado, recebo outro arquivo. Como calculo o SNR desse arquivo "com redução de ruído"?

--- EDIT ---

pergunta de acompanhamento postada AQUI

user13267
fonte

Respostas:

8

A definição comum de SNR é a potência do sinal desejado dividido pela potência do ruído. Suponha que você tenha obtido o sinal desejado e o ruído como matrizes, o cálculo do SNR no Matlab antes que a redução de ruído possa ser feita assim:

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

Após a redução do ruído, o ruído residual pode ser calculado como a diferença do sinal desejado e do sinal real. O cálculo do SNR é então simples:

residual_noise = signal - noise_reduced_signal; 
snr_after = mean( signal .^ 2 ) / mean( residual_noise .^ 2 ); 
snr_after_db = 10 * log10( snr_after )
Deve
fonte
1
signal e noise_reduced_signal precisa estar alinhado no tempo no seu caso.
amigos estão dizendo sobre dspGuru
@dspGuru É verdade que eu assumi que o algoritmo de redução de ruído não introduz um atraso de tempo.
DEVE
@ DspGuru e Dev: Nesses lugares, em vez de pegar a var e a média de todo o sinal, e se eu especificar alguma parte do sinal que definitivamente contém fala? Para s \ exemplo, substituir o sinal pelo sinal (start_speech: end_speech) em Matlab, uma vez que o meu sinal é de 5 segundos de duração com pausa entre as palavras
user13267
@ user13267 De qual sinal? Antes ou depois da redução de ruído? Geralmente, quanto mais longo o sinal que você analisar, melhor será sua estimativa do SNR.
DEVE
ambos. O que eu quero dizer é que minha amostra de som tem alguém falando uma frase curta, então quando eu a abro com audácia, posso ver as áreas de alta intensidade e baixa intensidade da forma de onda (presença de palavras e silêncio entre as palavras que eu acho). Então, eu só quero selecionar as amostras que contêm palavras e não incluir as amostras que contêm silêncio.
precisa saber é o seguinte
3

No lado da entrada:

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

O SNR é = DB2 - DB1

No lado da saída:

  1. Envie o sinal de fala limpa através do seu sistema de supressão de ruído. Indique a saída Y1.
  2. Envie o sinal de voz barulhento através do seu sistema de supressão de ruído. Indique essa saída Y2.
  3. Calcular Z = Y2 - Y1
  4. residualNoiseDB = 10 * log10 (var (Z))
  5. speechDB = 10 * log10 (var (Y1))
  6. SNR = speechDB - residualNoiseDB
dspGuru
fonte
É realmente necessário transmitir o sinal de fala limpa também através do algoritmo de redução de ruído? O sinal de fala não deveria ser o mesmo antes e depois do algoritmo de redução de ruído, para que tenhamos um ponto de referência comum?
user13267
Isso depende totalmente do seu algoritmo. Provavelmente a saída não corresponderá à entrada limpa - devido a atraso e filtragem.
amigos estão dizendo sobre dspGuru
A saída (quando a fala limpa é passada pelo algoritmo de redução de ruído) não corresponde à entrada, mas tenho certeza de que o algoritmo não apresenta atrasos. Verifique minha pergunta de acompanhamento (o link foi editado para esta pergunta). Possui as formas de onda da fala limpa antes da redução de ruído (na parte superior da figura) e depois da redução de ruído (na parte inferior da figura). Não há atraso, mas a amplificação é muito alta e parte do discurso foi filtrada.
user13267