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

Pav*_*vel 1 algorithm signal-processing

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

  1. log power histogram pecentile difference(又名"NIST quick method"),如下所述:http://labrosa.ee.columbia.edu/~dpwe/tmp/nist/doc/stnr.txt

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

    • S = sum {x [i] ^ 2*e [i]}
    • N = sum {x [i] ^ 2*(1-e [i])}
    • e [i]某种语音活动检测(语音/非语音指示符)

有没有更好的方法不需要立体声数据(或干净和嘈杂版本的数据)?我还想避免NIST文档中描述的"第二种方法"(见1.)对分布做出了强有力的假设.

小智 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的结果.对于48kHz以上的输入和FFT长度4096,这是k(300Hz)= 300*4096/48000~ = 25并且k(3000Hz)= 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 =总和{E [k = 25..250]}

  6. SNR =(SN)/ N. 等级为10*log10(SNR)

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