stft Python
时间: 2025-01-02 16:39:30 浏览: 6
### Python中实现STFT短时傅里叶变换
在Python中,`scipy.signal`库提供了方便的方法来执行短时傅里叶变换(STFT),这使得处理音频和其他时间序列数据变得简单。下面是一个具体的例子展示如何利用此功能完成STFT操作并绘制相应的时频图。
#### 导入必要的库
为了能够运行STFT函数以及可视化结果,需要导入几个重要的Python包:
```python
import numpy as np
from scipy import signal
import matplotlib.pyplot as plt
```
这些库分别用于数值运算、信号处理和绘图显示[^1]。
#### 创建测试信号
构建一段由两个不同频率组成的合成信号作为输入给STFT算法:
```python
fs = 1000 # 设置采样率
t = np.linspace(0., 2., int(2. * fs)) # 时间轴
x = np.sin(2 * np.pi * 50 * t) + np.sin(2 * np.pi * 120 * t) # 合成信号
```
这里创建了一个持续时间为两秒的信号,它包含了50 Hz 和 120 Hz 的正弦分量[^2]。
#### 执行STFT转换
调用`stft()` 函数来进行实际的STFT计算,并获取返回的时间-频率矩阵表示形式的数据:
```python
frequencies, times, Zxx = signal.stft(x, fs=fs, nperseg=256)
amplitude_spectrum = np.abs(Zxx) # 获取幅度谱
```
上述代码片段设置了窗口大小为256个样本点(`nperseg`),这对于大多数应用场景来说都是合理的默认值;当然也可以根据具体需求调整这个参数[^3]。
#### 可视化结果
最后一步就是把得到的结果画出来以便直观理解:
```python
plt.figure(figsize=(8, 6))
plt.pcolormesh(times, frequencies, amplitude_spectrum, shading='gouraud')
plt.title('STFT Magnitude Spectrum')
plt.ylabel('Frequency [Hz]')
plt.xlabel('Time [s]')
plt.colorbar(label='Amplitude |X(f,t)|')
plt.tight_layout()
plt.show()
```
这段脚本会生成一张色彩映射图表,其中横坐标代表时间,纵坐标则对应着各个可能存在的频率成分,颜色深浅反映了该时刻下特定频率处的能量强度。
阅读全文