基于短时幅度谱估计方法的数字语音信号增强matlab仿真

322 阅读3分钟

1.算法仿真效果

matlab2022a仿真结果如下:

98c3a8a60885e0e637d792924e835313_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

88b345498473f75915c5b8a0af995199_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png 2.算法涉及理论知识概要

        语音处理过程中受到各种各样噪声的干扰,不但降低了语音质量,而且还将使整个系统无法正常工作。因此,为了消除噪声干扰,在现代语音处理技术中,工业上一般采用语音增强技术来改善语音质量从而提高系统性能。基于短时幅度谱估计来研究语音增强,主要介绍了功率谱相减、维纳滤波法,并介绍了这几种语音增强方法的基本原理和实现方法。通过研究,我们得到在白噪声的条件下,这些语音增强方法具有很好的增强效果,可作为开发实用语音增强方法的基础。

 

2.1谱减法

      假定语音为平稳信号,而噪声和语音为加性信号且彼此不相关。此时带噪语音信号可表示为

 

914936a6934eb622f530adc082470541_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

4f24a18d95d2cc40156a222a9228c164_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png  

        上式中,下标w表示加窗信号,*表示复共轭。可以根据观测数据估计,其余各项必须近似为统计均值。由于n(t)和s(t)独立,则互谱的统计均值为0。为了用傅立叶逆变换再现语音,还需要的相位,这里用表示。此时可借用带噪语音相位,即的相位来近似。因而则恢复的语音是估值的傅立叶反变换,如下所示:

e3396b88ed3c37a2b7a6ec0df6b9dd23_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

2.2 语音增强——维纳滤波

       设维纳滤波器的输入为含噪声的随机信号。期望输出与实际输出之间的差值为误差,对该误差求均方,即为均方误差。因此均方误差越小,噪声滤除效果就越好。为使均方误差最小,关键在于求冲激响应。如果能够满足维纳-霍夫方程,就可使维纳滤波器达到最佳。根据维纳-霍夫方程,最佳维纳滤波器的冲激响应,完全由输入自相关函数以及输入与期望输出的互相关函数 所决定。

 

868d61c2d752006c60e50a1f7ab9b756_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

 

       这就是维纳滤波器(Wiener filter)。当信号x[n]和b[n]满足以上的假设条件时,维纳滤波的方法能够实现噪声抑制,并且不会引入很大的目标估计失真和背景残留噪声。所需要的功率谱和可以分别从时间序列x[n]与b[n]通过多帧平均得到。然而在实际中,目标信号和背景噪声都是非平稳的,也就是说,它们的功率谱会随着时间变化,即可以表示成时变函数和。因此,理想的情况是对每一帧信号的STFT采用不同的维纳滤波器进行滤波。在这里,我们考虑了平稳的背景噪声情况,时变的维纳滤波器可以表示成:

 

58af57e15c87dc2bb54bf8c784b8031f_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

  2ed579c742334c776c1314d94895bffa_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

       是对式做了压缩(开方)处理,所以谱减的一直效果不如维纳滤波方法。与谱减的另一个重要的区别是维纳滤波并不需要一个绝对的门限。由于噪声也是随机过程,因此这种估计只能建立在统计模型基础上。人耳感知对语音频谱分量的相位不敏感,因此目前的增强算法主要针对短时谱幅度。

 

3.MATLAB核心程序 `FrameLen=fix(0.025*fs);          %取25毫秒为一帧

overlap=FrameLen/2;

inc=FrameLen-overlap;            %帧移

x_frame=enframe(x,FrameLen,inc); %分帧

nf=size(x_frame,1);              % 帧数

win=hamming(FrameLen)';

x_window=[];

for k=1:nf

    x_row=x_frame(k,:).*win;     % 加窗

    x_window=[x_window;x_row];   

end

%对带噪语音进行DFT

y=fft(x_window');

ymag = abs(y);

yphase = angle(y);                          

NNoise=23;                      %取噪音段(语音的初始段)帧数

MN=mean(ymag(:,1:NNoise)')';

PN=mean(ymag(:,1:NNoise)'.^2)'; %初始噪声功率谱均值

 

NoiseCounter=0;%连续噪声段长度

SmoothFactor=9;%噪声平滑因子

Alpha=0.95;    %语音平滑因子

SNRPre=ones(size(MN));

 

%维纳滤波

for k=1:nf

     if k<=NNoise

        SpeechFlag=0;

        NoiseCounter=NNoise;

    else

           NoiseMargin=3;

           HangOver=8;

           SpectralDist= 20*(log10(ymag(:,k))-log10(MN));

           SpectralDist(find(SpectralDist<0))=0;

           Dist=mean(SpectralDist);

           if (Dist < NoiseMargin)

            NoiseFlag=1;

            NoiseCounter=NoiseCounter+1;

           else

            NoiseFlag=0;

            NoiseCounter=0;

           end

           if (NoiseCounter > HangOver)

           SpeechFlag=0;    

           else

           SpeechFlag=1;

           end

     end

    

    if SpeechFlag==0

        MN=(SmoothFactor*MN+ymag(:,k))/(SmoothFactor+1);      %更新噪声均值

        PN=(SmoothFactor*PN+(ymag(:,k).^2))/(1+SmoothFactor); %更新噪声功率

    end`