Перетворення Фур'є і звук
Кожен звук — нота фортепіано, людський голос, гуркіт грому — є суперпозицією чистих синусоїдальних хвиль. Перетворення Фур'є розкриває цю приховану частотну структуру. Воно перетворює форми хвиль на спектри, відкриває шлях до стиснення аудіо, уможливлює визначення висоти тону та розпізнавання мовлення і лежить в основі практично кожного конвеєра цифрової обробки сигналів. Ця стаття проведе вас від математичного означення до FFT Кулі-Тьюкі та живої спектрограми у браузері.
1. Синусоїди та частотна область
Чистий тон на частоті f Гц — це синусоїда: x(t) = A cos(2πft + φ). Запис через комплексну експоненту об'єднує амплітуду й фазу в одне число за допомогою формули Ейлера:
x(t) = Re{ A e^{i(2πft + φ)} }
Перетворення Фур'є розкладає довільний сигнал x(t) на його складові комплексні експоненти:
x(t) = ∫₋∞^∞ X(f) e^{+i 2πft} df // обернене: синтез із частотних компонентів
|X(f)|² — це спектральна щільність потужності — скільки потужності несе сигнал на частоті f. Графік |X(f)| залежно від f дає звичну спектральну діаграму. У цифровому аудіо сигнали дискретизуються з фіксованою частотою f_s (44 100 Гц для CD-аудіо); це веде до дискретної версії.
2. Дискретне перетворення Фур'є (DFT)
Маючи N комплексних відліків x[0] … x[N-1], DFT дає N комплексних значень у частотній області X[0] … X[N-1]:
x[n] = (1/N) Σₖ₌₀^{N-1} X[k] · e^{+i 2π kn / N} // IDFT
Кожен вихід X[k] — це скалярний добуток входу з комплексною синусоїдою на частоті k/N циклів на відлік. Для реального аудіо, дискретизованого з частотою f_s Гц, фізична частота біна k дорівнює:
Наївне DFT має складність O(N²) — неприйнятно повільно для N = 4096 чи більших вікон. FFT обчислює точно ті самі значення за O(N log N).
3. Швидке перетворення Фур'є Кулі-Тьюкі
Ключова ідея (Кулі та Тьюкі, 1965; також знайдена Гаусом у 1805 році) полягає в поділі та володарюванні — розбитті DFT довжини N на два DFT довжини N/2:
де E[k] = DFT членів із парними індексами x[0], x[2], x[4], … O[k] = DFT членів із непарними індексами x[1], x[3], x[5], … W_N^k = e^{-i 2πk/N} (поворотний множник)
Застосована рекурсивно до N = 2^m відліків, ця мережа метеликів вимагає O(N log₂ N) комплексних множень замість O(N²) — для N = 4096 це прискорення у 682 рази.
Діаграма метелика
Кожен етап-метелик об'єднує пару комплексних значень (a, b) у:
Повне FFT за основою 2 з проріджуванням за часом (DIT) проходить log₂ N етапів по N/2 метеликів у кожному. Індекси входу піддаються бітовому реверсу перед першим етапом (бо поділ на парні/непарні відповідає взяттю бітів від молодшого до старшого).
4. Віконне зважування та спектральне витікання
Застосування DFT до блоку скінченної довжини, який різко обриває сигнал, рівнозначне множенню сигналу на прямокутне вікно. У частотній області множення стає згорткою зі спектром прямокутного вікна (функцією sinc). Широкі бічні пелюстки sinc «просочують» енергію від сильних частотних компонентів у сусідні біни.
Віконні функції плавно зводять блок до нуля на обох кінцях, придушуючи витікання ціною дещо ширших головних пелюсток (зниженої роздільної здатності за частотою):
- Ганна: w[n] = 0.5 − 0.5 cos(2πn/(N-1)). Хороший універсальний вибір.
- Геммінга: w[n] = 0.54 − 0.46 cos(2πn/(N-1)). Краще придушення бічних пелюсток, ніж у вікна Ганна.
- Блекмана-Гарріса: дуже низькі бічні пелюстки (−92 дБ). Застосовується, коли роздільна здатність за частотою менш важлива, ніж придушення бічних пелюсток.
- Flat-top (пласковершинне): мінімальна похибка амплітуди; застосовується в точних вимірюваннях амплітуди.
5. Короткочасне перетворення Фур'є та спектрограми
Короткочасне перетворення Фур'є (STFT) застосовує DFT до коротких, перекривних вікон, що ковзають уздовж сигналу, даючи 2-вимірне часо-частотне представлення:
m = індекс кадру (вісь часу), H = крок переходу (відліків на крок), k = частотний бін, w = віконна функція
Зображення |STFT(m, k)|² (час по горизонталі, частота по вертикалі, інтенсивність = потужність) дає спектрограму. Музичні ноти постають як горизонтальні яскраві лінії; форманти й гармоніки мовлення видно як вертикальні смугасті патерни.
Мел-спектрограма викривлює частотну вісь із Гц до перцептивної мел-шкали (логарифмічно розрідженої на високих частотах), даючи компактні представлення, що широко використовуються в моделях машинного навчання для аудіо: wave-to-vec, Whisper та MusicLM — усі вони обробляють мел-спектрограми.
6. JavaScript: FFT з нуля
// FFT Кулі-Тьюкі за основою 2 (на місці, комплексний вхід/вихід)
// re[] та im[] — окремі масиви дійсної та уявної частин довжини N (степінь 2)
function fft(re, im) {
const N = re.length;
// Перестановка з бітовим реверсом
for (let i = 1, j = 0; i < N; i++) {
let bit = N >> 1;
for (; j & bit; bit >>= 1) j ^= bit;
j ^= bit;
if (i < j) {
[re[i], re[j]] = [re[j], re[i]];
[im[i], im[j]] = [im[j], im[i]];
}
}
// Етапи метеликів
for (let len = 2; len <= N; len <<= 1) {
const ang = -2 * Math.PI / len; // e^{-i 2π/len}
const wRe = Math.cos(ang), wIm = Math.sin(ang);
for (let i = 0; i < N; i += len) {
let curRe = 1, curIm = 0;
for (let k = 0; k < len / 2; k++) {
const uRe = re[i + k], uIm = im[i + k];
const vRe = re[i + k + len / 2], vIm = im[i + k + len / 2];
const tRe = curRe * vRe - curIm * vIm;
const tIm = curRe * vIm + curIm * vRe;
re[i + k] = uRe + tRe;
im[i + k] = uIm + tIm;
re[i + k + len / 2] = uRe - tRe;
im[i + k + len / 2] = uIm - tIm;
const newCurRe = curRe * wRe - curIm * wIm;
curIm = curRe * wIm + curIm * wRe;
curRe = newCurRe;
}
}
}
}
// Віконна функція Ганна
function hann(n, N) { return 0.5 * (1 - Math.cos(2 * Math.PI * n / (N - 1))); }
// Амплітудний спектр (перша половина, у дБ) для блоку дійсних аудіовідліків
function spectrum(samples) {
const N = samples.length;
const re = Float64Array.from(samples, (v, n) => v * hann(n, N));
const im = new Float64Array(N);
fft(re, im);
const mag = new Float64Array(N / 2);
for (let k = 0; k < N / 2; k++)
mag[k] = 20 * Math.log10(Math.hypot(re[k], im[k]) + 1e-10);
return mag; // амплітуди у dBFS
}
7. Визначення висоти тону через мікрофон браузера
Web Audio API надає аудіоконвеєр реального часу,
доступний у стандартних браузерах. Проста реалізація використовує
виявлення піків на основі FFT,
доповнене параболічною інтерполяцією для уточнення оцінки частоти:
async function startPitchDetector() {
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
const ctx = new AudioContext();
const src = ctx.createMediaStreamSource(stream);
const N = 4096;
const analyser = ctx.createAnalyser();
analyser.fftSize = N;
src.connect(analyser);
const buf = new Float32Array(N);
function tick() {
analyser.getFloatTimeDomainData(buf);
// Застосувати FFT (повторно використовуємо нашу функцію)
const re = Float64Array.from(buf, (v, n) => v * hann(n, N));
const im = new Float64Array(N);
fft(re, im);
// Знайти бін піка (пропускаємо DC-бін 0)
let peakBin = 1, peakMag = 0;
for (let k = 1; k < N / 2; k++) {
const m = re[k] * re[k] + im[k] * im[k];
if (m > peakMag) { peakMag = m; peakBin = k; }
}
// Параболічна інтерполяція: уточнення піка в межах біна
const a = Math.hypot(re[peakBin - 1], im[peakBin - 1]);
const b = Math.hypot(re[peakBin], im[peakBin]);
const c = Math.hypot(re[peakBin + 1], im[peakBin + 1]);
const refinedBin = peakBin + (a - c) / (2 * (a - 2 * b + c));
const hz = refinedBin * ctx.sampleRate / N;
console.log(`Pitch: ${hz.toFixed(1)} Hz`);
requestAnimationFrame(tick);
}
tick();
}
8. Застосування
MP3 та стиснення аудіо
MP3 використовує модифіковане дискретне косинусне перетворення (MDCT), варіант перетворення Фур'є, щоб перевести аудіоблоки в частотну область. Потім психоакустична модель маскує частотні компоненти, які людський слух не здатен розрізнити (замасковані гучнішими сусідніми частотами), і виділяє цим компонентам менше бітів.
Шумозаглушення
Навушники з активним шумозаглушенням аналізують спектр навколишнього шуму в реальному часі й виробляють протифазний сигнал для його придушення. Бюджети затримки та проєктування фільтрів повністю визначаються аналізом Фур'є: послаблення на кожній частоті вимагає, щоб фаза антишуму була зміщена рівно на π радіан.
Стиснення зображень (JPEG)
JPEG застосовує 2-вимірне дискретне косинусне перетворення (дійсну версію DFT) до блоків 8×8 пікселів. Низькочастотні коефіцієнти DCT несуть більшу частину візуальної енергії й зберігаються; високочастотні коефіцієнти агресивно квантуються. Та сама ключова ідея — розріджене представлення в частотній області — лежить в основі й JPEG 2000, HEIC та сучасних нейронних кодеків.
Реконструкція МРТ
МРТ-сканер вимірює перетворення Фур'є намагніченості тканин (зване k-простором) напряму. Реконструкція зображення тканини — це просто обернене 2-вимірне FFT. Теорія стисненого зчитування (compressed sensing) показує, що недодискретизований k-простір можна точно відновити, якщо тканина розріджена в певній області перетворення — це скорочує час сканування у 4–8 разів у сучасних клінічних протоколах.