【滤波专题-第6篇】小波阈值去噪方法看这一篇就明白了~(附MATLAB实现)

news2024/11/17 13:29:17

小波阈值去噪的算法是近些年比较流行的一种滤波方法,由于其阈值函数有着众多的改进方式和改进空间,改进阈值函数也往往可以作为创新点和亮点写到论文中,所以对于正在搞相关研究的同学们写论文是比较友好的(轻松水论文方式+1)。本篇将用尽量易懂的方式对小波阈值的原理进行讲解,帮大家梳理几个效果还可以的改进阈值函数,并提供一种非常便捷的MATLAB实现方法,供同学们使用。

小波阈值去噪的基础思想还是比较简单的,也就是通过分解+有选择的重构,实现去除噪声成分,留下关键信息的作用。我们从两个角度去理解就可以,谜底就在谜面上,这两个理解角度的关键词就是“小波”和“阈值”。

一、先说“小波”

需要注意的是,这里提到的小波指的是“小波分解”,而不是小波变换、离散小波变换或者小波包分解等等,涉及小波的概念比较多,这里要做好区分。

小波分解在我们之前的文章里也提到过,通过小波分解我们可以得到一串小波分解系数。而小波阈值去噪的理论基础就是[1]:

小波变换具有很强的去数据相关性,他能使信号的能量在小波域集中在一些大的小波系数当中,而噪声的能量却分布于整个小波域内。因此,经小波分解后,信号的小波系数幅值要大于噪声的系数幅值,可以认为,幅值比较大的小波系数一般以信号为主,而幅值比较小的系数在很大程度上是噪声。于是,采用阈值的办法,使大部分噪声系数减小至0,即将小于阈值部分的系数作为干扰噪声去除,然后再进行小波重构,从而实现降噪。

二、然后是“阈值”

在小波阈值去噪中,阈值函数体现了对超过和低于阈值的小波系数的不同处理策略,是阈值去噪中关键的一步。

对于“策略”,主要也包括两部分内容,分别是“阈值”的选择和“阈值函数”的选择。

(一)阈值的选择

所谓阈值,就是设定一个数值,当小波系数的绝对值小于这个阈值的时候,通通赋值为0(注:有些改进方法不是)。

阈值的选择方法常用的有这几种:

  • 'rigsure' — Use the principle of Stein's Unbiased Risk.
  • 'heursure' — Use a heuristic variant of Stein's Unbiased Risk.
  • 'sqtwolog — Use the universal threshold √2ln(length(x)).
  • 'minimaxi' — Use minimax thresholding.
  • 'VisuShrink'— 通用阈值方法

上述前四种是MATLAB内置的阈值选择方法,还有一种比较常用的VisuShrink方法没有收录到MATLAB官方库中,笔者在编程过程中一起把它集成进去了。(代码见下边的文章介绍)

阈值选择的的几种方法这里就不展开说了,其计算公式在论文中都不难找到。

(二)阈值函数的选择

阈值函数的设计通常是使用小波阈值降噪方法的核心关键所在,在写论文时这里可以加以改进,实现更好的滤波效果,妥妥的创新点。

传统的阈值函数有两种,分别是硬阈值软阈值

1.硬阈值

所谓硬阈值函数,其实就是“不做处理”。。。换句话说,我们不是已经将小于阈值的小波系数的置0了嘛,大于阈值的小波系数就保持原值(这操作真够硬的)。所以阈值函数画出来就是下图这样的,这样处理就导致了函数的不连续,“不连续”这种事情在信号处理中显然是不够优雅的。

从图上可以看出,转折处就是阈值,在这个例子里也就是2

2.软阈值

而所谓的软阈值函数,其实也没“软”到哪去(核心理念依旧有些生硬),只是将上图中W=2的幅值跳变的位置做了一个平移,他的图像如下图:

阈值依然是2

这样处理带来一个显而易见的问题:小波分解系数值变啦!相当于每个大于阈值的系数都减掉了2(也就是阈值),这毫无疑问会在信号重构的时候引入误差。

3.第一种改进的阈值函数

既然软阈值和硬阈值有缺点就好说了,此时我们就可以有针对性地进行改进,而改进的方法无非就是围绕一个核心目的:在消除阈值函数的不连续性的同时,使函数迅速靠近硬阈值函数。

就比如下图这样(蓝线):

这是一种比较简单且相对有效的阈值函数,表达式是这样的[2]:

式中 λ 就是阈值。

这个改进方法表达式简单明了,阈值函数曲线也比较漂亮。

4.第二种改进的阈值函数

这里再举一个例子,其阈值函数的表达式是这样的[3]:

按照论文里的说法,配合这个阈值函数使用的是VisuShrink阈值计算方法。

这个阈值函数图像是这样的:

这个方法相对于第一种改进方法靠近硬阈值的速度更快一些,不过在阈值位置还是有一个小一些的跳变,这个方法介于硬阈值与软阈值之间,也算是改进方法的一种。

5.其他更多改进方法

还有更多的阈值函数改进方法,不过很多种都要引入一个或多个调节因子,也就是引入了新的变量,这种情况下阈值函数的种类就比较多了,这里不再一一介绍。这里挑几个,贴一下他们的阈值函数图像,并附上参考论文,有需要的同学们可以更进一步查阅。

(1)改进方法3:《基于改进小波阈值-CEEMDAN算法的ECG信号去噪研究》

为了体现效果,这个图像范围画到了10

(2)改进方法4:《基于改进小波阈值函数的语音增强算法研究》,这个方法在小于阈值的位置也做了平滑处理。这个方法引入了两个调节因子alpha和gamma,可以调节阈值函数形状。

(3)改进方法5:《基于VMD与改进小波阈值的地震信号去噪方法研究》,这个方法也引入了两个调节因子,分别是alpha和beta,可以更加灵活地调整图线形状。

这个是alpha和beta都等于2的结果

三、MATLAB案例实现

我把上边讲到的7种阈值方法都进行了MATLAB代码实现。下面采用一个案例来进行演示。

首先我们仿真生成一段信号,并向其中加入白噪声。x为未加入白噪声的纯净信号,sig为加入白噪声后的信号,代码如下:

%% 1.生成仿真信号,x为无噪声信号,sig为添加噪声后的信号
rng(123); %设置随机种子,保证每次生成噪声的一致性
N = 200;
t = linspace(0,1,N);
x = 4*sin(4*pi*t);
x = x - sign(t-0.3) - sign(0.72-t);
sig = x + 0.2*randn(size(t));
figure('Color','w');subplot(2,1,1);plot(t,x);title('未加入白噪声信号')
subplot(2,1,2);plot(t,sig);title('加入白噪声信号')

下边我们尝试做一下软阈值、硬阈值、以及5种不同改进阈值方法的滤波效果对比吧。

(一)MATLAB编程实现方法

在MATLAB中,软、硬阈值的小波阈值滤波方法通过调用wden函数可以实现,但是想要实现改进阈值方法,对于没有MATLAB代码基础的同学们可能就得花费一些周章了,而且MATLAB官方函数里还没有visushrink这个很常用的阈值选择方法,所以笔者改造了wden、thselect和wthresh三个函数文件,并进一步封装成filterWaveletTh函数,延续本专栏中以往代码的风格,实现“一行代码”完成小波阈值去噪的效果。当然啦,这里所说的“一行代码”还需要配合一些参数的设置。

举个例子,如果对上述的sig信号进行软阈值滤波,选取'db3'类型的小波,分解水平为3,阈值选择原则为visushrink,那代码可以这样写:

s = filterWaveletTh(sig,'db3','s',3,'visushrink',[]);  %调用函数进行滤波,filterWaveletTh函数获取方法见文末

这样就可以得到滤波后的数据s。

我们来画图看一下滤波效果:

%% 画滤波前后对比图
figure('color','w')
subplot(311);plot(x,'k');title('原始信号(未加入噪声)')
subplot(312);plot(sig,'k');title('原始信号(加入噪声)')
subplot(313);plot(s,'k');title('滤波后信号')

软阈值滤波效果

结合我们之前讲过的计算一下滤波效果评价指标。计算SNR、MSE和NCC这三个指标值,计算方法也同样进行了封装,就像这样调用就行:

ori = x;  %无噪声信号
fil = s;  %滤波后信号
[SNR,MSE,NCC] = FilterEffectEvaluation(ori,fil);
% 对滤波效果进行评估
% 目前包含的评估指标有:信噪比SNR,均方差MSE,波形相似系数NCC
% 输入:
% ori:无噪声的原始数据,一维序列
% fil:滤波后的数据,一维序列

软阈值滤波后的SNR、MSE和NCC值分别为:26.4164、0.021658、0.99887。

这个效果还是可以的,下面我们再计算一下另外几种滤波方法的结果。

(二)硬阈值及五种改进方法的滤波结果

下面我们直接贴上来滤波效果对比图以及评价指标计算结果,具体代码实现都与上边的例子类似,直接给定参数调用就可以。

硬阈值滤波结果:滤波后的SNR、MSE和NCC值分别为:27.1828、0.018154、0.99905

改进方法1:滤波后的SNR、MSE和NCC值分别为:28.4053、0.0137、0.99928

改进方法2:滤波后的SNR、MSE和NCC值分别为:25.1265、0.029149、0.99847

改进方法3:滤波后的SNR、MSE和NCC值分别为:27.6984、0.016122、0.99916

改进方法4:滤波后的SNR、MSE和NCC值分别为:28.4599、0.013529、0.99929

改进方法5:滤波后的SNR、MSE和NCC值分别为:28.3339、0.013927、0.99927

做个表格列一下评价指标,做一个直观的对比:

小波阈值方法SNRMSENCC
软阈值26.41640.0216580.99887
硬阈值27.18280.0181540.99905
改进方法128.40530.01370.99928
改进方法225.12650.0291490.99847
改进方法327.69840.0161220.99916
改进方法428.45990.0135290.99929
改进方法528.33390.0139270.99927

这三个指标里,SNR和NCC都是越大越好,MSE是越小越好,所以总体来看改进方法4对于这个信号来说是比较好的小波阈值方法。

这里有三点注意事项需要提醒大家:

第一。改进方法4和改进方法5都引入了调整因子,通过调参有可能得到更好的效果,不过这里仅做演示,就不详细地做参数调试啦。

第二。虽然改进的阈值方法在理论上对阈值函数进行了完善,但是并不意味着改进方法的滤波结果一定优于软/硬阈值方法,就像这个例子里的改进方法2。又或者换了一个分析对象,改进方法4的效果也比不上软/硬阈值也是有可能的,所以在实际应用过程中要灵活分析处理。

第三。SNR、NCC和MSE指标,都是需要知道“纯净信号”才能计算的,对于只知道真实含噪信号,不知道纯净信号的情况,是没办法计算这三个指标的。我在之前的文章里进行过详细的说明:Mr.看海:【滤波专题-第4篇】滤波器滤波效果的评价指标(信噪比SNR、均方误差MSE、波形相似参数NCC)

(三)获取小波阈值的封装函数

上边提到了两个笔者封装的函数,一个是实现小波阈值滤波的filterWaveletTh,还有一个是进行滤波效果评估指标计算的FilterEffectEvaluation,函数的详细说明如下,大家在调用的时候建议详细读一下:

function s = filterWaveletTh(data,wname,SORH,lev,tptr,options)
% 使用小波阈值法实现滤波,本文件是为了形式统一方便调用的一层封装,具体实现在kwden.m、kwdencmp.m、kwthresh.m、kthselect.m文件中
% 这4个文件均为经本人调整过后的函数文件,原函数分别为wden,wdencmp,wthresh,thselect,所以关于这几个函数更多介绍可以查看对应的官方帮助文档
% 输入:
% data:待滤波数据
% wname:小波名称,可选范围参考这里:https://ww2.mathworks.cn/help/wavelet/ref/wfilters.html?searchHighlight=wname&s_tid=srchtitle_wname_2#d123e130597
% SORH:阈值函数类型
%       sorh ='a1'时,采用改进方法1,改进后的软阈值:
%                     参考论文:孙万麟, 王超. 基于改进的软阈值小波包网络的电力信号消噪[J]. 海军工程大学学报, 2019(4).
%       sorh = 'a2'时,采用改进方法2:
%                     参考论文:刘冲, 马立修, 潘金凤,等. 联合VMD与改进小波阈值的局放信号去噪[J]. 现代电子技术, 2021, 44(21):6.
%       sorh = 'a3'时,采用改进方法4:
%                     参考论文:基于改进小波阈值-CEEMDAN算法的ECG信号去噪研究
%       sorh = 'a4'时,采用改进方法3:
%                     参考论文:基于改进小波阈值函数的语音增强算法研究
%                     采用该方法需要输入两个调节因子,分别是alpha和gamma,取alpha>0,0<gamma<1
%       sorh = 'a5'时,采用改进方法3:
%                     参考论文:基于VMD与改进小波阈值的地震信号去噪方法研究
%                     采用该方法需要输入两个调节因子,分别是alpha和beta% lev:  小波分解水平
% tptr: 阈值选择规则,有可选类型:
%       '' — Adaptive threshold selection using the principle of Stein's Unbiased Risk Estimate (SURE).
%       'sqtwolog' — Fixed-form threshold is sqrt(2*log(length(X))).
%       'heursure' — Heuristic variant of 'rigrsure' and 'sqtwolog'.
%       'minimaxi' — Minimax thresholding.
%       'visushrink' - 通用阈值去噪方法
% options:部分阈值函数需要补充的参数设置,即某些调节因子,需要用结构体方式调用幅值,如options.a4_alpha=2。如果不需要设置,可以赋值为options=[]。具体如下:
%          -a4_alpha:改进方法4的alpha值设置
%          -a4_gamma:改进方法4的gamma值设置
%          -a5_alpha:改进方法5的alpha值设置
%          -a5_beta:改进方法5的beta值设置
% 输出:
% s:经过滤波后得到的数据
% 理论讲解见:https://zhuanlan.zhihu.com/p/579187348/

function [SNR,MSE,NCC] = FilterEffectEvaluation(ori,fil)
% 对滤波效果进行评估
% 目前包含的评估指标有:信噪比SNR,均方差MSE,波形相似系数NCC
% 输入:
% ori:无噪声的原始数据,一维序列
% fil:滤波后的数据,一维序列
% 输出:
% SNR:信噪比
% MSE:均方误差
% NCC:波形相似系数
% 理论讲解见:https://zhuanlan.zhihu.com/p/558808890

这两个封装函数的方便之处在于,同学们差不多只需要导入自己要分析的数据,然后直接调用函数就可以了,更多的时间精力可以放在写论文和改进算法上。

需要上边这个函数文件以及测试代码的同学,可以下边链接获取:

小波阈值滤波算法(软阈值、硬阈值、改进的阈值) | 工具箱文档

end.关于滤波专题

目前计划要讲到的包括:

-1.FIR有限冲激响应、IIR无限冲激响应数字滤波算法的理论讲解、滤波器设计方法和MATLAB代码实现
-2.滤波器滤波效果的评价指标
-3.“类EMD”方法(即包括EMD、EEMD、CEEMD、VMD等一系列方法)的滤波算法讲解与实现
-4.“类EMD”方法与ICA结合的滤波算法讲解与实现
-5.小波阈值滤波方法讲解与实现
-6.卡尔曼滤波方法讲解与实现
...(其他方法随时补充)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【高并发】超卖一人一单问题

一、超卖问题 1. 超卖场景 高并发场景下用户下单&#xff0c;存在如下所示的超卖问题&#xff0c;其产生的主要原因是一个线程刚读出库存值&#xff0c;还没进行修改时&#xff0c;另一个线程也读出来该库存值&#xff0c;从而导致这两个线程在进行下单时&#xff0c;对同一个…

【无人机】基于Matlab实现四旋翼无人机几何跟踪控制

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

红星美凯龙寻找「反弹线」

文|螳螂观察 作者| 青月 疫情三年&#xff0c;绝大多数企业都处在「水深火热」之中&#xff0c;到今天&#xff0c;这个情况仍未得到改善。 作为自媒体&#xff0c;「螳螂观察」的感触颇深&#xff0c;疫情之前对一家企业表示肯定的词一般是「暴涨」、「同比大增」&#xff…

C语言竞赛

目录 1059:C语言竞赛 输入格式&#xff1a; 输出格式&#xff1a; 输入样例&#xff1a; 输出样例&#xff1a; 思路: 1.结构: 2.判断素数 3.输出宽度调整 代码: 时间复杂度: 总结: 题目链接: 1059:C语言竞赛 C 语言竞赛是浙江大学计算机学院主持的一个欢乐的竞赛。…

vue3+vite使用element-plus

前言&#xff1a; vue3vite的项目中使用 element-plus的教程。 官方地址&#xff1a; 安装 | Element Plusa Vue 3 based component library for designers and developershttps://element-plus.gitee.io/zh-CN/guide/installation.html#%E6%B5%8F%E8%A7%88%E5%99%A8%E7%9B%B…

考研408数据结构 · 开端

引言数据结构在学什么对C语言掌握要求数据结构三要素逻辑结构数据运算存储结构数据结构在学什么 如何把问题信息化 场景&#xff1a;现在需要将1000本不同类型的书摆放到图书馆的书架上。研究问题&#xff1a;采取什么办法摆放&#xff1f;方法有&#xff1a; ① 不管不顾从头…

进程优先级与环境变量

目录 一、进程优先级 1.优先级与权限 2.查看进程优先级 3.PRI与NI 4.修改进程的优先级 5.进程优先级的注意事项 二、进程的其他概念 1.竞争性 2.独立性 3.并行和并发 三、环境变量 1.什么是环境变量 2.环境变量的分类 3.查看环境变量内容 &#xff08;1&#xf…

uniapp easycom教程

easycom 是 uniapp 的一种组件自动引入的规则&#xff0c;使用这种规则可以使满足规则的组件无需注册直接使用。 接下来我们来看一眼效果 这里可以看到我并没有进行组件注册而是直接使用了组件&#xff0c;这样的效果就是通过 easycom 的自定义规则来实现的。 来看一眼我的自…

pandas模块使用介绍

pandas模块使用介绍1.pandas简介 ​ pandas 是基于NumPy 的一种工具&#xff0c;该工具是为解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型&#xff0c;提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。…

专访 | 徐鹏程:开源,就是酷

OpenMLDB&#xff1a; 请先来一段自我介绍吧。 徐鹏程&#xff1a; 我本科就读于上海交通大学&#xff0c;硕士在伊利诺伊大学香槟分校&#xff0c;专业都是电子与计算机工程&#xff0c;感兴趣的方向有机器学习在生物信息等领域的应用、计算机系统与架构、分布式系统等。平时…

Java数据结构与Java算法学习Day08---关于树的深度学习(简略笔记记录)

目录 一、平衡树 119 1.1 2-3查找树 119 1.1.1 2-结点和3-结点的含义 119 1.1.2查找 120 1.2 2-3查找树的插入 121 1.2.1 向2-结点中插入新建 121 1.2.2向一棵树只含有一个3-结点的树中插入新建 121 1.2.3向一个父结点为2-结点的3-结点中插入新建 121 1.2.4向一个父…

数据库建表设计技巧

1.名字 建表的时候&#xff0c;给表、字段和索引起个好名字&#xff0c;真的太重要了。 1.1 见名知意 名字就像表、字段和索引的一张脸&#xff0c;可以给人留下第一印象。 好的名字&#xff0c;言简意赅&#xff0c;见名知意&#xff0c;让人心情愉悦&#xff0c;能够提高…

基于go-micro微服务的实战-zipkin实现全链路追踪(九)

基于go-micro微服务的实战-zipkin实现全链路追踪(九) 文章最后附带完整代码 Zipkin是 Twitter 的一个开源项目&#xff0c;基于 Google Dapper实现。可以使用它来收集各个服务器上请求链路的跟踪数据。除了面向开发的API接口之外&#xff0c;它也提供了方便的 UI 组件帮助我们…

代码随想录算法训练营第五十六天| LeetCode583. 两个字符串的删除操作、LeetCode72. 编辑距离

一、LeetCode583. 两个字符串的删除操作 1&#xff1a;题目描述&#xff08;583. 两个字符串的删除操作&#xff09; 给定两个单词 word1 和 word2 &#xff0c;返回使得 word1 和 word2 相同所需的最小步数。 每步 可以删除任意一个字符串中的一个字符。 2&#xff1a;解题思…

细数一下Java中反射机制及反射的优缺点

1. 反射的概念 反射 机制指的是&#xff0c;程序在运行时能够获取自身的信息。在 java 中只要给定类的名字&#xff0c;就能够获取类的所有属性和方法。 反射是 Java 中很多高级特性的基础&#xff0c;比如 注解、动态代理 以及 Spring Ioc、AOP 等技术都需要借助反射来实现。…

再见 if…elif…!使用 Python 装饰器轻松搞定!

大家好&#xff0c;今天在 Github 阅读 EdgeDB[1] 的代码&#xff0c;发现它在处理大量if…elif…else的时候&#xff0c;巧妙地使用了装饰器&#xff0c;方法设计精巧&#xff0c;分享给大家一下&#xff0c;欢迎收藏学习&#xff0c;喜欢点赞支持&#xff0c;技术交流见文末。…

DJ13-1 汇编语言程序设计-4

目录 1. 带显示的键盘输入&#xff08;1 号功能&#xff09; 2. 不带显示的键盘输入&#xff08;8 号功能&#xff09; 3. 字符串输入&#xff08;0AH 号功能&#xff09; 4. 字符显示&#xff08;2 号功能&#xff09; 5. 字符串显示&#xff08;9 号功能&#xff09; 6…

【C++哈希表的基础使用记录】

前言 今天重新打开力扣&#xff0c;看到以前的签到题两数之和&#xff0c;以前的方法是双指针暴力解法&#xff0c;偶然看到了哈希表的方法&#xff0c;让我想起了iOS的字典&#xff0c;也顺带学习了哈希表的使用&#xff0c;我这里仅仅限于自己用来写算法题&#xff0c;作以记…

从源码角度看React-Hydrate原理

React 渲染过程&#xff0c;即ReactDOM.render执行过程分为两个大的阶段&#xff1a;render 阶段以及 commit 阶段。React.hydrate渲染过程和ReactDOM.render差不多&#xff0c;两者之间最大的区别就是&#xff0c;ReactDOM.hydrate 在 render 阶段&#xff0c;会尝试复用(hydr…