我正试图对音频流中存在的静态或噪音量进行定性处理。流的正常内容是语音或音乐。
我一直在尝试使用样本的stddev,这确实让我能够处理语音与空信道噪声的存在(即高级stddev通常表示语音或音乐)
想知道是否有其他人对此有一些指示。
答案 0 :(得分:3)
峰值不能给你答案吗?如果您正在查看来自良好ADC的信号,则环境水平应为1或10的计数,而语音或音乐将达到数千个计数。是否有某种自动增益控制使这种策略不起作用?
如果您需要更复杂的东西,峰值与RMS之比可能比简单的RMS级别(RMS = stddev)更可靠。纯噪声的比例约为3-5,而正弦曲线的峰值与RMS之比为1.4。但是,通过查看信号的spectrum,您可以获得更多的歧视。静态通常是光谱平滑甚至是平坦的,而声音和音乐是光谱结构的。所以傅里叶变换可能就是你要找的东西。假设信号x包含0.5秒的数据,这里有一些Matlab代码:
Sx = fft(x .* hann(length(x), 'periodic'))
HANN函数应用Hann窗口来减少频谱泄漏,而FFT函数快速计算傅立叶变换。现在你有几个选择。如果要确定信号x是由静态还是语音/音乐组成,请采用频谱的峰值与RMS之比:
pk2rms = max(abs(Sx))/sqrt(sum(abs(Sx).^2)/length(Sx))
我希望纯静电的峰值与RMS之比大约为3-5(再次),而语音/音乐至少要高出一个数量级。这利用了纯白噪声在时域和频域具有相同“结构”的事实。
如果您想获得噪声水平的数值估算,您可以使用平均值计算Sx随时间的功率:
Gxx = ((k-1)*Gxx + Sx.*conj(Sx))/k
随着时间的推移,Gxx中的峰值应该来去,但是您应该看到与噪声基底相对应的恒定最小值。通常,音频谱在dB(对数垂直)范围内更容易查看。
一些注意事项:
我为x的长度选择了0.5秒,但我不确定这里的最佳值是多少。如果选择的值太短,x将没有太多结构。在这种情况下,信号的直流分量将具有很大的能量。我希望您仍然可以使用峰值到RMS鉴别器,但是,如果您首先在Sx中输出与DC相对应的bin。
2.我不确定k的值是多少,但该等式对应exponential averaging。您可以尝试使用k来计算出最佳值。这可能最适合使用短x。
答案 1 :(得分:0)
有各种各样的噪音。白色,粉红色,棕色。噪音可能来自很多地方。是60赫兹的嗡嗡声还是信号?
对于白噪声,我会查看fft并找到最低值来查看你的本底噪声。