概述
之前写了一篇短文《单通道语音增强之统计信号模型》讲了从统计信号处理的角度进行语音增强的各种方法。而单通道语音增强比较传统的方法是谱减法和维纳滤波, 在平稳噪声的条件下,能够获得较理想的去噪效果。这篇文章简单介绍了这两种方法, 更详细的原理可以参阅《语音增强--理论与实践》[1],里面各有一章详细分析了这两种模型。
假设麦克风采集到的带噪语音序列为
常用的语音增强方法都是在频域,需要对带噪信号
语音增强的目标是对实际信号
换句话说,语音增强就是要找出一个频域的实函数
下面是单通道语音增强系统主要步骤的示意图,系统目标就是估计抑制增益,而抑制增益依赖于两个核心步骤:语音检测VAD和噪声估计模块。只有准确估计噪声谱
综上,语音增强的典型流程就是:
1. 对带噪语音y[n]分帧, 每一帧进行DFT得到
2. 利用
3. 计算抑制增益
4. 抑制增益
5. 对
噪声估计模块可以估计噪声功率,也可以估计信噪比,避免信号幅度变化带来的误差。
定义后验信噪比:
定义先验信噪比:
谱减法 Spectral Subtraction
谱减法是最直观的去噪声思想,就是带噪信号减去噪声的频谱,就等于干净信号的频谱。估计信号频谱的表达式如下,其中
传统的语音增强算法都不恢复准确的相位,而是沿用测量信号$Y(omega_{k})$的相位,所以实际谱减法的公式为幅度谱相减:
其中
从幅度谱角度做谱减,是架设了测量信号和噪声的相位一样,引入了较大失真。 从功率谱角度做谱减,是更常用的方法。
假设语音信号与噪声不相关,于是得到估计的信号功率谱是测量信号功率谱减去估计的噪声功率谱。
因此抑制增益函数即为:
用后验信噪比表示:
用先验信噪比表示:
def spec_sub_gain(parameters=None):
ksi = parameters['ksi']
gain = np.sqrt( ksi / (1+ ksi)) # gain function
return gain
维纳滤波 Wiener Filtering
维纳滤波的思想也很直接,就是将带噪信号经过线性滤波器变换来逼近原信号,并求均方误差最小时的线性滤波器参数。 维纳滤波可以是在时域推导,也可以在频域推导。如第一部分所介绍,语音增强系统通常在频域处理信号,所以下面只讨论频域维纳滤波。
频域上,估计信号即为线性滤波器与输入信号的乘积。可见这个滤波器
均方误差为:
这是一个优化问题,目标是求使得均方误差最小的参数$H$
展开均方误差:
对
得到极值点:
求共轭后得到
带噪信号功率
用先验信噪比表示
用后验信噪比表示:
def wiener_gain(parameters=None):
ksi = parameters['ksi']
gain = ksi / (1+ ksi) # gain function
return gain
参考文献
[1] P. C. Loizou, Speech enhancement: theory and practice. CRC press, 2007.
[2] D.Wang and J. Lim, The unimportance of phase in speech enhancement," IEEE Transactions on Acoustics, Speech, and Signal Processing, vol. 30, no. 4, pp. 679-681, 1982.