MATLAB
(Matrix Laboratory)
för
SIGNALER
&
SYSTEM matlab.ico
BE 2001-10-01
1. Grunder
>> 2/3 ans = 0.6667
>>
MATLAB-prompt>> 2/3; Ingen utskrift
a=[1 2 2 9 2]; Vektor, längd 5
>> a a =
1 2 2 9 2
Alltså radvektor
>> at=a';
>> at at = 1 2 2 9 2
Transponerad vektor, dvs kolonnvektor.
Transponering görs med operatorn ” ' ”
>> a*at ans = 94
Kvadratsumman
>>whos
Name Size Bytes Class a 1x5 40 double array ans 5x1 40 double array at 5x1 40 double array Grand total is 15 elements using 120 bytes
Visar aktuella variabler i arbets-arean (”workspace”) ( default ”work” )
>> pwd ans =
C:\matlabR12\work
”print working directory”
Här ligger MATLAB på c:, normalt startar Du på nätet, enhet H:
Byt directory a la DOS med CD …
>> clear all
>> whos
Raderar alla variabler
2. Vektorer är viktigt
>> a .*a ans =
1 4 4 81 4
Elementvis multiplikation.
Obs Obs punkten ( . )
( Om a var 1 2 2 9 2 )
>> a.^2 (a ”upphöjt till 2” (elementvis)) ger samma resultat
>> a(3) ans = 4
Obs att i MATLAB börjar index med 1, inte 0 som i C/C++
>> [maxx,ix]=max(a.*a) maxx =81 (MAX av vektorn )
ix =4 ( Index för MAX-värdet )
max är en färdig funktion som ingår i MATLAB
>> help max
MAX Largest component.
For vectors, MAX(X) is the largest element in X. For . . .
OnLine-manual. Skriv help
>> t=[0:300]; Generera t.ex en tidvektor med sampelintervallet 1
>> s1=sin(0.2*t); sin(0), sin(0.2), …, sin(60)
>> s1(1:3)
ans = 0 0.1987 0.3894
De 3 första elementen i s1
>> s1(0)
??? Index into matrix is negative or zero.
Typiskt fel
>> s2=exp(-0.01*t);
>> s=s1+s2;
Addera vektorer
>> N=length(s) N =301
>> size(s) ans =1 301
Längd och dimension, Dimensionen:
1 rad, 301 kolumner
>> W=sum(s.*s) W =210.1149
Signalens energi bestäms enligt
∑
−=
= 1
0 2( )
N t
t s W
>> W=s'*s W =210.1149
Går också bra
>> plot(t,s);xlabel('t');
>> ylabel('s');
>> title('s(t),linjär skala');
Se figur övre nedan
>> loglog(t,s.^2) Se undre figuren nedan Vad innebär loglog?
0 50 100 150 200 250 300
-1 -0.5 0 0.5 1 1.5 2
t s
s(t),linjär skala
100 101 102 103
10-5 10-4 10-3 10-2 10-1 100 101
>>subplot(2,1,1);
>>stem(t(1:50),s(1:50));
1:a av 2 plottar
Stem ritar staplar ( ”lollipops” ) De 50 första samplen
>>subplot(2,1,2);
>>stem(t(1:5:end),s(1:5:end));
2:a av 2 plottar
Var 5:te sampel från start till slut
0 5 10 15 20 25 30 35 40 45 50
-0.5 0 0.5 1 1.5 2
0 50 100 150 200 250 300
-1 -0.5 0 0.5 1 1.5 2
>> a=[1 2 3];b=[4 5 6];
>> conc=[a b]
conc =1 2 3 4 5 6
Skarva ihop 2 vektorer
>> snoom=conc(end:-1:1) snoom =6 5 4 3 2 1
Utan kommentar
>> zeropadd=
[snoom zeros(1,4)]
zeropadd =
6 5 4 3 2 1 0 0 0 0
Addera en vektor med 4 nollor till snoom
>> zeropadd=[snoom'; … zeros(4,1)]
zeropadd=
6 5 4 3 2 1 0 0 0 0
Nog vanligare med kolumnvektorer.
Observera ” ; ”-tecknet
>> f=[1,-3,2];
>> p=roots(f) p = 2 1
Beskriver ett polynom:
f(z)=z2-3z+2 och dess rötter
>> conv([1, -p(1)],[1, -p(2)]) ans = 1 -3 2
Funktionen conv multiplicerar ihop 2 polynom
>> conv([1 1],[0 1 1 1]) ans =0 1 2 2 1
>> stem(0:length(ans)-1,ans)
0 1 2 3 4
0 0.5 1 1.5 2
>> x=sin(0.1*t);
>> x=x';%kolumnvektor
>> brus=randn(length(x),1);
>> x_plus_brus=x+brus;
>> save f1 x_plus_brus;
>> clear ;
>> load f1
>> stem(x_plus_brus)
Generera en brusig sinus
Spara signalen i workspace på fil med namn f1.mat
Extension ”mat” fås automatiskt
”clear” raderar variabler från minnet
”load” hämtar fil från workspace
>> w=0:.1:1;%Frekvensvektor
>> x=sin(w+pi/2);% x=f(w)
>> A=[w' x'];%A 11*2-matris
>> A(:,1);1:a kolumn i A
>> A(:,2);2:a kolumn i A
>> plot(A(:,1),A(:,2));
Ibland kan det vara smidigt att tänka i fler än 1 dimension (1D)
Dessa kommandon skapar en 2D-matris och plottar f(x).
Vad tror Du att A(1,:) blir?
Jo, ” 0 1 ” (1:a raden i A )
>> whos
Name Size Bytes Class A 11x2 176 double array ans 1x2 16 double array w 1x11 88 double array x 1x11 88 double array Grand total is 46 elements using 368 bytes
Dessa variabler finns i minnet nu
3. Matriser är viktigt
>> A=[1 2 3;4 5 6;7 8 9];%3*3
>> B=[1 2 1]';%3*1
>> C=A*B C =
8 20 32
>> D=B*A
??? Error using ==> *
Inner matrix dimensions must agree.
Obs ordning vid multiplikation
>> A=[1 2;5 4];
>> B=inv(A) B =
-0.6667 0.3333 0.8333 -0.1667
>> help inv
INV Matrix inverse.
INV(X) is the inverse of the square matrix X.
>> A=[2 3;5 -1] ;
>> y=[5 4]';
>> x=inv(A)*y x =
1 1
Lös ekvationssystemet 2x1 + 3x2 = 5
5x1 - x2 = 4 Matrisnotation:
y=Ax x=A-1y
4. Liksom komplexa tal
a = 1.0000 + 2.0000i abs(a)
2.2361 real(a) 1 phase(a) ans =
1.1071 %Obs i radianer!
>> fas_rad=phase(a)*180/pi fas_rad =
63.4349
Konvertera vinkeln till grader
>> j=sqrt(-1);%Obs
>> x=2;cos(x) ans =
-0.4161
>> arg=j*x;
>> y=(exp(arg)+exp(-arg))/2 y =
-0.4161
Här kallas ” i ” för j Beräkna cos(2) med Eulers formel
>> t=(0:10)*j;
>> y=1/t;
??? Error using ==> /
Matrix dimensions must agree.
>> y=1./t;
Warning: Divide by zero.
>>plot(abs(y));
>>hold;
>>plot(abs(y),'o');
Obs. t är ju en vektor Elementvis invertering kräver då en ” . ”
Plotta y.
Obs funktionen hold
Re(a) Im(a)
2
1
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:2*pi;
j=sqrt(-1);
x=exp(-0.2*t- j*t);
re=real(x);
im=imag(x);
compass(re,im);
Exekveras så här:
>> kompass
Tänk igenom programmets funktion!
6.Funktioner
Ett kraftfullare verktyg är att skapa egna funktioner som Kan anropas med ett antal parametrar och returnera ett antal värden.
Ex1:
Tillämpning:
>> v=randn(100,1);%slumptalsvektor
>> [mi,ma]=minmax(v) mi =
-2.1707 ma = 2.1832
%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);
Ex2:
%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(-1);t=0:0.1:1;v=sin(j*t);
>> complott(v);
Förklara varför sinusfunktionen får ett absolutvärde > 1 ! (i fig. ovan)
7. Vanliga testsignaler
>> dirac=[1,zeros(1,9)]';
I matten: δ[n]
Ger en dirac-puls följd av 9 st 0:or
>>step=[ones(10,1)]';
I matten: u[n]− nu[ −10]
Stegfunktion
>> pulse=[zeros(1,5), … ones(1,4) zeros(1,6)]';
I matten: u[n−5]−u[n−9]
Tidsfördröjd puls
>> ramp=0:10;
I matten: n⋅(u[n]−u[n−11])
Ramp
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
0 10
>> n=0:40;x=sin(0.1*2*pi*n);
Justera så index på x-axeln börjar med 0:
>> stem(0:length(n)-1, x);
Sinus
t = 0:.0001:.0.1250;
y = SQUARE(2*pi*30*t);, plot(t,y)
Fyrkantvåg 30 Hz
function
my_sawtooth(M,N,topp)
%M=nr of periods
%N=nr of samples/period y=[];
y1=topp*(0:N1)./(N1);%up_ramp for i=1:M
y=[y1 y];%concat up_ramp end
%compute x_axis
%note:topp x-coord is same
%as next start x-coord:
x=[];
for i=1:M%loop periods for j=1:N%loop samples t=(i-1)*(N-1);
xt=t:t+(N-1);
end
x=[x xt];%concat x-coord end
%"return to zero":
y(end+1)=0;
x(end+1)=x(end);
plot(x,y,x,y,'o');
Sågtandsvåg
>> my_sawtooth(4,15,2.5);
8. Faltning (”convolution”)
Huru göra faltning för tidsdiskreta signaler?
Ex med f=0,1,2,3,2,1 och g=1,1,1,0,1:
%conv f[n]*g[n]
%discrete time convolution
%
f=[0 1 2 3 2 1];
g=[1 1 1 0 1];
k=0:1:length(f)+length(g)-2;
c=conv(f,g);
stem(k,c,'filled');
9. Några filterexempel Med kod:
%Filtrering av brusig
%sinus med frekvens f1 f1=10;%Hz
fs=100;%samplingsfrekvens dt=1/fs;%sampelintervall N=101;%antal sampel t=0:dt:(N-1)*dt;%tiden x=sin(2*pi*f1.*t);%signal n=0.2*randn(1,N);%brus s=x+n;%brusig signal subplot(3,1,1);
plot(t,s);
legend('Brusig signal');
%
%****filter****
%Lågpass,gräns 12 Hz
%normerad gränsfrekvens:
% w1=(12/(0.5*fs)
% gradtal gr=8
%
w1=12/(0.5*fs);
grad=8;
[B,A]=butter(grad,w1);
F=0:.5:20;%frekvensvektor i Hz
[H]=freqz(B,A,F,fs);
subplot(3,1,2);
%plotta frekvenskurva ( i dB ):
plot(F,20*log10(abs(H)));
legend('Filtrets dämpkurva');
y=filter(B,A,s);
subplot(3,1,3);
plot(t,y,'r');
legend('Filtrerad signal');