Python实现信号连续小波变换时尺度图分辨率过低问题咨询
你当前代码输出的尺度图分辨率极低的核心原因是传入signal.cwt的尺度序列数量过少,同时存在时间、频率坐标映射错误的问题,修改方案如下:
问题定位
- 你定义的
extent = np.arange(1,10)仅包含9个离散尺度,对应尺度图的频率维度仅9个像素,自然分辨率极低 - 未将尺度转换为真实物理频率,时间轴也直接使用采样点索引而非实际秒数
imshow未指定extent参数,坐标映射完全错位
修正后的代码
from scipy import signal import numpy as np import matplotlib.pyplot as plt # 加载信号 w = np.loadtxt('signal') # 请先替换为你信号的实际采样频率,这里假设采样率为100Hz,根据你的实际情况修改 fs = 100 n_samples = len(w) t = np.arange(n_samples) / fs # 生成正确的时间轴(单位:秒) # 频率范围参数 fmin = 1 # Hz fmax = 50 # Hz n_scales = 100 # 尺度数量,数值越大频率分辨率越高,可自行调整 # 计算对应频率范围的尺度序列 # scipy的morlet小波默认中心频率omega0=5,尺度与频率的转换公式为 f = fs/(scale * omega0) omega0 = 5 scales = fs / (np.linspace(fmin, fmax, n_scales) * omega0) # 反转尺度保证频率轴从低到高显示 scales = scales[::-1] # 执行连续小波变换 scalogram = signal.cwt(w, signal.morlet, scales, w=omega0) # 绘图 fig, ax = plt.subplots(2, 1, sharex=True, figsize=(10,6)) ax[0].plot(t, w) ax[0].set(ylabel='振幅') # 设置imshow的extent参数,对应 [xmin, xmax, ymin, ymax] im = ax[1].imshow(np.abs(scalogram), origin='lower', extent=[t.min(), t.max(), fmin, fmax], aspect='auto') ax[1].set(xlabel='时间 (s)', ylabel='频率 (Hz)') # 可选添加色标 plt.colorbar(im, ax=ax[1], label='幅值') plt.tight_layout() plt.show()
调整说明
- 调整
n_scales参数即可控制频率维度的分辨率,数值越高分辨率越高,但计算耗时也会同步增加,一般设置50-200即可满足需求 - 请务必将
fs替换为你实际的信号采样频率,否则频率轴数值会完全错误
内容的提问来源于stack exchange,提问作者manas
相关产品推荐
相关产品推荐

