BE 00-0-0 MATLAB (Matrix Laboratory) matlab.ico för SIGNALER & SYSTEM
. Grunder >> /3 >> MATLAB-prompt ans = 0.6667 >> /3; Ingen utskrift a=[ 9 ]; Vektor, längd 5 >> a Alltså radvektor a = 9 >> at=a'; >> at at = 9 >> a*at ans = 94 >>whos Name Size Bytes Class a x5 40 double array ans 5x 40 double array at 5x 40 double array Transponerad vektor, dvs kolonnvektor. Transponering görs med operatorn ' Kvadratsumman Visar aktuella variabler i arbets-arean ( workspace ) ( default work ) Grand total is 5 elements using 0 bytes >> pwd ans = C:\matlabR\work >> clear all >> whos print working directory Här ligger MATLAB på c:, normalt startar Du på nätet, enhet H: Byt directory a la DOS med CD Raderar alla variabler
. Vektorer är viktigt >> a.*a ans = 4 4 8 4 >> a(3) ans = 4 >> [maxx,ix]=max(a.*a) maxx =8 (MAX av vektorn ) ix =4 ( Index för MAX-värdet ) >> help max Elementvis multiplikation. Obs Obs punkten (. ) ( Om a var 9 ) >> a.^ (a upphöjt till (elementvis)) ger samma resultat Obs att i MATLAB börjar index med, inte 0 som i C/C++ max är en färdig funktion som ingår i MATLAB OnLine-manual. Skriv help MAX Largest component. For vectors, MAX(X) is the largest element in X. For... >> t=[0:300]; Generera t.ex en tidvektor med sampelintervallet >> s=sin(0.*t); sin(0), sin(0.),, sin(60) >> s(:3) De 3 första elementen i s ans = 0 0.987 0.3894 >> s(0) Typiskt fel??? Index into matrix is negative or zero. >> s=exp(-0.0*t); Addera vektorer >> s=s+s; >> N=length(s) N =30 >> size(s) ans = 30 Längd och dimension, Dimensionen: rad, 30 kolumner 3
>> W=sum(s.*s) W =0.49 Signalens energi bestäms enligt W = N t= 0 s ( t) >> W=s'*s Går också bra W =0.49 >> plot(t,s);xlabel('t'); Se figur övre nedan >> ylabel('s'); >> title('s(t),linjär skala'); >> loglog(t,s.^) Se undre figuren nedan Vad innebär loglog? s(t),linjär skala.5 s 0.5 0-0.5-0 50 00 50 00 50 300 t 0 0 0 0-0 - 0-3 0-4 0-5 0 0 0 0 0 3 4
>>subplot(,,); >>stem(t(:50),s(:50)); >>subplot(,,); >>stem(t(:5:end),s(:5:end)); :a av plottar Stem ritar staplar ( lollipops ) De 50 första samplen :a av plottar Var 5:te sampel från start till slut.5 0.5 0-0.5 0 5 0 5 0 5 30 35 40 45 50.5 0.5 0-0.5-0 50 00 50 00 50 300 5
>> a=[ 3];b=[4 5 6]; >> conc=[a b] conc = 3 4 5 6 >> snoom=conc(end:-:) snoom =6 5 4 3 >> zeropadd= [snoom zeros(,4)] zeropadd = 6 5 4 3 0 0 0 0 >> zeropadd=[snoom'; zeros(4,)] zeropadd= 6 5 4 3 0 0 0 0 >> f=[,-3,]; >> p=roots(f) p = >> conv([, -p()],[, -p()]) ans = -3 >> conv([ ],[0 ]) ans =0 >> stem(0:length(ans)-,ans) Skarva ihop vektorer Utan kommentar Addera en vektor med 4 nollor till snoom Nog vanligare med kolumnvektorer. Observera ; -tecknet Beskriver ett polynom: f(z)=z -3z+ och dess rötter Funktionen conv multiplicerar ihop polynom.5 0.5 0 0 3 4 6
>> x=sin(0.*t); >> x=x';%kolumnvektor >> brus=randn(length(x),); >> x_plus_brus=x+brus; >> save f x_plus_brus; >> clear ; >> load f >> stem(x_plus_brus) >> w=0:.:;%frekvensvektor >> x=sin(w+pi/);% x=f(w) >> A=[w' x'];%a *-matris >> A(:,);:a kolumn i A >> A(:,);:a kolumn i A >> plot(a(:,),a(:,)); Generera en brusig sinus Spara signalen i workspace på fil med namn f.mat Extension mat fås automatiskt clear raderar variabler från minnet load hämtar fil från workspace Ibland kan det vara smidigt att tänka i fler än dimension (D) Dessa kommandon skapar en D-matris och plottar f(x). Vad tror Du att A(,:) blir? Jo, 0 (:a raden i A ) >> whos Name Size Bytes Class Dessa variabler finns i minnet nu A x 76 double array ans x 6 double array w x 88 double array x x 88 double array Grand total is 46 elements using 368 bytes 7
3. Matriser är viktigt >> A=[ 3;4 5 6;7 8 9];%3*3 >> B=[ ]';%3* >> C=A*B C = 8 0 3 >> D=B*A??? Error using ==> * Inner matrix dimensions must agree. >> A=[ ;5 4]; >> B=inv(A) B = -0.6667 0.3333 0.8333-0.667 >> help inv INV Matrix inverse. INV(X) is the inverse of the square matrix X. >> A=[ 3;5 -] ; >> y=[5 4]'; >> x=inv(a)*y x = Obs ordning vid multiplikation Lös ekvationssystemet x + 3x = 5 5x - x = 4 Matrisnotation: y=ax x=a - y 8
4. Liksom komplexa tal a =.0000 +.0000i abs(a).36 real(a) phase(a) ans =.07 %Obs i radianer! >> fas_rad=phase(a)*80/pi fas_rad = 63.4349 >> j=sqrt(-);%obs >> x=;cos(x) ans = -0.46 >> arg=j*x; >> y=(exp(arg)+exp(-arg))/ y = -0.46 >> t=(0:0)*j; >> y=/t;??? Error using ==> / Matrix dimensions must agree. >> y=./t; Warning: Divide by zero. >>plot(abs(y)); >>hold; >>plot(abs(y),'o'); Im(a) Konvertera vinkeln till grader Här kallas i för j Beräkna cos() med Eulers formel Obs. t är ju en vektor Elementvis invertering kräver då en. Plotta y. Obs funktionen hold Re(a) 9
5. m-filer Man upptäcker snart att det kan bli omständligt att när man behöver ett antal kommandon enbart jobba mot MATLAB-prompten. Då skriver man lämpligen en m-fil. Den skapas i en texteditor och sparas i workspace. Den får filtypen m, t.ex kompass.m: %m-fil som plottar %en komplex vektor %i ett polärt diagram %Fas-steg på 30 grader (pi/6) %Filnamn: kompass.m % t=0:pi/6:*pi; j=sqrt(-); x=exp(-0.*t- j*t); re=real(x); im=imag(x); compass(re,im); Exekveras så här: >> kompass Tänk igenom programmets funktion! 0
6.Funktioner Ett kraftfullare verktyg är att skapa egna funktioner som Kan anropas med ett antal parametrar och returnera ett antal värden. Ex: %Funktion som beräknar min- %och max-värden i en vektor. %IN-data: Vektor v %UT-data: minn och maxx %Filnamn: minmax function [minn,maxx]=minmax(v) minn=min(v); maxx=max(v); Tillämpning: >> v=randn(00,);%slumptalsvektor >> [mi,ma]=minmax(v) mi = -.707 ma =.83
Ex: %Funktion som plottar %beloppskurvan för en %kompex-vektor %IN-data: Vektor v %Filnamn: complott function complott(v) plot(abs(v)); Tillämpning: >> j=sqrt(-);t=0:0.:;v=sin(j*t); >> complott(v); Förklara varför sinusfunktionen får ett absolutvärde >! (i fig. ovan)
7. Vanliga testsignaler >> dirac=[,zeros(,9)]'; Ger en dirac-puls följd av 9 st 0:or I matten: δ [n] 03456789 >>step=[ones(0,)]'; Stegfunktion I matten: u [ n] u[ n 0] 03456789 >> pulse=[zeros(,5), ones(,4) zeros(,6)]'; Tidsfördröjd puls I matten: u [ n 5] u[ n 9] 03456789034 >> ramp=0:0; Ramp I matten: n ( u[ n] u[ n ]) 0 0 3
>> n=0:40;x=sin(0.**pi*n); Justera så index på x-axeln börjar med 0: >> stem(0:length(n)-, x); Sinus t = 0:.000:.0.50; y = SQUARE(*pi*30*t);, plot(t,y) Fyrkantvåg 30 Hz 4
function my_sawtooth(m,n,topp) %M=nr of periods %N=nr of samples/period y=[]; y=topp*(0:n)./(n);%up_ramp for i=:m y=[y y];%concat up_ramp end %compute x_axis %note:topp x-coord is same %as next start x-coord: x=[]; for i=:m%loop periods for j=:n%loop samples t=(i-)*(n-); xt=t:t+(n-); end x=[x xt];%concat x-coord end %"return to zero": y(end+)=0; x(end+)=x(end); Sågtandsvåg >> my_sawtooth(4,5,.5); plot(x,y,x,y,'o'); 5
8. Faltning ( convolution ) Huru göra faltning för tidsdiskreta signaler? Ex med f=0,,,3,, och g=,,,0,: %conv f[n]*g[n] %discrete time convolution % f=[0 3 ]; g=[ 0 ]; k=0::length(f)+length(g)-; c=conv(f,g); stem(k,c,'filled'); 6
9. Några filterexempel Med kod: %Filtrering av brusig %sinus med frekvens f f=0;%hz fs=00;%samplingsfrekvens dt=/fs;%sampelintervall N=0;%antal sampel t=0:dt:(n-)*dt;%tiden x=sin(*pi*f.*t);%signal n=0.*randn(,n);%brus s=x+n;%brusig signal subplot(3,,); plot(t,s); legend('brusig signal'); % %****filter**** %Lågpass,gräns Hz %normerad gränsfrekvens: % w=(/(0.5*fs) % gradtal gr=8 % w=/(0.5*fs); grad=8; [B,A]=butter(grad,w); F=0:.5:0;%frekvensvektor i Hz [H]=freqz(B,A,F,fs); subplot(3,,); %plotta frekvenskurva ( i db ): plot(f,0*log0(abs(h))); legend('filtrets dämpkurva'); y=filter(b,a,s); subplot(3,,3); plot(t,y,'r'); legend('filtrerad signal'); 7
MED SIMULINK: 8