Обробка сигналів · Акустика · Математика
📅 Квітень 2026 ⏱ ≈ 14 хв читання 🎯 Початковий–Середній

Перетворення Фур'є і звук

Кожен звук — нота фортепіано, людський голос, гуркіт грому — є суперпозицією чистих синусоїдальних хвиль. Перетворення Фур'є розкриває цю приховану частотну структуру. Воно перетворює форми хвиль на спектри, відкриває шлях до стиснення аудіо, уможливлює визначення висоти тону та розпізнавання мовлення і лежить в основі практично кожного конвеєра цифрової обробки сигналів. Ця стаття проведе вас від математичного означення до FFT Кулі-Тьюкі та живої спектрограми у браузері.

1. Синусоїди та частотна область

Чистий тон на частоті f Гц — це синусоїда: x(t) = A cos(2πft + φ). Запис через комплексну експоненту об'єднує амплітуду й фазу в одне число за допомогою формули Ейлера:

e^{i θ} = cos θ + i sin θ

x(t) = Re{ A e^{i(2πft + φ)} }

Перетворення Фур'є розкладає довільний сигнал x(t) на його складові комплексні експоненти:

X(f) = ∫₋∞^∞ x(t) e^{-i 2πft} dt // неперервне перетворення Фур'є

x(t) = ∫₋∞^∞ X(f) e^{+i 2πft} df // обернене: синтез із частотних компонентів

|X(f)|² — це спектральна щільність потужності — скільки потужності несе сигнал на частоті f. Графік |X(f)| залежно від f дає звичну спектральну діаграму. У цифровому аудіо сигнали дискретизуються з фіксованою частотою f_s (44 100 Гц для CD-аудіо); це веде до дискретної версії.

Теорема Найквіста-Шеннона: сигнал з обмеженою смугою й максимальною частотою f_max можна ідеально відновити за відліками, взятими з частотою f_s > 2 f_max. За дискретизації 44 100 Гц можна представити частоти до 22 050 Гц — це охоплює весь діапазон чутності (20 Гц–20 кГц).

2. Дискретне перетворення Фур'є (DFT)

Маючи N комплексних відліків x[0] … x[N-1], DFT дає N комплексних значень у частотній області X[0] … X[N-1]:

X[k] = Σₙ₌₀^{N-1} x[n] · e^{-i 2π kn / N} k = 0, 1, …, N-1

x[n] = (1/N) Σₖ₌₀^{N-1} X[k] · e^{+i 2π kn / N} // IDFT

Кожен вихід X[k] — це скалярний добуток входу з комплексною синусоїдою на частоті k/N циклів на відлік. Для реального аудіо, дискретизованого з частотою f_s Гц, фізична частота біна k дорівнює:

f_k = k · f_s / N // Гц (біни k = 0 … N/2 охоплюють 0 Гц до f_s/2)

Наївне DFT має складність O(N²) — неприйнятно повільно для N = 4096 чи більших вікон. FFT обчислює точно ті самі значення за O(N log N).

3. Швидке перетворення Фур'є Кулі-Тьюкі

Ключова ідея (Кулі та Тьюкі, 1965; також знайдена Гаусом у 1805 році) полягає в поділі та володарюванні — розбитті DFT довжини N на два DFT довжини N/2:

X[k] = E[k] + W_N^k · O[k] X[k + N/2] = E[k] − W_N^k · O[k]

де 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) у:

a′ = a + W · b b′ = a − W · b

Повне FFT за основою 2 з проріджуванням за часом (DIT) проходить log₂ N етапів по N/2 метеликів у кожному. Індекси входу піддаються бітовому реверсу перед першим етапом (бо поділ на парні/непарні відповідає взяттю бітів від молодшого до старшого).

4. Віконне зважування та спектральне витікання

Застосування DFT до блоку скінченної довжини, який різко обриває сигнал, рівнозначне множенню сигналу на прямокутне вікно. У частотній області множення стає згорткою зі спектром прямокутного вікна (функцією sinc). Широкі бічні пелюстки sinc «просочують» енергію від сильних частотних компонентів у сусідні біни.

Віконні функції плавно зводять блок до нуля на обох кінцях, придушуючи витікання ціною дещо ширших головних пелюсток (зниженої роздільної здатності за частотою):

Вибір розміру блоку N: більше N дає тоншу роздільну здатність за частотою (f_s/N Гц на бін), але гіршу роздільну здатність у часі. Для аналізу мовлення типово беруть N = 512–2048 відліків (11–46 мс за 44 100 Гц) з перекриттям 50–75% між послідовними блоками. Для визначення музичної висоти тону часто використовують N = 4096.

5. Короткочасне перетворення Фур'є та спектрограми

Короткочасне перетворення Фур'є (STFT) застосовує DFT до коротких, перекривних вікон, що ковзають уздовж сигналу, даючи 2-вимірне часо-частотне представлення:

STFT{x}(m, k) = Σₙ x[n] · w[n − mH] · e^{-i 2πkn/N}

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();
}
Автокореляція (алгоритм YIN) загалом надійніша для оцінки висоти тону монофонічних сигналів, ніж вибір піків FFT — вона справляється з артефактом «відсутньої основної частоти», що виникає, коли гармоніки ноти присутні, але сама основна частота слабка.

8. Застосування

MP3 та стиснення аудіо

MP3 використовує модифіковане дискретне косинусне перетворення (MDCT), варіант перетворення Фур'є, щоб перевести аудіоблоки в частотну область. Потім психоакустична модель маскує частотні компоненти, які людський слух не здатен розрізнити (замасковані гучнішими сусідніми частотами), і виділяє цим компонентам менше бітів.

Шумозаглушення

Навушники з активним шумозаглушенням аналізують спектр навколишнього шуму в реальному часі й виробляють протифазний сигнал для його придушення. Бюджети затримки та проєктування фільтрів повністю визначаються аналізом Фур'є: послаблення на кожній частоті вимагає, щоб фаза антишуму була зміщена рівно на π радіан.

Стиснення зображень (JPEG)

JPEG застосовує 2-вимірне дискретне косинусне перетворення (дійсну версію DFT) до блоків 8×8 пікселів. Низькочастотні коефіцієнти DCT несуть більшу частину візуальної енергії й зберігаються; високочастотні коефіцієнти агресивно квантуються. Та сама ключова ідея — розріджене представлення в частотній області — лежить в основі й JPEG 2000, HEIC та сучасних нейронних кодеків.

Реконструкція МРТ

МРТ-сканер вимірює перетворення Фур'є намагніченості тканин (зване k-простором) напряму. Реконструкція зображення тканини — це просто обернене 2-вимірне FFT. Теорія стисненого зчитування (compressed sensing) показує, що недодискретизований k-простір можна точно відновити, якщо тканина розріджена в певній області перетворення — це скорочує час сканування у 4–8 разів у сучасних клінічних протоколах.

〰️ Відкрити перетворення Фур'є →