如何将ssqueezepy CWT生成的时间轴转换为实际时间尺度?
解决ssqueezepy CWT图像X轴与实际时间的对应问题
你用ssqueezepy做Morlet小波变换后,图像X轴显示的是音频样本点的索引,不是实际时间——因为你的1秒音频样本数等于采样率(比如44100采样率就有44100个样本),所以X轴会显示到数千。要对应实际时间,按以下方法处理:
核心对应关系
实际时间 = X轴显示的样本索引 / 音频采样率(sample_rate1)
比如采样率44100时,X轴的44100对应1秒,22050对应0.5秒。
代码修改方案
方案一:直接修改imshow的轴刻度
利用你已经定义的time向量,给图像手动替换X轴刻度:
import matplotlib.pyplot as plt import soundfile as sf import numpy as np from ssqueezepy import cwt from ssqueezepy.visuals import imshow [data1, sample_rate1] = sf.read(input_file) duration = len(data1)/sample_rate1 time = np.arange(0, duration, 1/sample_rate1) Wx, scales = cwt(data1, 'morlet') Wx = abs(Wx) # 去除复分量 # 绘制并修改X轴 imshow(Wx, abs=1) # 设置5个均匀分布的刻度点,对应0到1秒的时间 ax = plt.gca() ax.set_xticks(np.linspace(0, len(data1)-1, 5)) ax.set_xticklabels(np.linspace(0, duration, 5).round(2)) ax.set_xlabel("时间 (秒)") plt.show()
方案二:用matplotlib原生imshow自定义绘制
如果想更灵活控制绘图,直接用matplotlib的imshow替代ssqueezepy的封装:
import matplotlib.pyplot as plt import soundfile as sf import numpy as np from ssqueezepy import cwt [data1, sample_rate1] = sf.read(input_file) duration = len(data1)/sample_rate1 Wx, scales = cwt(data1, 'morlet') Wx = abs(Wx) # 去除复分量 # 自定义刻度:选5个关键位置 num_ticks = 5 tick_indices = np.linspace(0, Wx.shape[1]-1, num_ticks).astype(int) tick_times = (tick_indices / sample_rate1).round(2) plt.imshow(Wx, aspect='auto', origin='lower') plt.xticks(tick_indices, tick_times) plt.xlabel("时间 (秒)") plt.ylabel("尺度") plt.colorbar(label="小波幅值") plt.show()
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

