在信号上使用PyWavelets和Matplotbib.Specgram会给出比pywt.cwt更详细的pywt.dwt曲线。我怎样才能以类似的方式获得pywt.cwt规范呢?
使用dwt:
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()有了这个谱图:
使用cwt:
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() 有了这个谱图:
为了获得更好的结果:
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()有了这个谱图:
我如何才能得到cwt (光谱图2和3)中类似的光谱图和风格,就像第一个?与第三个相比,第一个谱图似乎有更多的细节。
发布于 2019-08-26 20:31:59
这将是一个更好的评论,但由于我缺乏这样做的因果关系:
你不会想要用小波做一个谱图,而是一个标度图。上面看起来你正在做的是将你的数据投影到一个尺度子空间(这与频率相关),然后使用这些尺度并找到它们的频率内容,这可能不是你想要的。
细节系数和近似系数是您想要直接使用的。不幸的是,PyWavelets没有一个简单的绘图函数来为你做这件事,AFAIK。Matlab是这样做的,如果我失败了,他们的帮助页面可能会有所启发。
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中使用的数量进行比较。
我附上了一张这些瓷砖的照片

https://stackoverflow.com/questions/57648935
复制相似问题