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

2023-11-14

一、维纳滤波的基本原理
基本维纳滤波就是用来解决从噪声中提取信号问题的一种过滤(或滤波)方法。它基于平稳随机过程模型,且假设退化模型为线性空间不变系统的。实际上这种线性滤波问题,可以看成是一种估计问题或一种线性估计问题。基本的维纳滤波是根据全部过去的和当前的观察数据来估计信号的当前值,它的解是以均方误差最小条件下所得到的系统的传递函数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)
的估计值,可用 \hat{s}(n) 表示,即

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

\hat{s}(n)按最小均方误差准则使\hat{s}(n)和s(n)的均方误差ξ=E[e^2(n)]=E[{s(n)-\hat{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,则可得

此时,上可变为

该式为维纳滤波器的谱估计器。此时,\hat{s}(n)的频谱估计值为

此外,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下载

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 飞行汽车比无人驾驶更早到来?清华猛狮团队研制出陆空两栖自主驾驶飞车

    清华猛狮无人驾驶实验室一年前启动无人驾驶飞车研制项目 一年时间内 第一代研发样机已在河北清华发展研究院固安分院与延庆山区试飞成功 了解无人车挑战赛的人 对清华猛狮无人智能车团队并不陌生 它是由清华大学车辆与运载学院和清华大学计算科学与技术系
  • Yarn介绍及快速安装 - Debian/Ubuntu Linux

    1 Yarn介绍 Yarn 是一个用于管理 JavaScript 包的快速 可靠和安全的包管理器 它是由 Facebook Google Exponent 和 Tilde 团队共同开发的 旨在提供比 npm 更快速 可靠的包管理体验 以下是
  • IBM小型机(AIX)技术手册(一)

    2007年7月 2008年7月在北京中软国际的工作时总结的IBM小型机技术手册 AIX基本命令 创建文件夹 Mkdir 名称 查看硬件信息 prtconf 查看卷组 lsvg o 查看进程 ps ef grep 名称 如 socket等 查
  • python模拟鼠标拖动滑块_Python+Selenium 拖动滑块 (一)

    在我们登录账号中常常会遇到各种验证码 如图片验证码 拖动滑块验证 滑块验证码只需要用户使用鼠标将滑块从某个位置拖动到另一个位置即可 程序通过记录用户拖动滑块的轨迹 这一串的轨迹数据采用模式识别的手段就可以判断出这是否是真人在操作 滑块验证通
  • 中标麒麟 docker安装及运行第一个实例

    一 下载安装包 选择适合版本 本次安装选择20 10 7 Index of linux static stable x86 64 二 安装 1 将下载的安装文件进行解压 命令如下 tar xzf docker 20 10 7 tar 2 将
  • 【Linux内核】cpu时间片的概念

    推荐阅读 浅谈linux 内核网络 sk buff 之克隆与复制 深入linux内核架构 进程 线程 了解Docker 依赖的linux内核技术 cpu时间片的概念 时间片即CPU分配给各个程序的时间 每个线程被分配一个时间段 称作它的时间
  • 【mcuclub】PTC加热模块

    一 实物图 名称 PTC加热片 工作电压 5V 最大温度 180 功率 7 12W 是否防水 不防水 外部加热 名称 加热棒 工作电压 5V 最大温度 110 功率 7 10W 是否防水 防水 可直接放入水中 二 简介 PTC电加热器是一种
  • Linux命令自动补齐oh-my-zsh插件及美化主题超详细

    安装zsh 1 查看系统当前使用的shell echo SHELL 2 查看系统是否安装了zsh cat etc shells 3 用yum安装zsh yum y install zsh 4 查看shell列表 cat etc shells
  • [附源码]计算机毕业设计Python游戏交易平台(程序+源码+LW文档)

    该项目含有源码 文档 程序 数据库 配套开发软件 软件安装教程 项目运行 环境配置 Pychram社区版 python3 7 7 Mysql5 7 HBuilderX list pip Navicat11 Django nodejs 项目技
  • C#中Socket的Accept()和BeginAccept()的区别

    C 中Socket的Accept 和BeginAccept 的区别 区别在于 Accept 是同步的 BeginAccept 是异步的 调用accept 或者BeginAccept 函数来接受客户端的连接 这就可以和客户端通信了 Begin
  • 五分钟学会一门编程语言?

    大家好 我是可乐 看到标题 不出意外的话 你肯定开始骂我了 标题党 什么编程语言五分钟就能学会 其实我本来也是不相信的 但是学过了才知道这是真的 1 Brainfuck 看到这个小标题 不要误会 我没有骂人 这就是今天文章的主人公 也就是让
  • 如何理解BIO、NIO、AIO的区别

    一 同步阻塞I O BIO 同步阻塞I O 服务器实现模式为一个连接一个线程 即客户端有连接请求时服务器就需要启动一个线程进行处理 如果这个连接不做任何事情会造成不必要的线程开销 可以通过线程池机制来改善 BIO方式适用于连接数目比较小且固
  • Leetcode 124. 二叉树中的最大路径和

    题目内容 给定一个非空二叉树 返回其最大路径和 本题中 路径被定义为一条从树中任意节点出发 沿父节点 子节点连接 达到任意节点的序列 该路径至少包含一个节点 且不一定经过根节点 示例 1 输入 1 2 3 1 2 3 输出 6 示例 2 输
  • 使用 js 实现 贷款计算器功能

    table tr th Enter Loan Data th td td th Loan Balance Interest Payments th tr tr td Amount of Loan td tr table
  • Java NIO介绍(二)————无堵塞io和Selector简单介绍

    无堵塞IO介绍 既然NIO相比于原来的IO在读取速度上其实并没有太大区别 因为NIO出来后 IO的低层已经以NIO为基础重新实现了 那么NIO的优点是什么呢 NIO是一种同步非阻塞的I O模型 也是I O多路复用的基础 而且已经被越来越多地
  • 【我的Java笔记】List集合中set()方法的使用

    方法 E set int index E element 首先看一下API里对List集合中的set 方法的描述 例 使用List集合中的set 方法进行冒泡排序 import java util ArrayList public clas
  • WebDriverException unexpectedly exited. Status code was: 2

    raise WebDriverException selenium common exceptions WebDriverException Message Service D Projects test geckodriver exe u
  • 计数器实现七分频

    七分频 即将输入信号的频率变为原来的七分之一 本文用计数器实现输入信号的七分频 一 画出七分频的时序逻辑 实现原理 图中用到了两个计数器 一个上升沿触发一个下降沿触发 且每当计数器从0计数到6时 复位 中间信号sig1 sig2分别在cnt
  • xhtml2pdf如何支持中文

    这段时间在做一个图片PDF的项目 需要把网页转换成PDF 找到了python的xhtml2pdf这个库 个方面都满意 只是对中文的支持不好 html上的中文转换成PDF后都成了乱码 貌似中文网站都没有找到合适的解决办法 只能求助于万能的go
  • 传统语音增强——基本的维纳滤波语音降噪算法

    一 维纳滤波的基本原理 基本维纳滤波就是用来解决从噪声中提取信号问题的一种过滤 或滤波 方法 它基于平稳随机过程模型 且假设退化模型为线性空间不变系统的 实际上这种线性滤波问题 可以看成是一种估计问题或一种线性估计问题 基本的维纳滤波是根据