短时傅里叶变换及对信号的处理python代码实现
时间: 2023-08-31 20:06:47 浏览: 30
短时傅里叶变换程序
4星 · 用户满意度95%
好的,下面是一个使用Python实现短时傅里叶变换并对信号进行处理的示例代码:
```python
import numpy as np
import matplotlib.pyplot as plt
from scipy import signal
# 生成信号
t = np.linspace(0, 1, 1000, endpoint=False)
x = np.sin(2 * np.pi * 10 * t) + np.sin(2 * np.pi * 20 * t) + np.sin(2 * np.pi * 30 * t)
# 短时傅里叶变换参数
nperseg = 50 # 窗口大小
noverlap = 25 # 重叠长度
# 计算短时傅里叶变换
f, t, Zxx = signal.stft(x, fs=1000, nperseg=nperseg, noverlap=noverlap)
# 对频谱进行处理
threshold = 0.2 # 阈值
Zxx[np.abs(Zxx) < threshold * np.max(np.abs(Zxx))] = 0 # 频谱阈值处理
# 逆变换
_, x_rec = signal.istft(Zxx, fs=1000, nperseg=nperseg, noverlap=noverlap)
# 绘制结果
plt.figure(figsize=(8, 8))
plt.subplot(211)
plt.plot(t, x)
plt.title('Original Signal')
plt.xlabel('Time')
plt.ylabel('Amplitude')
plt.subplot(212)
plt.pcolormesh(t, f, np.abs(Zxx), vmin=0, vmax=np.max(np.abs(Zxx)), shading='gouraud')
plt.title('STFT Magnitude')
plt.ylabel('Frequency [Hz]')
plt.xlabel('Time [sec]')
plt.show()
plt.figure(figsize=(8, 4))
plt.plot(t, x, label='Original Signal')
plt.plot(t, x_rec, label='Recovered Signal')
plt.legend()
plt.title('Signal Comparison')
plt.xlabel('Time')
plt.ylabel('Amplitude')
plt.show()
```
这段代码首先生成一个包含三个正弦波的信号,然后使用`signal.stft`函数进行短时傅里叶变换,得到频谱矩阵`Zxx`。接着,对频谱矩阵进行阈值处理,将小于阈值的频率成分置为0。最后,使用`signal.istft`函数对处理后的频谱进行逆变换,得到恢复后的信号`x_rec`。最后绘制出原始信号、短时傅里叶变换后的频谱和恢复后的信号的图像。
阅读全文