You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 16:45:05