Užitečné signály (diskrétní verze) Jednotkový skok
1 pro n ≥ 0 jinak 0
σ [ n] =
Konvoluce Jednotkový impuls (delta funkce)
1 pro n = 0 jinak 0
δ [ n] =
Posunutý jednotkový impuls
δ [n − k ]
Proč jsou užitečné ? Viz předchozí přednáška: impulsní dekompozice (rozložím signál na jednoduché komponenty - impulsy) Vzniknou po dekompozici jednotkové impulsy ? NE ! Musím je posunout a vynásobit konstantou. Můžu to udělat ? ANO (viz přednáška o lineárních systémech) Každý impuls mohu reprezentovat posunutou a „natáhnutou“ delta funkcí.
[ ] a [ n] = −5δ [ n − 8]
Příklad: mám signál a n který je všude 0, jen na pozici 8 má hodnotu -5. Jak ho zapíšu pomocí jednotkových impulsů ?
Co udělá systém, když mu předložím impuls ? Impulsní odezva
[ ]
Impulsní odezva je výstupní signál systému, na který jsme přivedli jednotkový signál. Značíme obvykle h n
Když vstupem není jednotkový impuls, ale obecný impuls (posunutý a vynásobený konstantou), jaký je výstup ? Lineární systém splňuje homogenitu a časovou invarianci !!! (viz definice lineárního systému) Tedy pro předchozí příklad:
[ ] −5δ [ n − 8] ) vstup x [ n ] = −5h [ n − 8] výstup y [ n ] =
• impulsní odezva h n •
• Výstup je tedy impulsní odezva, která byla posunutá a natažená, stejně jako jednotkový impuls na vstupu. Když znám impulsní odezvu, tak vím o systému všechno. (spočítám výstup na libovolný vstup)
Konvoluce • Když znám impulsní odezvu, tak nepotřebuji nic jiného. • Impulsní odezva má všelijaké názvy (konvoluční jádro, jádro filtru, jádro, kernel, …) • Jak vypočtu výstup, když znám vstup a impulsní odezvu ? Konvoluce. Konvoluce je matematická operace, která si vezme dva signály a vyrobí třetí
y= [ n] x [ n] ∗ h [ n] ∗
tohle není násobení !!!!
Výstupní signál je výsledkem konvoluce vstupního signálu a jádra (impulsní odezvy) Signály nemusí být (a nebývají) stejně dlouhé
Vstup:
x [ n ] je vstupní signál o N prvcích, h [ n ] je konvoluční jádro o M prvcích
Výstup:
y [ n]
je výstupní signál o
N + M − 1 prvcích
Jak to funguje ? Vezmu postupně impulzy ze vstupního signálu, ty projdou lineárním systémem s danou impulsní odezvou. Dostanu hromadu výstupních signálů a ty sečtu. Viz předchozí přednáška o lineárních systémech. Příklad
N = 9, M = 4, výstup bude mít 12 prvků Jednotlivé odezvy vstupních impulzů (mám 9 vzorků, budu mít 9 odezev) (kde se h neprojeví, jsou nuly)
Výstupní signál dostanu, když to všechno sečtu (superpozice) Z obrázku je vidět, že se dá konvoluce chápat také tak, že se jedna funkce (např. h, protože je menší, ale je to principielně jedno) posouvá postupně zleva doprava po druhé funkci a výsledek je vážená suma jednotlivých vzorků (funkce h slouží jako váhy prvků druhé funkce) Z obrázku je také vidět, jakým způsobem se dá rovnou spočítat hodnota jednotlivých vzorků výstupního signálu, tzv. konvoluční stroj:
Konvoluční stroj Konvoluční stroj vezme převrácenou (zprava doleva) impulsní odezvu (funkci h) a postupně projíždí vstupní funkci, příslušné prvky vynásobí, výsledek sečte a získá tak přímo hodnotu výstupního prvku (vzorku). PROČ JE FUNKCE h PŘEVRÁCENÁ ? Plyne přímo ze vzorečku (ale jde to vysvětlit i lidsky, kdo to zvládne ?)
y [i ] =
M −1
∑ h [ j ] x [i − j ] j =0
Index i běží v rozmezí
( 0, N + M − 2 )
Kde jsou problematická místa ? Tam kde nemáme kompletní data (na začátku a na konci). Co s tím ? • Dám tam nuly • Budu si pamatovat že je to fuj
Často používaná jádra (běžné impulsní odezvy) Identita
Zesílení
Posunutí
x [ n] ∗ δ [ n] = x [ n]
x [ n ] ∗ kδ [ n ] = kx [ n ] Podle toho, jestli je k > 1; k < 1
x [ n] ∗ δ [ n + s ]= x [ n + s ]
mám zesílení nebo zeslabení signálu.
s může být i záporné, pak se výsledný signál nezpožďuje, ale předbíhá vstup
Echo
Identita plus zeslabené posunutí
Derivace
Integrace
Rozdíl dvou následujících vzorků, není nutná konvoluce, můžu to spočítat přímo
Tohle je ošklivák, neb ty jedničky jedou až do nekonečna, tedy máme před sebou nekonečnou impulsní odezvu.
y [ n ] = x [ n ] − x [ n − 1]
Ale přímo to jde spočítat snadno:
Ale lze to nadefinovat i jinak! Např. symetricky kolem bodu, který zrovna zkoumám
y [ n= ]
y [ n ] = x [ n ] + y [ n − 1]
Je vidět, že je to rekurzivní vztah, x n + 1 − x n − 1 / 2 obecně pozor na ně (stabilita)
( [
]
[
])
Filtry (horní a dolní propust)
Pozor na kauzalitu !
Vlastnosti konvoluce • Komutativní (nezáleží na pořadí)
y [ n] = x [ n] ∗ h [ n] = h [ n] ∗ x [ n]
To je sice pěkné, ale fyzikálně to nemusí dávat smysl. Př. Vydělávám 100 Kč / hodinu a dělám 500 hodin, dostanu 50000,- výplatu. Stejně bych mohl dělat jen 100 hodin, ale brát za to 500 / hodinu. Nezapomínejte, že vstupní signál a impulsní odezva jsou ZCELA ROZDÍLNÉ VĚCI.
• Asociativní (systém v sérii)
y [ n ] =( x [ n ] ∗ h1 [ n ]) ∗ h2 [ n ] =x [ n ] ∗ ( h1 [ n ] ∗ h2 [ n ])
Když výstup jednoho systému jde jako vstup dalšího systému (kaskádovité uspořádání). Na pořadí nezáleží, navíc je mohu nahradit jediným systémem, jehož impulsní odezvu získám konvolucí impulsních odezev dílších systémů.
• Distributivní (paralelní systémy)
y [ n ] =( x [ n ] ∗ h1 [ n ]) + ( x [ n ] ∗ h2 [ n ]) =x [ n ] ∗ ( h1 [ n ] + h2 [ n ])
Mám dva systémy. Oba sdílí vstup. Výstupy sečtu a mám výsledný výstup. Takové uspořádání mohu nahradit jediným systémem, jehož impulsní odezvu získám tak, že sečtu impulsní odezvy příslušných potvůrek.
Cvičení: • Naprogramujte konvoluční funkci (hotová se jmenuje conv, ale takhle pochopíte, jak to funguje) • Vyzkoušejte si několik klasických jader • Sledujte, jak vypadá začátek a konec zpracovaného signálu po konvoluci
Korelace samostatná kapitola, ale můžeme k výpočtu využít upravené konvoluce, takže alespoň z rychlíku motivační příklad: radar: pošlu puls, např. trojúhelník, vrátí se mi posunutý a zmenšený a zašumělý úkol: zjistit časový posun (abych věděl, kde je vrtulník)
Korelace: matematická operace podobná konvoluci, vezme dva signály a vyrobí třetí • Když jsou vstupní signály různé, jedná se o vzájemnou korelaci (cross-correlation) • Když jako vstupy použiji tentýž signál, jedná se o autokorelaci (auto-correlation)
Proč o tom hovoříme u konvoluce? Korelační stroj! Funguje úplně stejně, jen hledaný signál (odpovídající impulsní odezvě) NENÍ PŘEVRÁCENÝ V Matlabu je funkce xcorr, která se ale chová trošku jinak. Porovnáme na cvičení, pokud chci využít konvoluce, tak jednoduše vezmu hledaný signál, převrátím ho, a použiji konvoluci.
clear all % vygeneruji nahodny sumovity signal x = rand(1,1000)-0.5; % vyrobim puls od radaru (linearne klesa) apulse = linspace(5,0,20); % a ted ten puls jeste krapet predelame, aby byla odezva mensi pulse = apulse ./ 4; % a strcime ho do sumu, tim ziskame to co nam radar vrati x(600:619) = pulse; % prevratim puls pulse2 = fliplr(apulse); % spocitam konvoluci prevraceneho signalu a prevraceneho pulsu korelace = conv(x,pulse2);
Využití konvoluce
% vykreslim subplot(2,1,1) plot(1:length(x),x,'b',1:length(apulse),apulse,'r'); subplot(2,1,2); plot(korelace) % jde to i jinak korelace2 = xcorr(x,pulse); figure subplot(2,1,1) plot(x); subplot(2,1,2); plot(korelace2) % vysledek vypada jinak, ale to je tim, ze xcorr upravuje kratsi vektor na stejnou delku jako ten delsi, a na mista kde nema informace, tak da nuly
Využití funkce xcorr