如何计算噪声信号的SNR?


14

我在理解如何实际操作时遇到问题

我有一个包含纯语音的wav文件,另一个仅包含背景噪声的ave文件(可以是各种噪声,例如白噪声,人群噪声,吹来的风声等)。这些要么纯粹是言语,要么纯粹是噪音。因此,我想我可以通过两个文件中相应样本的简单划分(或样本帧的平均值)从它们获得SNR值。然后,我大胆地将它们组合起来以获得嘈杂的语音文件。我猜该文件将仍然具有相同的SNR。

现在,我将此文件通过降噪程序,并得到另一个文件。如何计算此“降噪”文件的SNR?

-编辑-

后续问题在这里发布

Answers:


8

SNR的通用定义是有用信号的功率除以噪声功率。假设您已将有用信号和噪声信号作为阵列获取,则可以像这样在噪声降低之前在Matlab中计算SNR:

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

降噪后,可以将剩余噪声计算为所需信号与实际信号之差。SNR的计算非常简单:

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

1
根据您的情况,信号和noise_reduced_signal必须进行时间对齐。
dspGuru 2012年

@dspGuru是的,我假设降噪算法不会引入时间延迟。
迪夫

@DspGuru和Dev:在这些地方,而不是取整个信号的var和均值,如果我指定信号中肯定包含语音的部分怎么办?对于s \ example,在Matlab中用signal(start_speech:end_speech)替换信号,因为我的信号长达5秒,单词之间有停顿
user13267

@ user13267哪个信号?降噪之前或之后?通常,您分析的信号越长,对SNR的估计就越好。
迪夫

两个都。我的意思是,我的声音样本中有人说一个简短的句子,所以当我大胆地打开它时,我可以看到高强度和低强度区域的波形(我想单词的存在和单词之间的静默)。因此,我只想选择那些包含单词的样本,而不选择那些包含沉默的样本。
user13267

3

在输入端:

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

SNR = DB2-DB1

在输出端:

  1. 通过您的噪声抑制算法发送干净的语音信号。表示输出Y1。
  2. 通过噪音抑制算法发送嘈杂的语音信号。表示输出Y2。
  3. 计算Z = Y2-Y1
  4. 残留噪声DB = 10 * log10(var(Z))
  5. 语音DB = 10 * log10(var(Y1))
  6. SNR =语音DB-残余噪声DB

确实也需要使干净的语音信号通过降噪算法吗?语音信号在降噪算法前后是否不应该相同,以便我们有一个共同的参考点?
user13267

这完全取决于您的算法。由于延迟和滤波,输出很可能与干净的输入不匹配。
dspGuru 2012年

输出(当干净的语音通过降噪算法时)确实与输入不匹配,但是我很确定该算法不会引入任何延迟。请检查我的后续问题(该链接已被编辑为该问题)。在降噪之前(图顶部)和降噪之后(图底部),它具有清晰语音的波形。没有延迟,但是放大率很高,并且某些语音已被滤除。
user13267
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.