如何计算噪声信号的 SNR?

信息处理 matlab 信噪比
2022-01-14 04:37:57

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

我有一个包含纯语音的 wav 文件和另一个仅包含背景噪声的 ave 文件(可以是各种东西,例如白噪声、人群噪声、风的记录等)。这些要么是纯粹的语音,要么是纯粹的噪音。所以我想我可以通过简单地划分两个文件中的相应样本(或一帧样本的平均值)来从它们那里得到一个 SNR 值。然后我大胆地将它们结合起来,得到一个嘈杂的语音文件。我猜这个文件仍然会有相同的 SNR。

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

- - 编辑 - -

此处发布的后续问题

2个回答

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. 计算 DB1 = 10*log10(var(noiseSignal))
  2. 计算 DB2 = 10*log10(var(cleanSpeechSignal))

信噪比 = DB2 - DB1

在输出端:

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