Než budeme cokoliv odhadovat musíme si nejprve vygenerovat nějaký zajímavý signál, na kterém naše odhady budeme zkoušet. Náš signál definujeme jako signál na výstupu filtru uvedeného na Obr. 1.1 při buzení (signál ) bílým stacionární gusovským procesem s nulovou střední hodnotou a rozptylem jedna.
Jelikož umíme pracovat pouze s posloupnostmi konečné délky omezíme se na náhodný vektor délky (s identicky normálně rozloženými složkami, kde normální rozdělení má nulovou střední hodnotu a rozptyl jedna). Takový jednoduše získáme použitím randn(N,1).
Cvičení 1.0: Vaším úkolem je vygenerovat , , za předpokladu že (počáteční podmínky).
Zkuste si napsat skript pro generování signálu sami. Až když budete mít potíže, prohlédněte si následující skript.
% genx.m N = 2000; L = 1000; v = randn(N,1); x = zeros(N,1); k1 = 0.9; k2 = 0.5; x(1) = v(1)*k2; % index -1 by vyvolal chybu, musime resit zvlast for n = 2:N if n == L+1 k1 = 0.0; k2 = 1.0; end x(n) = k1*x(n-1) + k2*v(n); endTakto by to asi napsal čtenář předchozího úvodu. Lze to zapsat take jednodušeji použitím funkce filter(B,A,u). Vstupní parametry B, resp. A mají význam koeficientů polynomů čitatele resp. jmenovatele přenosové funkce, viz. help filter. Nejdříve tedy musíme zjistit jaký vztah májí koeficienty a k těmto polynomům. Napíšeme rovnici filtru v časové oblasti
s = [ filter([0.5, 0],[1,-0.9],v(1:L)); filter([1, 0],[1, 0],v(L+1:N)) ];
Cvičení 1.1: Nyní si průběhy a vyneste.
To můžeme udělat např. přidámím těchto řádků k genx.m:
figure(1) % budeme kreslit do obrazku 1 plot(1:N,v,'b'); % horizontalni souradnice vynasenych bodu, % vertikalni souradnice vynasenych bodu, barva hold on % prubehy budou kresleny "pres sebe" plot(1:N,x,'r'); hold off % vypnuti kresleni "pres sebe" xlabel('n'); % popisy os ylabel('x[n],v[n]'); title('namodelovany signal x[n] (cervene)');
Momenty definujeme pomocí operátoru střední hodnoty 1.2.
Střední hodnotu náhodného procesu n čase značíme . Pro stacionární proces se momenty s časem nemění a platí tedy , značení se pak většinou zjednodušuje na .
Dále budeme předpokládat nulové střední hodnoty náhodných procesů , , případně náhodných veličin a . Vzájemná korelace n. v. a definujeme jako . Matici vzájemných korelací náhodných procesů a definujeme (zde uvádím pouze rozmě r )
Momenty 3. a 4. řádu ( , ) budeme používat k výpočtu kumulantů šikmosti a špičatosti při slepé separaci signálů pomocí ICA (Independent Component Analysis).
Jestliže je proces stacionární a ergodický lze jeho momenty odhadovat průměrováním v čase. Velkou výhodou je, že si pak vystačíme pouze s jedinou realizací. Odhad daného momentu obdržíme tak, že operátor střední hodnoty jednoduše nahradíme půměrem v čase. Například střední hodnotu odhadneme jako , korelaci odhadneme jako nebo moment vyššího řádu odhadneme jako .
Při blokovém odhadu předpokládáme stacionaritu v rámci bloků typicky fixní délky. V rámci každého bloku odhadneme momenty průměrováním.
Cvičení 1.2: Odhadněte autokorelační matici blokovým odhadem. Použijte bloky délky .
Řešení s for-cyklem:
M = 500; % délka bloku B = floor(N/M); % počet bloků rxx0 = zeros(B,1); % inicializace koeficientů Rxx rxx1 = zeros(B,1); for b = 1:B for n= ((b-1)*M+2):M*b rxx0(b) = rxx0(b) + x(n)^2/(M-1); rxx1(b) = rxx1(b) + x(n)*x(n-1)/(M-1); end end
Řešení bez for-cyklu (pouze náhrada za vnitřní smyčku):
range = ((b-1)*M+2):M*b; X = [ x(range) , x(range-1) ]; Rxx = X'*X/(M-1); rxx0(b) = Rxx(1,1); rxx1(b) = Rxx(1,2);
Vynesení obrázků:
figure(2) subplot(2,1,1) % subplot umoznuje dát více grafů do % jednoho obrazku, 1. podgraf plot(1:N,x,'b'); subplot(2,1,2) % 2. podgraf plot(1,0,'b'); % jenom kvuli pouziti hold on hold on for b = 1:B nz = (b-1)*M+1 ; nk = M*b ; plot([nz,nk],[rxx0(b),rxx0(b)],'b'); plot([nz,nk],[rxx1(b),rxx1(b)],'r'); end hold off
K odhadu střední hodnoty lze využít strukturu integrátoru na Obr. 1.4.
Otázka je jaká volba , poskytne dobrý odhad střední hodnoty. Shrneme nejprve požadavky na frekvenční charakteristiku: Frekvenční charakteristika by měla mít maximum na nulové frekvenci, ostatní frekvence by měly být pokud možno potlačeny. Hodnota frekvenční charakteristiky v tomto maximu by měla být jedna (chceme střední hodnotu a ne nějaký násobek). Systém by měl být stabilní.
Řešením této úlohy dojdeme k tomu, že možné hodnoty konstant , musí být reálné a dále musí splňovat podmínky , a . Takovýto integrátor se nazývá normalizovaný. Obvykle se jeho koeficienty značí místo , a místo . Odhad, který je jako zde aktualizován s každým novým vzorkem budeme nazývat průběžný.
Cvičení 1.3: Zkuste najít správné řešení sami.
Cvičení 1.4: Vyneste si frekvenční charakteristiku, impulsovou odezvu a póly a nuly v z-rovině pro různé hodnoty pro různé hodnoty ,.
Implulsovou odezvu vypočtete jednoduše pomocí funkce filter 1.3 nebo impz. Dále můžete použít následující funkce Matlabu.
Poznámka: Takovouto funkci si jednoduše můžete vytvořit sami. Stačí když si vzpomenete, že frekvenční charakteristika (systému diskrétního v čase) je vlastně přenosová funkce vyčíslená na jednotkové kružnici. pro integrátor by to dopadlo takto:
H = zeros(length(W),1); % length vraci velikost vektoru for k = 1:length(W) z = exp(j*W(k)); H(k) = k2*z/(z-k1); endNebo trochu zhuštěně:
z = exp(j*W); H = k2*z ./ (z-k1); % vyznam operatoru "./",".*",".^" je, ze operace % se provadi prvek po prvku, operandy pak musi % byt matice stejneho rozmeru, vyzkousekjte si
|
Cvičení 1.5: Odhadněte autokorelační matici průběžným odhadem pomocí normalizovaného integrátoru. Vyzkoušejte vliv na odhad (volte např. ).
Řešení:
lambda = 0.995; % koeficienty normalizovaneho integratoru k1 = lambda; k2 = 1-lambda; rxx0 = zeros(N,1); rxx1 = zeros(N,1); rxx0(1) = k2*x(n)^2; rxx1(1) = k2*x(n)*x(n-1); for n= 2:N rxx0(n) = k1*rxx0(n-1) + k2*x(n)^2; rxx1(n) = k1*rxx1(n-1) + k2*x(n)*x(n-1); end