Odpovedať 
 
Hodnotenie témy:
  • 0 Hlasov - 0 Priemer
  • 1
  • 2
  • 3
  • 4
  • 5
Frekvenčné spektrum - MATLAB
01-15-2020, 22:05
Príspevok: #1
Frekvenčné spektrum - MATLAB
Frekvenčné spektrum môže rekrezentovať jednotlivé spektrá signálu a analyzovať, či dochádza k tzv. aliasingu - prekrývaniu spektier. V tejto implementácii použijeme interpolátor na pôvodné spektrum signálu, ktorý dokáže stlačiť pôvodné spektrum a do spektra vložiť kópiu (nultú hodnotu). Predchádza aliasingu.

Script pracuje s menovitou frekvenciou signálu 1Hz. Nakoľko budeme pracovať s uhlovou (kruhovou) frekvenciou, potrebujeme si frekvenciu vyjadriť v rad/s. Následne si určíme vzorkovaciu frekvenciu s hodnotou 2*uhlová frekvencia. Následne násobky vzorkovacej frekvencie do + i do - *2, *3. Tieto hodnoty budú následne slúžiť na reprezentáciu na x osi grafu. Programová implementácia bola vyhotovená pre MATLAB vrámci semestrálneho projektu. MATLAB umožňuje upraviť funkčné hodnoty osi x a y použitím xticks funkcie a následne funkciou xticklabels priradiť aj textové hodnoty - labely k jednotlivým hodnotám. Následne môžeme do čiarového grafu vykresliť spektrum pôvodného signálu.
[Obrázok: vyRUsKt.png]
Vidíme, že v spektre nie je aliasing - prekrývanie spektier. Následne vykonáme operáciu s interpolátorom, ktorý umožňuje stlačiť pôvodné spektrum. Interpolátor má faktor L, ktorý sa na spektrum aplikuje. Všeobecne platí, že interpolátor do spektra vloží L-1 kópiu, respektíve nultú zložku. Teda aby interpolátor zmenil spektrum, musí mať hodnotu minimálne 2. V tejto implementácii sme použili faktor L=2 a L=3. Výsledkom sú spektrá, do ktorých sú vložené kópie a pôvodné spektrum je stlačené. Vzorkovacia frekvencia je nadvzorkovaná - vynásobená * faktor L.
[Obrázok: gm0uurR.png]
Interpolátor má využitie predovšetkým v elektotechnike pri spracovaní a prenose signálov, napríklad pri odosielaní nadvzorkuje signál, čím predchádza prípadnej chybe, nakoľko rovnaký signál je nadvzorkovaný, t.j. môže ho reprodukovať vernejšie.
Viac o projekte: https://arduino.php5.sk/frekvencne-spektrum.php
Výstup čiarového grafu:
[Obrázok: OBrAHN0.png]
Programová implementácia:
Kód:
%%Vyhotovil: Martin Chlebovec
%%Donate: https://paypal.me/chlebovec

close all; %% zatvor figure, okno
clear all; %% Vymaž premenné a ich hodnoty
f = 1 %%frekvencia (Hz)
omega_max = 2*pi*f %%uhlova frekvencia
omega_vz = 2*omega_max %%vzorkovacia frekvencia 2*max uhlova frekvencia
omega_vz_2 =  2*omega_vz
omega_vz_3 =  3*omega_vz

%%inverzne hodnoty pre - x os
minus_omega_max = (-1*omega_max)
minus_omega_vz = (-1*omega_vz)
minus_omega_vz_2 =  (-1*omega_vz_2);
minus_omega_vz_3 =  (-1*omega_vz_3);
%%funkcne hodnoty spektra
x = [[(minus_omega_vz_2+minus_omega_vz_3)/2],minus_omega_vz_2,[(minus_omega_vz+minus_omega_vz_2)/2],minus_omega_vz,minus_omega_max,0,omega_max,omega_vz,[(omega_vz+omega_vz_2)/2],omega_vz_2,[(omega_vz_2+omega_vz_3)/2]]
y = [0,f,0,f,0,f,0,f,0,f,0]

ax1 = subplot(5,1,1) %%podgraf
plot(x,y); %%vykreslenie spojitej funkcie z funkcnych hodnot do grafu
%%množina hodnôt x osi, označenie
xticks([ minus_omega_vz_2 minus_omega_vz minus_omega_max 0 omega_max omega_vz omega_vz_2])
xticklabels({'-2*Ovz','-Ovz','-Omax','0','Omax','Ovz','2*Ovz'})
%%množina hodnôt y osi, označenie
yticks([ 0 1])
yticklabels({'0','1'})
title('Spektrum signálu omega-vz = 2*omega-max'); %%Nadpis grafu
xlabel('Uhlová frekvencia (1/s)'); %Popis osi x
ylabel('Amplitúda'); %Popis osi y
hold on %%pockaj (podrz okno grafov pre vykreslenie dalsich)

%%Definicia interpolatoru L =2 a funkcnych hodnot spektra
L_2 = 2
x_2 = [minus_omega_vz_2+minus_omega_max/L_2,minus_omega_vz_2,minus_omega_vz_2-minus_omega_max/L_2,minus_omega_vz+minus_omega_max/L_2,minus_omega_vz,minus_omega_vz-minus_omega_max/L_2,minus_omega_max/L_2,0,omega_max/L_2,omega_vz-omega_max/L_2,omega_vz,omega_vz+omega_max/L_2,omega_vz_2-omega_max/L_2,omega_vz_2,omega_vz_2+omega_max/L_2]
y_2 = [0,f,0,0,f,0,0,f,0,0,f,0,0,f,0]
ax2 = subplot(5,1,2) %%podgraf
%%vykreslenie spektra z funkcnych hodnot pre x a y os
plot(x_2,y_2);
hold on

%%Vykreslenie kópii pre interpolator L = 2 do spektra
plot([(minus_omega_vz_2+minus_omega_vz_3/2)/L_2,(minus_omega_vz_2+minus_omega_vz_3/2)/L_2-minus_omega_max/L_2,(minus_omega_vz_2+minus_omega_vz_3/2)/L_2-minus_omega_max ],[0,1,0],'--r');
plot([(minus_omega_vz+minus_omega_vz_2/2)/L_2-minus_omega_max/L_2,(minus_omega_vz+minus_omega_vz_2/2)/L_2-minus_omega_max,(minus_omega_vz-minus_omega_vz_2/2)/L_2+minus_omega_max/L_2],[0,1,0],'--r');
plot([(omega_vz-omega_vz_2/2)/2+omega_max/L_2,(omega_vz+omega_vz_2/2)/L_2-omega_max,(omega_vz+omega_vz_2/2)/L_2-omega_max/L_2],[0,1,0],'--r');
plot([(omega_vz_2+omega_vz_3/2)/L_2,(omega_vz_2+omega_vz_3/2)/L_2-omega_max/L_2,(omega_vz_2+omega_vz_3/2)/L_2-omega_max ],[0,1,0],'--r');

%%Označenie kópie pre interpolator L = 2 + text
plot([(minus_omega_vz_2+minus_omega_vz_3/2)/L_2 (minus_omega_vz_2+minus_omega_vz_3/2)/L_2-minus_omega_max],[0 0],'-k','LineWidth',3);
scatter((minus_omega_vz_2+minus_omega_vz_3/2)/L_2,0,'<','k')
scatter((minus_omega_vz_2+minus_omega_vz_3/2)/L_2-minus_omega_max,0,'>','k')
plot([(minus_omega_vz_2+minus_omega_vz_3/2)/L_2, (minus_omega_vz_2+minus_omega_vz_3/2)/L_2],[0,1],'--k')
plot([(minus_omega_vz_2+minus_omega_vz_3/2)/L_2-minus_omega_max, (minus_omega_vz_2+minus_omega_vz_3/2)/L_2-minus_omega_max],[0,1],'--k')
text((minus_omega_vz_2+minus_omega_vz_3/2)/L_2,-0.15,' Kópia','Color','black', 'Fontsize', 12);
hold on
%%množina hodnôt x osi, označenie
xticks([ minus_omega_vz_2 minus_omega_vz minus_omega_max 0 omega_max omega_vz omega_vz_2])
xticklabels({'-2*Ovz','-Ovz','-Omax','0','Omax','Ovz','2*Ovz'})
%%množina hodnôt y osi, označenie
yticks([ 0 1])
yticklabels({'0','1'})
title('Interpolácia pre faktor L = 2 --> stlačenie pôvodného spektra na polovicu'); %%Nadpis grafu
xlabel('Uhlová frekvencia (1/s)'); %Popis osi x
ylabel('Amplitúda'); %Popis osi y


%%Definicia interpolatoru L = 3 a funkcnych hodnot spektra
L_3 = 3
x_3 = [minus_omega_vz_2+minus_omega_max/L_3,minus_omega_vz_2,minus_omega_vz_2-minus_omega_max/L_3,minus_omega_vz+minus_omega_max/L_3,minus_omega_vz,minus_omega_vz-minus_omega_max/L_3,minus_omega_max/L_3,0,omega_max/L_3,omega_vz-omega_max/L_3,omega_vz,omega_vz+omega_max/L_3,omega_vz_2-omega_max/L_3,omega_vz_2,omega_vz_2+omega_max/L_3]
y_3 = [0,f,0,0,f,0,0,f,0,0,f,0,0,f,0]
ax3 = subplot(5,1,3) %%podgraf
%%vykreslenie spektra z funkcnych hodnot pre x a y os
plot(x_3,y_3);
hold on
%%Vykreslenie kópii pre interpolator L = 3 do spektra
plot([minus_omega_vz_2-minus_omega_max/L_3,minus_omega_vz_2-minus_omega_max/L_3+omega_max/3,(minus_omega_vz_2-minus_omega_max/L_3)-(minus_omega_max/L_3)*2],[0,1,0],'--r');
plot([(minus_omega_vz_2-minus_omega_max/L_3)-(minus_omega_max/L_3)*2,(minus_omega_vz_2-minus_omega_max/L_3)-(minus_omega_max/L_3)*3,minus_omega_vz+minus_omega_max/L_3],[0,1,0],'--r');
plot([(((minus_omega_vz-minus_omega_max/L_3)-(minus_omega_max/L_3)*2)+(minus_omega_max/L_3)*2),(((minus_omega_vz-minus_omega_max/L_3)-(minus_omega_max/L_3)*2)+(minus_omega_max/L_3)*2/2),((minus_omega_vz-minus_omega_max/L_3)-(minus_omega_max/L_3)*2)],[0,1,0],'--r');
plot([((minus_omega_vz-minus_omega_max/L_3)-(minus_omega_max/L_3)*2),(((minus_omega_vz-minus_omega_max/L_3)-(minus_omega_vz/L_3)*2))+(minus_omega_max/L_3), ((minus_omega_vz-minus_omega_max/L_3)-(minus_omega_vz/L_3)*2)],[0,1,0],'--r');
plot([(((omega_vz-omega_max/L_3)-(omega_max/L_3)*2)+(omega_max/L_3)*2),(((omega_vz-omega_max/L_3)-(omega_max/L_3)*2)+(omega_max/L_3)*2/2),((omega_vz-omega_max/L_3)-(omega_max/L_3)*2)],[0,1,0],'--r');
plot([((omega_vz-omega_max/L_3)-(omega_max/L_3)*2),(((omega_vz-omega_max/L_3)-(omega_vz/L_3)*2))+(omega_max/L_3), ((omega_vz-omega_max/L_3)-(omega_vz/L_3)*2)],[0,1,0],'--r');
plot([omega_vz_2-omega_max/L_3,omega_vz_2-omega_max/L_3+minus_omega_max/3,(omega_vz_2-omega_max/L_3)-(omega_max/L_3)*2],[0,1,0],'--r');
plot([(omega_vz_2-omega_max/L_3)-(omega_max/L_3)*2,(omega_vz_2-omega_max/L_3)-(omega_max/L_3)*3,omega_vz+omega_max/L_3],[0,1,0],'--r');

%%Označenie kópie pre interpolator L = 3 + text
plot([minus_omega_vz_2-minus_omega_max/L_3 minus_omega_vz+minus_omega_max/L_3],[0 0],'-k','LineWidth',3);
scatter(minus_omega_vz_2-minus_omega_max/L_3,0,'<','k')
scatter(minus_omega_vz+minus_omega_max/L_3,0,'>','k')
plot([minus_omega_vz_2-minus_omega_max/L_3, minus_omega_vz_2-minus_omega_max/L_3],[0,1],'--k')
plot([minus_omega_vz+minus_omega_max/L_3, minus_omega_vz+minus_omega_max/L_3],[0,1],'--k')
text((minus_omega_vz_2+minus_omega_vz_3/2)/L_2,-0.15,'Dvojica kópii','Color','black', 'Fontsize', 12);
hold on

%%množina hodnôt x osi, označenie
xticks([ minus_omega_vz_2 minus_omega_vz minus_omega_max 0 omega_max omega_vz omega_vz_2])
xticklabels({'-2*Ovz','-Ovz','-Omax','0','Omax','Ovz','2*Ovz'})
%%množina hodnôt y osi, označenie
yticks([ 0 1])
yticklabels({'0','1'})
title('Interpolácia pre faktor L = 3 --> stlačenie pôvodného spektra na tretinu'); %%Nadpis grafu
xlabel('Uhlová frekvencia (1/s)'); %Popis osi x
ylabel('Amplitúda'); %Popis osi y
linkaxes([ax1,ax2,ax3],'xy'); %%synchronizuj osi x pre kazdy graf
Vyhľadať všetky príspevky tohoto používateľa
Citovať príspevok v odpovedi
Odpovedať 


Skok na fórum:




Kontakty | matlab.sk | Nahor | Na obsah | Odľahčený (archivačný) mód | RSS