首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >连续小波变换与离散小波变换产生相似谱图的比较

连续小波变换与离散小波变换产生相似谱图的比较
EN

Stack Overflow用户
提问于 2019-08-26 03:05:51
回答 1查看 1.7K关注 0票数 1

在信号上使用PyWavelets和Matplotbib.Specgram会给出比pywt.cwt更详细的pywt.dwt曲线。我怎样才能以类似的方式获得pywt.cwt规范呢?

使用dwt:

代码语言:javascript
复制
import pywt
import pywt.data
import matplotlib.pyplot as plot
from scipy import signal
from scipy.io import wavfile

bA, bD = pywt.dwt(datamean, 'db2')
powerSpectrum, freqenciesFound, time, imageAxis = plot.specgram(bA, NFFT =  387, Fs=100)

plot.xlabel('Time')
plot.ylabel('Frequency') 
plot.show()

有了这个谱图:

https://imgur.com/a/bYb8bBS

使用cwt:

代码语言:javascript
复制
widths = np.arange(1,5)
coef, freqs = pywt.cwt(datamean, widths,'morl')
powerSpectrum, freqenciesFound, time, imageAxis = plot.specgram(coef, NFFT = 129, Fs=100)

plot.xlabel('Time')
plot.ylabel('Frequency') 
plot.show()   

有了这个谱图:

https://imgur.com/a/GIINzJp

为了获得更好的结果:

代码语言:javascript
复制
sig  = datamean
widths = np.arange(1, 31)
cwtmatr = signal.cwt(sig, signal.ricker, widths)

plt.imshow(cwtmatr, extent=[-1, 1, 1, 5], cmap='PRGn', aspect='auto',
       vmax=abs(cwtmatr).max(), vmin=-abs(cwtmatr).max())
plt.show()

有了这个谱图:

https://imgur.com/a/TnXqgGR

我如何才能得到cwt (光谱图2和3)中类似的光谱图和风格,就像第一个?与第三个相比,第一个谱图似乎有更多的细节。

EN

回答 1

Stack Overflow用户

发布于 2019-08-26 20:31:59

这将是一个更好的评论,但由于我缺乏这样做的因果关系:

你不会想要用小波做一个谱图,而是一个标度图。上面看起来你正在做的是将你的数据投影到一个尺度子空间(这与频率相关),然后使用这些尺度并找到它们的频率内容,这可能不是你想要的。

细节系数和近似系数是您想要直接使用的。不幸的是,PyWavelets没有一个简单的绘图函数来为你做这件事,AFAIK。Matlab是这样做的,如果我失败了,他们的帮助页面可能会有所启发。

代码语言:javascript
复制
def scalogram(data):
    wave='db4'
    coeff=pywt.wavedec(data,wave)
    levels=len(coeff)
    lengths=[len(co) for co in coeff]
    col=np.max(lengths)
    im=np.ones([levels,col])
    col=col.astype(float)
    for level in range(levels):
        #print [lengths[level],col]
        y=coeff[level]
        if lengths[1+level]<col:
            x=col/(lengths[1+level]+1)*np.arange(1,len(y)+1)
            xi=np.linspace(0,int(col),int(col))
            yi=griddata(points=x,values=y,xi=xi,method='nearest')
        else:
            yi=y
        im[level,:]=yi
    im[im==0]=np.nan
    tiles=sum(lengths)-lengths[0]
    return im,tiles
Wxx,tiles=scalogram(data)
IM=plt.imshow(np.log10(abs(Wxx)),aspect='auto')
plt.show()

有更好的方法可以做到这一点,但它是有效的。这会产生一个类似于"Wxx“中的语谱图的方阵,而tiles只是时频平铺的数量的计数器,以与SFFT中使用的数量进行比较。

我附上了一张这些瓷砖的照片

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

https://stackoverflow.com/questions/57648935

复制
相关文章

相似问题

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