小波分解的理解
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');

可以看到三种重构的方式结果是一样的,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
