估计音频文件的SNR的方法?

时间:2011-11-16 11:12:12

标签: algorithm signal-processing

如何从包含语音的单个音频文件中估算SNR? 我知道两种方法:

  1. log power histogram pecentile difference(又名“NIST快速方法”),如下所述:http://labrosa.ee.columbia.edu/~dpwe/tmp/nist/doc/stnr.txt

  2. 10 * log10((S-N)/ N),其中

    • S = sum {x [i] ^ 2 * e [i]}
    • N = sum {x [i] ^ 2 *(1-e [i])}
    • e [i]某种语音活动检测(语音/非语音指示符)
  3. 有没有更好的方法不需要立体声数据(或干净和嘈杂版本的数据)?我还想避免在NIST文档(见1.)中描述的“第二种方法”,该方法对分布做出了强有力的假设。

1 个答案:

答案 0 :(得分:5)

人声使用300 Hz至3 kHz的频率。这就是(旧的)电话系统正在使用的。人声从不使用所有这些频率,这就是为什么我们可以进行频率分析以找到本底噪声 - 没有任何参考或语音活动检测e [i]:

  1. 计算FFT,频率分辨率为~10 - 20 Hz。 对于48 kHz的采样率,您将使用FFT长度的采样率/分辨率= 4800个样本,这应该四舍五入到最接近的2的幂,即4096

  2. 确定保持300 - 3000 Hz结果的必要分档。 bin索引k保持频率k * samplerate / FFT_length的结果。对于48 kHz以上的输入和FFT长度4096,这是k(300 Hz)= 300 * 4096/48000~ = 25和k(3000 Hz)= 3000 * 4096 / 48000~ = 250。

  3. 计算每个必要箱中的能量:E [k] = FFT [k] .re ^ 2 + FFT [k] .im ^ 2。这取决于您的FFT算法“在哪里”写入实部和虚部。

  4. N = min {E [k = 25..250]} * number_of_bins(= 250-25 + 1)

  5. S = sum {E [k = 25..250]}

  6. SNR =(S-N)/ N.级别为10 * log10(SNR)

  7. 由于SNR会随着时间的推移而变化,请使用一些新样本返回步骤1 - 可能会有一些重叠