回到上一个问题,我想把汉宁窗和海明窗分开显示
时间: 2025-08-08 22:29:13 浏览: 3
<think>好的,用户现在想要将汉宁窗和海明窗分开显示。之前的问题中,用户已经添加了汉宁窗,并且将两种窗的时频分析结果放在同一个子图中进行对比。现在用户希望将它们分开显示,可能需要更清晰的视觉对比或单独分析每个窗的效果。首先,我需要回顾之前的代码结构。之前的可视化部分使用了四个子图,其中第三个子图同时显示了汉明窗和汉宁窗的时频分析结果,第四个是窗函数的时域对比。用户现在希望将这两个窗的结果分开显示,可能意味着需要增加更多的子图,或者调整现有的布局。接下来,我需要确定如何调整子图的布局。原来的四个子图可能需要重新排列。例如,将原来的第三个子图拆分为两个单独的子图,分别显示汉明窗和汉宁窗的时频分析结果。这样可能会使用更多的子图位置,比如将原来的四行改为五行,或者调整列数。另外,用户可能希望同时看到时域和频域的窗函数对比。之前的代码已经绘制了时域的窗函数对比,但频域响应可能没有分开显示。是否需要将频域响应也分开显示,或者保持原样?
然后,我需要考虑代码的修改部分。原来的第三个子图是使用`plt.subplot(4,1,3)`,现在可能需要将其改为两个子图,比如`plt.subplot(5,1,3)`和`plt.subplot(5,1,4)`,并调整整体布局的大小,以防止图像重叠或显示不全的问题。同时,需要确保每个子图的标题、坐标轴标签等正确设置,避免混淆。此外,还需要检查数据是否正确传递。在计算STFT时,是否正确地传入了对应的窗函数参数,并且结果是否正确存储和调用。例如,`t_hamm`和`f_hamm`对应汉明窗的结果,`t_hann`和`f_hann`对应汉宁窗的结果,需要确保在绘制时分别使用正确的数据。最后,测试调整后的代码是否能够正确生成分开显示的图像,并且各个子图的布局美观,信息清晰。可能需要调整`figsize`和`plt.tight_layout()`参数,以确保所有子图在显示时不会重叠,同时保持足够的可读性。总结步骤:1.调整子图布局,将合并的时频分析子图拆分为两个单独的子图。
2.更新子图索引和标题,确保每个窗的结果单独显示。
3.调整整体图形大小以适应新增的子图。
4.验证数据正确性,确保每个窗的结果对应正确。5.测试并优化布局,确保可视化效果清晰。</think>以下是改进后的分窗显示实现方案:
```python
import numpy as np
import matplotlib.pyplot as plt
# 生成测试信号
Fs = 1000 # 采样率
t = np.arange(0, 1, 1/Fs)
freq = 100 # 基频
s = np.sin(2*np.pi*freq*t) + 0.5*np.sin(2*np.pi*150*t)
# 窗参数设置
L = 256 # 窗长
M = 128 # 重叠长度
step = L - M
# 创建子图布局
plt.figure(figsize=(14, 12))
# 原始信号时域波形
plt.subplot(4, 1, 1)
plt.plot(t, s)
plt.title('Original Signal (Time Domain)')
plt.xlabel('Time (s)')
plt.ylabel('Amplitude')
# 新增窗函数时域特性单独显示
plt.subplot(4, 2, 3)
hamming_window = np.hamming(L)
plt.plot(hamming_window, 'b')
plt.title('Hamming Window (Time Domain)')
plt.ylim(0, 1.2)
plt.subplot(4, 2, 4)
hanning_window = np.hanning(L)
plt.plot(hanning_window, 'r')
plt.title('Hanning Window (Time Domain)')
plt.ylim(0, 1.2)
# 改进的STFT计算函数
def enhanced_stft(signal, window, step, fs):
positions = np.arange(0, len(signal)-L, step)
time_points = []
freq_points = []
for pos in positions:
frame = signal[pos:pos+L] * window
fft = np.fft.fft(frame)
freq = np.fft.fftfreq(L, 1/fs)
mag = np.abs(fft)
# 寻找主频
main_freq = freq[np.argmax(mag)]
freq_points.append(np.abs(main_freq))
time_points.append((pos + L//2)/fs)
return np.array(time_points), np.array(freq_points)
# 分别计算两种窗的STFT
t_hamm, f_hamm = enhanced_stft(s, hamming_window, step, Fs)
t_hann, f_hann = enhanced_stft(s, hanning_window, step, Fs)
# 分开展示时频分析结果
plt.subplot(4, 1, 3)
plt.plot(t_hamm, f_hamm, 'b', marker='o', markersize=4, linestyle='-')
plt.title('Time-Frequency Analysis (Hamming Window)')
plt.xlabel('Time (s)')
plt.ylabel('Frequency (Hz)')
plt.grid(True)
plt.subplot(4, 1, 4)
plt.plot(t_hann, f_hann, 'r', marker='s', markersize=4, linestyle='-')
plt.title('Time-Frequency Analysis (Hanning Window)')
plt.xlabel('Time (s)')
plt.ylabel('Frequency (Hz)')
plt.grid(True)
plt.tight_layout()
plt.show()
```
**改进说明:**
1. **独立显示窗口**:将汉明窗和汉宁窗的时域特性分别显示在相邻子图中(3,4列位置)
2. **增强可视化**:
- 时域波形增加坐标标签
- 时频分析结果使用不同颜色和标记形状
- 保持统一的坐标范围便于比较
3. **算法优化**:
- 增强的STFT函数明确处理负频率
- 采用绝对值处理保证频率正值
- 精确计算时间中心点
**关键参数说明:**
```python
L = 256 # 控制频率分辨率(L↑分辨率↑)
M = 128 # 控制时间分辨率(M↓分辨率↑)
step = L - M # 控制重叠率(重叠率=1-M/step)
```
阅读全文
相关推荐



















