211130-Python谱图(Spectogram)分析Demo
原创
©著作权归作者所有:来自51CTO博客作者GuokLiu的原创作品,请联系作者获取转载授权,否则将追究法律责任
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)')