python - 与离散小波变换相比,在连续小波变换中创建相似的频谱图
问题描述
在信号上使用 PyWavelets 和 Matplotbib.Specgram 可以用 pywt.dwt 然后 pywt.cwt 给出更详细的图。如何以类似的方式获得 pywt.cwt 规格图?
使用载重吨:
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)获得与第一个类似的频谱图和样式?与第三个相比,第一个频谱图似乎有更多的细节。
解决方案
作为评论,这会更好,但由于我缺乏这样做的业力:
您不想用小波制作频谱图,而是要制作一个尺度图。您在上面所做的似乎是将您的数据投影到一个比例子空间(与频率相关),然后采用这些比例并找到它们的频率内容,这可能不是您想要的。
细节和近似系数是您想要直接使用的。不幸的是,AFAIK,PyWavelets 没有简单的绘图功能来为您执行此操作。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”中的频谱图的方阵,并且瓦片只是时间频率瓦片数量的计数器,用于与 SFFT 中使用的数量进行比较。
推荐阅读
- jquery - 使用引导程序 4 首次单击时不显示弹出框 html
- python - 如何获得订单已提交的价格 backtester python
- spring - 我可以在 Spring MVC 中直接从其他控制器方法调用一个控制器方法吗?
- laravel - Livewire - 通过复选框分配多个值
- azure - 在 Azure Blob 存储中创建用户之间逻辑分离的最佳方法
- python - 从 Linux 的内存中记录屏幕
- ruby-on-rails - 带有 Includes 的 Rails 控制器 where 语句
- javascript - How to modify text in Javascript
- laravel - 在同一模型中复制字段 - OctoberCMS
- sharepoint - 共享点列表 - 使用预定义的循环列表自动填充列