Přeskočit na obsah
coden

Filtry a konvoluce: vyhlazení, hrany a odstranění šumu

Klouzavý průměr a definice konvoluce, frekvenční odezva a konvoluční věta, odstranění brumu 50 Hz z EKG, hledání hran derivací gaussovky, mediánový filtr proti výstřelům a součet kostek jako konvoluce.

13 minut Matěj Žalmánek 2026-10-16

Série Základy AI Díl 58 z 83
  1. Mapa umělé inteligence: co je co a jak to do sebe zapadá
  2. Stručná historie umělé inteligence: od Turinga po jazykové modely
  3. Data, model, trénink, inference: základní pojmy na jednom příkladu
  4. Jak číst matematický zápis: symboly, indexy, sumy a kvantifikátory
  5. Množiny a relace: stavebnice, ze které se skládají definice v AI
  6. Funkce a zobrazení: proč je každý model v AI funkce
  7. Logika a důkazy: pravidla, podle kterých se v AI uvažuje
  8. Grafy a stromy: struktura, na které stojí hledání i neuronové sítě
  9. Lineární algebra pro strojové učení: vektory, matice a proč AI hlavně násobí
  10. Derivace, gradient a řetízkové pravidlo: jak model zjistí, kterým směrem se učit
  11. Gradientní sestup: jak se model učí
  12. Co je pravděpodobnost: od hodu kostkou ke Kolmogorovovým axiomům
  13. Podmíněná pravděpodobnost a Bayesova věta: jak změnit odhad, když se dozvíte něco nového
  14. Náhodná veličina a distribuční funkce: jedna funkce, která o rozdělení řekne všechno
  15. Funkce hustoty a pravděpodobnostní funkce: proč má spojitá veličina v bodě pravděpodobnost nula
  16. Střední hodnota, rozptyl a kovariance: kde rozdělení leží, jak je široké a co s čím souvisí
  17. Přehled pravděpodobnostních rozdělení: Bernoulli, binomické, Poisson, rovnoměrné, normální a exponenciální
  18. Zákon velkých čísel a centrální limitní věta: proč se průměry chovají tak předvídatelně
  19. Statistika a odhady parametrů: maximální věrohodnost, MAP a intervaly spolehlivosti
  20. Teorie informace: entropie, křížová entropie a KL divergence — odkud se berou ztrátové funkce
  21. Prohledávání stavového prostoru: BFS, DFS, UCS a A* s animacemi
  22. Hry a protivník: minimax, alfa-beta ořezávání a Monte Carlo tree search
  23. Splňování omezujících podmínek: backtracking, propagace omezení a AC-3 na sudoku a mapě krajů
  24. Logika a znalostní systémy: dopředné a zpětné řetězení, rezoluce a expertní systémy
  25. Plánování: STRIPS, svět kostek, heuristiky z relaxace a plánování v AI agentech
  26. Lokální hledání a simulované žíhání: obchodní cestující přes krajská města
  27. Genetické algoritmy: populace, křížení, mutace a výběr na batohu na výlet
  28. Evoluční strategie a genetické programování: od pravidla jedné pětiny po Keplerův zákon
  29. Optimalizace mravenčí kolonií: jak feromonová stopa najde krátkou cestu
  30. Optimalizace hejnem částic: setrvačnost, vlastní zkušenost a zkušenost hejna
  31. Neuroevoluce: evoluce vah i tvaru neuronových sítí a algoritmus NEAT
  32. Fuzzy množiny a funkce příslušnosti: jak zapsat „trochu teplo“
  33. Fuzzy logika a pravděpodobnost: proč „trochu teplo“ neznamená „pravděpodobně teplo“
  34. Fuzzy logika: t-normy, implikace a pravidla KDYŽ–PAK
  35. Fuzzy řízení: Mamdani a Sugeno od ventilátoru po kyvadlo na vozíku
  36. Fuzzy shlukování: algoritmus fuzzy c-means a body mezi shluky
  37. Neuro-fuzzy systémy (ANFIS): fuzzy pravidla, která se učí z dat
  38. Markovovy řetězce: přechodová matice, stacionární rozdělení a PageRank
  39. Skryté Markovovy modely: Viterbiho algoritmus a nepoctivé kasino
  40. Bayesovské sítě: proč je tráva mokrá a co z toho plyne pro postřikovač
  41. Kalmanův filtr: jak z nepřesných měření odhadnout, kde auto je a jak rychle jede
  42. Druhy strojového učení: s učitelem, bez učitele, s částečným učitelem a další
  43. Přeučení a regularizace: proč model, který zná data nazpaměť, selže
  44. Vyhodnocení modelu: křížová validace, F1 a křivka ROC
  45. Shlukování a snížení dimenze: k-means, PCA a t-SNE
  46. Klasifikace a regrese: dvě úlohy učení s učitelem
  47. Lineární regrese: nejmenší čtverce geometricky i maticově
  48. Polynomiální a nelineární regrese: jak přímku ohnout
  49. Logistická regrese: sigmoida, šance a křížová entropie
  50. Vícetřídní klasifikace a softmax: od dvou tříd k mnoha
  51. Naivní Bayesův klasifikátor: spamový filtr, který funguje lépe, než by měl
  52. Ztrátové funkce: co přesně model minimalizuje
  53. Rozhodovací stromy a k nejbližších sousedů: modely bez vzorců
  54. Ansámbly: náhodný les a gradient boosting
  55. SVM a jádrový trik: nejširší hranice a jak ji ohnout
  56. Signál a vzorkování: proč platí Nyquistův teorém
  57. Fourierova transformace: rozklad signálu na frekvence
  58. Filtry a konvoluce: vyhlazení, hrany a odstranění šumu
  59. Zvuk a řeč: spektrogram, melová škála a MFCC
  60. Obraz jako signál: pixely, barvy, konvoluce a hrany
  61. Perceptron a umělý neuron: nejjednodušší neuronová síť a co neumí
  62. Neuronová síť od nuly: zpětné šíření chyby krok za krokem
  63. Aktivace, inicializace a normalizace: drobnosti, na kterých hluboká síť stojí
  64. Konvoluční sítě: jak síť poznává obrázky
  65. Rekurentní sítě: paměť pro posloupnosti a mizející gradient
  66. LSTM a GRU: brány, které rozhodují, co si síť zapamatuje
  67. Autoenkodéry: síť, která se učí data stlačit a zase rozbalit
  68. Embeddingy a word2vec: jak se slovo stane vektorem
  69. Mechanismus pozornosti: jak se model naučí, kam se dívat
  70. Transformery a velké jazykové modely: architektura krok za krokem
  71. Tokenizace: jak se text rozseká na kousky pro model
  72. Předtrénování a škálování: proč větší model a víc dat funguje
  73. Doladění a RLHF: jak se z doplňovače textu stane asistent
  74. Prompty, kontext a RAG: jak modelu dát správné informace
  75. Variační autoenkodéry (VAE): nové obrázky ze spojitého latentního prostoru
  76. Generativní adversariální sítě (GAN): padělatel proti detektivovi
  77. Difúzní modely: jak se z čistého šumu stane obrázek
  78. Markovovy rozhodovací procesy: stavy, akce, odměny a Bellmanovy rovnice
  79. Q-learning a DQN: učení hodnoty akcí od tabulky po neuronovou síť
  80. Policy gradient a PPO: učení přímo strategie
  81. Jak funguje AI agent: jazykový model ve smyčce s nástroji
  82. Programování s AI agenty: zadání, testy a kontrola
  83. Vyhodnocení a bezpečnost AI systémů: jak měřit a jak hlídat

Celá osnova série 83 z 83 témat hotovo

Co si odnesete
  • Co je konvoluce a jak z jednoho principu vzniká vyhlazení i hledání hran.
  • Proč se na filtr vyplatí dívat ve frekvencích.
  • Kdy konvoluce nestačí a proč ji potkáte v neuronových sítích i v pravděpodobnosti.

Co se hodí znát předem: Signál a vzorkování: proč platí Nyquistův teorém, Fourierova transformace: rozklad signálu na frekvence

Telefon při focení potichu odstraňuje šum, zostřuje hrany a rozmazává pozadí. Kardiograf vymaže z EKG brum z elektrické sítě. Hlasový asistent potlačí hluk ulice. Za všemi těmi úpravami stojí jedna a tatáž operace — konvoluce: posouvat po signálu malé okénko vah a v každém místě spočítat vážený součet. A když o pár let později přišly konvoluční neuronové sítě, nedělaly nic jiného, jen si ty váhy začaly učit samy.

Navazuje na díly Signál a vzorkování a Fourierova transformace.

1. Klouzavý průměr

Zašuměné měření: sinusovka 2 Hz vzorkovaná 200krát za sekundu, k tomu šum se směrodatnou odchylkou 0,4. Nejjednodušší způsob, jak šum potlačit: každý vzorek nahradit průměrem jeho okolí.

zašuměný signál −2,22,2 průměr přes 5 vzorků −2,22,2 průměr přes 21 vzorků −2,22,2 průměr přes 61 vzorků −2,22,2 hodnota signálu (bez jednotky) 0400 vzorek n (pořadí, fs = 200 Hz)
Klouzavý průměr přes 5, 21 a 61 vzorků; čárkovaně signál bez šumu zašuměnýbez šumu
Délka okna Mzbylý šumzachovaná amplituda 2 Hzcelková odchylka od čistého signálu
bez filtru0,4001,0000,400
50,1950,9960,196
210,0990,9290,124
610,0650,4910,378

Průměr přes M vzorků zmenší nezávislý šum zhruba √Mkrát. Jenže zprůměruje i signál: s oknem 61 vzorků (0,3 s, víc než půl periody) zbude ze sinusovky polovina a výsledek je horší než bez filtru. Nejlepší je kompromis kolem 21 vzorků. Vyhlazování je vždy obchod mezi šumem a ostrostí.

Definice — centrovaný klouzavý průměr

Nechť x = (x[n])n ∈ ℤ je posloupnost reálných čísel (signál) a M ∈ ℕ je liché, M = 2m + 1 pro nějaké m ∈ {0, 1, 2, …}. Centrovaný klouzavý průměr délky M signálu x je posloupnost y = (y[n])n ∈ ℤ daná pro každé n ∈ ℤ předpisem

y[n] = 1/M ∑j=−mm x[n + j].

Hodnota y[n] je tedy průměr vzorku x[n] a m sousedů na každé straně. Centrování zajistí, že výstup není proti vstupu zpožděný. Má-li signál jen konečně mnoho vzorků x[0], …, x[L − 1], chybějí na okrajích sousedé; tady je nahrazujeme krajní hodnotou (x[n] = x[0] pro n < 0 a x[n] = x[L − 1] pro n ≥ L) a čísla v tabulce počítáme jen ve vnitřní části (bez 40 krajních vzorků z každé strany).

Věta — průměr M vzorků zmenší nezávislý šum √Mkrát

Nechť M ∈ ℕ, M ≥ 1, a e1, …, eM jsou nezávislé náhodné veličiny, které mají všechny tentýž rozptyl σ2 (σ ≥ 0). Pak

var(1/M ∑j=1M ej) = σ2/M,   a tedy směrodatná odchylka průměru je σ/√M.

Důkaz. Rozptyl součtu nezávislých veličin je součet rozptylů a konstanta vstupuje do rozptylu na druhou, var(cX) = c2 var(X). Proto var(1/M ∑ ej) = 1/M2 · M σ2 = σ2/M. ∎

Pro σ = 0,4: M = 5 dá 0,4/√5 = 0,179, M = 21 dá 0,087, M = 61 dá 0,051. V tabulce je o něco víc (0,195; 0,099; 0,065), protože je to jediná konkrétní realizace šumu; průměr přes 300 různých realizací vychází 0,178; 0,087 a 0,051.

chyba2 ≈ (σ/√M)2 + 1/2 · ((1 − |H|) · A)2

chyba
efektivní odchylka vyhlazeného signálu (v obrázku zelený) od čistého; poslední sloupec tabulky
σ/√M
šum, který průměrem projde — klesá s délkou okna, proto chceme okno dlouhé
(1 − |H|) · A
o kolik průměr zmenšil amplitudu A = 1 sinusovky; |H| je zesílení na 2 Hz (předposlední sloupec). Roste s délkou okna, proto chceme okno krátké
1/2
zmenšení amplitudy je sinusovka, a sinusovka s amplitudou a má efektivní hodnotu a/√2, tedy kvadrát a2/2
Druhé mocniny se sčítají, protože šum a zkreslení spolu nesouvisejí. Platí to pro střední hodnotu přes mnoho realizací šumu.
Příklad — proč vyhrává okno kolem 21 vzorků

Barvy podle vzorce výše; chyba = √(šum)2 + 1/2 · (zkreslení)2.

M = 21: šum 0,087, zkreslení 1 − 0,929 = 0,071:

chyba ≈ √0,0872 + 1/2 · 0,0712 = √0,0076 + 0,0025 = 0,101.

M = 61: šum 0,051, zkreslení 1 − 0,491 = 0,509:

chyba ≈ √0,0512 + 1/2 · 0,5092 = √0,0026 + 0,130 = √0,132 = 0,364 — vládne zkreslení.

M = 5: šum 0,179, zkreslení jen 0,004, chyba ≈ 0,179 — vládne šum.

Projdeme-li všechna lichá M, vzorec má minimum při M = 19 a 21 (obě 0,101). Na naší jediné realizaci šumu vyšlo 0,124 — o něco víc, ale se stejným vítězem.

2. Konvoluce

Definice — konvoluce a jádro

Nechť x = (x[n])n ∈ ℤ je posloupnost reálných čísel (signál) a h = (h[k])k ∈ ℤ posloupnost reálných čísel, která má jen konečně mnoho nenulových členů (jádro, též filtr). Signál konečné délky chápeme jako posloupnost doplněnou nulami. Konvoluce signálu x s jádrem h je posloupnost x * h daná pro každé n ∈ ℤ předpisem

(x * h)[n] = ∑k ∈ ℤ h[k] · x[n − k]

(součet má jen konečně mnoho nenulových sčítanců). Pro takto definovanou konvoluci platí:

  1. linearita: (αx + βz) * h = α(x * h) + β(z * h) pro všechny signály x, z a všechna α, β ∈ ℝ;
  2. nezávislost na posunu: označíme-li (Sdx)[n] = x[n − d] posun signálu o d ∈ ℤ vzorků, pak (Sdx) * h = Sd(x * h) — posunutý vstup dá stejně posunutý výstup;
  3. impulzní odezva: pro jednotkový impulz δ (δ[0] = 1, δ[n] = 0 pro n ≠ 0) je δ * h = h.

Jádro je tedy zároveň impulzní odezva filtru — to, co filtr udělá z jediného jedničkového vzorku.

Laicky řečeno

Jádro je šablona vah, kterou posouváme po signálu. V každé poloze vynásobíme, co je pod šablonou, a sečteme. Klouzavý průměr přes 5 vzorků má jádro (1/5, 1/5, 1/5, 1/5, 1/5). Malý příklad počítaný ručně: (1, 2, 3) * (1, 1) = (1, 3, 5, 3) — každé číslo výsledku je součet dvou sousedů. Změnou vah dostaneme úplně jiné filtry: vyhlazení, zostření, hledání hran, ozvěnu.

(x * h)[n] = ∑k h[k] · x[n − k]

(x * h)[n]
výstup filtru v místě n (v obrázcích zelený); každý výstupní vzorek se počítá stejným předpisem, jen posunutým — proto filtr na posunu nezávisí
h[k]
váhy jádra; jediné, čím se filtry liší (průměr, diference, gaussovka). Nezávisí na n, a proto je filtr všude stejný
x[n − k]
vzorek o k kroků zpátky. Minus je tam schválně: jádro se „otočí“, takže h[0] násobí současnost a h[1] minulost — a jediný jedničkový vzorek na vstupu dá na výstupu přesně h (impulzní odezvu), ne její zrcadlo
∑k
součet přes všechny pozice jádra; konvoluce je proto lineární — výstup součtu signálů je součet výstupů
Výstup je vážený součet současného a minulých (u centrovaného jádra i budoucích) vzorků, se stejnými vahami všude.
Příklad — konvoluce krok za krokem

(1, 2, 3) * (1, 1), indexy od nuly; výsledek má délku 3 + 2 − 1 = 4:

x = (1, 2, 3), h = (1, 1), y = x * h; barvy podle vzorce výše:

y[0] = h[0] · x[0] = 1 · 1 = 1,   y[1] = h[0] · x[1] + h[1] · x[0] = 1 · 2 + 1 · 1 = 3,

y[2] = h[0] · x[2] + h[1] · x[1] = 1 · 3 + 1 · 2 = 5,   y[3] = h[1] · x[2] = 1 · 3 = 3.

Na nesymetrickém jádru je vidět, proč je tam minus: (1, 2, 3) * (1, −1) = (1, 2 − 1, 3 − 2, −3) = (1, 1, 1, −3) — každé číslo je „současný mínus předchozí“, tedy diference. Bez otočení (tzv. korelace, ∑ h[k] x[n + k]) by vyšlo totéž s opačným znaménkem. Konvoluční vrstvy neuronových sítí ve skutečnosti počítají korelaci; protože se jádro učí, na tom nezáleží.

funkce konvoluce(x, h):                 # plná délka |x| + |h| − 1
    y ← nuly délky |x| + |h| − 1
    pro n = 0 … |x| − 1:
        pro k = 0 … |h| − 1:
            y[n + k] ← y[n + k] + x[n] · h[k]   # vzorek x[n] „rozešle“ kopii jádra
    vrať y
Věta — vlastnosti konvoluce

Nechť x, z : ℤ → ℝ jsou signály, g, h : ℤ → ℝ jádra (posloupnosti s konečně mnoha nenulovými členy) a α, β ∈ ℝ. Pak platí:

  1. komutativita: x * h = h * x, kde (h * x)[n] = ∑k x[k] · h[n − k] (důkaz substitucí k → n − k);
  2. asociativita: (x * g) * h = x * (g * h);
  3. linearita: (αx + βz) * h = α(x * h) + β(z * h).

Z asociativity plyne praktický důsledek: dva filtry za sebou (nejdřív g, pak h) se dají nahradit jediným, s jádrem g * h. Tak vznikne derivace gaussovky v oddílu o hranách. Má-li signál x konečnou délku |x| a jádro h délku |h|, stojí přímý výpočet |x| · |h| násobení.

3. Co filtr dělá s frekvencemi

Definice — konvoluční věta a frekvenční odezva

Nechť fs > 0 je vzorkovací frekvence (vzorků za sekundu) a x : ℤ → ℝ signál, pro který ∑n |x[n]| < ∞. Jeho Fourierova transformace v diskrétním čase je funkce 𝓕(x) : ℝ → ℂ,

𝓕(x)(f) = ∑n ∈ ℤ x[n] · exp(−2πi fn/fs),   f ∈ ℝ

(spojitá obdoba diskrétní Fourierovy transformace Xk konečného signálu x0, …, xN−1 z dílu Fourierova transformace; f je frekvence v Hz). Nechť h je jádro (konečně mnoho nenulových členů). Frekvenční odezva filtru s jádrem h je funkce H = 𝓕(h) : ℝ → ℂ,

H(f) = ∑k ∈ ℤ h[k] · exp(−2πi fk/fs).

Číslo |H(f)| je zesílení a arg H(f) fázový posun, které filtr způsobí sinusovce s frekvencí f (věta níže).

Konvoluční věta: za uvedených předpokladů platí pro každé f ∈ ℝ

𝓕(x * h)(f) = 𝓕(x)(f) · H(f),

tj. Fourierova transformace konvoluce je součin Fourierových transformací.

Filtr se nazývá dolní propust, když propouští frekvence pod jistou mezní frekvencí fc (|H(f)| je blízko 1 pro |f| < fc) a tlumí frekvence nad ní (|H(f)| je blízko 0 pro fc < |f| ≤ fs/2); jak přesně „blízko“, je věcí návrhu filtru, ne definice. Obráceně (tlumí nízké, propouští vysoké) je to horní propust.

Laicky řečeno

Filtr je ekvalizér. V čase je to šablona vah, ve frekvencích tabulka „basy ×1, výšky ×0,1“. Obojí popisuje totéž. Klouzavý průměr je dolní propust: pomalé změny projdou, rychlé kmitání se zprůměruje na nulu.

00,51 050100150200250 frekvence f (Hz) zesílení |H(f)| (poměr, 0–1)
Frekvenční odezva klouzavého průměru při vzorkování 500 Hz; čárkovaně 50 Hz M = 5M = 10M = 25

Odezva klouzavého průměru má nuly: frekvence, jejichž perioda se do okna vejde přesně celočíselněkrát, se zprůměrují na nulu dokonale. Při vzorkování 500 Hz má průměr přes 10 vzorků (20 ms) nulu přesně na 50 Hz a jejích násobcích, průměr přes 5 vzorků na 100 Hz a 200 Hz a průměr přes 25 vzorků na 20, 40, 60… Hz — 50 Hz jen ztlumí na 0,13.

Věta — sinusovka projde filtrem jen zesílená a posunutá

Nechť fs > 0, h je jádro s frekvenční odezvou H, f ∈ ℝ a x je komplexní sinusovka s frekvencí f,

x[n] = exp(2πi fn/fs),   n ∈ ℤ.

Pak y = x * h splňuje y[n] = H(f) · x[n] pro všechna n ∈ ℤ.

Důkaz.

y[n] = ∑k h[k] exp(2πi f(n − k)/fs) = exp(2πi fn/fs) · ∑k h[k] exp(−2πi fk/fs) = H(f) · x[n]. ∎

Výstup je tatáž sinusovka vynásobená komplexním číslem H(f): |H(f)| ji zesílí nebo zeslabí, arg H(f) posune. Protože se každý signál dá rozložit na sinusovky (díl o Fourierově transformaci) a konvoluce je lineární, filtr prostě vynásobí každou frekvenci svým H(f) — to je konvoluční věta.

|H(f)| = |sin(π fM/fs)|/M · |sin(π f/fs)|

|H(f)|
zesílení klouzavého průměru délky M na frekvenci f (f není celočíselný násobek fs) — křivky v obrázku
|sin(π fM/fs)|
fM/fs je počet period, které se vejdou do okna (okno trvá M/fs sekund). Když je to celé číslo, čitatel je nula: kladné a záporné půlvlny v okně se přesně vyruší. Odtud nuly odezvy
M · |sin(π f/fs)|
normování: pro f → 0 je sin(π fM/fs) ≈ M · sin(π f/fs), takže |H(f)| → 1 — konstantní signál projde beze změny, jak se od průměru čeká
Vzorec plyne ze součtu geometrické řady: pro jádro h[k] = 1/M (k = 0, …, M − 1) je H(f) = 1/M ∑k=0M−1 qk = 1/M · 1 − qM/1 − q, kde q = exp(−2πi f/fs) ≠ 1, a |1 − e−iθ| = 2|sin θ/2|. Centrování jádra změní jen fázi, ne |H|.
Příklad — průměr přes 25 vzorků na 50 Hz

fs = 500 Hz, M = 25, f = 50 Hz. Do okna 25/500 s = 0,05 s se vejde 50 · 0,05 = 2,5 periody — necelý počet, takže nula to není. Barvy podle vzorce výše:

Čitatel: |sin(π · 50 · 25/500)| = |sin(2,5π)| = 1. Jmenovatel: 25 · sin(π · 50/500) = 25 · sin(0,1π) = 25 · 0,309 = 7,73.

|H(50)| = 1/7,73 = 0,13

— přesně hodnota z textu výše. Pro 40 Hz se vejdou právě 2 periody a čitatel je sin(2π) = 0.

4. Odstranění brumu z EKG

Elektrická síť v Evropě kmitá na 50 Hz a kabely EKG ji zachytí jako brum. Nasimulujeme si EKG s tepem 75 za minutu, vzorkované 500krát za sekundu, a přidáme brum s amplitudou 0,3:

EKG + brum 50 Hz −0,51,3 po průměru přes 10 vzorků −0,51,3 amplituda (relativní, QRS ≈ 1) 01000 vzorek n (pořadí, fs = 500 Hz)
EKG s brumem 50 Hz a po průměru přes 10 vzorků EKG bez brumu

Průměr přes 10 vzorků má nulu přesně na 50 Hz, a tak efektivní hodnotu brumu sníží z 0,212 na nulu — do zaokrouhlovací chyby počítače. Daň je vidět na hrotu QRS: z výšky 0,98 klesne na 0,81, protože rychlý hrot obsahuje i frekvence kolem 25 Hz, které průměr ztlumí na 0,64. V praxi se proto používá úzký pásmový zádržný filtr (notch), který vystřihne jen okolí 50 Hz a zbytek nechá být — navrhuje se právě ve frekvencích.

Definice — efektivní hodnota

Nechť L ∈ ℕ, L ≥ 1, a e[1], …, e[L] ∈ ℝ. Efektivní hodnota (RMS, root mean square) této posloupnosti je číslo

RMS(e) = √1/L ∑n=1L e[n]2 ≥ 0,

tedy odmocnina z průměru druhých mocnin. Je to „typická velikost“ kmitání, které má průměr nula — obyčejný průměr by se vynuloval. U šumu s nulovou střední hodnotou je to (výběrová) směrodatná odchylka; všechny „odchylky“ a „zbylý šum“ v tomto dílu jsou efektivní hodnoty. Sinusovka s amplitudou A má (přes celé periody) efektivní hodnotu A/√2, protože průměr sin2 přes periodu je 1/2.

Příklad — čísla z EKG ze vzorce odezvy

Brum před filtrem: 0,3/√2 = 0,212.

Brum po filtru: M = 10 při 500 Hz je okno 0,02 s a do něj se vejde 50 · 0,02 = 1 perioda brumu — přesně celá, čitatel sin(π) = 0 a brum zmizí.

Hrot QRS: složka 25 Hz se do okna vejde jen napůl (0,5 periody); barvy podle vzorce |H(f)| v oddílu o frekvencích:

|H(25)| = |sin π/2|/10 · sin π/20 = 1/10 · 0,156 = 0,64.

Proto hrot klesne — z 0,98 na 0,81.

5. Hledání hran: derivace jako konvoluce

Definice — diference a derivace gaussovky

Nechť x : ℤ → ℝ je signál. Jeho diference je posloupnost y daná pro každé n ∈ ℤ předpisem

y[n] = x[n] − x[n − 1].

Je to konvoluce y = x * d s jádrem d[0] = 1, d[1] = −1 a d[k] = 0 pro ostatní k, krátce d = (1, −1). Odhaduje derivaci signálu (změnu na jeden krok vzorkování) a je to horní propust (věta níže).

Nechť s > 0 (šířka ve vzorcích) a r = ⌈4s⌉. Derivace gaussovky je jádro

h[k] = −k · exp(−k2/2s2)/C   pro k = −r, …, r,   h[k] = 0 jinak,

kde C = ∑k=1r k · exp(−k2/2s2) > 0 je normovací konstanta. Je to (až na kladný násobek) navzorkovaná derivace gaussovky g(t) = exp(−t2/2s2), protože g′(t) = −t/s2 g(t). Až na normování se přibližně rovná jádru d * g — diferenci zkonvolvované s navzorkovanou gaussovkou — takže signál se zároveň vyhladí i derivuje.

Laicky řečeno

Hrana je místo, kde se signál prudce změní, a změnu měří derivace. Jenže derivace vytahuje vysoké frekvence, a šum je samá vysoká frekvence. Prostá diference proto zesílí šum tak, že se v něm hrana snadno ztratí. Řešení: nejdřív vyhladit, pak derivovat — a protože konvoluce jde skládat, jde to jedním jádrem.

schod z 0 na 1 se šumem σ = 0,2 −0,81,8 diference (1, −1) −1,81,8 derivace gaussovky (σ = 4 vzorky) −1,81,8 hodnota (bez jednotky) 0300 vzorek n (pořadí)
Schod v šumu a dva detektory hrany

Obě metody najdou hranu na správném místě (mezi vzorky 149 a 150). Prostá diference má ale šum se směrodatnou odchylkou 0,27 a druhý nejvyšší vrchol jen 2,2krát nižší než hranu — s jiným šumem by se snadno spletla. Derivace gaussovky má šum 0,10 a hrana je 3,7krát vyšší než cokoli jiného. Na tomhle principu stojí Cannyho detektor hran v obrazech (1986).

Věta — diference zdvojnásobí rozptyl šumu

Nechť (e[n])n ∈ ℤ jsou nezávislé náhodné veličiny, které mají všechny tentýž rozptyl σ2, a h je jádro (konečně mnoho nenulových členů). Pak pro každé n ∈ ℤ

var((e * h)[n]) = σ2 ∑k h[k]2,

tedy jádro změní směrodatnou odchylku nezávislého šumu ze σ na σ · √∑k h[k]2. Speciálně diference d = (1, −1) dá rozptyl σ2 + σ2 = 2σ2.

Důkaz. (e * h)[n] = ∑k h[k] e[n − k] je součet nezávislých veličin; rozptyl součtu nezávislých veličin je součet rozptylů (i u rozdílu je to součet) a var(cX) = c2 var(X). ∎

Diference: σ√2 = 0,2 · 1,414 = 0,28 (změřeno 0,27), a hrana výšky 1 dá vrchol 1 — vrchol je jen 3,5krát nad šumem. Derivace gaussovky níže: √∑k h[k]2 = 0,47, šum 0,2 · 0,47 = 0,095 (změřeno 0,10), vrchol hrany 1 — přes 10krát nad šumem.

Ve frekvencích: diference má odezvu |H(f)| = 2|sin(π f/fs)|, nula pro f = 0 a 2 na Nyquistově frekvenci fs/2. Konstantu zahodí a nejrychlejší kmitání zdvojnásobí — proto horní propust.

h[k] = −k · exp(−k2/2s2)/C,   k = −16, …, 16

h[k]
jádro derivace gaussovky; jeho výstup je v obrázku zelený
−k
derivační část, obdoba diference (1, −1): budoucí vzorky (k < 0) s kladnou vahou, minulé se zápornou, takže výstup měří „napravo minus nalevo“. Až do vzdálenosti |k| = s váha se vzdáleností roste, protože rozdíl dvou vzdálenějších vzorků měří tentýž skok, ale jejich šum se na něm podílí relativně méně
exp(−k2/2s2)
gaussovka se šířkou s = 4 vzorky: tlumí vzdálené vzorky, aby jádro bylo krátké a hranu nerozmazalo. Větší s = méně šumu, ale horší určení polohy hrany. Jádro končí na ±4s, kde je gaussovka už pod 0,04 %
C
normování C = ∑k=116 k · exp(−k2/32) = 15,91 — součet kladných vah, aby čistý schod výšky 1 dal vrchol přesně 1 a výsledky šlo porovnat s diferencí
Derivace (−k) a vyhlazení (gaussovka) v jednom jádře — díky asociativitě konvoluce.

6. Když průměr nestačí: mediánový filtr

Definice — mediánový filtr

Nechť M ∈ ℕ je liché, M = 2m + 1 s m ∈ {0, 1, 2, …}. Pro reálná čísla a1, …, aM označme a(1) ≤ a(2) ≤ … ≤ a(M) tatáž čísla seřazená vzestupně (se zachováním opakování). Medián je prostřední z nich,

med(a1, …, aM) = a(m+1).

Nechť x : ℤ → ℝ je signál. Mediánový filtr délky M z něj vytvoří signál y daný pro každé n ∈ ℤ předpisem

y[n] = med(x[n − m], …, x[n + m]).

Každý vzorek se tedy nahradí mediánem hodnot v okně kolem něj (okraje konečného signálu doplňujeme krajní hodnotou jako u průměru). Není to konvoluce — je nelineární (věta níže).

Laicky řečeno

Občasné výstřely — prasknutí na desce, vadný pixel, chyba přenosu — jsou pro průměr katastrofa: jeden obří výkyv se rozmaže do celého okolí. Medián se o extrémy nestará, stejně jako se medián platů nestará o jednoho miliardáře. Stejný rozdíl jako mezi kvadratickou a absolutní ztrátou.

signál s výstřely −44 klouzavý průměr −44 mediánový filtr −44 hodnota signálu (bez jednotky) 0400 vzorek n (pořadí, fs = 200 Hz)
Sinusovka s výstřely: průměr a medián přes 5 vzorků

V signálu je 19 výstřelů o velikosti ±3. Odchylka od čistého signálu je 0,67; klouzavý průměr ji sníží na 0,28, protože výstřely jen rozmaže do širších hrbolů. Medián přes stejných 5 vzorků ji sníží na 0,04 — výstřely prakticky zmizí.

Příklad — průměr a medián jednoho okna

Okno pěti vzorků s jedním výstřelem: (0,1; 0,2; 3,1; 0,3; 0,2). Průměr = 3,9/5 = 0,78 — výstřel ho vytáhl čtyřikrát výš, než leží ostatní vzorky. Seřazeno: (0,1; 0,2; 0,2; 0,3; 3,1), medián je prostřední, 0,2. Výstřel by mohl být 3 nebo 3 000 a medián by se nezměnil.

Podle definice je výstup (m + 1). nejmenší hodnota okna. Dokud je v okně nejvýš m výstřelů, leží výstup mezi hodnotami „slušných“ vzorků; přebít medián dokážou až tři výstřely v okně pěti vzorků.

Věta — mediánový filtr není lineární, a proto to není konvoluce

Nechť M ≥ 3 je liché. Pak mediánový filtr délky M není lineární zobrazení: existují signály x, z, pro které medián součtu x + z není součtem mediánů. Proto neexistuje jádro h, pro které by mediánový filtr byl konvolucí s h.

Důkaz. Stačí jedno okno. Nechť okno signálu x obsahuje m jedniček a m + 1 nul a okno signálu z jedinou jedničku na místě, kde má x nulu, jinak nuly. Nul je v obou oknech většina, takže oba mediány jsou 0; okno x + z má ale m + 1 jedniček, tedy většinu, a medián 1 ≠ 0 + 0. Pro M = 3: med(0, 0, 1) = 0 a med(1, 0, 0) = 0, ale med((0, 0, 1) + (1, 0, 0)) = med(1, 0, 1) = 1. Každá konvoluce je lineární, takže medián konvolucí být nemůže — a nemá ani frekvenční odezvu. ∎

Souvislost se ztrátami: pro čísla x1, …, xM je průměr 1/M ∑ xj to jediné c ∈ ℝ, které minimalizuje ∑j (xj − c)2, a medián (pro liché M) to jediné c, které minimalizuje ∑j |xj − c|. Kvadrát velké odchylky je obří, takže jeden výstřel průměr strhne; absolutní hodnota roste jen lineárně a výstřel „táhne“ stejnou silou, ať je jakkoli velký.

7. Proč je konvoluce všude

Konvoluce se neobjevuje jen u signálů. Kdykoli se sčítají nezávislé náhodné veličiny, rozdělení součtu je konvoluce jejich rozdělení:

01/6 1 kostka 1 6 2 kostky 2 12 3 kostky 3 18 součet ok (od n do 6n) P(součet) (0 až 1/6)
Součet jedné, dvou a tří kostek jako opakovaná konvoluce rozdělení součtu

Jedna kostka má rovnoměrné rozdělení. Konvoluce se sebou samou dá trojúhelník — součet 7 padne v 6 případech z 36. Třetí konvoluce už připomíná zvon: nejčastější součty 10 a 11 mají 27 případů z 216. Další konvoluce by zvon dál vyhlazovaly; to je centrální limitní věta z dílu Limitní věty v řeči konvolucí.

P(X + Y = s) = ∑k P(X = k) · P(Y = s − k)

P(X + Y = s)
rozdělení součtu; hraje roli výstupu (x * h)[n]
P(X = k)
první kostka padne na k — hraje roli jádra h[k]
P(Y = s − k)
druhá kostka musí dorovnat zbytek do součtu s; odtud stejné „n − k“ jako v konvoluci. Násobí se, protože kostky jsou nezávislé
∑k
jednotlivé možnosti (k, s − k) se navzájem vylučují, takže se jejich pravděpodobnosti sčítají
Platí pro nezávislé náhodné veličiny X, Y s celočíselnými hodnotami a každé s ∈ ℤ. Stejný vzorec jako konvoluce signálů — jen místo vzorků jsou pravděpodobnosti.
Příklad — součet 7 na dvou kostkách a 10 na třech

Barvy podle vzorce výše. Dvě kostky:

P(X + Y = 7) = ∑k=16 1/6 · 1/6 = 6/36

— dvojice (1, 6), (2, 5), (3, 4), (4, 3), (5, 2), (6, 1). Rozdělení dvou kostek v šestatřicetinách: 1, 2, 3, 4, 5, 6, 5, 4, 3, 2, 1 pro součty 2 až 12.

Tři kostky: P(10) = ∑k=16 P(třetí = k) · P(první dvě dají 10 − k). Součty 9, 8, 7, 6, 5, 4 mají na dvou kostkách 4, 5, 6, 5, 4 a 3 případy z 36, takže

P(10) = 1/6 · 4 + 5 + 6 + 5 + 4 + 3/36 = 27/216.

  • Neuronové sítě. Konvoluční vrstva je sada jader, jejichž váhy se učí gradientním sestupem. První vrstvy sítí na obrázcích se samy naučí jádra podobná detektorům hran.
  • Zvuk. Ozvěna sálu je konvoluce: nahraje se impulzní odezva kostela a jakýkoli zvuk zkonvolvovaný s ní zní, jako by zazněl v kostele.
  • Rychlost. Díky konvoluční větě se dlouhé konvoluce počítají přes FFT: transformovat, vynásobit, transformovat zpět.
Definice — dvourozměrná konvoluce

Nechť I : ℤ2 → ℝ je obrázek (I[i, j] je jas pixelu v řádku i a sloupci j; obrázek konečné velikosti doplníme mimo jeho okraj) a nechť r ∈ {0, 1, 2, …} a K : {−r, …, r}2 → ℝ je jádro velikosti (2r + 1) × (2r + 1). Dvourozměrná konvoluce obrázku I s jádrem K je obrázek I * K daný pro všechna (i, j) ∈ ℤ2 předpisem

(I * K)[i, j] = ∑a=−rr ∑b=−rr K[a, b] · I[i − a, j − b].

Je to totéž co v jednom rozměru, jen se jádro posouvá po řádcích i sloupcích. Například jádro 3 × 3 s řádky (1, 0, −1), (2, 0, −2), (1, 0, −1) (Sobelův operátor) je diference ve vodorovném směru spojená s vyhlazením (1, 2, 1) ve svislém — dvourozměrná obdoba derivace gaussovky.

Cena: přímý výpočet stojí na každý pixel (2r + 1)2 násobení. U jednorozměrného signálu délky N a jádra délky L je to N · L násobení, přes FFT řádově N log2 N — vyplatí se to, když je jádro dlouhé (ozvěna sálu má desítky tisíc vzorků), u krátkých jader neuronových sítí (3 × 3) ne.

8. Shrnutí

  • Konvoluce posouvá jádro vah po signálu a sčítá vážené hodnoty; (1, 2, 3) * (1, 1) = (1, 3, 5, 3).
  • Klouzavý průměr tlumí šum, ale i signál: okno 21 vzorků snížilo odchylku z 0,400 na 0,124, s oknem 61 zbyla ze sinusovky jen polovina.
  • Ve frekvencích je konvoluce násobení; průměr přes 10 vzorků při 500 Hz má nulu přesně na 50 Hz a brum z EKG odstranil úplně.
  • Derivace hledá hrany, ale zesiluje šum; derivace gaussovky snížila šum z 0,27 na 0,10.
  • Na výstřely je lepší nelineární medián (odchylka 0,04 proti 0,28 u průměru); součet náhodných veličin je konvoluce rozdělení.

Chcete si to osahat? Nechte AI agenta načíst krokoměr nebo GPS stopu z vašeho telefonu a vyhladit ji klouzavým průměrem a mediánem — který si lépe poradí se skoky polohy?

Máte na to jiný názor? Napište na support@coden-app.com.

Agent na vašem počítači, ovládaný z telefonu