我试图使用pywavelet库来理解小波的概念。我的第一步是看看如何使用小波系数重建给定的输入信号。请参阅下面的代码:
db1 = pywt.Wavelet('db1')
cA6, cD6,cD5, cD4, cD3, cD2, cD1=pywt.wavedec(data, db1, level=6)
cA6cD_approx = pywt.upcoef('a',cA6,'db1',take=n, level=6) + pywt.upcoef('d',cD1,'db1',take=n, level=6)\
+pywt.upcoef('d',cD2,'db1',take=n, level=6) + pywt.upcoef('d',cD3,'db1',take=n, level=6) + \
pywt.upcoef('d',cD4,'db1',take=n, level=6) + pywt.upcoef('d',cD5,'db1',take=n, level=6) + \
pywt.upcoef('d',cD6,'db1',take=n, level=6)
plt.figure(figsize=(28,10))
p1, =plt.plot(t, cA6cD_approx,'r')
p2, =plt.plot(t, data, 'b')
plt.xlabel('Day')
plt.ylabel('Number of units sold')
plt.legend([p2,p1], ["original signal", "cA6+cD* reconstructed"])
plt.show()
现在,当我使用waverec()
方法时,信号重建非常准确。请看下面的情节:
有人可以解释两种重建方法之间的区别吗?
答案 0 :(得分:1)
它们都是逆离散小波变换" upcoef" 是使用系数的直接重建,而" waverec" 是多级一维逆离散小波变换,做了几乎相同的事情,但是这样做的方式允许你排列系数并在开发时更有效率。
答案 1 :(得分:1)
函数 wavedec 执行树分解,这意味着先进行滤波,然后进行下采样(二进位方案的因子为2)。
waverec 和 upcoef 这两个函数都可以导致重建。
第一个是 waverec ,执行与 wavedec 对称的直接树重构,这意味着先进行上采样,然后进行滤波。在每个重建级别(您的情况是6个)中,也会进行求和以产生具有更多细节的信号,以供下一重建级别使用。
第二个功能 upcoef 允许对给定的子量表执行独立的重建,而无需考虑其他子量表中包含的其余细节。通常在重建信号时通过零填充执行。换句话说, upcoef 可以看作是插值运算符。
在您的情况下,您使用 upcoef 将所有小波子尺度从其抽取的x网格插值到原始x网格。然后,您对所有内插信号进行了求和(仅包含定义的有限数量的细节)。因为Daubechies的小波是正交的,所以它们可以实现完美的重构,这样您可以在重构后恢复原始信号。 简而言之:
waverec => direct reconstruction => original signal
n times upcoef => interpolation followed by a global summation => original signal
仅当您要可视化同一未抽取x网格帧上的所有细节时,子比例尺插值才有用。由于任何子量表及其插值版本中包含的信息量都是相同的,因此这种插值不会带来任何其他好处。
答案 2 :(得分:0)
我做了一些更改,尤其是“级别”的设置。从图中可以看到两种重建方法将产生相同的结果。
import numpy as np
import pywt
import matplotlib.pyplot as plt
data = np.loadtxt('Mysample_test.txt')
n = len(data)
wl = pywt.Wavelet("db1")
coeff_all = pywt.wavedec(data, wl, level=6)
cA6, cD6,cD5, cD4, cD3, cD2, cD1= coeff_all
omp0 = pywt.upcoef('a',cA6,wl,level=6)[:n]
omp1 = pywt.upcoef('d',cD1,wl,level=1)[:n]
omp2 = pywt.upcoef('d',cD2,wl,level=2)[:n]
omp3 = pywt.upcoef('d',cD3,wl,level=3)[:n]
omp4 = pywt.upcoef('d',cD4,wl,level=4)[:n]
omp5 = pywt.upcoef('d',cD5,wl,level=5)[:n]
omp6 = pywt.upcoef('d',cD6,wl,level=6)[:n]
#cA6cD_approx = omp0 + omp1 + omp2 + omp3 + omp4+ omp5 + omp6
#plt.figure(figsize=(18,9))
recon = pywt.waverec(coeff_all, wavelet= wl)
p1, =plt.plot(omp0 + omp6 + omp5 + omp4 + omp3 + omp2 + omp1,'r')
p2, =plt.plot(data, 'b')
p3, =plt.plot(recon, 'y')
plt.xlabel('Day')
plt.ylabel('Number of units sold')
plt.legend([p3,p2,p1], ["waverec reconstructed","original signal", "cA6+cD* reconstructed"])
plt.show()