【语言信号增强算法研究-1】维纳滤波(Wiener Filter)

1 语音增强方法分类

2 维纳滤波的局限性

  • 对于非线性和非高斯噪声的处理效果不佳; 对于信号和噪声的统计特性要求比较高,需要准确地了解信号和噪声的分布规律(说明自适应很差); 在处理复杂信号时,需要进行多次计算和优化,计算量较大。

3 维纳滤波的原理

4 实现源码与程序

4-1 维纳滤波器wiener_filter函数的实现代码

%% ============================================================ %%
%%                      维纳滤波器函数实现
%% ============================================================ %%

%% ------------------------------------------------------------ %%
%% param 
%  noisy:含噪信号  
%  clean:纯净信号(无噪信号)  
%  noise:纯噪音信号 
%  para :(集总了滤波器各参数的)结构体

%% retval
%  H:滤波器系数
%  enhenc:增强后的(时域形式)信号

%% (集总了滤波器各参数的)结构体para成员介绍:
%  n_fft      : FFT
%  hop_length :
%  win_length :
%  alpha      :
%  beta       :
%% ------------------------------------------------------------ %%
function [H, enhenc] = wiener_filter(noisy, clean, noise, para) % 使用维纳滤波函数
    %% 从结构体获取到相关参数
    n_fft      = para.n_fft;
    hop_length = para.hop_length;
    win_length = para.win_length;
    alpha      = para.alpha;
    beta       = para.beta;

    %% 使用短时傅里叶变换(STFT)后取绝对值,并转换为相应的频谱表示
    S_noisy = abs(stft(noisy, n_fft, hop_length, win_length)); % 得到含噪信号频谱
    S_noise = abs(stft(noise, n_fft, hop_length, win_length)); % 得到纯噪音信号频谱
    S_clean = abs(stft(clean, n_fft, hop_length, win_length)); % 得到无噪信号频谱

    %% 计算(无噪/纯噪音)信号的频谱平方后的均值
    Pxx = mean(S_clean.^2, 1);
    Pnn = mean(S_noise.^2, 1);

    %% 根据维纳滤波器的公式计算滤波器系数H
    H = (Pxx ./ (Pxx + alpha * Pnn)) .^ beta;   

    %% 将噪声信号频谱与滤波器系数相乘,得到增强后的频谱S_enhec
    S_enhec = S_noisy .* H;                     

    %% 使用逆短时傅里叶变换(ISTFT)将增强后的频谱S_enhec转换回时域信号,得到增强后的信号enhenc。
    enhenc = istft(S_enhec, hop_length, win_length);
end

4-2 滤波效果仿真代码

援引CSDN上一篇blog的代码改写如下

因为维纳滤波器的参数求解过程中必须要用到参考信号

  • 仿真信号 S g n Sgn Sgn 为两个正弦信号的叠加: S g n = A ∗ s i n ( 2 π f 1 t ) + B ∗ s i n ( 2 π f 2 t ) Sgn=A*sin(2πf_1t)+B*sin(2πf_2t) Sgn=Asin(2πf1t)+Bsin(2πf2t)
close all;
clear;
clc;

%% 信号产生,对原始信号进行采样
A=10;
B=15;
f1=1000;
f2=2000;
fs=10^5;
t=0:999;                            % 采样点t = [0,999],长度1000
M = length(t);                      % 信号长度
Sgn = A*sin(2*pi*f1*t/fs) + B*sin(2*pi*f2*t/fs);

%% 给仿真信号加入高斯白噪声
SNR = 3;                            % 初始信噪比
Obs_Sgn = awgn(Sgn,SNR,'measured'); % 给仿真信号加入信噪比为-3dB的高斯白噪声
WGN = Obs_Sgn - Sgn;                % 观测信号Obs_Sgn = 仿真信号Sgn + 高斯白噪声WGN(误差信号,每次运行都不一样)

%% 第一种情况:(期望)感兴趣信号SOI为的原信号Sgn
SOI = Sgn; 

%% 维纳滤波
N = floor(length(Obs_Sgn)*0.1);     % 滤波器的阶数,向下取整
Rxx=xcorr(Obs_Sgn, N-1, 'biased');  % 自相关函数1*(2N-1)维度,返回一个延迟范围在[-N,N]的互相关函数序列

%% 变成矩阵(N*N维度)
for i=1:N
    for j=1:N
        mRxx(i,j)=Rxx(N-i+j); % N*N维度
    end
end

%% 产生维纳滤波中x方向上观测信号与期望信号d的互相关矩阵
Rxd=xcorr(Obs_Sgn, SOI, N-1, 'biased');        % 互相关函数1*(2N-1)维度

%% 变成矩阵1*N维度
for i=1:N
    mRxd(i)=Rxd(N-1+i); % 1*N维度
end

h = inv(mRxx)*mRxd';                % 由wiener-Hopf方程得到滤波器最优解, h是N*1维度

%% 检验wiener滤波效果
y   = conv(Obs_Sgn, h);             % 滤波后的输出,长度为M+N-1,要截取前M个。
y   = y(1:M);                       % yy = filter(h,1,x);  % 用卷积或者直接用filter都可以
Py  = sum(power(y,2))/M;            % 滤波后信号y的功率
ERR = SOI - y;                      % 输出减去期望等于滤波误差
Pn  = sum(power(ERR,2))/M;          % 滤波后噪声功率
Delta_P = Py-Pn                     % 功率增量
SNR_Filtered = 10*log10(Delta_P/Pn) % 滤波后信噪比(单位db) 
imv = 10*log10(Delta_P/Pn/power(10,SNR/10)) % 滤波后较滤波前信噪比提高了imv dB。

figure(1), subplot(311);
plot(t,Sgn);
title('Signal原信号');

subplot(312);
plot(t,WGN);
title('WGN高斯白噪声');

subplot(313)
plot(t,Obs_Sgn)
title('观测波形')

在这里插入图片描述

%% 期望和滤波后的信号对比
figure(2), subplot(211);
plot(t, SOI, 'r:', t, y, 'b-','LineWidth',1);
legend('期望信号','滤波后结果'); 
title('期望信号与滤波结果对比');
xlabel('观测点数'), ylabel('信号幅度');
axis([0 1000 -50 50]);

subplot(212), plot(t, ERR);
title('输出误差');
xlabel('观测点数'), ylabel('误差幅度');
axis([0 1000 -50 50]);


%% 滤波前后对比
figure(3), subplot(211);
plot(t, Obs_Sgn);
title('维纳滤波前');
xlabel('观测点数'), ylabel('信号幅度');
axis([0 1000 -50 50])

subplot(212), plot(t, y);
title('维纳滤波后');
xlabel('观测点数'), ylabel('误差幅度');
axis([0 1000 -50 50]);

在这里插入图片描述


%% 情况二:(期望)感兴趣信号SOI为的加性高斯白噪声WGN
SOI = WGN;

...
%% 期望信号与滤波结果对比
figure(2)
plot(t, SOI, 'r:', t, y, 'b-','LineWidth',1);
legend('期望信号','滤波后结果'); 
title('期望信号与滤波结果对比');
xlabel('观测点数'), ylabel('信号幅度');
axis([0 1000 -50 50])


%% Signal原始信号与噪声抵消后结果对比
figure(3)
plot(t, Sgn, 'r:', t, Obs_Sgn - y, 'b-','LineWidth',1);
legend('Signal原始信号','噪声抵消后结果');
title('Signal原始信号与噪声抵消后结果对比');
xlabel('观测点数'), ylabel('信号幅度');
axis([0 1000 -50 50])

在这里插入图片描述


%% 情况三:(期望)感兴趣信号SOI为的观测信号
%% 观测信号与滤波结果对比
figure(2), subplot(211);
plot(t, Obs_Sgn, 'r:', t, y, 'b-','LineWidth',1);
legend('观测信号','滤波后结果'); 
title('观测信号与滤波结果对比');
xlabel('观测点数'), ylabel('信号幅度');
axis([0 1000 -50 50])

subplot(212);
plot(t, ERR);
title('输出误差');
xlabel('观测点数'), ylabel('误差幅度');
axis([0 1000 -50 50]);


%% 滤波前后对比
figure(3), subplot(211);
plot(t, Obs_Sgn);
title('维纳滤波前');
xlabel('观测点数'), ylabel('信号幅度');
axis([0 1000 -50 50])

subplot(212), plot(t, y);
title('维纳滤波后');
xlabel('观测点数'), ylabel('误差幅度');
axis([0 1000 -50 50]);

在这里插入图片描述

4-3 仿真实验结论

  • (期望)感兴趣信号设置为原始信号 S g n Sgn Sgn时,效果最好

5 详细说明

  • 原始信号 S g n Sgn Sgn 经过噪声信道(加入白噪声 W G N WGN WGN),变成 含噪信号 O b s S g n ObsSgn ObsSgn O b s S g n = S g n + W G N ObsSgn=Sgn+WGN ObsSgn=Sgn+WGN)。
    O b s S g n ObsSgn ObsSgn 经过维纳滤波器(Wiener Filter)后得到 S g n F i l t e r e d SgnFiltered SgnFiltered,由于期望的感兴趣信号为 S O I SOI SOI ,则误差信号 E R R = S O I − S g n F i l t e r e d ERR=SOI-SgnFiltered ERR=SOISgnFiltered,滤波器系数为H
  • 按照均方误差最小原则,从 O b s S g n ObsSgn ObsSgn 信号中剥离得到 S g n Sgn Sgn,叫维纳滤波理论
  • 不能使用维纳滤波法对未知信号进行滤波!!!因为设计滤波器系数时需要使用到期望信号 S O I SOI SOI

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/508162.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

副业赚钱攻略:给工资低的你6个实用建议,闷声致富不是梦

经常有朋友向我咨询,哪些副业比较靠谱且能赚钱。实际上,对于大多数打工族而言,副业不仅是增加收入的途径,更是利用业余时间提升自我、实现价值的重要方式。 鉴于此,今天我想和大家分享六个值得尝试的副业,…

sql注入---Union注入

文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 学习目标 了解union注入过程中用到的关键数据库,数据表,数据列sql查询中group_concat的作用使用union注入拿到靶机中数据库里的所有用户名和密码 一. 获得数据库表名和列…

CDN流量清洗

CDN是构建在网络之上的内容分发网络,依靠部署在各地的边缘服务器,通过中心平台的分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率,因此CDN也用到了负载均衡技术。…

57、FreeRTOS/串口通信和DMA ADC PWM相关20240401

一、使用PWMADC光敏电阻完成光控灯的实验。(根据测得的光敏电阻大小,控制灯的亮度) 代码: /* USER CODE BEGIN 2 */HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_3);//打开定时器的PWM通道3HAL_TIM_PWM_Start(&htim3,TIM_CHANN…

如何写好面向新人的开发文档

前言 大家在进入公司的时候,或多或少会接触到公司或者来自前辈的文档。文档水平层次不齐,好的事无巨细,层次清晰,拉跨的可能就像正确的废话,正确的说了正确的话。文档形式也是多种多样,word、markdown、云…

【学习笔记】java项目—苍穹外卖day06

文章目录 苍穹外卖-day06课程内容1. HttpClient1.1 介绍1.2 入门案例1.2.1 GET方式请求1.2.2 POST方式请求 2. 微信小程序开发2.1 介绍2.2 准备工作2.3 入门案例2.3.1 小程序目录结构2.3.2 编写和编译小程序2.3.3 发布小程序 3. 微信登录3.1 导入小程序代码3.2 微信登录流程3.3…

详解ExecutorService 和 Executors

代码示例: ExecutorService 表⽰⼀个线程池实例. Executors 是⼀个⼯⼚类, 能够创建出⼏种不同⻛格的线程池. ExecutorService 的 submit ⽅法能够向线程池中提交若⼲个任务. ExecutorService pool Executors.newFixedThreadPool(10);pool.submit(new Runnable() {Overri…

算法系列--递归,回溯,剪枝的综合应用(1)

💕"对相爱的人来说,对方的心意,才是最好的房子。"💕 作者:Lvzi 文章主要内容:算法系列–递归,回溯,剪枝的综合应用(1) 大家好,今天为大家带来的是算法系列--递归,回溯,剪枝的综合应用(1) 1.全排…

Multisim14.2仿真参数的修改

本内容讲述Multisim14.2仿真参数的修改,以放大倍数修改为例说明。紫色文字是超链接,点击自动跳转至相关博文。持续更新,原创不易! 目录: 1、三极管放大倍数的修改 2、Uc的电压计算 1、三极管放大倍数的修改 在仿真…

2024第16届成都实验室装备展6月1日举办

2024第16届成都实验室装备展6月1日举办 邀请函 主办单位: 中国西部教体融合博览会组委会 承办单位:重庆港华展览有限公司 博览会主题:责任教育 科教兴邦 展会背景 现代高新技术与基础科学实验研究对科学仪器的先进性、稳定性、性价比等…

【BlossomRPC】接入注册中心

文章目录 NacosZookeeper自研配置中心 RPC项目 配置中心项目 网关项目 这是BlossomRPC项目的最后一篇文章了,接入完毕注册中心,一个完整的RPC框架就设计完成了。 对于项目对注册中心的整合,其实我们只需要再服务启动的时候将ip/port/servic…

2024阿里云服务器ECS u1实例性能测评_CPU内存_网络_存储

阿里云服务器u1是通用算力型云服务器,CPU采用2.5 GHz主频的Intel(R) Xeon(R) Platinum处理器,ECS通用算力型u1云服务器不适用于游戏和高频交易等需要极致性能的应用场景及对业务性能一致性有强诉求的应用场景(比如业务HA场景主备机需要性能一致)&#xf…

Php_Code_challenge13

题目: 答案: 解析: 开启一个会话,在SESSION变量"nums"为空时则对"nums","time","whoami"进行赋值,并在120秒后关闭会话,创建一个变量"$value"…

2024051期传足14场胜负前瞻

2024051期售止时间为4月2日(周一)22点00分,敬请留意: 本期深盘多,1.5以下赔率2场,1.5-2.0赔率2场,其他场次是平半盘、平盘。本期14场难度中等偏上。以下为基础盘前瞻,大家可根据自身…

Hamcrest断言框架

一、Hamcrest简介 Hamcrest源于Java,支持多种语言,是用于编写匹配器对象的框架,可以更灵活的定义“匹配”规则。Hamcrest 断言,基于更灵活的 Matchers 断言方式。 二、Hamcrest安装 可以使用常用的python打包工具来安装Hamcres…

电商技术揭秘二:电商平台推荐系统的实现与优化

文章目录 一、推荐系统的重要性1.1 提升用户体验1.1.1 个性化推荐增强用户满意度1.1.2 减少用户选择困难 1.2 增加销售额1.2.1 促进交叉销售和捆绑销售1.2.2 提高用户购买转化率 1.3 数据分析与用户行为理解1.3.1 挖掘用户偏好和购买习惯1.3.2 为产品开发和库存管理提供数据支持…

思考: 什么时候需要disable MMU/i-cache/d-cache?

快速链接: 【精选】ARMv8/ARMv9架构入门到精通-[目录] 👈👈👈 在armv8/armv9的aarch64架构下,软件的启动流程: BL1--->BL2--->BL31--->BL32--->BL33.... 在不同的BL镜像切换时,都需要disable …

943: 顺序表插入操作的实现

学习版 【C语言】 需要扩充数组 【C】 #include <iostream> #include <vector> #include <algorithm> using namespace std; class MyLinkedList { public:struct LinkedNode{int val;LinkedNode* next;LinkedNode(int x) :val(x), next(NULL) {}};MyLin…

切换ip地址的app,简单易用,保护隐私

在数字化时代&#xff0c;IP地址作为网络设备的标识&#xff0c;不仅承载着数据在网络间的传输任务&#xff0c;还在一定程度上关联着用户的隐私和安全。因此&#xff0c;切换IP地址的App应运而生&#xff0c;为用户提供了一种便捷的方式来改变其网络身份&#xff0c;实现匿名浏…

制造业需要有品牌力和生命力的产品,CRM能做什么?

以往谈及制造业的数字化转型&#xff0c;生产制造环节往往是重点。但从中国制造走向中国创造&#xff0c;需要有生命力和品牌力的产品。全面推进制造业高质量发展&#xff0c;须重视客户与营销环节的变革&#xff0c;将客户与产品有效连通&#xff0c;实现价值升级。 大连冶金…