Escolar Documentos
Profissional Documentos
Cultura Documentos
INTRODUO
MATLAB um software para anlise matemtica voltado para processamento
numrico (apesar de ter um mdulo de processamento simblico baseado no programa
MAPLE). O ponto forte do MATLAB so as bibliotecas matemticas de lgebra
matricial, os recursos grficos e a abertura para desenvolvimento de mdulos
(toolboxes) por terceiros. A comunidade acadmica de controle elegeu o MATLAB sua
plataforma principal e, por isso, a gama de mdulos nesta rea muito grande. O
MATLAB tem um programa companheiro que tem uma interface grfica onde
circuitos de simulao e controle podem ser implementados de maneira extremamente
amigvel, o SIMULINK.
Os mdulos do MATLAB comercializados pela MATHWORKS (muitos outros podem
ser obtidos gratuitamente na web ou ainda adquiridos diretamente de seus produtores
so atualmente:
Chemometrics
Communications
Control System
Financial Toolbox
Frequency Domain System Identification
Fuzzy Logic
Higher-Order Spectral Analysis
Image Processing
LMI Control
Mapping
Model Predictive Control
-Analysis and Synthesis
NAG
Neural Network
Optimization
Partial Differential Equation
QFT Control Design
Robust Control
Signal Processing
Spline
Statistics
Symbolic/Extended Symbolic Math
System Identification
Wavelet
TUTORIAL BSICO
MATLAB trabalha bsicamente com matrizes retangulares cujos elementos podem
eventualmente ser complexos. Um escalar interpretado como uma matriz de dimenso
1x1, um vetor linha de N elementos como uma matriz de dimenso Nx1 e um vetor
coluna como uma matriz de dimenso 1xN.
Ambiente MATLAB (workspace)
Ao abrir o MATLAB, voc estar no ambiente de trabalho tambm chamado de
workspace do MATLAB como mostra na seguinte figura:
Operaes aritmticas
Queremos somar 10 ao dobro de a, instanciado anteriormente, logo dividir por 10.
(10+2*a)/10
ans =
1.6000
Nmeros complexos
Sejam os nmeros complexos: a = 1 + i*2 e b = 1 - i*2
a=1+i*2
a =
1.0000 + 2.0000i
b=1-i*2
b =
1.0000 - 2.0000i
real(a)
ans =
1
imag(a)
ans =
2
Salvando dados
Queremos salvar as variveia a e b com o nome de complexo no disco A
save a:complexo a b
!dir a:
Carregando dados
Queremos carregar o arquivo complexo do disco A
load a:complexo
Verificamos o contedo
Who
Your variables are:
a
b
Produto e diviso:
x(1)*x(3)/x(2)
ans =
15
14
Produto e diviso:
x.*y
ans =
-6
y./x
ans =
-0.1667
0.2000
0.2857
Operaes mistas:
y-2
ans =
-3
-2
-1
x+y-2
ans =
3
0
4
3*x
ans =
18
6
15
3*x.*y
ans =
-18
0
15
(3*x.*y)./x+(y-2)
ans =
-6
-2
2
21
42
v=(3*x.*y)./x+(y-2)
v =
-6
-2
2
-2
Gerao de vetores
Gerar o vetor t de 0 a 10 a intervalos de 2 unidades
t=0:2:10
t =
0
2
10
t =
0
10
ou
x=0:5
x =
0
10
8
6
4
2
0
10
5
4
3
2
1
0
FIGURA 1
5
4.5
4
3.5
3
x 2.5
2
1.5
1
0.5
0
6
t
10
11
for n=1:10
x(n)=n.^2;
end
comandos
elseif expresso
comandos
elseif expresso
comandos
.
.
else
comandos
end
12
13
exemplo:
n=1;
if n < 1
x=-1;
elseif n == 1
x=0;
else
x=1;
end
switch expresso
case {expresso1}
comandos
case {expresso2}
comandos
.
.
otherwise
comandos
end
exemplo:
n=1;
switch n
case {1}, x=2;
case {-1},x=-2;
otherwise, x=0;
end
Exemplo:
%exemploIF.m
%******************************************************************
% Neste exemplo e pretende-se encontrar os instantes
% o vetor y muda de sinal.
% O vetor y e dado por:
%
y = sin(x).*exp(-x)
%
onde x esta no intervalo:
%
0 < x <= 8 cujo passo e de 0.1
%******************************************************************
x=.1:.1:8;
y=sin(x).*exp(-x);
ind=1:length(x);
plot(ind,y)
n=length(y);
i=2;%indice para o controle do vetor y
14
x= 1
2
3
(x+y)= 5
7
9
x= 4
5
6
x+ y= 5
7
9
x y = -3 3 -3
x+2=345
x.*y = 4 10 18
x.*y = Error
x*2 = 2 4 6
x.*2 = 2 4 6
x.\y = 4 2.5 2
y./x = 4 2.5 2
2./x = 2 2 2/3
x^2 = Error
x.^2 = 1 4 9
2^x = Error
2.^x = 2 4 8
x^y = Error
x.^y = 1 32 729
(x+i*y)= 1-4i
2-5i
3-6i
(x+i*y).= 1+4i
2+5i
3+6i
15
Comando find(x)
find(x) retorna os ndices cujos valores do vetor x so no nulos.
Se x = [10 2 3 0 7 9 0]
find(x) retornar: 1 2 3 5 6
Se houver alguma alguma condio com relao aos valores do vetor x, ento este
comando retornar ndices para os quais a condio verdadeira. Assim por exemplo se
quer obter os indices para os quais os valores do vetor x so nulos. De maneira que, o
comando adequado seria:
find(x == 0), o qual retornar 4 7
Ainda, podemos situar a condio mais elaborado. Assim, por exemplo se quer obter os
indices correspondentes a valores do vetor x entre 3 e 3.
find(-3<=x & x<=3) o qual retornar 3 4 7.
Comandos max(x), min(x)
...
Gerar uma senoide de 0 a 1 seg., de frequncia 5 Hz e amplitue pico-pico de 4
unidades. A senoide ser digitalizada a uma frequencia de amostragem de 100 Hz.
f0=5;
fs=100;
t=0:1/fs:1;
x=2*sin(2*pi*f0*t);
plot(t,x)
xlabel('tempo')
ylabel('x')
grid
16
2
1.5
1
0.5
x
0
-0.5
-1
-1.5
-2
0.2
0.4
0.6
0.8
tempo
17
ma vez gravado este arquivo num subdiretrio conhecido, podemos executar este
programa a partir do ambiente MATLAB. Porm importante estar no mesmo
subdiretrio onde est gravado o labps_1.m. Consideremos que o labps_1.m est no
subdiretorio \psinais\lab\ , ento primeiro devemos mudar para aquele subdiretrio:
cd \psinais\lab
Criando funes m
A partir do workspace ou a partir de um programa principal de extenso m podem
ser chamados outros programas (subrotinas) que esto em forma de funes. As
funes operam localmente e esto definidas no seguinte formato:
function [s1,s2,...,sn] = nome(e1,e2,...em)
18
onde:
e1,e2,...em: variveis de entrada
s1,s2,...sn: varveis de sada
nome: nome do arquivo m com que ser gravado
Utilizando o exemplo anterior, se quer criar uma funo chamado de senoide que
tm como:
variveis de entrada: instante inicial, instante final, amplitude e frequncia de
amostragem.
variveis de sada: vetores de tempo e senoide propriamente dito.
tambm sero adicionados comentrios necessrios na utilizao da funo.
Para saber a utilizao da funo senoide, utiliza-se o comando help; que mostrar
no workspace, todas as primeiras linhas da funo definidas como comentrios (as
linhas antecedidas pelo smbolo %)
help senoide
function[t,x]=senoide(ti,tf,f0,A0,fs)
Esta funcao gera uma senoide de ti a tf,
de frequencia f0 e amplitude A0
a uma frequencia de amostragem fs.
Como resposta tem-se os vetores tempo (t) e
a senoide (x) propriamente dita.
Obs. fs deve ser pelo menos duas vezes f0,
convem pelo menos fs = 10*f0.
19
Uma vez gravado este arquivo com o nome de temps.m execute o help temps para
saber sobre o objetivo da funo.
20
Por exemplo, se quer executar a funo senoide a apartir do workspace, gerando uma
senoide de 0 a 1 seg., de frequncia 5 Hz e amplitue pico-pico de 4 unidades. A senoide
ser digitalizada a uma frequencia de amostragem de 100 Hz.
A estrutura desta funo ,
function[t,x]=senoide(ti,tf,f0,A0,fs)
[t,x]=senoide(0,1,5,2,100);
plot(t,x)
xlabel('tempo [seg]')
ylabel('x(t)')
title('senoide de 5 Hz')
grid
senoide de 5 Hz
2
1.5
1
0.5
x(t)
0
-0.5
-1
-1.5
-2
0
0.2
0.4
0.6
tempo [seg]
0.8
.
Executando uma funo a partir de um programa .m
As funes podem ser requisistadas a partir de um outro programa.
Para exemplificar, cria-se um programa de nome labps_2.m que realiza a mesma
tarefa feita a partir workspace no exemplo anterior.
21
%labps_2.m
% Programa principal para
% gerar uma senoide de 0 a 1 seg., de frequncia 5 Hz
% e amplitue pico-pico de 4 unidades, amostrando o sinal a
% uma frequencia de 100 Hz.
% A partir deste programam chamado a funcao senoide(.)
% que gera a senoide.
% A funcao senoide tem a seguinte estrutura:
%
function[t,x]=senoide(ti,tf,f0,A0,fs)
ti=0; %tempo inicial
tf=1; %tempo final
f0=5; %frequencia do sinal
A0=2; %amplitude do sinal
fs=100; %frequencia de amostragem
[t,x]=senoide(ti,tf,f0,A0,fs); %gerando a senoide
plot(t,x)
xlabel('tempo')
ylabel('x')
grid
0
-0.5
-1
-1.5
-2
0.2
0.4
0.6
0.8
tempo
22
ti
x
Escolha um nome para o arquivo de sada que conter os dados, por exemplo,
dados e a seguir as variveis que sero gravados.
save dados t x
ti
x
Personalizao de eixos
O MATLAB permite controle total sobre a aparncia e proporo dos eixos horizontal
e vertical de grficos.
Comandos
Descrio
axis(auto)
axis(axis)
axis(square)
axis(normal)
axis(off )
axis(on)
23
Exemplo
x=1:10;
y=2*x;
plot(x,y);
grid;
xlabel(x);
ylabel(y);
title(teste);
grid;
teste
20
18
16
14
12
y
10
8
6
4
2
10
axis(equal);
teste
20
18
16
14
y
12
10
8
6
4
2
-5
10
x
15
24
axis([2 8 2 18]);
teste
18
16
14
12
10
8
6
4
2
5
x
Manipulao de matrizes
O MATLAB uma poderosa ferramenta na manipulao matricial. Vejamos
alguns desses exemplos:
A=[1 2 3;4 5 6;7 8 9]
A =
1
2
3
4
5
6
7
8
9
A(3,2)
ans =
8
3
6
9
25
-2
2
-2
7
-8
9
-2.6250
-0.7500
1.3750
-0.6250
-0.2500
0.3750
Matrizes Especiais
Matriz de zeros.
A=zeros(4)
A =
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
Matriz de uns.
A=ones(3)
A =
1
1
1
1
1
1
1
1
1
A=ones(2,3)
A =
1
1
1
1
1
1
Matriz aleatria.
A=rand(3)
A =
0.2190
0.0470
0.6789
A=rand(3,1)
0.6793
0.9347
0.3835
0.5194
0.8310
0.0346
26
A =
0.0535
0.5297
0.6711
Matriz unitria.
A=eye(4)
A =
1
0
0
0
0
1
0
0
0
0
1
0
0
0
0
1
A=eye(4,2)
A =
1
0
0
1
0
0
0
0
0.8
0.6
y
0.4
0.2
0
-2
-1
0
x
27
stairs(x,y)
xlabel('x')
ylabel('y')
0.8
0.6
0.4
0.2
0
-2
stem(x,y)
xlabel('x')
ylabel('y')
-1
0
x
-1
0
x
0.8
0.6
0.4
0.2
0
-2
Variveis aleatrias
A seguir trataremos varveis aleatrias.
Seja um processo aleatrio:
x=randn(50,1);
stem(x,:)
28
3
2
1
0
-1
-2
-3
10
20
30
40
50
9
8
7
6
5
4
3
2
1
0
-3
A mdia do processo ,
mean(x)
ans =
-0.0058
A varincia do processo ,
cov(x)
ans =
1.3812
-2
-1
29
Ajuste de curvas
No MATLAB existe uma funo de ajuste de curvas chamada polyfit. So necessrios
os vetores x, y e a ordem ou grau do polinmio de aproximao.
x=0:.1:1;
y=[-.447 1.978 3.28 6.16 7.08 7.34 7.66 9.56 9.48 9.30 11.2];
stem(x,y,':')
xlabel('x')
ylabel('y')
12
10
8
6
4
2
0
-2
0
0.2
0.4
0.6
0.8
-0.0317
30
12
10
8
6
4
2
0
-2
0
0.2
0.4
0.6
0.8
-0.4470
1.9780
3.2800
6.1600
7.0800
7.3400
7.6600
9.5600
9.4800
9.3000
11.2000
Observemos que para o valor de x = 0.35 no est definido. Ento podemos estimar o
valor de y correspondente.
ye=interp1(x,y,.35)
ye =
6.6200
Gerao de sinais
Impulso
A funo impulso est definida como:
1, t = t 0
(t t 0 ) =
0, t t 0
31
Para criar uma funo impulso necessrio definir o tempo T total de e o intervalo de
discretizao dt.
1, t = 1
, sendo o
Por exemplo consideremos a seguinte funo impulso, (t 1) =
0
,
t
dt=.2;
t=0:dt:5-dt;
N=length(t);
x=zeros(1,N);
[t0,n0]=find(t==1);
x(n0)=1;
stem(t,x,':')
whitebg
stem(t,x,':')
xlabel('tempo[seg]')
title('impulso')
impulso
1
0.8
0.6
0.4
0.2
2
3
tempo[seg]
Degrau
A funo degrau est definida como:
1, t t 0
u (t t 0 ) =
0, t t 0
Para criar uma funo degrau necessrio definir o tempo total de e o intervalo de
discretizao dt.
1, t 2
Por exemplo consideremos a seguinte funo degrau, u (t 2) =
, sendo o
0, t 2
tempo 0 seg t < 5 seg. e o intervalo de discretizao dt = 0.2 seg.
32
passo
dt=.2;
t=0:dt:5-dt;
N=length(t);
x=zeros(1,N);
[t0,n0]=find(t==2)
x(n0:N)=ones(size(n0:N));
stem(t,x,':')
xlabel('tempo[seg]')
title('passo')
0.8
0.6
0.4
0.2
0
0
2
3
tempo[seg]
Peridico
A funo peridica est definida como:
x(t ) = A0 sin (2f 0 t )
Para criar uma funo peridica so necessrios definir: a amplitude A0, a frequncia do
sinal e o intervalo de discretizao dt
Por exemplo consideremos uma seguinte funo peridica , x(t ) = sin(100t ) , sendo o
tempo 0 seg t 0.5 seg. e a frequncia de amostragem de fs = 1000 kHz. Fazendo
uma analogia com a funo padro, A0 =1; 2f0 = 100, ento, f0 = 50. Por outro lado
fs = 1/dt = 1000
fs=1000;
dt=1/fs;
f0=50;
t=0:dt:.5;
x=sin(2*pi*f0*t);
stem(t(1:50),x(1:50),':')
sin(2*pi*50*t)
1
0.5
-0.5
-1
0
0.01
0.02
0.03
tempo [s]
0.04
0.05
33
Anlise espectral
O MATLAB oferece a ferramenta para a anlise espectral atravs transformada discreta
de Fourier utilizando algoritmos rpidos conhecidos como FAST FOURIER
TRANSFORM (FFT). Quando ralizemos a anlise espectral usaremos o termo de FFT.
Como exemplo calculemos o espectro do sinal peridico x(t ) = sin(100t )
fs=1000;
N=length(x);
df=fs/N;
f=0:df:fs-df;
X=fft(x);
Y=(1/N)*abs(X);
subplot(2,1,1)
stem(t,Y,':')
subplot(2,1,2)
stem(f(1:N/4),Y(1:N/4),':')
xlabel('freq. [Hz]')
0.5
200
400
600
800
1000
50
100
150
freq. [Hz]
200
250
0.5
x=sin(2*pi*50*t)+sin(2*pi*150*t);
y=x+2*randn(size(x));
subplot(2,1,1)
plot(t(1:100),y(1:100))
xlabel('tempo [s]');
X=fft(x);
Y=(1/N)*abs(X);
subplot(2,1,2)
plot(f(1:N/4),Y(1:N/4))
xlabel('freq. [Hz]')
10
-10
0.02
0.04
0.06
tempo [s]
0.08
0.1
50
100
150
freq. [Hz]
200
250
0.5
34
[V]
0.1
0
-0.1
-0.2
2
[V^2*s/Hz]
%trn.m
% sinal transitrio e sua
%densidade
% espectral de energia
[y,Fs]=wavread('ta.wav');
N=4096;
t=(0:4095)/Fs;
T=N/Fs;
f=(0:(N/2-1))*Fs/N;
Y=y(351:N+350);
S=fft(Y)/N;
subplot(211),plot(t,Y)
xlabel('tempo [s]')
ylabel('[V]')
subplot(212),plot(f,2*abs(S(
1:N/2)*T).^2)
xlabel('freq. [Hz]')
ylabel('[V^2*s/Hz]')
0
x 10
0.05
0.1
0.15
-6
0.2
0.25
tempo [s]
0.3
0.35
0.4
1.5
1
0.5
0
1000
2000
3000
freq. [Hz]
4000
5000
6000
[V]
0.1
0
-0.1
-0.2
0
0.05
0.1
tempo [s]
-6
3
[V^2/Hz]
%alt.m
% sinal aleatrio e sua DEP
[y,Fs]=wavread('sh.wav');
N=2048;
t=(0:N-1)/Fs;
T=N/Fs;
f=(0:(N/2-1))*Fs/N;
S=zeros(N,1);
H=hanning(N);
ni=1;count=0;
while (ni+N-1) <= length(y),
Y=y(ni:ni+N-1);
Y=Y.*H;
S=S+2*abs(fft(Y)/N).^2*T;
count=count+1;
ni=ni+N/2;
end
subplot(211),plot(t,y(1:N))
xlabel('tempo [s]')
ylabel('[V]')
subplot(212),plot(f,S(1:N/2))
xlabel('freqncia [Hz]')
ylabel('[V^2/Hz]')
x 10
0.15
0.2
2
1
0
0
1000
2000
3000
4000
freqncia [Hz]
5000
6000
35
Grficos de linha
Os grficos bidimensionais podem ser estendidos para o espao tridimensional. Por
exemplo podemos gerar uma helice de 5 espirais a passos de pi/50. Utilizaremos
cordenadas paramtricas (sin(t), cos(t),t) para representar um ponto.
t=0:pi/50:5*(2*pi);
plot3(sin(t),cos(t),t)
title('helice')
xlabel('sin(t)')
ylabel('cos(t)')
zlabel('t')
helice
40
30
20
10
0
1
1
0
cos(t)
-1
-1
sin(t)
Superfcies
Criaremos uma superfcie onde os eixos x e y esto divididos em grades retangulares e a
altura dada por z =
sin( x 2 + y 2 )
x2 + y2
variaro de 10 at 10 a intervalos de 0.5. Para evitar a diviso por zero ser necessrio
acrescentar um valor pequeno ao numerador e ao denominador.
36
x=-10:.5:10;
y=-10:.5:10;
[X,Y]=meshgrid(x,y);
Z=sin(sqrt(X.^2+Y.^2))./(sqrt(X.^2+Y.^2)+eps);
mesh(X,Y,Z)
xlabel('x')
ylabel('Y')
xlabel('X')
zlabel('Z')
0.5
0
-0.5
10
10
0
Y
0
-10
-10
Podem ser obtidos grficos de contorno que mostram as linhas de elevao. Neste
exemplo queremos dividir em 100 partes ou 100 fatias.
contour(X,Y,Z,100)
37
10
-5
-10
-10
-5
0
X
10
38