SEMESTRÁLNÍ PRÁCE Z X37SAS Zadání č. 7 Daniel Tureček St-lichý týden, 9:15
Zadání Určete periodu signálu s(k), určete stejnosměrnou složku, výkon, autokorelační funkci. Záznam signálu je v souboru persig2. 1. Úvod Signál, pro který budeme počítat jednotlivé body zadání je dán v souboru persig2 ve formátu řady čísel oddělených mezerami. Pro práci se signálem bude použit výpočetní program Matlab. 2. Načtení signálu do Matlabu Do Matlabu načteme signál ze souboru persig2 proměnné data následujícím příkazem: data = load('persig2'); (1) kde load je funkce, která načte data ze souboru a uloží je do proměnné. Nyní již máme signál uložen v proměnné v Matlabu a mužeme na něm provádět další výpočty. 3. Výpočet autokorelační funkce Autokorelační funkce je pro periodický diskrétní signál dána předpisem: R m = 1 N 0 k 0 N 0 1 s k * s k m (2) k=k 0 a vypočítáme ji: R = xcorr(data) / length(data); (3) kde xcorr je funkce, která počítá korelační či autokorelační funkci. Pro výpočet korelační funkce má syntaxi: proměnná = xcorr(x, y); nebo proměnná = xcorr(x); (4) kde x,y jsou signály jejíchž korelační či autokorelační funkci počítáme. Výše zmíněná funkce xcorr nám ovšem pouze vypočítá sumu ve vzorci (2). Abychom získali správnou hodnotu pro periodický signál je nutné výsledek vydělit délkou signálu. Tu spočítáme pomocí funkce length. Stejného výsledku bychom dosáhli, kdybychom do funkce xcorr přidali parametr 'biased'. R = xcorr(data,'biased'); (5) 4. Výpočet periody signálu Periodu signálu zjistíme z autokorelační funkce. Víme, že autokorelační funkce má stejnou periodu jako signál, pro který byla počítána. Periodu můžeme tedy snadno určit například jako vzdálenost sousedních maxim. V našem případě jsme zjistili index globálního maxima a index
druhého nejvyššího maxima zleva. Jejich rozdíl je námi hledaná perioda. V matlabu celý postup vypadá následovně: [size1, pos1] = max(r); (6) [size2, pos2] = max(r(1:pos1-1)); (7) N0 = pos1 - pos2; (8) kde funkce max najde v proměnné (vektoru) maximum. Její syntaxe je: [velikost maxima, index] = max(proměnná); (9) kde velikost maxima je velikost nalezeného maxima v proměnné proměnná a index je poloha tohoto maxima v proměnné proměnná. V řádku (6) tedy spočítáme globální maximum, jeho hodnotu uložíme do proměnné size1 a polohu do proměnné pos1. V řádku (7) spočítáme maximum na intervalu od 1 do polohy globálního maxima. Tímto získáme pozici druhého nejvyššího maxima vlevo od globálního maxima. V posledním řádku (8) vypočítáme rozdíl mezi polohami obou maxim a uložíme jej do proměnné N0. 5. Výpočet stejnosměrné složky Stejnosměrnou složku spočítáme podle vzorce: ss= 1 N 0 N 0 1 V matlabu můžeme stejnosměrnou složku vypočítat funkcí mean. Jelikož je náš signál periodický počítáme střední hodnotu na jedné periodě : s k ss=mean(data(1:n0)); (10) kde data(1:n0) omezí signál pouze na jednu periodu. Pro kontrolu můžeme stejnosměrnou složku také spočítat vzorcem: kde sum je funkce suma. ss2=sum(data(1:n0))/n0; (11) 6. Výpočet výkonu Výpočet výkonu můžeme provést dvěma způsoby: 1. Z korelační funkce, jelikož platí: 2. Ze vzorce: P=R 0 (12) P= 1 N 0 s k 2 (13) N 0 1
Vzorec (13) lze do matlabu přepsat následujícím způsobem P=sum(abs(data(1:N0).*data(1:N0)))/N0; (14) kde znaky.* značí, že se při sčítání vynásobí mezi sebou jednotlivé hodnoty v proměnné data. 7. Vykreslení grafů signálu a autokorelační funkce Vykreslení grafů provedeme pomocí následujících příkazů: subplot(2,1,1); (15) plot(data); (16) title('persig2'); (17) xlabel('k'); (18) ylabel('y'); (19) subplot(2,1,2); (20) plot(r); (21) title('autokorelacni funkce'); (22) xlabel('\tau'); (23) ylabel('r'); (24) kde: subplot je funkce, která vytvoří mřížku grafů a jeden zvolí. Syntaxe: subplot(počet grafů vertikálně, počet grafů horizontálně, zvolený graf); plot(data) je funkce, která vykreslí graf signálu persig2 title('titulek') je funkce, která nastaví název grafu xlabel('x') je funkce, která nastaví popisek osy x ylabel('y') je funkce, která nastaví popisek osy y 8. Grafy a výsledky Graf vstupního signálu persig2:
Graf autokorelační funkce: Perioda N 0 =47 Stejnosměrná složka Výkon P=0,0969 ss= 0,0337 9. Zdrojový kód % project.m clear; % smazani puvodnich hodnot data = load('persig2'); % nacteni signalu ze souboru a ulozeni do promene data %AUTOKORELACNI FUNKCE R=xcorr(data)/length(data); % vypocet auto korelacni funkce %PERIODA [size1,pos1]=max(r); % maximum korelacni funkce, pos1 - index maxima [size2,pos2]=max(r(1:pos1-1)); % pos2 - index druheho nejvetsiho maxima N0=pos1-pos2; %perioda - rozdil indexu dvou nejblizsih maxim %SS SLOZKA ss=mean(data(1:n0)); ss2=sum(data(1:n0))/n0; %VYKON P=sum(abs(data(1:N0).*data(1:N0)))/N0; % energie signalu P=mean(abs(data(1:N0).*data(1:N0))); %VYPIS ss % stejnosmerna slozka P % vykon %VYKRESLENI GRAFU subplot(2,1,1); % vytvoreni mrizky pro 2 grafy, zvoleni horniho grafu plot(data); % vykresleni grafu vstupniho signalu title('persig2'); % nastaveni titulky horniho grafu xlabel('k'); % popisek osy x ylabel('y'); % popisek osy y subplot(2,1,2); % zvoleni spodniho grafu plot(r); % vykresleni grafu autokorelacni funkce title('autokorelacni funkce'); % nastaveni titulku spodniho grafu xlabel('\tau'); % popisek osy x ylabel('r'); % popisek osy y