CZR - numerické cvičení - zadání a řešení Jan Černocký, FIT VUT Brno, 5. května 007 LPC je dán signál o -ti vzorcích x[0]... x[]: 0, 0.707,, 0.707, 0, -0.707, -, -0.707, 0, 0.707,, 0.707 Příklady. je možné vyjádřit tento signál analyticky? Jak? Ano, je to sinusovka: x[n] = sin(πfn) s normovanou frekvencí f = /8. Jak se na to přišlo: že je to sinusovka asi sami vidíte. Je to periodické po N = 8 vzorcích a vzoreček pro normovanou frekvenci je f = /N, kde N je perioda. I kdybyste na tento vzoreček zapomněli, můžete si říci normální sinusovka je periodická s π. Víme, že v tam musí být π a že tam musí být diskrétní čas, čím bych tak ten diskrétní čas vynásobil/a, aby to bylo periodické po 8-mi vzorcích? n = 0:; f = /8; N=; x = sin (*pi*f*n); stem(n,x); 0.8 0.6 0.4 0. 0 0. 0.4 0.6 0.8 0 4 6 8 0. spočítejte energii vztaženou na vzorek. součet kvadrátů absolutních hodnot vzorků (vzorky jsou reálné, takže se na absolutní hodnoty můžeme klidně vykašlat), dělíme délkou signálu: E = N N x [n] = 0 + 6 + 3 = 0.5 E = /N * sum(x.^) Přídavná kontrola: energie sinusovky by měla být A, kde A je amplituda. Platí to?... jo, platí. A = 3. spočítejte průchody nulou - nejprve pohledem na obrázek, pak matematicky.
pohledem na obrázek: matematicky: Z = N n= sign x[n] sign x[n ], pro zjednodušení bereme znaménko čísla nula: sign 0 =. Uvědomíme si, že vedle sebe sedící vzorky se stejným znaménkem mají absolutní hodnotu rozdílu znamének 0, pokud se znaménko změní, je to. V našem signálu tyto přechody dostáváme dva, tedy: Z = = 4. proveďte LPC analýzu řádu - musíte tedy určit koeficienty a a a filtru A(z). Budete potřebovat autokorelační koeficienty R[0], R[] a R[]. Proveďte výpočet řešením standardní soustavy rovnic o dvou neznámých. Autokorelační koeficienty se počítají pomocí: R[k] = N k s[n]s[n + k] budeme je potřebovat pro k=0,,. Signál okopírujeme, posuneme doleva (ale ono je to stejně jedno... ) o k, pak všechny vzorky, které budou nad sebou vynásobíme a sečteme. R[0] = R[] = R[] = R = xcorr(x) R = R(N:N+) R0 = R(); R=R(); R = R(3); N k N k N k LPC koeficienty jsou řešením soustavy rovnic: [ R[0] R[] R[] R[0] x[n]x[n] = 0 + 0.707 +... = 6 x[n]x[n + ] = 0 0.707 + 0.707 +... = 4.43 x[n]x[n + ] = 0 + 0.707 0.707 +... = 0.5 ] [ ] a = a [ R[] R[] ] tedy R[0]a + R[]a = R[] R[]a + R[0]a = R[] Na výpočet soustavy rovnic o neznámých můžete jít různě, po několika neúspěšných pokusech s použitím kofaktorů jsem si to odvodil růčo: pro ax + by = c by mělo platit: dx + ey = f x = ce bf ea bd (takže tam ty kofaktory stejně dostaneme, ha ha ha). Po dosazení: a = pak se to dosadí do libovolné z rovnic a vyjde: 4.43 6 + 0.5 4.43 6 4.43 =.97 a = 0.843
A = inv([r0 R ; R R0]) * [-R; -R] 5. Proveďte tentýž výpočet pomocí Levinsona-Durbina. postupujeme podle rovnic -6 v přednášce o LPC. inicializace E (0) = 6 iterace() k = [R[] + nic]/e (0) = 4.43/6 = 0.707 a () a () j = 0.707...nic E () = ( 0.707 )6 = 3 nic v algoritmu značí, že díky indexům není co dělat. A = levinson (R,) iterace() k = [R[] + a () R[]]/E() =... = 0.833 a () = 0.833 a () = a () + k a () = 0.707 + 0.833 ( 0.707) =.95 6. Vypočtěte energii chyby predikce z LPC a autokorelačních koeficientů. podle vzorečku (0) z přednášky: E = R[0] + P a i R[i] = 6.97 4.43 + 0.834 0.5 = 0.93 i= Toto je nenormovaná energie, pokud ji budeme chtít převést na normovanou, musíme dělit 4-ti (?? a proč ne -ti??). E norm = 0.93 4 = 0.065 7. Vypočítejte signál chyby predikce - jedná se tedy o filtrování signálu x[n] inverzním filtrem A(z). Vypočtěte jeho energii a srovnejte s energií vypočtenou v bodě 6. filtrujeme filtrem A(z) = + a z + a z, který má v časové oblasti tuto diferenční rovnici: y[n] = x[n] + a x[n ] + a x[n ] Musíme tedy sčítat současný vzorek s minulým násobeným a a předminulým násobeným a. Na to je dobré si udělat malou tabulku: Odpověď: Signál má vzorků, ale jelikož filtr má dvě paměti, produkuje signál ještě o dva vzorky delší (musíme počkat, až se paměti vysypou ). 3
n x[n] x[n ] a x[n ] x[n ] a x[n ] y[n] 0 0 0 0 0 0 0 0.707 0 0 0 0 0.707 0.707-0.97 0 0 0.083 3 0.707 -.96 0.707 0.589 0 4 0 0.707-0.97 0.833-0.083 5-0.707 0 0 0.707 0.589-0.8 6 - -0.707 0.97 0 0-0.083 7-0.707 -.96-0.707-0.589 0 8 0-0.707 0.97 - -0.833 0.083 9 0.707 0 0-0.707-0.589 0.8 0 0.707-0.97 0 0 0.083 0.707 -.96 0.707 0.589 0 0 0.707-0.97 0.833-0.083 3 0 0 0 0.707 0.589 0.589 Nejprve si vyplníme sloupce x[n], x[n ] a x[n ], pak k nim dopočítáme sloupce násobené koeficienty a nakonec sloupce x[n], a x[n ] a a x[n ] sečteme. Zvrhlíci si to můžou spočítat i v Excelu ;-) Spočítáme-li energii výstupního signálu: E normy = 4 zjistíme, že je to 0.065, takže vzorec pro výpočet residuální energie z LPC koeficientů a autokorelačních koeficientů nelhal. 3 y [n] 8. Určete, kde má filtr A(z) póly a jak vypadá jeho frekvenční charakteristika. Jmenovatele filtru H(z) = A(z) můžeme rozložit do pólů takto: H(z) = + a z + a z = z z z = + a z + a (z p )(z p ) Póly (tedy body, kde je jmenovatel roven nule, tedy celý výraz roven nekonečnu) jsou dány řešením rovnice: z + a z + a = 0 Opět si vzpomeneme na středoškolskou matematiku, kde se kvadratická rovnice řešila: ax + bx + c = 0 x, = b ± b 4ac a po dosazení a =, b = a =.96, c = a = 0.833 vyjde: p = 0.648 + 0.648j, p = 0.648 0.648j podle předpokladu vyšla dvě komplexně sdružená čísla. Pokud si tato čísla nakreslíme do komplexní roviny, začneme tušit, že filtr bude mít charakter pásmové propusti: když bude putovat bod z = e jπf po jednotkové kružnici, přiblíží se k pólu, krátká vzdálenost k póly stáhne jmenovatele H(z) do malých hodnot a když je jmenovatel malý, frekvenční charakteristika bude velká. Převedeme-li póly do exponenciálního tvaru re jφ, dostaneme: p = 0.93e j0.78, p = 0.93e j0.78 Zajímá nás, které frekvenci bude maximum odpovídat. Když celá kružnice (π rad) odpovídá normované frekvenci, pak bude 0.78 rad odpovídat: 0.78 π = 0.4 8 To je fajn, protože filtr A(z) se dobře naučil na náš signál, který měl také frekvenci 8. Více viz přednáška o lineární filtraci v ISS. 4
H=freqz(,A,56); f=(0:55) / 56 * 0.5; plot (f,abs(h)) 9 8 7 6 5 4 3 0 0 0.05 0. 0.5 0. 0.5 0.3 0.35 0.4 0.45 0.5 5
DTW Jsou dány vektory s parametry 3 : testovací: t = [ 3] T referenční : r = [ 4] T referenční : r = [ 3] T Příklady. Určete Euklidovy vzdálenosti vektoru t od r i od r a určete, který z referenčních vektorů je testovacímu blíže. Pro výpočet Euklidovy vzdálenosti použijeme známý vzoreček pro přeponu trojúhelníka: D(r, t) = (r() t()) + (r() t()), kde r(), t() jsou první a r(), t() druhé složky jednotlivých vektorů. Takže: Referenční vektor r je testovacímu blíže. D(r, t) = + =.44 D(r, t) = ( ) + 0 =. Referenční posloupnost má 4 vektory, testovací má 3 vektory. Je dána mřížka lokálních vzdáleností (reference svisle, test vodorovně). Určete DTW vzdálenost. D = 5 3 5 4 3 6 5 Při výpočtu DTW vzdálenosti začneme tak, že si nakreslíme mřížku lokálních vzdáleností D a inicializujeme mřížku částečných kumulovaných vzdáleností G.. Pak budeme vyplňovat G zleva doprava a zespoda nahoru tak, že v každém bodě: hodnota = min g souseda vlevo + d g souseda dole + d g souseda vlevo dole + d Z přednášek si možná pamatujete, že je penalizace příliš rychlého postupu v obou směrech. Při vyplňování políčka v G si zapamatujeme, odkud jsme přišli. Vyplnění prvního sloupce a prvního řádku je triviální, detail ukazuje políčko [, ], kde se poprvé musíme skutečně rozhodnout: 3 Vektory jsou sloupcové a protože se mi je nechce sloupcové sázet, je u nich všude T jako že jsou transponované ;-) 6
Nakonec bude G vypadat takto: Lehce určíme DTW vzdálenost: podělíme poslední políčko součtem délek reference a testu: D DT W = 4 3 + 4 = 3. Určete optimální srovnávací cestu a průběhy indexovacích funkcí r(k) a t(k). Optimální srovnávací cestu dostaneme zpětným trasováním z posledního políčka G na obrázku je vyznačena tlustými čarami. Vidíme, že srovnávací cesta má K = 5 bodů, indexovací funkce budou: pro referenci r(k) = [ 3 4] pro test t(k) = [ 3 3]. 7
3 HMM Je dán model s N = 4 stavy (z nichž jsou vysílací). Vektory v matici O mají dva prvky a je jich T = 5: [ ] [ ] [ ] [ ] [ ] 0.5. 0.5 o() =, o() =, o(3) =, o(4) =, o(5) =. 3 3 5 Model má tuto matici přechodových pravděpodobností: A = 0 0 0 0 0.6 0.4 0 0 0 0.7 0.3 0 0 0 0 Funkce hustoty rozdělení pravděpodobnosti v jednotlivých stavech jsou dány jedním Gaussovým rozložením s následujícími vektory středních hodnot a směrodatných odchylek: [ µ = ] [, σ = ] µ 3 = [ ] [, σ 3 = ] Příklady Matlabové ověření k těmto příkladům najdete v souboru cviko_hmm_reseni.m. určete všechny možné stavové sekvence X. Bude dobré si tento HMM nejprve nakreslit: Všechny stavové sekvence musí začínat prvním nevysílacím stavem č. a končit posledním nevysílacím č.4. Dva vysílací stavy si musí rozdělit všechny vektory, celková délka všech sekvencí tedy bude 7. Všechny možné sekvence jsou 4: X = [ 3 3 3 3 4] X = [ 3 3 3 4] X 3 = [ 3 3 4] X 4 = [ 3 4] Jiné sekvence nejsou platné, protože v modelu se nedají přeskakovat stavy.. pro každou z nich určete pravděpodobnost vyslání: P (O, X M). V tomto úkolu budete potřebovat výpočet vysílacích pravděpodobností Pro b (o()) spočítejte sami, pro ostatní jsou zde: o() o() o(3) o(4) o(5) b?????? 0.0349 0.0398 0.003 0.000 b 3 0.0098 0.000 0.0033 8 0.0340 0.09
Nejprve musíme spočítat vysílací pravděpodobnost b (o()) dostaneme ji tak, že dosadíme o() do funkce hustoty rozložení pravděpodobnosti druhého stavu. Jelikož jsou tato rozložení dána pouze pomocí středních hodnot a směrodatných odchylek, nemusíme se naštěstí starat o inverzi kovarianční matice a její determinant, ale použijeme zjednodušený vzorec (rovnice 5 v přednášce o HMM), kdy dostaneme vysílací pravděpodobnost jako součin hodnot dvou jednorozměrných Gaussovek. b (o()) = e (o() µ ) π σ σ e (o() µ ) σ =... = 0.034 π σ Tabulku tedy můžeme doplnit. Při výpočtu pravděpodobností P (O, X M) po jednotlivých cestách se řídíme pravidlem násobit všechny pravděpodobnosti, které po cestě potkáme, tedy všechny přechodové a vysílací vždy bereme podle toho, který stav vysílá který vektor. Bude to brutální, ale tady jsou celkové vzorečky: P (O, X M) = a b (o()) a 3 b 3 (o()) a 33 b 3 (o(3)) a 33 b 3 (o(4)) a 33 b 3 (o(5)) a 34 =.0 0 P (O, X M) = a b (o()) a b (o()) a 3 b 3 (o(3)) a 33 b 3 (o(4)) a 33 b 3 (o(5)) a 34 = 6. 0 P (O, X 3 M) = a b (o()) a b (o()) a b (o(3)) a 3 b 3 (o(4)) a 33 b 3 (o(5)) a 34 = 6.36 0 0 P (O, X 4 M) = a b (o()) a b (o()) a b (o(3)) a b (o(4)) a 3 b 3 (o(5)) a 34 =.6 0 3. určete Baum-Welchovu pravděpodobnost: P (O M) = X P (O, X M) Tato pravděpodobnost je sumou přes všechny cesty: P (O M) = 7. 0 0 4. určete Viterbiho pravděpodobnost: P (O M) = max P (O, X M) X Tato pravděpodobnost je maximem přes všechny cesty: P (O M) = 6.36 0 0 5. určete log-viterbiho pravděpodobnost: log P (O M) pomocí algoritmu token-passing. Odlogaritmujte a srovnejte s bodem 4. Budeme postupovat přesně podle algoritmu na konci přednášky o HMM. Je dobré si připravit obrázek, který obsahuje na svislé ose stavy modelu a na vodorovné ose časy. Časy můžeme doplnit o dva fiktivní časy: 0 a T + (předpokládáme, že vektory O jsou indexovány od do T ), ve kterých budeme algoritmus inicializovat a uzavírat. Uvědomíme si, že do piv budeme dolévat logaritmické 4 pravděpodobnosti log a ij + log b j [o(t)], takže bude dobré si připravit: do obrázku logaritmy přechodových pravděpodobností: log = 0, log 0.6 = 0.5 log 0.4 = 0.9, log 0.7 = 0.36, log 0.3 =.0 tabulku logaritmů b j (o(t)) pro všechny vektory: o() o() o(3) o(4) o(5) log b -3.38-3.35-3. -6.65-9. log b 3-4.63-6.9-5.7-3.38-4.35 4 Je celkem jedno, jaký použijeme logaritmus, doporučuji přirozený na kalkulačce ln, v programovacích jazycích log. 9
Průběh algoritmu je pak naznačen na následujícím obrázku 5 : Po jeho doběhnutí odebereme z posledního stavu modelu pivo, a pro získání Viterbiho pravděpodobnosti odlogaritmujeme: P (O M) = e.8 = 6.33 0 0 což je (až na zaokrouhlovací chyby) výsledek, který jsme dostali v příkladu 4. plným procházením všech cest. 5 Černá tečka pod číslem stavu nemá žádný význam v papíru byla díra ;-) 0