【问题标题】:methods for estimating SNR of an audio file?估计音频文件信噪比的方法?
【发布时间】:2011-11-16 11:12:11
【问题描述】:

如何从包含语音的单个音频文件中估算 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] 某种语音活动检测(语音/非语音指示器)

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

【问题讨论】:

  • 给定一个单通道、单版本的音频文件,并且不假设噪声分布,你将如何区分信号和噪声?
  • 假设是可以的,但在“第二种方法”中它们非常强大。无论如何,期待高能量值的语音和低能量值的噪音是好的。
  • 2.你必须固定重量。因为对于 N,您仅对静音时段和 S 仅对语音时段求和。 (现在,如果您少说话,您的 SNR 会有所不同)
  • 好的,谢谢!你是对的,如果 e[i] 是一个二元函数,但一般来说,如果它在整个范围 [0..1] 上定义,则归一化项 (1/L) 会抵消,对吧?
  • @Pavel:我怀疑你可以创建一个非二进制函数来给出正确的结果。为此,您必须知道 SNR。

标签: algorithm signal-processing


【解决方案1】:

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

  1. 以 ~ 10 - 20 Hz 的频率分辨率计算 FFT。 对于 48 kHz 的采样率,您将使用采样率/分辨率 = 4800 个样本的 FFT 长度,这应该四舍五入到最接近的 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. 计算每个必要 bin 中的能量: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. 信噪比 = (S-N)/N。级别为 10*log10(SNR)

  7. 随着 SNR 随时间变化,返回第 1 步,获取一些新样本 - 可能有一些重叠

【讨论】:

    猜你喜欢
    • 2019-02-27
    • 2015-07-16
    • 2018-11-20
    • 2014-10-25
    • 2014-07-25
    • 1970-01-01
    • 2015-07-25
    • 1970-01-01
    • 2018-07-18
    相关资源
    最近更新 更多