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()
关键修改点
- 处理NaN值:添加
.dropna()去除滚动平均产生的缺失值,避免小波变换报错或出现异常结果。 - 使用计算得到的频率:改用
pywt.cwt返回的calculated_freqs(重命名避免和自定义freqs混淆)来设置y轴范围,确保频率维度准确。 - 设置
origin='lower':让矩阵的第一行(对应低频率)显示在图的底部,第二行依次向上对应更高频率,和y轴的标注方向一致。
替代方案(若不想用origin参数)
如果保留origin='upper'(默认),可以反转y轴来匹配频率顺序:
axs[i].invert_yaxis()
内容的提问来源于stack exchange,提问作者sssj
相关产品推荐
相关产品推荐

