FourierLab z čeho se to skládá

Tohle je statická kopie kapitoly pro vyhledávače. Interaktivní verze má animované obrázky, kontrolní otázky a tlačítka, která příklad načtou do kalkulačky.

Konvoluce: co dělá každá lineární soustava

Pošli do soustavy jediný impuls a zaznamenej, co vyleze. Ten záznam se jmenuje impulsní odezva a — pokud je soustava lineární a časově neproměnná — popisuje ji úplně. Nic dalšího o ní není potřeba vědět.

Důvod je jednoduchý: každý signál je posloupnost impulsů různé velikosti. Soustava na každý odpoví svou odezvou, a protože je lineární, odpovědi se sečtou. Tomu sčítání se říká konvoluce.

vstup (zlatě) a otočená odezva (modře)výstupy[16] = 1,042041 vzorků × 6 koeficientů = 246 operací přímo, ale 384 přes FFT
  1. x[n] a h[n]

    Vlevo vstup, vpravo to, co soustava udělá s jediným impulsem. Ta druhá věc soustavu úplně popisuje — nic víc o ní není potřeba vědět.

  2. h[k] → h[n − k]

    Impulsní odezva se zrcadlově otočí a přiloží k signálu v místě n. To otočení není libovůle — plyne z toho, že dřívější vstup ovlivňuje pozdější výstup, ne naopak.

  3. y[n] = Σₖ x[k]·h[n−k]

    Součin překryvu, sečtený. Jedno číslo výstupu. Pak se posune o krok a celé se to opakuje — to je konvoluce, a je to všechno, co lineární soustava dělá.

  4. N · M operací

    Pro každý výstupní vzorek se projde celá odezva. Milion vzorků a filtr o tisíci koeficientech dá miliardu operací.

  5. x ∗ h ⟷ X · H

    Konvoluce v čase je obyčejné násobení ve frekvenci. Takže: transformuj, vynásob po koších, transformuj zpět. Z N·M se stane N·log N — a to je důvod, proč se FFT používá i tam, kde nikoho spektrum nezajímá.

Modře je odezva otočená a přiložená v místě n; výstup dole je součin překryvu, sečtený. Posuň jezdcem a sleduj, jak výstup vzniká bod po bodu.
y[n] = Σₖ x[k]·h[n−k]konvoluce

Proč se odezva otáčí. To zrcadlové otočení překvapí každého. Plyne z toho, že vstup před chvílí ovlivňuje výstup teď — takže když se dívám na výstup v čase n, nejstarší vstup je nejdál a prošel největší částí odezvy. Kontrola, která to potvrdí: konvoluce s posunutým Diracovým impulsem signál jen posune a nic jiného neudělá. Testy to ověřují na 1e-15.

Konvoluční věta

Přímý výpočet stojí N·M operací. Pro milion vzorků a filtr o tisíci koeficientech to je miliarda. Jenže:

x ∗ h ⟷ X · Hkonvoluce v čase = násobení ve frekvenci

Konvoluce v čase odpovídá obyčejnému násobení po koších ve frekvenci. Takže: transformuj oba signály, vynásob je, transformuj zpět. N·M se změní na N·log N.

To je druhý a možná důležitější důvod, proč FFT existuje: používá se i tam, kde o spektrum vůbec nejde. Filtrování dlouhého záznamu, násobení velkých čísel, korelace — všude se to jde přes frekvenci jen kvůli rychlosti.

Past, která vyrobí věrohodně vypadající nesmysl. Transformace předpokládá periodické opakování, takže násobení spekter dá cyklickou konvoluci: co přeteče na konci, obtočí se na začátek. Výsledek vypadá skoro správně a má pokažené konce. Řešení je doplnit oba signály nulami alespoň na délku N + M − 1 — solver v téhle labce to dělá a testy porovnávají obě cesty na 20 náhodných dvojicích (shoda 2,2·10⁻¹⁵).

A ještě jedna kontrola, která chytá překlepy v indexech. Konvoluce M a N vzorků má vždycky přesně M + N − 1 vzorků. Kdo dostane N, uřízl si doběh; kdo dostane M + N, má chybu o jedna. Ani jedno se samo neohlásí, takže to hlídá test.

Vzorce v této kapitole

∗ — konvoluce
y[n] = Σ x[k]·h[n−k] [—] kap. 6
věta — konvoluční věta
x ∗ h ⟷ X · H [—] kap. 6