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

如何用Python将300Hz时间序列数组转换为频谱图?

Python将(1,9000)时间序列转换为频谱图

核心思路

频谱图通过对时间序列分窗执行FFT,展示不同时间节点的频率分布特征。针对你的(1,9000)二维数组,需先将其转换为一维输入,再用scipy.signal.spectrogram计算频谱数据,最后通过matplotlib可视化。

完整代码实现

import numpy as np
from scipy import signal
import matplotlib.pyplot as plt

# 模拟你的(1,9000)时间序列数据
# 实际使用时替换为你自己的原始数组
data = np.array([[-127, -162, -197, -229] + [-22, -21] * 4498])
# 将二维数组转为一维(spectrogram要求输入为一维序列)
time_series = data.squeeze()  # 也可使用time_series = data.flatten()

# 采样频率设置
fs = 300  # Hz

# 计算频谱图
# nperseg: 单窗口样本数,值越大频率分辨率越高、时间分辨率越低
# noverlap: 窗口重叠样本数,通常设为nperseg的一半保证时间连续性
f, t, Sxx = signal.spectrogram(time_series, fs=fs, nperseg=256, noverlap=128)

# 绘制频谱图
plt.figure(figsize=(10, 6))
# 转换为dB刻度更易观察弱信号
plt.pcolormesh(t, f, 10 * np.log10(Sxx), cmap='viridis')
plt.colorbar(label='功率谱密度 (dB/Hz)')
plt.xlabel('时间 (s)')
plt.ylabel('频率 (Hz)')
plt.title('时间序列频谱图')
plt.ylim(0, fs/2)  # 仅显示奈奎斯特频率以下的有效范围(0-150Hz)
plt.tight_layout()
plt.show()

关键细节说明

  • 数据形状处理:data.squeeze()会移除长度为1的维度,将(1,9000)转为符合要求的(9000,)一维数组。
  • 参数调优:
    • 若需更高频率分辨率,可增大nperseg(比如设为300,对应1秒窗口,频率分辨率1Hz);
    • 若需更连续的时间轴,可提高noverlap占比(最大不超过nperseg-1)。
  • 刻度转换:10 * np.log10(Sxx)将线性功率转为对数刻度(dB),更贴合人对信号强度的感知逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 10:02:14