当前位置:   article > 正文

传统语音增强——基于先验信噪比的维纳滤波语音降噪算法_降噪先验信噪比

降噪先验信噪比

一、基于先验信噪比的维纳滤波语音降噪算法的基本概念 

改进的维纳滤波器为基于先验信噪比的维纳滤波器,其原理框图下图所示。

对于第m帧带噪语音信号ym(n)=sm(n)+nm(n)
式中,sm(n)是第m帧纯净语音信号;nm(n)为第m帧噪声信号。维纳滤波器就是在最小方均误差准则(MSE)下实现对语音信号sm(n)的估计。在sm(n)与nm(n)不相关且均为平稳随机过程条件下,对上式进行离散傅里叶变换,得Y(m,k)=S(m,k)+N(m,k)
谱增益函数为

式中,ζ(m,k)(SNRpo)为先验信噪比;m为帧号;k为频点。

则第m帧增强语音可表示为

采用直接判决(Decision-Directed)法来估计先验信噪比SNRprio,即
SNRprio(m,k)=a・ SNRprio(m-1,k)+(1-a) ・max(SNRpost(m,k) -1,0)

式中,SNRpost表示后验信噪比;Y(m,k)表示估计的第m帧信号的功率谱;\hat{N}(m,k)表示估
计的第m帧噪声功率谱。

二、先验信噪比的维纳滤波语音增强实验

先验信噪比的维纳滤波函数Weina_Im

名称:Weina_Im
功能:基于先验信噪比的维纳滤波算法。
调用格式:
enhanced = Weina_Im(x,wind,inc,NIS,alpha)
说明:输入参数x是输入的含噪语音信号;wlen为窗函数或窗长;inc是帧移;NIS是前导无话段帧数;alpha是信噪比平滑参数。enhanced是降噪后的信号。

函数代码如下:

  1. % 维纳滤波enhancement=Weina_Im(y_fft,framesize,framenum,length);
  2. % MS估计噪声功率谱, D-D法估计先验概率, 不需要估计纯净信号功率
  3. % y_fft:分帧语音的FFT变换,
  4. % framesize:帧长
  5. % framenum:总帧数,
  6. % length:语音长度
  7. % enhancement:增强后的语音
  8. % --------------------------------------------------------------------------------------------------------------
  9. function enhancement=Weina_Im(x,wind,inc,NIS,alpha)
  10. Length=length(x);
  11. nwin=length(wind); % 取窗长
  12. if (nwin == 1) % 判断窗长是否为1,若为1,即表示没有设窗函数
  13. framesize= wind; % 是,帧长=win
  14. wnd=hamming(framesize); % 设置窗函数
  15. else
  16. framesize = nwin; % 否,帧长=窗长
  17. wnd=wind;
  18. end
  19. y=enframe(x,wnd,inc)'; % 分帧
  20. framenum=size(y,2); % 求帧数
  21. y_fft = fft(y); % FFT
  22. y_a = abs(y_fft); % 求取幅值
  23. y_phase=angle(y_fft); % 求取相位角
  24. y_fft2=y_a.^2; % 求能量
  25. noise=mean(y_fft2(:,1:NIS),2); % 计算噪声段平均能量
  26. snr_x_q=0.96; %前一帧先验信噪比,初始值设为0.96
  27. for i=1:framenum
  28. Mag_y=y_a(:,i);
  29. snr_h=y_fft2(:,i)./noise;%(:,i); %计算后验信噪比
  30. snr_x=alpha.*snr_x_q+(1-alpha).*max(snr_h-1,0); %先验信噪比,利用"D-D"法 ,framesize*1
  31. Hw=snr_x./(1+snr_x); %维纳滤波
  32. M=Mag_y.*Hw; %维纳后的幅度值
  33. Mn=M.*exp(1i.*y_phase(:,i)); %插入相位
  34. snr_x_q=M.^2./noise;%(:,i); %更新估计的前一帧先验信噪比
  35. signal(:,i)=real(ifft(Mn));
  36. end
  37. enhancement=filpframe(signal',wnd,inc);

信噪比计算函数SNR_Calc

名称:SNR_Calc
功能:计算信噪比。
调用格式:
snr=SNR_Calc(x,xn)

说明:输入信号x是输入的纯净语音信号;xn是输入的含噪信号。输出参数snr是计算的信噪比。

函数程序如下:

  1. function snr=SNR_Calc(I,In)
  2. % 计算带噪语音信号的信噪比
  3. % I 是纯语音信号
  4. % In 是带噪的语音信号
  5. % 信噪比计算公式是
  6. % snr=10*log10(Esignal/Enoise)
  7. I=I(:)'; % 把数据转为一列
  8. In=In(:)';
  9. Ps=sum((I-mean(I)).^2); % 信号的能量
  10. Pn=sum((I-In).^2); % 噪声的能量
  11. snr=10*log10(Ps/Pn); % 信号的能量与噪声的能量之比,再求分贝值

案例、用先验信噪比的维纳滤波算法给语音减噪

程序如下:

  1. clear all; clc; close all;
  2. [xx, fs] = wavread('C5_3_y.wav'); % 读入数据文件
  3. xx=xx-mean(xx); % 消除直流分量
  4. x=xx/max(abs(xx)); % 幅值归一化
  5. IS=0.25; % 设置前导无话段长度
  6. wlen=200; % 设置帧长为25ms
  7. inc=80; % 设置帧移为10ms
  8. SNR=5; % 设置信噪比SNR
  9. NIS=fix((IS*fs-wlen)/inc +1); % 求前导无话段帧数
  10. alpha=0.95;
  11. signal=awgn(x,SNR,'measured','db'); % 叠加噪声
  12. output=Weina_Im(x,wlen,inc,NIS,alpha) ;
  13. output=output/max(abs(output));
  14. len=min(length(output),length(x));
  15. x=x(1:len);
  16. signal=signal(1:len);
  17. output=output(1:len);
  18. snr1=SNR_Calc(x,signal); % 计算初始信噪比
  19. snr2=SNR_Calc(x,output); % 计算降噪后的信噪比
  20. snr=snr2-snr1;
  21. fprintf('snr1=%5.4f snr2=%5.4f snr=%5.4f\n',snr1,snr2,snr);
  22. % 作图
  23. time=(0:len-1)/fs; % 设置时间
  24. subplot 311; plot(time,x,'k'); grid; axis tight;
  25. title('纯语音波形'); ylabel('幅值')
  26. subplot 312; plot(time,signal,'k'); grid; axis tight;
  27. title(['带噪语音 信噪比=' num2str(SNR) 'dB']); ylabel('幅值')
  28. subplot 313; plot(time,output,'k');grid;%hold on;
  29. title('滤波后波形'); ylabel('幅值'); xlabel('时间/s');

运行结果如下:

实验使用到的语音数据下载链接如下:

传统语音增强——最小方均(LMS)自适应滤波算法-数据集文档类资源-CSDN下载

参考文献:语音信号处理实验教程;梁瑞宇、赵力、魏昕(编著) 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/117350
推荐阅读
相关标签
  

闽ICP备14008679号