传统语音增强——基本的维纳滤波语音降噪算法

这篇具有很好参考价值的文章主要介绍了传统语音增强——基本的维纳滤波语音降噪算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、维纳滤波的基本原理
基本维纳滤波就是用来解决从噪声中提取信号问题的一种过滤(或滤波)方法。它基于平稳随机过程模型,且假设退化模型为线性空间不变系统的。实际上这种线性滤波问题,可以看成是一种估计问题或一种线性估计问题。基本的维纳滤波是根据全部过去的和当前的观察数据来估计信号的当前值,它的解是以均方误差最小条件下所得到的系统的传递函数H(z)或单位样本响应h(n)的形式给出的,因此更常称这种系统为最佳线性过滤器或滤波器。设计维纳滤波器的过程就是寻求在最小均方误差下滤波器的单位样本响应h(n)或传递函数H(z)的表达式,其实质是解维纳-霍夫(Wiener-Hopf)方程。

设带噪语音信号为x(n)=s(n)+v(n)
其中,x(n)表示带噪信号;v(n)表示噪声。则经过维纳滤波器h(n)的输出响应y(n)为

传统语音增强——基本的维纳滤波语音降噪算法

理论上,x(n)通过线性系统h(n)后得到的y(n)应尽量接近于s(n),因此y(n)为s(n)
的估计值,可用  表示,即

传统语音增强——基本的维纳滤波语音降噪算法

从上式可知,卷积形式可以理解为从当前和过去的观察值x(n),x(n-1),x(n-2)…x(n-m),…来估计信号的当前值。因此,用h(n)进行滤波实际上是一种统计估计问题。

按最小均方误差准则使和s(n)的均方误差ξ=E[e^2(n)]=E[{s(n)-}^2]
达到最小。使ξ最小的充要条件是ξ对于h(n)的偏导数为零,即

传统语音增强——基本的维纳滤波语音降噪算法

上式整理可得

传统语音增强——基本的维纳滤波语音降噪算法

这就是正交性原理或投影原理。可得

传统语音增强——基本的维纳滤波语音降噪算法

已知,s(n)和d(n)是联合宽平稳的,因此令x(n)的自相关函数Rx(m-l)=E{x(n-m)x(n-l)},s(n)与x(n)的互相关函数Rsx(m)=E{s(n)x(n-m)},则上式可变为

传统语音增强——基本的维纳滤波语音降噪算法

上式称为维纳滤波器的标准方程或维纳-霍夫(Wiener-Hopf)方程。如果已知Rsx(m)和Rx(m-l),那么解此方程即可求得维纳滤波器的冲激响应。

当l从0到N-1取有限个整数值时,设滤波器冲激响应序列的长度为N,冲激响应矢量为

传统语音增强——基本的维纳滤波语音降噪算法

滤波器输入数据矢量为

传统语音增强——基本的维纳滤波语音降噪算法

则滤波器的输出为

传统语音增强——基本的维纳滤波语音降噪算法

 这样,上式所示的维纳-霍夫方程可写成Q = Rh
其中,Q=E[x(n)s(n)]是s(n)与x(n)的互相关函数,它是一个N维列矢量;R是x(n)的自相关函数,是N阶方阵R=E[x(n)x^T(n)],则最优的维纳滤波器的冲激响应为hopt=R^(-1)Q

如果进行傅里叶变换可得

传统语音增强——基本的维纳滤波语音降噪算法

式中,Px(k)为x(n)的功率谱密度;Psx(k)为x(n)与s(n)的互功率谱密度。
由于v(n)与s(n)互不相关,即Rsv(k)=0,则可得

传统语音增强——基本的维纳滤波语音降噪算法

此时,上可变为

传统语音增强——基本的维纳滤波语音降噪算法

该式为维纳滤波器的谱估计器。此时,的频谱估计值为

传统语音增强——基本的维纳滤波语音降噪算法

此外,H(k)还可以写为

传统语音增强——基本的维纳滤波语音降噪算法

式中,λs(k)和λv(k)分别为第k个频点上的信号和噪声的功率谱。
传统的维纳滤波法需要估计出纯净语音信号的功率谱,一般用类似谱减法的方法得到,
即用带噪语音功率谱减去估计到的噪声功率谱,这种方法会存在残留噪声大的问题。

二、维纳滤波语音增强实验

基本维纳滤波函数Weina_Norm

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

函数程序如下:

% 维纳滤波 enhanced=Weina_Norm(x,wind,inc,NIS,alpha,beta)
% MS估计噪声功率谱,需要估计纯净信号功率Ps
% x:输入语音信号
% framesize:帧长
% overlap:帧重叠长度
% NIS:无声帧帧数
% alpha,beta:抑制参数
% ---------------------------------------------------------------------------------------------------------------
 %%
function enhanced=Weina_Norm(x,wind,inc,NIS,alpha,beta)
    nwin=length(wind);           % 取窗长
    if (nwin == 1)              % 判断窗长是否为1,若为1,即表示没有设窗函数
       framesize= wind;               % 是,帧长=win
       wnd=hamming(framesize);                      % 设置窗函数
    else
       framesize = nwin;              % 否,帧长=窗长
       wnd=wind;
    end
    
    y=enframe(x,wnd,inc)';             % 分帧
    framenum=size(y,2);                           % 求帧数
    y_fft = fft(y);                         % FFT
    y_a = abs(y_fft);                       % 求取幅值
    y_phase=angle(y_fft);                   % 求取相位角
    y_a2=y_a.^2;                            % 求能量
    noise=mean(y_a2(:,1:NIS),2);               % 计算噪声段平均能量
    signal=zeros(framesize,1);
    for i=1:framenum
         frame=y(:,i);                                 %取一帧数据
         y_fft=fft(frame);                 %对信号帧y_ham进行短时傅立叶变换,得到频域信号y_fft
         y_fft2=abs(y_fft).^2;     %计算频域信号y_fft每帧的功率谱y_w
     
         %带噪语音谱减去噪声谱
         for k=1:framesize
                if   abs( y_fft2(k) )  >=alpha*noise(k)%(k,i)
                      signal(k)=y_fft2(k)-alpha*noise(k);%(k,i);
                      if signal(k)<0
                          signal(k)=0;
                      end
                else
                      signal(k)=beta*noise(k);%*0.01;
                end
                
         end
         %计算H(W)
         Hw=( signal./(signal+1*noise) ).^1 ;
         %维纳滤波器输出
         yw(:,i)=Hw.*y_fft;
         yt(:,i)=ifft(yw(:,i));
    end
  %采用相位,反而信噪比低
    enhanced=filpframe(yt',wnd,inc);

信噪比计算函数SNR_Calc

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

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

函数程序如下:

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

 案例、用基本的维纳滤波算法给语音减噪

程序如下:

clear all; clc; close all;

[xx, fs] = audioread('C5_3_y.wav');           % 读入数据文件
xx=xx-mean(xx);                         % 消除直流分量
x=xx/max(abs(xx));                      % 幅值归一化
IS=0.25;                                % 设置前导无话段长度
wlen=200;                               % 设置帧长为25ms
inc=80;                                 % 设置帧移为10ms
SNR=5;                                  % 设置信噪比SNR
NIS=fix((IS*fs-wlen)/inc +1);           % 求前导无话段帧数
alpha=2;
beta=0.01;
signal=awgn(x,SNR,'measured','db');               % 叠加噪声
output=Weina_Norm(x,wlen,inc,NIS,alpha,beta) ;
output=output/max(abs(output));
len=min(length(output),length(x));
x=x(1:len);
signal=signal(1:len);
output=output(1:len);

snr1=SNR_Calc(x,signal);            % 计算初始信噪比
snr2=SNR_Calc(x,output);            % 计算降噪后的信噪比
snr=snr2-snr1;
fprintf('snr1=%5.4f   snr2=%5.4f   snr=%5.4f\n',snr1,snr2,snr);

% 作图
time=(0:len-1)/fs;                        % 设置时间
subplot 311; plot(time,x,'k'); grid; axis tight;
title('纯语音波形'); ylabel('幅值')
subplot 312; plot(time,signal,'k'); grid; axis tight;
title(['带噪语音 信噪比=' num2str(SNR) 'dB']); ylabel('幅值')
subplot 313; plot(time,output,'k');grid;%hold on;
title('滤波后波形'); ylabel('幅值'); xlabel('时间/s');

 运行结果如下:

传统语音增强——基本的维纳滤波语音降噪算法

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

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

参考文献:语音信号处理实验教程;梁瑞宇、赵力、魏昕(编著) 文章来源地址https://www.toymoban.com/news/detail-441915.html

到了这里,关于传统语音增强——基本的维纳滤波语音降噪算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 低照度图片增强——传统算法

    光照因素一直是影响成像质量的一个关键因素,夜间等光照环境较差的条件下的图片往往细节丢失、分辨不清,信噪比低下。低照度图像增强是指通过一系列算法和技术,增强在低照度或弱光条件下拍摄的图像的可视化质量。本文主要介绍一些传统的低照度图像增强算法,给

    2024年02月08日
    浏览(28)
  • 点云传统滤波算法

    本文介绍了各种滤波算法的原理以及给出了相关实现方法。 分割功能滤波是一种常用的点云处理方法,可以将点云数据分割为不同的部分,以便对每个部分进行独立处理。 直通滤波(PassthroughFilter)是一种常用的点云滤波方法,其主要目的是将点云数据在某个维度上的数据范

    2024年02月14日
    浏览(30)
  • 【使用维纳滤波进行信号分离】基于维纳-霍普夫方程的信号分离或去噪维纳滤波器估计(Matlab代码实现)

     💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码实现 维纳滤

    2024年02月14日
    浏览(39)
  • 图像处理---逆滤波和维纳滤波

    本文主要介绍退化图像复原的两种方法:逆滤波和维纳滤波。 图像退化的表达式: g ( x , y ) = h ( x , y ) ⊙ f ( x , y ) + η ( x , y ) begin{aligned} g(x,y)=h(x,y)odot f(x,y)+eta(x,y) end{aligned} g ( x , y ) = h ( x , y ) ⊙ f ( x , y ) + η ( x , y ) ​ f ( x , y ) : f(x,y): f ( x , y ) : 输入图像 h ( x , y ) : h(x

    2024年02月04日
    浏览(31)
  • 【滤波专题-第7篇】“类EMD”算法分解后要怎样使用(3)——EMD降噪方法及MATLAB代码实现

    使用EMD分解(以及其他“类EMD”分解方法,以下为了简便统称EMD)做信号降噪,是EMD的一个比较重要的应用方向。EMD可以将复杂的信号分解为一系列的固有模态函数(IMFs),每一个IMF都包含了信号的一部分频率信息。在信号降噪的过程中,如何选择和筛选IMFs是关键步骤之一

    2024年02月16日
    浏览(30)
  • 语音增强——基本谱减法及其python实现

    参考视频: https://www.bilibili.com/video/BV1eV411W7V4/?spm_id_from=333.788vd_source=77c874a500ef21df351103560dada737 语音增强(去噪):消除语音中的噪声,增加语音听感与可懂度。 顾名思义,谱减法,就是用带噪信号的频谱减去噪声信号的频谱。谱减法基于一个简单的假设:假设语音中的噪声只

    2024年02月09日
    浏览(24)
  • 运用维纳滤波实现图像去模糊(OpenCV实现)

    目录 一、背景描述 二、技术应用 三、实际处理 (1)对运动模糊的处理 处理效果 (2)对均值模糊的处理 处理效果 (3)对高斯模糊的处理 处理效果 (4)对运动模糊+高斯噪声的处理 处理效果  四、振铃现象 五、总结 图像去模糊 是低级计算机视觉中的一个经典问题,它的

    2024年02月03日
    浏览(28)
  • 语音增强的算法及应用

            语音增强的目的是从带噪语音中提取尽可能纯净的原始语音,主要目标是提高语音质量和可懂度。这一领域的发展历程相当丰富,多年来,学者们一直在努力寻求各种优良的语音增强算法。         在近年的研究中,各种语音增强方法不断被提出,如基于小波

    2024年02月07日
    浏览(29)
  • 统计信号处理-使用维纳滤波和逆滤波对图像进行恢复-matlab仿真-附代码

    题目 将维纳滤波应用于图像恢复,假设退化图像为一加性高斯白噪声污染的图像,试用逆滤波方法和维纳滤波方法恢复图像,并比较其效果;查阅文献,尝试使用迭代维纳滤波的方法进一步提高效果,注意构建正确的修正项。 逆滤波用于图像恢复简介 逆滤波法是一种从添加

    2024年02月05日
    浏览(39)
  • 数字图像处理——图像退化(大气湍流模型与运动模糊模型)与图像复原(逆滤波与维纳滤波)

    一般来说,图像的退化模型可以表示为 其中g(x,y) 表示退化后的图像,h(x,y)表示退化模型,f(x,y)表示原图像,n(x,y)表示噪声。 在频域上面可以表示为 下面介绍常见的两种退化模型:基于大气湍流物理特性的大气湍流模型和运动模糊模型。 1.大气湍流模型 退化模型: 伴随着

    2024年02月05日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包