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

Morlet小波变换图形异常:如何修正频率标注错误?

修正Morlet小波变换频率维度展示问题

你的判断是对的——当前代码的频率标注和实际展示的维度不匹配,问题出在尺度与频率的对应顺序以及imshow的轴设置上。以下是具体修正方案:

问题根源

pywt.cwt返回的frequencies数组是按输入尺度从大到小的顺序对应的频率(即频率从小到大排列),而你自定义的freqs是升序(1~49Hz),同时imshow默认将矩阵的第一行放在图的顶部,导致图中顶部显示的是低频率(对应大尺度),但你标注的y轴是从低到高,两者颠倒,看起来像是展示了尺度而非频率。

修正后的代码

import numpy as np
import matplotlib.pyplot as plt
import pywt
import pandas as pd  # 确保导入pandas(若之前未导入)

# 待处理的EMG列名
columns_to_process = ['VL_R', 'VM_R', 'VM_L', 'VL_L']

# 小波变换参数
fs = 100  # 采样率
freqs = np.arange(1, 50, 1)  # 目标频率范围
scales = fs / freqs  # 计算对应尺度

# 创建子图
num_columns = len(columns_to_process)
fig, axs = plt.subplots(num_columns, 1, figsize=(10, 4 * num_columns))

for i, column in enumerate(columns_to_process):
    # 平滑数据并去除NaN(滚动平均前几个值为缺失值)
    smoothed_data = df_cleaned[column].rolling(window=10).mean().dropna()

    # 执行Morlet小波变换,传入采样周期确保频率计算准确
    coefficients, calculated_freqs = pywt.cwt(smoothed_data, scales, 'morl', sampling_period=1/fs)

    # 绘制小波变换结果:使用计算得到的频率,设置origin='lower'让频率从低到高对应图的底部到顶部
    im = axs[i].imshow(
        np.abs(coefficients),
        extent=[0, len(smoothed_data)/fs, calculated_freqs.min(), calculated_freqs.max()],
        aspect='auto',
        cmap='jet',
        origin='lower'  # 关键:让矩阵第一行对应图的底部(低频率)
    )
    axs[i].set_title(f'{column} Morlet Wavelet Transform')
    axs[i].set_ylabel('Frequency [Hz]')
    axs[i].set_xlabel('Time [sec]')

    # 添加颜色条
    cbar = plt.colorbar(im, ax=axs[i])
    cbar.set_label('Magnitude')

plt.tight_layout()
plt.show()

关键修改点

  1. 处理NaN值:添加.dropna()去除滚动平均产生的缺失值,避免小波变换报错或出现异常结果。
  2. 使用计算得到的频率:改用pywt.cwt返回的calculated_freqs(重命名避免和自定义freqs混淆)来设置y轴范围,确保频率维度准确。
  3. 设置origin='lower':让矩阵的第一行(对应低频率)显示在图的底部,第二行依次向上对应更高频率,和y轴的标注方向一致。

替代方案(若不想用origin参数)

如果保留origin='upper'(默认),可以反转y轴来匹配频率顺序:

axs[i].invert_yaxis()

内容的提问来源于stack exchange,提问作者sssj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 01:35:21