多尺度小波分解Matlab/Python实现与原理分析
小波分解的理解
Matlab中实现小波分解方式
在matlab中实现小波分解的方式比较简单,通过[C,L] = wavedec(X,N,‘wname’)得到C和L,如下图,C表示分解得到的各个层的小波系数,L表示各个层的长度,L的最后一个数表示原数据的长度。
通过在Matlab中输入open wavedec
打开分解的源文件可以发现,主要就是通过执行dwt函数进行多层分解的,分解的系数通过wfilters
函数获得Lo_D,Hi_D
,在分解中[x,d] = dwt(x,Lo_D,Hi_D);
不断使用分解得到的x作为下一次分解的输入。进一步地,打开dwt文件,还能看到为了抑制边界效应的边界延拓通过wextend
完成,卷积是通过wconv1
实现的。分解工作的流程图为:
graph LRstart(输入数据) --> wavedec[wavedec函数]wavedec[wavedec函数] --> dwt[dwt函数]dwt[dwt函数] --> wextend[wextend端点延拓方法]dwt[dwt函数] --> conv1[wconv1卷积]wextend[wextend端点延拓方法] --> filter[间隔取值]conv1[wconv1卷积] --> filter[间隔取值]filter[间隔取值] --结果返回--> wavedec[wavedec函数]wavedec[wavedec函数] --> end[输出数据]
分解得到的每个层的长度可以表示为:
Li=Li−1+滤波器长度−12L_{i}=\frac{\mathrm{L_{i-1}}+\mathrm{滤波器长度}-1}2Li=2Li−1+滤波器长度−1
滤波器长度可以查看Matlab,如sym7的长度为14,sym4的长度为8。
分解之后,可以通过X = waverec(C,L,‘wname’)重构出来,当需要去除某个层的信息,达到移除噪声(低层分解的细节部分)或者移除基线漂移(高层分解的平均部分),可以通过X = wrcoef(‘type’,C,L,‘wname’,N)得到某个level的‘a’或者’d’(type = ‘a’或者‘d’),用原始信号减去该部分即可。
小波分解实现原理
但是在其他的编程环境中,往往只有基础的DWT和IDWT用于做单层的小波变换,多尺度分解的wrcoef函数是没有实现的,得到的C的长度不一,不能直接重构。
实现的原理即为:不断对信号进行小波分解,
信号s经过一次小波分解后得到平均cA1和细节cD1,然后将cA1作为输入进行下一次小波分解得到平均cA2和细节cD2,然后将cA2作为输入进行下一次小波分解得到平均cA3和细节cD3…。假如进行3个尺度的分解,得到的C即为:
C=[cA3,cD3,cD2,cD1]C=\lbrack cA3,cD3,cD2,cD1\rbrackC=[cA3,cD3,cD2,cD1]
令不要的层的系数变为0,向上重构,例如如果需要去除基线漂移的话,就是细节部分cA3令为0,然后用令为0的cA3和cD3重构一次得到重构的cA2,cA2和cD2重构得到cA1,cA1和cD1重构得到信号s。
通过这种方式写的Matlab验证脚本为:
x = [0:500];
subplot(211)
plot(x,'-');hold on;
subplot(212)
[C,L] = wavedec(x,6,'sym7');
a = wrcoef('a',C,L,'sym7',6);
r1 = x - a;
plot(r1,'b');%% 第二种方式
C(1:L(1)) = zeros(1,L(1));
r2 = waverec(C,L,'sym7');
plot(r2,'k');
%% 第三种方式
[C1,L1] = wavedec(x,1,'sym7');
[C2,L2] = wavedec(C1(1:L1(1)),1,'sym7');
[C3,L3] = wavedec(C2(1:L2(1)),1,'sym7');
[C4,L4] = wavedec(C3(1:L3(1)),1,'sym7');
[C5,L5] = wavedec(C4(1:L4(1)),1,'sym7');
[C6,L6] = wavedec(C5(1:L5(1)),1,'sym7');C6(1:L6(1)) = zeros(1,L6(1));
x5 = waverec(C6,L6,'sym7');
C5(1:L5(1)) = x5;
x4 = waverec(C5,L5,'sym7');
C4(1:L4(1)) = x4;
x3 = waverec(C4,L4,'sym7');
C3(1:L3(1)) = x3;
x2 = waverec(C3,L3,'sym7');
C2(1:L2(1)) = x2;
x1 = waverec(C2,L2,'sym7');
C1(1:L1(1)) = x1;
r3 = waverec(C1,L1,'sym7');
plot(r3,'r');
可以看到三种重构的方式结果是一样的,subplot(212)的三种方式去除了cA6之后是完全一样的,当其他编程环境中需要使用到类似的处理效果可以参考这个逻辑。
Python环境下的实现为:
def waveletdec(self, s, coef_type='d', wname='sym7', level=6, mode='symmetric'):import pywtN = len(s)w = pywt.Wavelet(wname)a = sca = []cd = []for i in range(level):(a, d) = pywt.dwt(a, w, mode) # 将a作为输入进行dwt分解ca.append(a)cd.append(d)rec_a = []rec_d = []for i, coeff in enumerate(ca):coeff_list = [coeff, None] + [None] * irec_a.append(pywt.waverec(coeff_list, w)[0:N]) # 进行重构for i, coeff in enumerate(cd):coeff_list = [None, coeff] + [None] * irec_d.append(pywt.waverec(coeff_list, w)[0:N]) # 进行重构if coef_type == 'd':return rec_dreturn rec_a
多尺度小波分解Matlab/Python实现与原理分析相关推荐
- matlab dwt 多层分解,多尺度小波分解Matlab/Python实现与原理分析
小波分解的理解 Matlab中实现小波分解方式 在matlab中实现小波分解的方式比较简单,通过[C,L] = wavedec(X,N,'wname')得到C和L,如下图,C表示分解得到的各个层的小波 ...
- 一维信号小波去噪算法C语言,[转载]一维小波分解与去噪重构
对随机一维信号实现多尺度小波分解,长度M=256,层数N=3. 解:一维随机信号是用nelec函数作为信号源,产生0~256范围内的信号. 实现小波按层分解的函数是: [C,L]=wavedec(s, ...
- python小波分解与重构_小波分解和重构
小波变换能够很好地表征一大类以低频信息为主要成分的信号, 小波包变换可以对高频部分提供更精细的分解 详见(http://www.cnblogs.com/welen/articles/5667217.h ...
- 图像3尺度全小波包分解matlab,小波分析理论与图像降噪处理
摘 要: 简要介绍了小波分析基本理论中的小波变换和小波包变换,重点论述了小波分析在图像降噪处理中的应用及其算法流程.在此基础上,利用Matlab R2007进行了图像去噪仿真测试,并对仿真结果进行了 ...
- 【图像去噪】基于matlab快速跨尺度小波降噪泊松损坏图像去噪【含Matlab源码 1893期】
⛄一.图像去噪及滤波简介 1 图像去噪 1.1 图像噪声定义 噪声是干扰图像视觉效果的重要因素,图像去噪是指减少图像中噪声的过程.噪声分类有三种:加性噪声,乘性噪声和量化噪声.我们用f(x,y)表示图 ...
- 小波变换、小波分解[python实现]//未完待续
更新于2022/10/27 小波变换与小波分解的不同 (235条消息) 小波与小波包.小波包分解与信号重构.小波包能量特征提取 暨 小波包分解后实现按频率大小分布重新排列(Matlab 程序详解)_c ...
- matlab dwt 多层分解,利用matlab对图片进行多层小波分解 会的加QQ511607771 加过作图之后积分加倍送...
利用matlab对图片进行多层小波分解 会的加QQ511607771 加过作图之后积分加倍送 mip版 关注:96 答案:2 悬赏:0 解决时间 2021-01-23 13:02 已解决 202 ...
- ewt分解模式matlab算法如何实现,EWT 经验小波分解 在 的基础上提出的一个拓展,具有自适应性,效果有提升 matlab 276万源代码下载- www.pudn.com...
文件名称: EWT下载 收藏√ [ 5 4 3 2 1 ] 开发工具: matlab 文件大小: 1585 KB 上传时间: 2016-11-03 下载次数: 5 提 供 者: 欧阳 详细 ...
- MATLAB小波分解/重构wavedec/waverec函数中L和C的意义
这两天在做用小波阈值法进行信号去噪的问题,需要将信号进行五层小波分解,每进行一层分解时都将该层得到的细节系数CDi进行一次阈值化处理.这可以通过多次调用matlab中的dwt函数来实现.但是,在信号进 ...
- 小波分解的尺度和层数
在理解小波系数的维度的时候,被小波分解的尺度和层数搞迷糊了,看了几个博客和文档,整理了自己的理解. 先看小波分解过程以及频率的划分 尺度和分解层数不是一个概念,但是有如下的关系: 尺度与分解频率成反比 ...
最新文章
- 第二章:制作 yum 仓库和配置MTA-Postfix
- PostgreSQL SQL 语言:数据定义
- not in SQL语句转化为 not exists
- 饿了么CTO张雪峰:允许90后的技术人员“浮躁“一点
- 给你的博客换个装-园子换装指南
- 百度地图 Android SDK - 个性化地图
- transit, transfer, convey-conveyance, transport-transportation
- 给 WordPress 博客添加 Tabs 标签切换功能
- 周末巨献:100+诡异的数据集,20万Eclipse Bug、死囚遗言
- java程序员选择多个offer时需要看重哪些?_27 道阿里巴巴 Java 面试题,你会几道?...
- jinja2中的过滤器
- 简仿Path的商店表情弹出模块
- 《程序员》5月刊精彩内容预告
- 讲给后台程序员看的前端系列教程(17)——文本样式
- 为什么鸿蒙不掉符,教你如何使用鸿蒙符 鸿蒙符的挽歌一波流的逆袭
- firefox插件使用:hackbar
- 算法题:卖股票,求最大利润
- mex文件用matlab能打开吗,MATLAB通过mex文件调用C/C++程序
- ubuntu14.04安裝chromium浏览器的Flash播放插件
- Notepad++行首行尾批量添加字符