首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >准小波信号重构

准小波信号重构
EN

Stack Overflow用户
提问于 2017-04-20 16:33:21
回答 3查看 3.5K关注 0票数 2

我正在尝试使用pywavelet库来理解小波的概念。我的第一步是看看如何使用小波系数重建给定的输入信号。下面是我的代码:

代码语言:javascript
复制
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()方法时,信号重建相当准确。如下图所示:

有人能解释一下这两种重建方法的区别吗?

EN

回答 3

Stack Overflow用户

发布于 2017-04-29 06:54:07

它们都是逆离散小波变换"upcoef"是使用系数的直接重建,而"waverec"是多级1D离散小波逆变换,做几乎相同的事情,但以一种允许您排列系数的方式进行,开发时效率更高。

票数 1
EN

Stack Overflow用户

发布于 2018-08-03 19:03:02

我做了一点改动,特别是"level“的设置。从图中,您将看到两种重建方法将产生相同的结果。

代码语言:javascript
复制
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()
票数 1
EN

Stack Overflow用户

发布于 2018-10-05 14:42:03

wavedec函数执行树形分解,这意味着先进行滤波,然后进行下采样(对于二进方案,因子为2)。

两个函数waverec和upcoef都可以导致重建。

第一个是waverec,它执行一个直接的树重建,这与wavedec所做的事情是对称的,这意味着在进行上采样之后进行滤波。在每个重建级别(在您的情况下为6个),还将执行求和,以生成具有更多细节的信号,用于下一个重建级别。

第二个函数upcoef允许执行给定子尺度的独立重建,而无需考虑其他子尺度中包含的其余细节。这通常在重建信号时通过零填充来执行。换句话说,upcoef可以看作是一个插值运算符。

在您的示例中,您使用upcoef将所有小波子尺度从其抽取的x网格插值到原始x网格。然后,您执行了所有插值信号的求和(仅包含已定义的有限数量的细节)。因为Daubechies的小波是正交的,所以它们可以实现完美的重建,这样你就可以在重建后恢复原始信号。

简而言之:

代码语言:javascript
复制
waverec        => direct reconstruction                        => original signal
n times upcoef => interpolation followed by a global summation => original signal

仅当您想要可视化同一非抽取x网格帧上的所有细节时,子比例插值才有用。这样的插值不会带来更多的信息,因为任何子尺度中包含的信息量及其插值版本都是相同的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43514247

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档