Ответ
Выбор оконной функции — это поиск компромисса между разрешением по частоте (ширина главного лепестка) и спектральной утечкой (уровень боковых лепестков). В своей работе с анализом сигналов я руководствуюсь следующими принципами:
Распространённые окна и их применение:
| Окно | Главный лепесток | Боковые лепестки | Когда использовать |
|---|---|---|---|
| Прямоугольное (Rectangular) | Узкий | Высокие | Оценка точных частот при известной целой периодичности, резкие обрезки (плохо для спектрального анализа). |
| Хэннинг (Hanning) | Широкий | Низкие | Спектральный анализ по умолчанию. Хороший общий баланс. |
| Хэмминг (Hamming) | Широкий | Очень низкие | Когда критично подавление ближайших боковых лепестков (например, в цифровых фильтрах). |
| Блэкман (Blackman) | Очень широкий | Минимальные | Когда требуется максимальное подавление утечек, а потеря частотного разрешения приемлема. |
| Кайзер (Kaiser) | Настраиваемый | Настраиваемый | Когда нужен контроль над параметрами. Задаётся параметром beta. |
Практический пример в Python: Допустим, я анализирую аудиосигнал и хочу увидеть его спектрограмму.
import numpy as np
import matplotlib.pyplot as plt
from scipy import signal
# Генерируем тестовый сигнал (сумма двух синусоид)
fs = 1000 # Частота дискретизации
t = np.arange(0, 1.0, 1/fs)
f1, f2 = 50, 120 # Частоты компонент
x = 0.7 * np.sin(2*np.pi*f1*t) + np.sin(2*np.pi*f2*t)
# Выбираю окно Хэннинга как стандарт для спектрального анализа
window = np.hanning(len(x))
x_windowed = x * window
# Рассчитываем и визуализируем БПФ
freqs = np.fft.rfftfreq(len(x_windowed), 1/fs)
fft_vals = np.abs(np.fft.rfft(x_windowed))
plt.figure(figsize=(10,4))
plt.plot(freqs, fft_vals)
plt.title('Спектр сигнала (окно Хэннинга)')
plt.xlabel('Частота (Гц)')
plt.ylabel('Амплитуда')
plt.grid(True)
plt.show()
Моё правило: Начинаю с окна Хэннинга. Если вижу сильную утечку (размазывание пиков), перехожу к Блэкману. Если важно сохранить разрешение для близких частот и сигнал длинный, пробую Кайзер с подобранным beta.