⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wiener.m

📁 这是本人编写的一个利用维纳滤波实现语音增强的程序.在输入语音信噪比不是很低的情况下,效果不错.
💻 M
字号:
function enhancedsignal=wiener(noisyspeech,samplefrequency)
x=noisyspeech;
fs=samplefrequency;
nx=length(x);
enhanced_x=zeros(1,nx);

%分帧和加窗
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
%------滤波
SNRNew=(ymag(:,k).^2)./PN-1;
SNRPost=Alpha*SNRPre+(1-Alpha).*max(SNRNew,0); %由上一帧的增益,原始语音,噪声功率求得SNR,再平滑并确定SNR
Gain=SNRPost./(SNRPost+1);
smag=Gain.*ymag(:,k);
SNRPre=smag.^2./PN;  %备下一帧用
%------重新生成谱
spectrum= smag.*exp(j*yphase(:,k));
%------重新生成语音
enhanced_x((inc*(k-1)+1):(inc*(k-1)+FrameLen))=enhanced_x((inc*(k-1)+1):(inc*(k-1)+FrameLen))+real(ifft(spectrum,FrameLen))';
end
enhancedsignal=enhanced_x;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -