语音增强------谱减法
原理介绍
假设
x
(
n
)
x\left( n \right)
x(n)为噪声污染的语音信号,其由纯净语音信号
s
(
n
)
s\left( n \right)
s(n)和加性噪声
d
(
n
)
d\left( n \right)
d(n)组成,即
x
(
n
)
=
s
(
n
)
+
d
(
n
)
x\left( n \right)=s\left( n \right)+d\left( n \right)
x(n)=s(n)+d(n)
两边同时做傅里叶变换可以得到
X
(
ω
)
=
S
(
ω
)
+
D
(
ω
)
X\left( \omega \right)=S\left( \omega \right)+D\left( \omega \right)
X(ω)=S(ω)+D(ω)
将
X
(
ω
)
X\left( \omega \right)
X(ω)表示为极坐标的形式
X
(
ω
)
=
∣
X
(
ω
)
∣
e
j
ϕ
x
(
ω
)
X\left( \omega \right)=\left| X\left( \omega \right) \right|{{e}^{j{{\phi }_{x}}\left( \omega \right)}}
X(ω)=∣X(ω)∣ejϕx(ω)
其中,
∣
X
(
ω
)
∣
\left| X\left( \omega \right) \right|
∣X(ω)∣为幅度谱,
ϕ
x
(
ω
)
{{\phi }_{x}}\left( \omega \right)
ϕx(ω)表示相位。
同样可以得到噪声的极坐标形式
D
(
ω
)
=
∣
D
(
ω
)
∣
e
j
ϕ
d
(
ω
)
D\left( \omega \right)=\left| D\left( \omega \right) \right|{{e}^{j{{\phi }_{d}}\left( \omega \right)}}
D(ω)=∣D(ω)∣ejϕd(ω)
一般来说,噪声的幅度谱
∣
D
(
ω
)
∣
\left| D\left( \omega \right) \right|
∣D(ω)∣是无法得到的,但是可以通过无语音活动时(如语音停顿间隙)的平均幅度谱来代替。类似地,噪声的相位
ϕ
d
(
ω
)
{{\phi }_{d}}\left( \omega \right)
ϕd(ω)可以用带噪语音的相位
ϕ
x
(
ω
)
{{\phi }_{x}}\left( \omega \right)
ϕx(ω)来代替。
因此可以得到增强后的语音信号的谱估计
S
^
(
ω
)
=
[
∣
X
(
ω
)
∣
−
∣
D
^
(
ω
)
∣
]
e
j
ϕ
x
(
ω
)
\hat{S}\left( \omega \right)=\left[ \left| X\left( \omega \right) \right|-\left| \hat{D}\left( \omega \right) \right| \right]{{e}^{j{{\phi }_{x}}\left( \omega \right)}}
S^(ω)=[∣X(ω)∣−∣∣∣D^(ω)∣∣∣]ejϕx(ω)
其中,
∣
D
^
(
ω
)
∣
\left| \hat{D}\left( \omega \right) \right|
∣∣∣D^(ω)∣∣∣是无语音活动时的噪声的幅度谱估计,增强后的语音信号可以简单通过对
S
^
(
ω
)
\hat{S}\left( \omega \right)
S^(ω)进行逆傅里叶变换得到。这就是谱减法的基本原理。
利用带噪语音的相位来代替增强后的语音信号的相位的原因是相位不会对语音的可懂度造成影响,只是可能在一定程度上影响语音的质量。
另外注意到,由于可能错误地估计噪声的幅度谱导致
∣
X
(
ω
)
∣
−
∣
D
^
(
ω
)
∣
\left| X\left( \omega \right) \right|-\left| \hat{D}\left( \omega \right) \right|
∣X(ω)∣−∣∣∣D^(ω)∣∣∣为负值,但是幅度谱应该为非负值,一个简单的解决办法是将负的谱置为零,即
S
^
(
ω
)
=
{
∣
X
(
ω
)
∣
−
∣
D
^
(
ω
)
∣
,
∣
X
(
ω
)
∣
>
∣
D
^
(
ω
)
∣
0
e
l
s
e
\hat{S}\left( \omega \right)=\left\{ \begin{aligned} & \left| X\left( \omega \right) \right|-\left| \hat{D}\left( \omega \right) \right|,\ \ \ \ \left| X\left( \omega \right) \right|>\left| \hat{D}\left( \omega \right) \right| \\ & 0\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ else \\ \end{aligned} \right.
S^(ω)=⎩⎨⎧∣X(ω)∣−∣∣∣D^(ω)∣∣∣, ∣X(ω)∣>∣∣∣D^(ω)∣∣∣0 else
上述是最基本的幅度谱减法的原理。
更一般的来说,谱减法可以写为
∣
S
^
(
ω
)
∣
p
=
∣
X
(
ω
)
∣
p
−
∣
D
^
(
ω
)
∣
p
{{\left| \hat{S}\left( \omega \right) \right|}^{p}}={{\left| X\left( \omega \right) \right|}^{p}}-{{\left| \hat{D}\left( \omega \right) \right|}^{p}}
∣∣∣S^(ω)∣∣∣p=∣X(ω)∣p−∣∣∣D^(ω)∣∣∣p
谱减法流程图
谱减法的缺点
1)由于对负值进行半波整流,导致帧频谱的随机频率上出现小的、独立的峰值,变换到时域上面,这些峰值听起来就像帧与帧之间频率随机变化的多颤音,也就是通常所说的“音乐噪声”(Musical Noise)
2)另外,谱减法还存在一个小缺点就是使用带噪语音的相位作为增强后语音的相位,因此产生语音的质量可能比较粗糙,尤其是在低信噪比的条件下,可能会达到被听觉感知的程度,降低语音的质量。
为了更好的理解谱减法语音增强,这里对该算法进行简单仿真,仿真参数设置如下
参数名称 | 参数值 |
---|---|
信噪比 | 5dB |
采样率 | 16KHz |
FFT点数 | 与数据长度一致 |
具体结果如下
从图中可以看出,原始干净语音的波形及语谱图都很清楚地显示了语音的特征;中间的图为带噪语音的波形和语谱图,在加噪的语音信号有明显的被污染,而且语谱图中也有加大的粗糙点;最下面的图为经过幅度谱减法增强后的语音信号信号,可以看出噪声被削减一部分,从语谱图中也可以看出原本带噪语音的粗糙的点被很大程度消减了。通过前面的介绍也可以看出,谱减法存在着一些固有的缺点,但是这种方法在最初的语音增强方面有着很大影响。
代码如下:
clear;
close all;
clc;
%% 读入数据
[signal,~]=audioread('clean.wav'); %读入干净语音
[noise,fs]=audioread('noise.wav'); %读入噪声
N=length(signal);
t=(0:N-1)/fs;
SNR=5; %信噪比大小
noise=noise/norm(noise,2).*10^(-SNR/20)*norm(signal);
x=signal+noise; %产生固定信噪比的带噪语音
%% 谱减法
noise_estimated=x(1:0.5*fs,1); %将前0.5秒的信号作为估计的噪声
fft_x=fft(x); %对加噪语音进行FFT
phase_fft_x=angle(fft_x); %取带噪语音的相位作为最终相位
fft_noise_estimated=fft(noise_estimated); %对噪声进行FFT
mag_signal=abs(fft_x)-sum(abs(fft_noise_estimated))/length(fft_noise_estimated); %恢复出来的幅度
mag_signal(mag_signal<0)=0; %将小于0的部分置为0
%% 恢复语音信号
fft_s = mag_signal .* exp(1i.*phase_fft_x);
s = ifft(fft_s);
figure(1)
subplot(321);
plot(t,signal);
axis([0 3 -1.5 1.5]);
title('干净语音');xlabel('时间/s');ylabel('幅度');
subplot(323);
plot(t,x);
axis([0 3 -1.5 1.5]);
title('带噪语音');xlabel('时间/s');ylabel('幅度');
subplot(325);
plot(t,real(s));
axis([0 3 -1.5 1.5]);
title('谱减法增强后的语音');xlabel('时间/s');ylabel('幅度');
subplot(322);
spectrogram(signal,256,128,256,16000,'yaxis');
subplot(324);
spectrogram(x,256,128,256,16000,'yaxis');
subplot(326);
spectrogram(s,256,128,256,16000,'yaxis');
可以选择MATLAB自带的函数绘制语谱图,可以得到如下结果
同理也可以得到以上的结论。
关于语音及噪声文件,具体请参考:语音信号处理常用语料库下载地址
参考文献
[1]Loizou P C . Speech Enhancement: Theory and Practice[M]. CRC Press, Inc. 2007.
[2]PhiliposC.Loizou. 语音增强:理论与实践:theory and practice[M]// 语音增强:理论与实践:theory and practice. 电子科技大学出版社, 2012.