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

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

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

---编辑---

在此处发布后续问题

#1 楼

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 )


评论


$ \ begingroup $
signal和noise_reduced_signal必须根据您的情况进行时间调整。
$ \ endgroup $
– dspGuru
2012年11月2日在16:19

$ \ begingroup $
@dspGuru是的,我假设降噪算法不会引入时间延迟。
$ \ endgroup $
–戴夫
2012年11月3日13:45

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

$ \ begingroup $
@ user13267哪个信号?降噪之前还是之后?通常,您分析的信号越长,对SNR的估计就越好。
$ \ endgroup $
–戴夫
2012年11月8日下午6:47

$ \ begingroup $
他们两个。我的意思是,我的声音样本中有人说一个简短的句子,所以当我大胆地打开它时,我可以看到高强度和低强度区域的波形(我想单词的存在和单词之间的沉默)。因此,我只想选择那些包含单词的样本,而不选择那些包含沉默的样本。
$ \ endgroup $
–user13267
2012年11月8日7:34

#2 楼

在输入端:


计算DB1 = 10 * log10(var(noiseSignal))
计算DB2 = 10 * log10(var(cleanSpeechSignal))
< SNR为= DB2-DB1

在输出侧:


通过您的噪声抑制算法发送干净的语音信号。表示输出Y1。
通过噪声抑制算法发送嘈杂的语音信号。表示输出Y2。
计算Z = Y2-Y1
residualNoiseDB = 10 * log10(var(Z))
speechDB = 10 * log10(var(Y1))
SNR = speechDB-残差NoiseDB


评论


$ \ begingroup $
是否真的也需要通过降噪算法传递干净的语音信号?语音信号在降噪算法之前和之后是否应该不相同,以便我们有一个共同的参考点?
$ \ endgroup $
–user13267
2012年11月8日下午5:47

$ \ begingroup $
这完全取决于您的算法。由于延迟和滤波,输出很可能与干净的输入不匹配。
$ \ endgroup $
– dspGuru
2012年11月14日19:00

$ \ begingroup $
输出(当通过降噪算法传递干净的语音时)确实与输入不匹配,但是我很确定该算法不会引入任何延迟。请检查我的后续问题(链接已被修改为该问题)。在降噪之前(图顶部)和降噪之后(图底部),它具有清晰语音的波形。没有延迟,但是放大率很高,并且某些语音已被滤除。
$ \ endgroup $
–user13267
2012年11月15日,0:10