如何用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
相关产品推荐
相关产品推荐

