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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 23:25:18