Fourierova transformace: rozklad signálu na frekvence
Skládání obdélníku ze sinusovek a Gibbsův jev, DFT a spektrum akordu, frekvenční rozlišení, prosakování a Hannovo okno, tón ukrytý v šumu a proč je FFT tak rychlá.
Série Základy AI Díl 57 z 83
- Mapa umělé inteligence: co je co a jak to do sebe zapadá
- Stručná historie umělé inteligence: od Turinga po jazykové modely
- Data, model, trénink, inference: základní pojmy na jednom příkladu
- Jak číst matematický zápis: symboly, indexy, sumy a kvantifikátory
- Množiny a relace: stavebnice, ze které se skládají definice v AI
- Funkce a zobrazení: proč je každý model v AI funkce
- Logika a důkazy: pravidla, podle kterých se v AI uvažuje
- Grafy a stromy: struktura, na které stojí hledání i neuronové sítě
- Lineární algebra pro strojové učení: vektory, matice a proč AI hlavně násobí
- Derivace, gradient a řetízkové pravidlo: jak model zjistí, kterým směrem se učit
- Gradientní sestup: jak se model učí
- Co je pravděpodobnost: od hodu kostkou ke Kolmogorovovým axiomům
- Podmíněná pravděpodobnost a Bayesova věta: jak změnit odhad, když se dozvíte něco nového
- Náhodná veličina a distribuční funkce: jedna funkce, která o rozdělení řekne všechno
- Funkce hustoty a pravděpodobnostní funkce: proč má spojitá veličina v bodě pravděpodobnost nula
- Střední hodnota, rozptyl a kovariance: kde rozdělení leží, jak je široké a co s čím souvisí
- Přehled pravděpodobnostních rozdělení: Bernoulli, binomické, Poisson, rovnoměrné, normální a exponenciální
- Zákon velkých čísel a centrální limitní věta: proč se průměry chovají tak předvídatelně
- Statistika a odhady parametrů: maximální věrohodnost, MAP a intervaly spolehlivosti
- Teorie informace: entropie, křížová entropie a KL divergence — odkud se berou ztrátové funkce
- Prohledávání stavového prostoru: BFS, DFS, UCS a A* s animacemi
- Hry a protivník: minimax, alfa-beta ořezávání a Monte Carlo tree search
- Splňování omezujících podmínek: backtracking, propagace omezení a AC-3 na sudoku a mapě krajů
- Logika a znalostní systémy: dopředné a zpětné řetězení, rezoluce a expertní systémy
- Plánování: STRIPS, svět kostek, heuristiky z relaxace a plánování v AI agentech
- Lokální hledání a simulované žíhání: obchodní cestující přes krajská města
- Genetické algoritmy: populace, křížení, mutace a výběr na batohu na výlet
- Evoluční strategie a genetické programování: od pravidla jedné pětiny po Keplerův zákon
- Optimalizace mravenčí kolonií: jak feromonová stopa najde krátkou cestu
- Optimalizace hejnem částic: setrvačnost, vlastní zkušenost a zkušenost hejna
- Neuroevoluce: evoluce vah i tvaru neuronových sítí a algoritmus NEAT
- Fuzzy množiny a funkce příslušnosti: jak zapsat „trochu teplo“
- Fuzzy logika a pravděpodobnost: proč „trochu teplo“ neznamená „pravděpodobně teplo“
- Fuzzy logika: t-normy, implikace a pravidla KDYŽ–PAK
- Fuzzy řízení: Mamdani a Sugeno od ventilátoru po kyvadlo na vozíku
- Fuzzy shlukování: algoritmus fuzzy c-means a body mezi shluky
- Neuro-fuzzy systémy (ANFIS): fuzzy pravidla, která se učí z dat
- Markovovy řetězce: přechodová matice, stacionární rozdělení a PageRank
- Skryté Markovovy modely: Viterbiho algoritmus a nepoctivé kasino
- Bayesovské sítě: proč je tráva mokrá a co z toho plyne pro postřikovač
- Kalmanův filtr: jak z nepřesných měření odhadnout, kde auto je a jak rychle jede
- Druhy strojového učení: s učitelem, bez učitele, s částečným učitelem a další
- Přeučení a regularizace: proč model, který zná data nazpaměť, selže
- Vyhodnocení modelu: křížová validace, F1 a křivka ROC
- Shlukování a snížení dimenze: k-means, PCA a t-SNE
- Klasifikace a regrese: dvě úlohy učení s učitelem
- Lineární regrese: nejmenší čtverce geometricky i maticově
- Polynomiální a nelineární regrese: jak přímku ohnout
- Logistická regrese: sigmoida, šance a křížová entropie
- Vícetřídní klasifikace a softmax: od dvou tříd k mnoha
- Naivní Bayesův klasifikátor: spamový filtr, který funguje lépe, než by měl
- Ztrátové funkce: co přesně model minimalizuje
- Rozhodovací stromy a k nejbližších sousedů: modely bez vzorců
- Ansámbly: náhodný les a gradient boosting
- SVM a jádrový trik: nejširší hranice a jak ji ohnout
- Signál a vzorkování: proč platí Nyquistův teorém
- Fourierova transformace: rozklad signálu na frekvence
- Filtry a konvoluce: vyhlazení, hrany a odstranění šumu
- Zvuk a řeč: spektrogram, melová škála a MFCC
- Obraz jako signál: pixely, barvy, konvoluce a hrany
- Perceptron a umělý neuron: nejjednodušší neuronová síť a co neumí
- Neuronová síť od nuly: zpětné šíření chyby krok za krokem
- Aktivace, inicializace a normalizace: drobnosti, na kterých hluboká síť stojí
- Konvoluční sítě: jak síť poznává obrázky
- Rekurentní sítě: paměť pro posloupnosti a mizející gradient
- LSTM a GRU: brány, které rozhodují, co si síť zapamatuje
- Autoenkodéry: síť, která se učí data stlačit a zase rozbalit
- Embeddingy a word2vec: jak se slovo stane vektorem
- Mechanismus pozornosti: jak se model naučí, kam se dívat
- Transformery a velké jazykové modely: architektura krok za krokem
- Tokenizace: jak se text rozseká na kousky pro model
- Předtrénování a škálování: proč větší model a víc dat funguje
- Doladění a RLHF: jak se z doplňovače textu stane asistent
- Prompty, kontext a RAG: jak modelu dát správné informace
- Variační autoenkodéry (VAE): nové obrázky ze spojitého latentního prostoru
- Generativní adversariální sítě (GAN): padělatel proti detektivovi
- Difúzní modely: jak se z čistého šumu stane obrázek
- Markovovy rozhodovací procesy: stavy, akce, odměny a Bellmanovy rovnice
- Q-learning a DQN: učení hodnoty akcí od tabulky po neuronovou síť
- Policy gradient a PPO: učení přímo strategie
- Jak funguje AI agent: jazykový model ve smyčce s nástroji
- Programování s AI agenty: zadání, testy a kontrola
- Vyhodnocení a bezpečnost AI systémů: jak měřit a jak hlídat
Celá osnova série 83 z 83 témat hotovo
- Proč se dá každý signál složit ze sinusovek a co ukazuje spektrum.
- Na čem závisí frekvenční rozlišení a k čemu je okenní funkce.
- Jak spektrum najde tón v šumu a proč FFT změnila zpracování signálů.
Co se hodí znát předem: Signál a vzorkování: proč platí Nyquistův teorém
Když na klavíru zahrajete akord, do ucha dorazí jediná zvlněná křivka tlaku vzduchu. Ucho z ní přesto pozná tři tóny. Hlemýžď ve vnitřním uchu totiž dělá to, co v matematice dělá Fourierova transformace: rozkládá signál na frekvence. Joseph Fourier na začátku 19. století při studiu šíření tepla tvrdil, že každou funkci jde složit ze sinusovek. Tehdejší matematici mu to nevěřili. Měl pravdu — a jeho myšlenka dnes stojí v kompresi MP3 a JPEG, v mobilních sítích, v rozpoznávání řeči i v tom, jak transformery v jazykových modelech kódují pořadí slov.
Navazuje na díl Signál a vzorkování.
1. Skládání ze sinusovek
Definice — Fourierova řada
Nechť T > 0 a x : ℝ → ℝ je periodická funkce s periodou T, tj. x(t + T) = x(t) pro všechna t ∈ ℝ. Číslo 1/T je její základní frekvence. Nechť a0, a1, a2, … a b1, b2, … ∈ ℝ jsou Fourierovy koeficienty funkce x (další definice). Fourierova řada funkce x je řada
a0 + ∑k=1∞ [ak cos(2πkt/T) + bk sin(2πkt/T)];
její K-tý částečný součet SK(t) obsahuje a0 a členy k = 1, …, K. Sinusovky s frekvencí k/T, k ≥ 1, se nazývají harmonické (k-tá harmonická).
„Mírné předpoklady“, za kterých řada funkci skutečně vyjádří (Dirichletova věta): je-li x na periodě po částech spojitě diferencovatelná, pak řada v každém bodě t konverguje k x(t−) + x(t+)/2, kde x(t−) a x(t+) jsou jednostranné limity. V bodech spojitosti tedy k x(t), ve skoku k průměru obou stran.
Housle a flétna zahrají stejné a, a přesto zní jinak. Obě mají základní frekvenci 440 Hz, ale k ní jinak silné harmonické — 880, 1 320, 1 760 Hz… Barva tónu je recept, kolik které harmonické přimíchat. A recept existuje pro každý periodický průběh, dokonce i pro hranatý obdélník.
Obdélník se skládá z lichých harmonických s amplitudami 4/π, 4/3π, 4/5π… Jedna sinusovka je hrubý odhad, tři členy už tvar připomínají, s padesáti je obdélník skoro hotový. U skoků ale zůstane malý zub: částečný součet vystoupí až na 1,18 a s přidáváním členů se zub zužuje, ale nesnižuje — i s 200 členy je to 1,179, tedy asi 9 % výšky skoku. Tomu se říká Gibbsův jev a je to první varování: ostré skoky potřebují nekonečně mnoho vysokých frekvencí.
Definice — Fourierovy koeficienty
Nechť T > 0 a x : ℝ → ℝ je periodická s periodou T a integrovatelná na [0, T]. Její Fourierovy koeficienty jsou čísla
a0 = 1/T ∫0T x(t) dt,
ak = 2/T ∫0T x(t) cos(2πkt/T) dt, bk = 2/T ∫0T x(t) sin(2πkt/T) dt pro k = 1, 2, …
Funguje to díky ortogonalitě: pro celá k, l ≥ 1 je ∫0T sin(2πkt/T) cos(2πlt/T) dt = 0 a pro k ≠ l je nulový i integrál součinu dvou sinů a dvou kosinů, kdežto ∫0T sin2(2πkt/T) dt = T/2. Vynásobení signálu k-tou sinusovkou a integrace proto z celé řady „vyloví“ jediný člen, bk · T/2; činitel 2/T to T/2 vyrovná.
Příklad — koeficienty obdélníku
Obdélník s periodou T = 1: x(t) = 1 pro 0 < t < ½ a −1 pro ½ < t < 1.
a0 = 0, protože kladná a záporná půlka mají stejnou plochu. ak = 0, protože obdélník je lichý (x(−t) = −x(t)) a kosinus sudý — součin je lichý a jeho integrál přes periodu nulový.
∫0½ sin(2πkt) dt = 1 − cos πk/2πk a druhá půlka dá totéž (záporný signál krát záporný sinus), takže bk = 2 · 2 · 1 − cos πk/2πk = 2(1 − cos πk)/πk.
Pro liché k je cos πk = −1, tedy bk = 4/πk: b1 = 1,273, b3 = 0,424, b5 = 0,255. Pro sudé k je cos πk = 1 a bk = 0.
Kontrola uprostřed kladné půlky, t = 1/4, pro K = 3 (barvy podle vzorce níže): 4/π · (sin(π/2)/1 + sin(3π/2)/3 + sin(5π/2)/5) = 1,273 · (1 − 0,333 + 0,2) = 1,103; jeden člen 1,273. Součet se k hodnotě 1 blíží zleva i zprava, jak se přidávají členy s opačnými znaménky.
x(t) ≈ 4/π ∑k=1K sin(2π(2k − 1)t)/2k − 1
- 4/π
- je to b1; bez něj by součet místo ±1 vycházel ±π/4 ≈ ±0,785 — činitel převádí „tvar“ na správnou výšku obdélníku
- sin(2π(2k − 1)t)
- jen sinusy, protože obdélník je lichý; a jen liché harmonické 1, 3, 5…, protože druhá půlperioda je zrcadlem první s opačným znaménkem — sudé harmonické by v obou půlkách měly stejné znaménko a vyrušily se
- (2k − 1)
- amplitudy klesají jen jako 1/k. Tak pomalu proto, že signál má skok; spojitý trojúhelník má koeficienty klesající jako 1/k2 a hladké signály ještě rychleji
- K
- počet sečtených členů (v obrázku 1, 3, 10, 50); nekonečná řada je ideál, počítač i reálný přístroj vždy sečte jen konečně mnoho — odtud Gibbsův zub
Věta — velikost Gibbsova překmitu
Nechť x je obdélník s periodou 1 z příkladu výše a pro K ≥ 1 nechť
SK(t) = 4/π ∑k=1K sin(2π(2k − 1)t)/2k − 1
je jeho částečný součet. Pak
limK → ∞ maxt ∈ (0, 1/2) SK(t) = 2/π ∫0π sin u/u du ≈ 1,1790.
Překmit nad hodnotu 1 je tedy 0,179, a protože skok z −1 na 1 má výšku 2, je to 0,179/2 ≈ 9 % výšky skoku — pro velká K nezávisle na K. Jev popsal Henry Wilbraham (1848) a znovu J. Willard Gibbs (1899).
Náčrt důkazu. První maximum za skokem leží v t = 1/4K. Označme uk = π(2k − 1)/2K; body jsou od sebe vzdálené Δu = π/K a vyplní interval (0, π). Pak sin(2π(2k − 1)t)/2k − 1 = sin uk/uk · Δu/2 a částečný součet je 4/π · 1/2 · ∑ sin uk/uk Δu — Riemannův součet integrálu výše. Náš výpočet: 1,273 pro jeden člen, 1,180 pro deset, 1,179 pro dvě stě.
2. Diskrétní Fourierova transformace
Definice — DFT a spektrum
Nechť N ≥ 1 a x[0], …, x[N − 1] ∈ ℂ (typicky reálné vzorky signálu vzorkovaného frekvencí fs > 0). Nechť i je imaginární jednotka, i2 = −1, a exp(iθ) = eiθ komplexní exponenciála (další definice). Diskrétní Fourierova transformace (DFT) vzorků je posloupnost X[0], …, X[N − 1] ∈ ℂ,
X[k] = ∑n=0N−1 x[n] · exp(−2πikn/N), k = 0, 1, …, N − 1.
Index k se nazývá koš a odpovídá mu frekvence fk = k · fs/N (v Hz). Amplitudové spektrum je posloupnost absolutních hodnot |X[k]| vynesená proti fk; arg X[k] je fáze příslušné složky. Hodnota |X[k]| tedy říká, jak silně je frekvence fk v signálu zastoupená.
Pro každou zkoumanou frekvenci vezmeme sinusovku a kosinusovku té frekvence a spočteme, jak moc se signál s nimi „shoduje“ — vynásobíme vzorek po vzorku a sečteme. Když signál danou frekvenci obsahuje, součiny mají pořád stejné znaménko a součet je velký. Když ne, kladné a záporné části se vyruší. Komplexní číslo e−iθ je jen úsporný zápis, jak udělat sinus i kosinus naráz.
Definice — komplexní exponenciála, absolutní hodnota a fáze
Nechť i je imaginární jednotka, i2 = −1, a ℂ = {a + ib : a, b ∈ ℝ} jsou komplexní čísla. Pro θ ∈ ℝ je komplexní exponenciála dána Eulerovým vzorcem
eiθ = exp(iθ) = cos θ + i sin θ
(shoduje se s dosazením iθ do Taylorovy řady exponenciály). Je to bod jednotkové kružnice v komplexní rovině, otočený od 1 o úhel θ proti směru hodinových ručiček; e−iθ = cos θ − i sin θ je otočení na druhou stranu. Nechť z = a + ib, a, b ∈ ℝ.
- Absolutní hodnota (vzdálenost od nuly): |z| = √a2 + b2.
- Komplexně sdružené číslo: z* = a − ib.
- Pro z ≠ 0 je argument (fáze) arg z to jediné číslo z intervalu (−π, π], pro které z = |z| ei arg z — úhel, který z svírá s kladnou reálnou osou.
X[k] = ∑n=0N−1 x[n] · exp(−2πi · k · n/N)
- X[k]
- výsledek pro jednu frekvenci k · fs/N: komplexní číslo, aby neslo dvě informace naráz — sílu (|X[k]|) i fázi (arg X[k])
- x[n]
- vzorky signálu; vstupují lineárně, takže spektrum součtu signálů je součet spekter — proto tři tóny akordu dají tři oddělené vrcholy
- exp(−2πikn/N)
- „zkušební“ sinusovka a kosinusovka frekvence k: za celý záznam (n od 0 do N) se otočí přesně kkrát. Celý počet otáček zaručuje, že různé koše jsou na sebe kolmé: tón s frekvencí přesně na koši se v žádném jiném koši neobjeví
- ∑n
- součet přes všechny vzorky je „hlasování“: když signál kmitá v rytmu zkušební sinusovky, součiny se sčítají, jinak se kladné a záporné vyruší
Příklad — DFT čtyř vzorků ručně
Signál x = (1, 2, 1, 0) je stejnosměrná složka 1 plus sinusovka s amplitudou 1, která se za čtyři vzorky otočí jednou: x[n] = 1 + sin(πn/2).
Pro N = 4 je exp(−2πikn/4) = (−i)kn, takže stačí mocniny −i: 1, −i, −1, i (barvy podle vzorce výše).
X[0] = 1 + 2 + 1 + 0 = 4
X[1] = 1 + 2 · (−i) + 1 · (−1) + 0 · i = −2i
X[2] = 1 + 2 · (−1) + 1 · 1 + 0 · (−1) = 0
X[3] = 1 + 2 · i + 1 · (−1) + 0 · (−i) = 2i
Čtení: stejnosměrná složka je X[0]/N = 4/4 = 1, amplituda sinusovky 2 · |X[1]|/N = 2 · 2/4 = 1. Fáze arg(−2i) = −90° říká „sinus, ne kosinus“. Koš k = 2 je prázdný a X[3] je komplexně sdružené k X[1] — viz další větu.
Věta — spektrum reálného signálu je symetrické
Nechť N ≥ 1, x[0], …, x[N − 1] ∈ ℝ a X je jejich DFT. Pak pro každé k = 1, …, N − 1 platí
X[N − k] = X[k]*
(komplexně sdružené číslo). Důkaz: pro celé n je exp(−2πi(N − k)n/N) = exp(−2πin) · exp(2πikn/N) = 1 · exp(−2πikn/N)*, sdružení součtu je součet sdružení a reálné x[n] se sdružením nemění. ∎
Důsledky: nová informace je jen v koších 0 až N/2 (pro 8 192 vzorků jich je 4 097) a energie sinusovky se dělí napůl mezi k a N − k. Proto se amplituda počítá jako 2 · |X[k]|/N — dvojka vrací polovinu ze zrcadlového koše, dělení N odstraní to, že se sčítalo N vzorků.
Akord A dur: tóny a (440 Hz), cis (554,37 Hz) a e (659,26 Hz) s amplitudami 1; 0,7 a 0,5, k tomu šum. Vzorkováno 8 000krát za sekundu, 8 192 vzorků, tedy něco přes sekundu záznamu:
V čase je signál nečitelná vlnovka. Ve spektru jsou tři ostré vrcholy, a když se jejich poloha upřesní z okolních košů, vyjde 440,0; 554,4 a 659,3 Hz. Spektrum tedy pozná, které tóny zněly, i když jsou zašuměné a smíchané.
Algoritmus — upřesnění vrcholu parabolou
Vstup: amplitudové spektrum S[0], …, S[M] ≥ 0 (koše 0 až M = N/2 z DFT délky N), vzorkovací frekvence fs > 0 a práh p ≥ 0. Výstup: seznam upřesněných frekvencí vrcholů v Hz.
- Projdi koše k = 1, …, M − 1 a vyber ty, pro které S[k] > p, S[k] > S[k − 1] a S[k] > S[k + 1] (ostrá lokální maxima nad prahem).
- Pro každý vybraný koš polož a = S[k − 1], b = S[k], c = S[k + 1].
- Spočti posun vrcholu paraboly proložené body (−1, a), (0, b), (1, c): d = 1/2 · a − c/a − 2b + c. Protože b je ostré maximum, je jmenovatel záporný a −1/2 < d < 1/2.
- Přidej do výstupu frekvenci f = (k + d) · fs/N.
Algoritmus skončí, když projde všechny koše. Proč je potřeba: koše jsou od sebe 8 000/8 192 = 0,977 Hz a 440 Hz leží v koši 440 · 8 192/8 000 = 450,56 — mezi koši. Vrchol se proto upřesní parabolou proloženou třemi sousedními koši:
pro každý koš k, který je vyšší než práh a než oba sousedé:
a, b, c ← S[k − 1], S[k], S[k + 1]
d ← ½ · (a − c) / (a − 2b + c) # posun vrcholu paraboly, −½ … ½ koše
f ← (k + d) · fs / N # upřesněná frekvence v Hz
U tónu a: nejvyšší je koš 451 (440,43 Hz) s hodnotou b = 0,8790, sousedé a = 0,8058 (koš 450) a c = 0,2023 (koš 452). d = 1/2 · 0,6035/0,8058 − 1,7580 + 0,2023 = 0,3018/−0,7499 = −0,402, takže f = 450,598 · 8 000/8 192 = 440,04 Hz. Skutečná frekvence 440 Hz, chyba 0,04 Hz — dvacetkrát méně než šířka koše.
3. Rozlišení: delší poslech, ostřejší frekvence
Definice — frekvenční rozlišení
Nechť fs > 0 je vzorkovací frekvence a N ≥ 1 počet vzorků. Délka záznamu je T = N/fs (v sekundách). Frekvenční rozlišení DFT je vzdálenost frekvencí sousedních košů
Δf = fk+1 − fk = fs/N = 1/T.
Dva tóny, jejichž frekvence se liší o méně než zhruba Δf (s oknem o něco víc), proto ve spektru splynou v jeden vrchol.
Abyste poznali, že dva tóny 440 a 450 Hz jsou dva, a ne jeden, musíte poslouchat dost dlouho na to, aby se stihly „rozejít“ — rozdíl 10 Hz se projeví za desetinu sekundy. Přesnost ve frekvenci a v čase jdou proti sobě: čím kratší úsek, tím rozmazanější spektrum. Je to stejný princip jako Heisenbergova relace neurčitosti.
Z 256 vzorků (32 ms, koše po 31,25 Hz) je ve spektru jediný široký vrchol. Z 1 024 vzorků (128 ms, koše po 7,8 Hz) už dva, a z 8 192 vzorků (1 s, koše po 0,98 Hz) dva ostré. Proto se pro analýzu řeči volí okna kolem 20–30 ms: řeč se mění rychle a delší okno by smíchalo různé hlásky.
Δf = fs/N = 1/T
- Δf
- vzdálenost sousedních košů — nejjemnější rozdíl frekvencí, který spektrum ještě „vidí“
- fs
- vzorkovací frekvence; koše pokrývají pásmo 0 až fs (užitečná je polovina do Nyquistovy frekvence), takže se o ně dělí N košů
- N
- počet vzorků = počet košů; víc vzorků znamená jemnější dělení
- T
- délka záznamu v sekundách, T = N/fs. Tady je jádro věci: fs se zkrátí a rozlišení závisí jen na tom, jak dlouho posloucháme — rychlejší vzorkování nepomůže
Příklad — kolik vzorků potřebují tóny 440 a 450 Hz
Rozdíl je 10 Hz, takže potřebujeme Δf < 10 Hz, tedy T > 1/10 s a N = fs · T > 8 000 · 0,1 = 800 vzorků (barvy podle vzorce výše).
N = 256: Δf = 8 000/256 = 31,25 Hz, tóny jsou od sebe 10/31,25 = 0,32 koše — splynou.
N = 1 024: Δf = 8 000/1 024 = 7,8125 Hz, 1,28 koše — dva vrcholy, i když s Hannovým oknem těsně.
N = 8 192: Δf = 8 000/8 192 = 0,977 Hz, 10,24 koše — dva ostré vrcholy.
4. Prosakování a okna
DFT tiše předpokládá, že vybraný úsek se donekonečna opakuje. Když se do úseku nevejde celý počet period, na jeho koncích vznikne skok — a skok, jak víme z obdélníku, potřebuje spoustu frekvencí.
Definice — prosakování a okenní funkce
Nechť N ≥ 2, fs > 0 a x[n] = A sin(2πf · n/fs + φ), n = 0, …, N − 1, jsou vzorky sinusovky s frekvencí 0 < f < fs/2. Frekvence f leží na koši, právě když f = k · fs/N pro nějaké celé k; pak je X[k′] = 0 pro všechny koše k′ ∉ {k, N − k}. Prosakování (spectral leakage) je jev, kdy f na koši neleží: pak je X[k′] ≠ 0 i v koších daleko od f — energie sinusovky se rozlije do celého spektra.
Okenní funkce je posloupnost w[0], …, w[N − 1] ∈ [0, 1]; spektrum s oknem je DFT posloupnosti w[n] · x[n]. Okno se volí tak, aby se signál na okrajích úseku plynule ztlumil k nule. Hannovo okno je
w[n] = 1/2 − 1/2 cos(2πn/N) = sin2(πn/N), n = 0, …, N − 1.
Vystřihnout kus signálu nůžkami je jako utnout tón uprostřed — ozve se lupnutí, a lupnutí obsahuje všechny frekvence. Okno místo nůžek tón na začátku a na konci plynule zesílí a zeslabí. Cena: vrchol se trochu rozšíří. Zisk: vzdálené frekvence zůstanou čisté.
Bez okna je spektrum 390 Hz od tónu pořád na −41,5 dB — slabší tón v tomhle pásmu by se v prosakování utopil. S Hannovým oknem je tam −110,3 dB, prakticky nic. Okno pomůže i výšce vrcholu: sinusovka s amplitudou 1 dá bez okna vrchol jen 0,64 (energie se rozlila do sousedních košů), s Hannovým oknem 0,85. Proto jsme i spektrum akordu počítali s Hannovým oknem.
w[n] = 1/2 − 1/2 cos(2πn/N)
- w[n]
- váha n-tého vzorku (v obrázku zelená křivka je spektrum s touto vahou); vzorky se jí násobí před DFT
- 1/2
- střední úroveň okna; proto je ∑ w[n] = N/2 a amplitudu je s oknem potřeba násobit 2/∑ w[n] = 4/N místo 2/N
- − 1/2 cos
- kosinus se stejnou amplitudou jako střední úroveň: na okrajích (n = 0) dá 1/2 − 1/2 = 0, uprostřed (n = N/2) 1/2 + 1/2 = 1. Okno tak plynule klesne k nule a skok na okrajích úseku zmizí
- 2πn/N
- přes celý úsek přesně jedna perioda; i hodnoty a sklon okna na obou koncích na sebe navazují, takže opakovaný úsek nemá ani skok, ani zlom
Věta — Hannovo okno ve frekvencích je konvoluce se třemi čísly
Nechť N ≥ 2, x[0], …, x[N − 1] ∈ ℂ, X je jejich DFT, w Hannovo okno délky N a Xw DFT posloupnosti w[n] · x[n]. Indexy X počítejme dokola modulo N (X[−1] = X[N − 1], X[N] = X[0]). Pak pro každé k = 0, …, N − 1
Xw[k] = 1/2 X[k] − 1/4 X[k − 1] − 1/4 X[k + 1].
Důkaz: podle Eulerova vzorce je cos θ = eiθ + e−iθ/2, takže w[n] = 1/2 − 1/4 exp(2πin/N) − 1/4 exp(−2πin/N). Vynásobení signálu exp(2πin/N) posune celé spektrum o jeden koš: ∑n x[n] exp(2πin/N) exp(−2πikn/N) = ∑n x[n] exp(−2πi(k − 1)n/N) = X[k − 1]; obdobně exp(−2πin/N) dá X[k + 1]. Zbytek je linearita DFT. ∎
Okno tedy ve frekvencích jen zprůměruje každý koš se sousedy vahami (−¼, ½, −¼). Daleko od tónu se prosakování mění z koše na koš jen pomalu (nenormovaná DFT v koších 149, 150, 151 je −2,815; −2,750; −2,687, imaginární části nulové), takže ½ X[k] a ¼ (X[k − 1] + X[k + 1]) jsou skoro stejná čísla a téměř se odečtou: ½ · (−2,750) − ¼ · (−2,815 − 2,687) = −1,375 + 1,3755 = 0,0005. U tónu, kde se koše mění prudce, k odečtení nedojde — vrchol jen rozšíří na tři koše. Na vzorku 785,2 Hz to platí do zaokrouhlovací chyby (rozdíl pod 10−12). Je to tatáž konvoluce, o které je díl Filtry a konvoluce.
Příklad — odkud jsou čísla 0,64 a −41,5 dB
Sinusovka vzdálená δ košů od koše k v něm bez okna zanechá zhruba podíl |sin(πδ)/πδ| své amplitudy. Náš tón leží přesně mezi koši, δ = 1/2: sin(π/2)/π/2 = 2/π ≈ 0,637, tedy −3,9 dB. S Hannovým oknem je tatáž ztráta jen −1,4 dB, tedy 0,85. Obě hodnoty uvádí jako „scalloping loss“ přehled okenních funkcí F. J. Harrise (1978).
Ve vzdálenosti δ = 49,5 koše (koš 150, asi 390 Hz od tónu) dá odhad 1/πδ = 1/155,5 = 0,0064 amplitudy, vůči vrcholu 0,637 tedy 0,0101, neboli −39,9 dB. Přesný výpočet dá −41,5 dB; rozdíl dělá zrcadlový obraz tónu na záporné frekvenci, který se do koše 150 přičte s opačnou fází. Úroveň bez okna klesá jen jako 1/δ (6 dB na oktávu), s Hannovým oknem jako 1/δ3 (18 dB na oktávu, opět Harris 1978) — odtud −110 dB.
5. Co spektrum prozradí: tón ukrytý v šumu
Tón 1 000 Hz s amplitudou 0,1 přimícháme do šumu se směrodatnou odchylkou 1. Výkon tónu je proti šumu 200krát menší (−23 dB) — v časovém průběhu není vidět vůbec nic.
Ve spektru je to jinak. Šum se rozprostře rovnoměrně do všech 4 097 košů, kdežto tón se soustředí do jednoho. Vrchol na 1 000 Hz má výšku 0,116, typický koš šumu 0,019 a nejvyšší koš šumu 0,061 — tón je nejvyšší vrchol celého spektra. Čím delší záznam, tím víc vynikne. Na tomhle principu poslouchají radioteleskopy slabé signály z vesmíru a GPS přijímač signál družic, který je pod úrovní šumu.
Definice — výkon, poměr signálu k šumu a decibely
Nechť N ≥ 1 a x[0], …, x[N − 1] ∈ ℝ jsou vzorky signálu. Výkon signálu je průměr druhých mocnin
P = 1/N ∑n=0N−1 x[n]2.
Sinusovka s amplitudou A (přes celé periody) má výkon A2/2, protože průměr sin2 přes periodu je 1/2; šum s nulovou střední hodnotou a směrodatnou odchylkou σ má (očekávaný) výkon σ2. Nechť Psignál, Pšum > 0 jsou výkony užitečného signálu a šumu. Poměr signálu k šumu a jeho hodnota v decibelech jsou
SNR = Psignál/Pšum, SNRdB = 10 · log10 SNR.
Pro poměr amplitud A1/A2 se píše 20 · log10 A1/A2, protože výkon roste s druhou mocninou amplitudy.
Tady: Ptón = 0,12/2 = 0,005, Pšum = 12 = 1, SNR = 0,005 = 1/200, tedy 10 · log10 0,005 = −23,0 dB.
SNRkoš = SNRčas + 10 · log10 N/2
- SNRkoš
- poměr výkonu tónu k výkonu šumu v tom jediném koši, kde tón leží — rozhoduje, jestli vrchol ve spektru vyčnívá
- SNRčas
- poměr v celém signálu (−23 dB); tolik „vidíme“ v časovém průběhu
- 10 · log10 N/2
- zisk transformace: tón celý padne do jednoho koše, kdežto výkon šumu se rozdělí do N/2 košů. Proto pomáhá delší záznam — každé zdvojnásobení N přidá 3 dB
Příklad — tón proti šumu v jednom koši
Zisk pro N = 8 192: 10 · log10 8 192/2 = 10 · log10 4 096 = 36,1 dB, takže SNRkoš = −23,0 + 36,1 = 13,1 dB (barvy podle vzorce výše), poměr výkonů 20,5 a poměr amplitud √20,5 ≈ 4,5.
Šum v jednom koši: komplexní koeficient X[k] má střední kvadrát Nσ2, po přepočtu na amplitudu 2/N · |X[k]| je efektivní hodnota 2σ/√N = 2/90,5 = 0,0221. Absolutní hodnota takového šumu má Rayleighovo rozdělení s mediánem 0,0221 · √ln 2 = 0,0184 — to je ten „typický koš šumu“ 0,019 z odstavce výše. Tón s amplitudou 0,1 je nad ním 0,1/0,0221 = 4,5krát, přesně podle zisku výše.
Nejvyšší ze zhruba 4 090 košů šumu bude kolem 0,0221 · √ln 4 090 ≈ 0,064; změřili jsme 0,061. Proto je dobré, aby tón vyčníval aspoň několikanásobně: jen nad typickým košem nestačí, musí převýšit i ten nejvyšší.
6. FFT: algoritmus, který změnil svět
Definice — rychlá Fourierova transformace (FFT)
FFT (rychlá Fourierova transformace) je každý algoritmus, který spočítá DFT délky N za řádově N log2 N operací místo N2 u výpočtu přímo podle definice. Nejznámější je varianta Cooleyho a Tukeyho (1965):
Vstup: N = 2m vzorků x[0], …, x[N − 1] ∈ ℂ, m ≥ 0. Výstup: jejich DFT X[0], …, X[N − 1].
- Je-li N = 1, vrať X[0] = x[0] (podmínka zastavení rekurze).
- Jinak rozděl vzorky na sudé x[0], x[2], …, x[N − 2] a liché x[1], x[3], …, x[N − 1].
- Rekurzivně spočti E = FFT(sudé) a O = FFT(liché), obě délky N/2.
- Pro k = 0, …, N/2 − 1 polož t = Wk O[k], kde W = exp(−2πi/N), a X[k] = E[k] + t, X[k + N/2] = E[k] − t.
- Vrať X.
Přímý výpočet porovná každý vzorek s každou frekvencí. FFT si všimne, že se tytéž mezivýpočty opakují, a spočte je jen jednou. Pro 8 192 vzorků potřebuje přímá DFT 67 108 864 komplexních násobení, FFT 53 248 — 1 260krát méně. Pro milion vzorků je poměr přes sto tisíc: rozdíl mezi „za vteřinu“ a „za den“.
X[k] = E[k] + Wk O[k], X[k + N/2] = E[k] − Wk O[k], W = exp(−2πi/N)
- E[k]
- DFT délky N/2 ze sudých vzorků x[0], x[2], … — menší úloha stejného druhu, kterou umíme vyřešit rekurzivně
- O[k]
- DFT délky N/2 z lichých vzorků x[1], x[3], …
- Wk
- „otočný činitel“: liché vzorky leží o jeden vzorek později, a posun o vzorek se ve spektru projeví otočením fáze o 2πk/N
- −
- v tom je celá úspora: Wk + N/2 = −Wk, takže jedním násobením Wk · O[k] dostaneme dva výsledky — součet i rozdíl („motýlek“)
- X[k], X[k + N/2]
- dolní a horní polovina hledaného spektra; k běží jen od 0 do N/2 − 1, protože E a O se po N/2 opakují
funkce FFT(x): # délka N je mocnina dvou
N ← délka(x)
když N = 1: vrať x # DFT jednoho vzorku je ten vzorek
E ← FFT(x[0], x[2], …, x[N − 2]) # sudé vzorky
O ← FFT(x[1], x[3], …, x[N − 1]) # liché vzorky
pro k = 0 … N/2 − 1:
t ← e^(−2πik/N) · O[k] # jediné násobení
X[k] ← E[k] + t
X[k + N/2] ← E[k] − t
vrať X
Příklad — FFT čtyř vzorků (1, 2, 1, 0)
Sudé vzorky (1, 1): E = (1 + 1, 1 − 1) = (2, 0). Liché vzorky (2, 0): O = (2 + 0, 2 − 0) = (2, 2).
Otočné činitele pro N = 4: W0 = 1, W1 = exp(−2πi/4) = exp(−πi/2) = −i.
X[0] = 2 + 1 · 2 = 4, X[2] = 2 − 1 · 2 = 0
X[1] = 0 + (−i) · 2 = −2i, X[3] = 0 − (−i) · 2 = 2i (barvy podle vzorce výše)
Totéž jako přímý výpočet v oddílu o DFT, jen se čtyřmi násobeními (z nichž jediné netriviální, krát −i) místo šestnácti.
Věta — FFT potřebuje N/2 · log2 N násobení
Nechť N = 2m, m ≥ 0, a M(N) je počet komplexních násobení, které provede FFT výše (včetně násobení jedničkou). Pak
M(N) = N/2 · log2 N.
Důkaz. Z algoritmu M(N) = 2 M(N/2) + N/2 pro N ≥ 2 a M(1) = 0. Na úrovni rekurze j = 0, …, m − 1 je 2j podúloh, každá po N/2j+1 násobeních, tedy dohromady N/2 násobení na úroveň; úrovní je m = log2 N. ∎
Pro N = 8 192 = 213: 4 096 · 13 = 53 248, proti N2 = 67 108 864 u přímé DFT, poměr 1 260. Násobení jedničkou se tu pro jednoduchost počítají také.
Zajímavost: stejný trik už v roce 1805 použil Carl Friedrich Gauss při výpočtu drah planetek, ale nepublikoval ho. Mezitím ho několikrát objevili znovu (třeba Danielson a Lanczos v roce 1942), ale proslavil se až v roce 1965, v době, kdy byl potřeba k odhalování podzemních jaderných zkoušek ze seismických záznamů.
7. Fourier v umělé inteligenci
- Řeč a zvuk. Modely jako Whisper nedostávají surové vzorky, ale spektrogram — spektra krátkých oken za sebou. Podrobně díl Zvuk a řeč.
- Komprese. JPEG a MP3 převádějí obraz a zvuk do frekvencí (příbuznou kosinovou transformací) a zahazují ty, které oko a ucho nevnímají.
- Konvoluce. Konvoluce v čase je násobení ve frekvencích; velké konvoluce se proto někdy počítají přes FFT. O konvoluci je díl Filtry a konvoluce.
- Transformery. Původní transformer (2017) kóduje pozici slova ve větě jako sadu sinusovek a kosinusovek s různými frekvencemi — každá pozice dostane vlastní „spektrální otisk“.
Definice — sinusové kódování pozice v transformeru
Nechť d ≥ 2 je sudé (rozměr vektorů modelu) a pos ∈ {0, 1, 2, …} pozice slova ve vstupu. Sinusové kódování pozice podle článku Vaswani a kol., Attention Is All You Need (2017), je vektor PE(pos) ∈ ℝd, jehož složky s indexy 0, …, d − 1 jsou pro j = 0, …, d/2 − 1
PE(pos, 2j) = sin(pos/10 0002j/d), PE(pos, 2j + 1) = cos(pos/10 0002j/d).
Vektor PE(pos) se přičte k vektoru slova na pozici pos.
Každá dvojice složek je jedna „harmonická“: vlnové délky rostou geometricky od 2π (pro j = 0) po 2π · 10 000(d−2)/d, při d = 512 asi 2π · 9 647 ≈ 60 600 pozic. Rychlé složky rozliší sousední slova, pomalé vzdálená — podobně jako ručičky hodin. Dvojice sin a cos se volí proto, že posun o pevný počet pozic je pak pro každou dvojici jen otočení o pevný úhel, tedy lineární operace, kterou se síť snadno naučí.
8. Shrnutí
- Každý rozumný signál se dá složit ze sinusovek; u skoků zůstane Gibbsův překmit asi 9 % výšky skoku.
- DFT spočte, jak silně je v signálu každá frekvence; v zašuměném akordu našla 440,0; 554,4 a 659,3 Hz.
- Rozlišení je 1/délka záznamu: tóny 440 a 450 Hz rozliší až okno delší než asi 0,1 s.
- Okno potlačí prosakování: 390 Hz od tónu −41,5 dB bez okna, −110,3 dB s Hannovým oknem.
- Spektrum vytáhne tón i z šumu 200krát silnějšího; FFT to zvládne 1 260krát rychleji než přímý výpočet (pro 8 192 vzorků).
Chcete si to osahat? Nahrajte telefonem pár sekund pískání a nechte AI agenta spočítat spektrum — na jaké frekvenci pískáte a jsou vidět i harmonické?
Máte na to jiný názor? Napište na support@coden-app.com.