短时傅里叶变换(STFT)窗函数对比
时间: 2025-01-12 20:39:42 浏览: 108
### 不同窗函数对短时傅里叶变换的影响
在信号处理领域,选择合适的窗函数对于短时傅里叶变换(STFT)至关重要。不同的窗函数会影响频谱分析的结果,在时间分辨率和频率分辨率之间取得平衡。
#### 矩形窗(Rectangular Window)
矩形窗是最简单的窗函数形式,其特点是所有样本权重相等。尽管实现简单,但在实际应用中往往不是最佳选择。由于其旁瓣较高,容易引起泄漏效应,影响相邻频率分量之间的区分度[^1]。
```python
import numpy as np
from scipy.signal import get_window
import matplotlib.pyplot as plt
window = 'boxcar' # Rectangular window alias in SciPy
win_rect = get_window(window, 50)
plt.plot(win_rect)
plt.title('Rectangular Window')
plt.show()
```
#### 汉宁窗(Hanning Window)
汉宁窗通过平滑过渡减少数据端点处的不连续性,从而降低旁瓣水平并提高主瓣宽度内的能量集中程度。这有助于改善频域表示的质量,尤其适合于存在多个紧密间隔谐波成分的情况[^2]。
```python
win_hann = get_window('hann', 50)
plt.plot(win_hann)
plt.title('Hanning Window')
plt.show()
```
#### 哈明窗(Hamming Window)
哈明窗与汉宁窗相似,但设计上略有不同,旨在进一步抑制特定位置上的最大副峰幅度。因此,在某些应用场景下可能提供更好的性能表现。
```python
win_hamm = get_window('hamming', 50)
plt.plot(win_hamm)
plt.title('Hamming Window')
plt.show()
```
#### 黑曼窗(Blackman Window)
黑曼窗具有更宽广的主瓣以及更低的侧边峰值特性,适用于需要更高精度解析能力的任务场景。然而,这也意味着它的时间局部化性质相对较差一些。
```python
win_black = get_window('blackman', 50)
plt.plot(win_black)
plt.title('Blackman Window')
plt.show()
```
为了直观展示这些窗函数如何改变 STFT 的输出效果,可以利用 Python 中的相关库来绘制对比图:
```python
from scipy.fft import fftshift, fftfreq
from scipy.signal import stft
def plot_stft_comparison(signal, fs=1.0):
windows = ['boxcar', 'hann', 'hamming', 'blackman']
fig, axes = plt.subplots(len(windows)+1, figsize=(8, 6*len(windows)))
f, t, Zxx = stft(signal, fs=fs, nperseg=len(signal))
extent = [np.min(t), np.max(t), -(f[-1]-f[0])/2., (f[-1]-f[0])/2.]
for i, win_type in enumerate(windows):
_, _, Zxx_win = stft(signal, fs=fs, window=get_window(win_type, len(signal)), nperseg=len(signal))
ax = axes[i]
im = ax.imshow(np.abs(Zxx_win), aspect='auto', origin='lower', cmap='inferno',
extent=extent)
ax.set_title(f'STFT with {win_type.capitalize()} Window')
fig.colorbar(im, ax=ax)
plt.tight_layout()
plt.show()
# Example usage:
time = np.linspace(-1, 1, 400)
signal = np.sin(2 * np.pi * 7 * time) + np.random.randn(*time.shape)*0.5
plot_stft_comparison(signal)
```
上述代码片段展示了四种常见窗函数应用于同一测试信号后的 STFT 结果差异。观察图像可以帮助理解各种窗函数的选择会对最终得到的信息有何种影响。
阅读全文
相关推荐

















