如何从包含语音的单个音频文件中估算SNR? 我知道两种方法:
log power histogram pecentile difference(又名“NIST快速方法”),如下所述:http://labrosa.ee.columbia.edu/~dpwe/tmp/nist/doc/stnr.txt
10 * log10((S-N)/ N),其中
有没有更好的方法不需要立体声数据(或干净和嘈杂版本的数据)?我还想避免在NIST文档(见1.)中描述的“第二种方法”,该方法对分布做出了强有力的假设。
答案 0 :(得分:5)
人声使用300 Hz至3 kHz的频率。这就是(旧的)电话系统正在使用的。人声从不使用所有这些频率,这就是为什么我们可以进行频率分析以找到本底噪声 - 没有任何参考或语音活动检测e [i]:
计算FFT,频率分辨率为~10 - 20 Hz。 对于48 kHz的采样率,您将使用FFT长度的采样率/分辨率= 4800个样本,这应该四舍五入到最接近的2的幂,即4096
确定保持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。
计算每个必要箱中的能量:E [k] = FFT [k] .re ^ 2 + FFT [k] .im ^ 2。这取决于您的FFT算法“在哪里”写入实部和虚部。
N = min {E [k = 25..250]} * number_of_bins(= 250-25 + 1)
S = sum {E [k = 25..250]}
SNR =(S-N)/ N.级别为10 * log10(SNR)
由于SNR会随着时间的推移而变化,请使用一些新样本返回步骤1 - 可能会有一些重叠