从音频信号中去除有界噪声

信息处理 声音的 噪音 过滤 去噪
2022-02-16 21:13:33

我目前正在尝试从“受污染”的音频文件中消除一些噪音。根据给出的信息,我知道噪声被隔离到一个特定的频带——即从 ~1400 Hz 到 ~1800 Hz。

最直接的方法显然是实现一个阻带滤波器——我已经成功地做到了。但是,我想探索替代选项,即带通滤波器也可以消除所需信号。

这是我到目前为止所做的:

在 MATLAB 中,我探索了信号的某些方面,例如它的功率谱、自相关等:

在此处输入图像描述

在此处输入图像描述

很明显,噪声集中在我上面提到的频带中,并且看起来噪声是高斯的。

我最初的想法是应用频谱减法方法,例如 Ephraim-Malah 算法,但这种方法做出的假设之一是基础噪声是高斯白噪声。在我拥有的文件中,噪声仅限于特定频段,而不是整个信号。我担心的是,如果我要应用该算法,我会无意中对信号的潜在良好部分引入轻微失真。

目前,我正在考虑将信号分成两部分:使用阻带滤波器来提取不受影响的频率,并使用带通滤波器来捕获噪声区域,将算法应用于后一个频段,然后重新组合信号。

这是一种合适的方法,还是我可以使用更简单和/或更好的方法?

笔记:

因为我知道噪音是什么,所以我可能会使用 Weiner 滤波器。

4个回答

如果您有一些关于噪声的先验信息,例如频带,您可以简单地实现一个噪声消除算法,重点是消除该频带上的噪声(我的意思是使用某种加权的噪声消除过程)。

一种不错的方法是加权多波段频谱减法(这不是唯一的方法,实际上这些加权方法有很多变化)。MBSS 的改进是由于多频带语音考虑了有色噪声对语音频谱的非线性影响,即某些频率比其他频率受到的影响更大。多频带频谱减法(MBSS)方法比其他方法(例如传统的功率谱减法)提供了明确的改进。

语音频谱被划分为$N$个不重叠的频带,并且频谱减法被独立地应用于每个频带。第 i 个频带中的干净语音频谱的估计可以通过以下公式获得:N non-overlapping bands and spectral subtraction is applied to each band independently. The estimation of the clean speech spectrum in i'th band can be obtained from:

|x(ω)|2=|y(ω)|2αiδi|d(ω)|2

为了

ci<ω<ci+1

其中 $ c_i $ 和 $ c_{i+1}$ 分别是开始和结束频段(您的特定频段)。在第 i 个频带中,$\alpha_i$ 是过减因子,$\delta_i$ 是单独控制每个频带中的噪声去除特性的因子。因此,您可以设置系数以消除音频信号中的有界噪声。ci and ci+1 are the beginning and ending frequency band (your specific band) respectively. In the i'th band, αi is the over-subtraction factor and δi is factor to control noise removal properties in each band individually. So you can set coefficient to remove the bounded noise from an audio signal.

如需更多帮助,您可以阅读本文:

Sunil D. Kamath,Philipos C. Loizou,“一种用于增强被有色噪声破坏的语音的多波段频谱减法方法”,Proc。IEEE国际。会议。声学,语音,信号处理,卷。4,2002 年 7 月。

Reaper数字音频工作站 (DAW) 软件有一个ReaFIR插件,可以从样本中学习噪声的频谱分布,并且可以进行频谱“减法” 我上次检查时,您可以免费试用。

绝对可以使用光谱减法方法。需要满足的基本假设是噪声近似静止或仅缓慢变化。请注意,频谱减法是通过修改每个频率仓的幅度在频域中执行的。如果您事先知道噪声仅存在于某个频带中,则可以仅在该频带中应用频谱减法,而保持所有其他频率区间不变。

一个简单但相当有效的方法是移动平均线

基本上,您使用确定数量的前向和后向值来取噪声信号的平均值。如果 $x$ 是您的噪声信号并且 $y$ 是移动平均线的输出,并且您选择平均长度为 5: $$ y(k) = \frac{1}{5} \big{(}x (k-2) + x(k-1)+x(k)+x(k+1)+x(k+2)\big{)}$$x is your noisy signal and y is the output of the moving average, and you choose an averaging length of 5:

y(k)=15(x(k2)+x(k1)+x(k)+x(k+1)+x(k+2))