Как выбрать оконную функцию для анализа временных рядов?

«Как выбрать оконную функцию для анализа временных рядов?» — вопрос из категории Временные ряды, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Выбор оконной функции — это поиск компромисса между разрешением по частоте (ширина главного лепестка) и спектральной утечкой (уровень боковых лепестков). В своей работе с анализом сигналов я руководствуюсь следующими принципами:

Распространённые окна и их применение:

Окно Главный лепесток Боковые лепестки Когда использовать
Прямоугольное (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.