小波分解的理解

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实现与原理分析相关推荐

  1. matlab dwt 多层分解,多尺度小波分解Matlab/Python实现与原理分析

    小波分解的理解 Matlab中实现小波分解方式 在matlab中实现小波分解的方式比较简单,通过[C,L] = wavedec(X,N,'wname')得到C和L,如下图,C表示分解得到的各个层的小波 ...

  2. 一维信号小波去噪算法C语言,[转载]一维小波分解与去噪重构

    对随机一维信号实现多尺度小波分解,长度M=256,层数N=3. 解:一维随机信号是用nelec函数作为信号源,产生0~256范围内的信号. 实现小波按层分解的函数是: [C,L]=wavedec(s, ...

  3. python小波分解与重构_小波分解和重构

    小波变换能够很好地表征一大类以低频信息为主要成分的信号, 小波包变换可以对高频部分提供更精细的分解 详见(http://www.cnblogs.com/welen/articles/5667217.h ...

  4. 图像3尺度全小波包分解matlab,小波分析理论与图像降噪处理

    摘  要: 简要介绍了小波分析基本理论中的小波变换和小波包变换,重点论述了小波分析在图像降噪处理中的应用及其算法流程.在此基础上,利用Matlab R2007进行了图像去噪仿真测试,并对仿真结果进行了 ...

  5. 【图像去噪】基于matlab快速跨尺度小波降噪泊松损坏图像去噪【含Matlab源码 1893期】

    ⛄一.图像去噪及滤波简介 1 图像去噪 1.1 图像噪声定义 噪声是干扰图像视觉效果的重要因素,图像去噪是指减少图像中噪声的过程.噪声分类有三种:加性噪声,乘性噪声和量化噪声.我们用f(x,y)表示图 ...

  6. 小波变换、小波分解[python实现]//未完待续

    更新于2022/10/27 小波变换与小波分解的不同 (235条消息) 小波与小波包.小波包分解与信号重构.小波包能量特征提取 暨 小波包分解后实现按频率大小分布重新排列(Matlab 程序详解)_c ...

  7. matlab dwt 多层分解,利用matlab对图片进行多层小波分解 会的加QQ511607771 加过作图之后积分加倍送...

    利用matlab对图片进行多层小波分解 会的加QQ511607771 加过作图之后积分加倍送 mip版  关注:96  答案:2  悬赏:0 解决时间 2021-01-23 13:02 已解决 202 ...

  8. ewt分解模式matlab算法如何实现,EWT 经验小波分解 在 的基础上提出的一个拓展,具有自适应性,效果有提升 matlab 276万源代码下载- www.pudn.com...

    文件名称: EWT下载  收藏√  [ 5  4  3  2  1 ] 开发工具: matlab 文件大小: 1585 KB 上传时间: 2016-11-03 下载次数: 5 提 供 者: 欧阳 详细 ...

  9. MATLAB小波分解/重构wavedec/waverec函数中L和C的意义

    这两天在做用小波阈值法进行信号去噪的问题,需要将信号进行五层小波分解,每进行一层分解时都将该层得到的细节系数CDi进行一次阈值化处理.这可以通过多次调用matlab中的dwt函数来实现.但是,在信号进 ...

  10. 小波分解的尺度和层数

    在理解小波系数的维度的时候,被小波分解的尺度和层数搞迷糊了,看了几个博客和文档,整理了自己的理解. 先看小波分解过程以及频率的划分 尺度和分解层数不是一个概念,但是有如下的关系: 尺度与分解频率成反比 ...

最新文章

  1. 第二章:制作 yum 仓库和配置MTA-Postfix
  2. PostgreSQL SQL 语言:数据定义
  3. not in SQL语句转化为 not exists
  4. 饿了么CTO张雪峰:允许90后的技术人员“浮躁“一点
  5. 给你的博客换个装-园子换装指南
  6. 百度地图 Android SDK - 个性化地图
  7. transit, transfer, convey-conveyance, transport-transportation
  8. 给 WordPress 博客添加 Tabs 标签切换功能
  9. 周末巨献:100+诡异的数据集,20万Eclipse Bug、死囚遗言
  10. java程序员选择多个offer时需要看重哪些?_27 道阿里巴巴 Java 面试题,你会几道?...
  11. jinja2中的过滤器
  12. 简仿Path的商店表情弹出模块
  13. 《程序员》5月刊精彩内容预告
  14. 讲给后台程序员看的前端系列教程(17)——文本样式
  15. 为什么鸿蒙不掉符,教你如何使用鸿蒙符 鸿蒙符的挽歌一波流的逆袭
  16. firefox插件使用:hackbar
  17. 算法题:卖股票,求最大利润
  18. mex文件用matlab能打开吗,MATLAB通过mex文件调用C/C++程序
  19. ubuntu14.04安裝chromium浏览器的Flash播放插件
  20. Notepad++行首行尾批量添加字符

热门文章

  1. matlab转换器dcdc,用 Simulink 设计 DC/DC 转换器
  2. java 获取身份证前两位对应省份
  3. YUI:globle object
  4. [TJOI2018]教科书般的亵渎
  5. h5 7个移动端框架
  6. JAVA与GO语言之间应该选择学习哪个?
  7. jquery版本安全漏洞问题
  8. 【弃】Selenium官方文档中文版
  9. 图形可视化2:matlab画散点图加拟合趋势线
  10. java/php/net/python教务排课系统设计