多尺度小波分解Matlab/Python实现与原理分析

多尺度小波分解Matlab/Python实现与原理分析小波分解的理解 Matlab 中实现小波分解方式在 matlab 中实现小波分解的方式比较简单 通过 C L wavedec X N wname 得到 C 和 L 如下图 C 表示分解得到的各个层的小波系数 L 表示各个层的长度 L 的最后一个数表示原数据的长度 分解得到的每个层的长度可以表示为 L2 L1 滤波器长度 1 2 滤波器长度可以查看 Matlab 如 sym7 的长度为 14 sym

小波分解的理解

Matlab中实现小波分解方式

graph LR start(输入数据) --> 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[输出数据] 

小波分解实现原理

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'); 

三种重构方式效果,上图源信号,下图移除cA6之后的效果,三个方法输出一致,绘图被完全覆盖
可以看到三种重构的方式结果是一样的,subplot(212)的三种方式去除了cA6之后是完全一样的,当其他编程环境中需要使用到类似的处理效果可以参考这个逻辑。

Python环境下的实现为:

 def waveletdec(self, s, coef_type='d', wname='sym7', level=6, mode='symmetric'): import pywt N = len(s) w = pywt.Wavelet(wname) a = s ca = [] 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] * i rec_a.append(pywt.waverec(coeff_list, w)[0:N]) # 进行重构 for i, coeff in enumerate(cd): coeff_list = [None, coeff] + [None] * i rec_d.append(pywt.waverec(coeff_list, w)[0:N]) # 进行重构 if coef_type == 'd': return rec_d return rec_a 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/178032.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午6:11
下一篇 2026年3月26日 下午6:11


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号