STFT: Фурье по окнам
Соединяем окна из временной области и Фурье — получаем эволюцию частот во времени.
STFT (Short-Time Fourier Transform) — применение преобразования Фурье к каждому короткому окну сигнала; результат показывает, как спектр меняется во времени.
Обычное преобразование Фурье даёт один спектр на всю запись — но речь меняется! За секунду спектр гласного сменяется спектром согласного. Нам нужна не одна фотография частот, а «видео». Его и даёт STFT: режем сигнал на окна (как в разделе про временную область) и считаем Фурье для каждого.
Как собирается STFT
Алгоритм объединяет всё, что мы изучили: нарезку на перекрывающиеся окна, оконную функцию и FFT. Результат — двумерная таблица: строки = частоты, столбцы = моменты времени, значения = сила частоты в этот момент.
сигнал --> окно1 --> FFT --> спектр1 |
--> окно2 --> FFT --> спектр2 | складываем
--> окно3 --> FFT --> спектр3 | в столбцы
v
таблица (частота × время) = спектрограмма
Эта таблица и есть основа спектрограммы — её мы подробно разберём в следующем разделе.
Компромисс время-частота
У STFT есть фундаментальное ограничение, вытекающее из физики (принцип неопределённости). Нельзя одновременно точно знать когда и на какой частоте произошло событие.
| Окно | Время | Частота |
| короткое | точно «когда» | грубо «какая частота» |
| длинное | грубо «когда» | точно «какая частота» |
Поэтому размер окна — это компромисс. Для речи берут 20–30 мс: разумный баланс. Хотите ловить быстрые щелчки — окно короче; хотите точно мерить низкие частоты — длиннее.
Размеры STFT кодом
Посчитаем форму итоговой спектрограммы по параметрам — это помогает читать вывод librosa.
sample_rate = 16000
duration = 1.0 # секунда
n_fft = 400 # окно 25 мс
hop = 160 # шаг 10 мс
total = int(sample_rate * duration)
n_frames = 1 + (total - n_fft) // hop
n_freq_bins = n_fft // 2 + 1 # столько частотных бинов даёт FFT
print("Отсчётов:", total)
print("Кадров (по времени):", n_frames)
print("Частотных бинов:", n_freq_bins)
print("Форма спектрограммы:", (n_freq_bins, n_frames))Вывод:
Отсчётов: 16000 Кадров (по времени): 98 Частотных бинов: 201 Форма спектрограммы: (201, 98)
Из одной секунды звука получилась таблица 201×98. Каждый столбец — спектр одного окна, каждая строка — поведение одной частоты во времени.
Хорошая бытовая метафора STFT — это нотная запись против одной усреднённой «характеристики» пьесы. Обычный Фурье сообщил бы вам: «в этой сонате в целом много до, ре и соль» — и всё. А нотный лист показывает, в какой момент какая нота звучит и как долго тянется. STFT превращает звук именно в такую партитуру: вертикаль — высота (частота), горизонталь — время, а насыщенность отметки — громкость. Поэтому спектрограмма читается почти как ноты: видно, как гласный «держит» свои полосы, а взрывной согласный мелькает вертикальной чёрточкой.
Компромисс время-частота перестаёт быть абстрактным, если перевести его в герцы и миллисекунды. Окно в 25 мс при 16 кГц — это 400 отсчётов, и FFT делит диапазон до 8000 Гц примерно на 200 бинов, то есть разрешение по частоте около 40 Гц. Хотите различать частоты с точностью 10 Гц — берите окно вчетверо длиннее, но тогда вы «усредните» 100 мс звука и размажете быстрые согласные. Это не недостаток конкретной библиотеки, а закон природы: чем уже вы режете время, тем грубее видите частоту, и обойти это нельзя — только выбрать удобный для задачи баланс.
Отдельно стоит запомнить, что такое частотный бин, потому что здесь часто путаются. FFT не выдаёт частоты «в герцах» напрямую — он отдаёт пронумерованные корзины, и бин с номером k соответствует частоте k · sr / n_fft герц. При sr = 16000 и n_fft = 400 соседние бины отстоят на 40 Гц, и весь полезный диапазон укладывается в 201 бин. Поэтому, когда модель «смотрит на строку спектрограммы», она смотрит не на конкретный герц, а на узкую полосу частот. Понимание этого избавляет от загадок вроде «почему пик размазан на два бина».
Как работает под капотом
Когда вы пишете librosa.stft(y, n_fft=400, hop_length=160), внутри происходит ровно это: сигнал нарезается на 98 окон, каждое умножается на оконную функцию, к каждому применяется FFT, результаты складываются в матрицу комплексных чисел. Взяв модуль (амплитуду), получаем спектрограмму; возведя в квадрат — спектрограмму мощности. Дальнейшие признаки (мел, MFCC) строятся уже из неё.
Частые ошибки
- Ждать от STFT идеальной точности. Принцип неопределённости запрещает одновременно точные время и частоту.
- Неверный размер окна. Слишком длинное смазывает быструю речь, слишком короткое — низкие частоты.
- Путать частотные бины и герцы. Бин N соответствует частоте N·sr/n_fft Гц — это надо пересчитывать.
Итоги
- STFT — Фурье по скользящим окнам; показывает эволюцию спектра во времени.
- Результат — таблица частота × время (основа спектрограммы).
- Компромисс время-частота: короткое окно — точное время, длинное — точная частота.
- Параметры n_fft и hop задают форму итоговой спектрограммы.