STFT 算法

  • 对信号分段进行FFT处理, 每次处理的结果都是谱图中的一列;
  • 每段信号的长度越短,时间轴上的精度越高,频率轴上的精度越低
  • 时间轴和频率轴的分辨率是一对不可调和的矛盾
  • 根据傅立叶变换的不确定原理,我们不能同时获得频率和时间的高分辨率

specgram() 函数

  • 第一个参数:信号的组数
  • 第二个参数:FFT的长度
  • 第三个参数:信号的采样频率
  • overlap: 连续两块数据之间的重叠部分的长度, 该参数越接近FFT的长度,FFT运算的次数越多,时间轴上的精度越大
import numpy as np
import matplotlib.pyplot as plt
import scipy.signal as signal


sampling_rate = 8000.0
fft_size = 1024
step = fft_size/16
time = 2
t = np.arange(0, time, 1/sampling_rate)
sweep = signal.chirp(t, f0=100, t1=time, f1=0.8*sampling_rate/2, method='logarithmic')

plt.specgram(sweep, fft_size, sampling_rate, noverlap=1024-step)
plt.xlabel('Time (s)')
plt.ylabel('Freq. (Hz)')

211130-Python谱图(Spectogram)分析Demo_时间轴


211130-Python谱图(Spectogram)分析Demo_python_02