参考代码:Noise reduction using spectral gating in python
算法步骤:
语谱图
选取一个音频信号进行分析和处理,可以看到音频信号的语谱图上有很多白色或接近白色的像素。白色像素表示信号的平均功率或其他统计特性的值为0或者接近0.一般在加性高斯白噪声的情况下,白色像素代表的区域是噪声。
滤波器
如频谱图所示,信号在8kHz处有一个需要被去除的噪声,可以使用一个低通滤波器进行滤波,不影响其他频谱,衰减8kHz处的频谱,得到以下频谱图。
同理,我们如果要通过语谱图达到降噪效果,需要做的就是不影响彩色的有效信号像素,衰减白色或接近白色的噪声像素。就像滤波器把频谱图低频信号保留,抠出高频噪声扔掉,语谱图则是保留彩色像素,抠出浅色像素扔掉。像是一个二维滤波器。
Mask
Mask是图像处理里比较常用的一种抠图算法。简要原理如下图所示(图片有参考)。
平滑处理
如图所示,用于平滑处理mask的滤波器。
音频降噪的mask的值不只是0和1,通过平滑处理之后取值范围在[0,1]区间。这样恢复的音频更流畅。
信号恢复
通过原来的语谱图和mask bitmap做运算得到masked map如图所示。可见相比于原来的语谱图,大量浅色像素被掩蔽。
经过恢复得到恢复后信号语谱图。
做逆运算即可得到信号的时域情况,对比如下。
1.原始音频
2.加噪声后音频
3.降噪恢复音频
经过播放.WAV文件,加噪信号有明显的噪声干扰,降噪信号几乎没有噪声,恢复效果良好。对于加性噪声,mask降噪具有很不错的效果。