2

I am trying to understand the concept of wavelets using the pywavelet library. My first step was to see how I could reconstruct a given input signal using the wavelet coefficients. Please see my code below:

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()

This yielded the following plot: Reconstruction using upcoef

Now, when I used the waverec() method, the signal reconstruction was quite accurate. Please see plot below: Reconstruction using waverec

Can someone please explain the difference between the two reconstruction methods?

4

3 回答 3

1

我改变了一点,尤其是“级别”的设置。从图中,您将看到两种重构方式将产生相同的结果。

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()
于 2018-08-03T11:03:02.110 回答
1

它们都是逆离散小波变换“upcoef”是使用系数的直接重建,而“waverec”是多级 1D 逆离散小波变换,做几乎相同的事情,但这样做的方式可以让你排列你的系数,开发时效率更高。

于 2017-04-28T22:54:06.970 回答
1

函数wavedec执行树分解,这意味着先进行过滤,然后再进行下采样(二元方案的因子为 2)。

函数waverecupcoef都可以导致重建。
第一个是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 网格框架上可视化所有细节时,子尺度插值才有用。这样的插值并没有带来更多,因为任何子尺度中包含的信息量及其插值版本都是相同的。

于 2018-10-05T06:42:03.357 回答