Escolar Documentos
Profissional Documentos
Cultura Documentos
"TOOLBOX" DE SINAIS
NOTAS DE AULA
PAULO LO M. OSORIO
( DEE/PUC-RIO )
2002
2
AVISO
Estas notas destinam-se aqueles que esto usando o Matlab pela primeira vez. Os
exemplos apresentados utilizam uma pequena parcela das funes disponveis e tem por obje-
tivo familiarizar o usurio com as funes e os comandos mais comuns. H tambm uma
introduo ao uso das principais funes da "toolbox signal", que de grande utilidade no
Matlab para implementar exemplos e exerccios. Uma listagem desses livros pode ser
3
4
1.Introduo
tcnica e cientfica em geral. A sua filosofia de processamento est baseada em matrizes. Como
muito mais rpida do que escrever programas em linguagens de alto nvel, tais como
FORTRAN e C. Alm disto, ele possui facilidades grficas que tornam a interface homem
prompt (>>) indica que o Matlab est esperando pela entrada de comandos.
>>
O Matlab trabalha com duas janelas: uma janela de comandos que usada para a
entrada dos comandos, dados, e para mostrar os resultados na tela, e uma outra janela grfica
onde so gerados os grficos. As duas janelas so apagadas quando do incio de cada sesso de
Matlab. A janela de comando pode ser limpa durante uma sesso de trabalho atravs do
comando clc. Para se limpar a janela grfica usado o comando clg.
entrados, bem como as variveis que foram criadas. Desta forma, os comandos e as variveis
5
ficam residentes no espao de trabalho do Matlab, e podem ser chamados sempre que se
desejar. Para se limpar o espao de trabalho usa-se o comando clear.
ter mltiplos comandos na mesma linha, desde que separados por ponto e vrgula (;). Os
Alm de executar comandos que so entrados pelo teclado, o Matlab tambm capaz de
executar seqncias de comandos que esto armazenadas em arquivos com extenso .m, como
rente. Estes arquivos podem ser vistos por meio do comando type. Se o arquivo especificado
com este comando no tiver uma extenso, ele assumido como sendo do tipo M.
O Matlab, como j foi dito, orientado para trabalhar com matrizes. Uma matriz
notada como A(i,j) ou a(i,j), em que A e a so matrizes diferentes. O ndice i se refere
linhas e colunas. Uma matriz que possui somente uma linha ou somente uma coluna chamada
de vetor. Por outro lado, se uma matriz possuir somente uma linha e uma coluna, ela um
escalar.
H vrias formas de se criar uma matriz no Matlab, sendo a mais simples atravs de
b = [ 1 3 5 7 9];
c = [2;4;6;8;10];
6
D = [1 2 3;4 5 6;7 8 9];
Um comando muito til o whos que mostra o nome de todas as variveis existentes
no espao de trabalho global, bem como os seus tipos e dimenses. Se as variveis acima
whos
Deve-se observar, nos exemplos acima, que todas linhas esto finalizadas por ponto e
vrgula (;). Isto evita que as matrizes sejam impressas na tela. A omisso do (;), faz com que o
b=[1 3 5 7 9]
b =
1 3 5 7 9
matriz 3x3. Observe que os nmeros dentro dos colchetes ou esto separados por vrgulas ou
por espaos. O ponto e vrgula separa as linhas da matriz. Uma forma alternativa de se entrar a
matriz D a seguinte:
7
D = [1 2 3
4 5 6
7 8 9];
O Matlab permite tambm se definir uma matriz a partir de outra j existente. Por
A = [1 .53 1-2*j];
B = [0 -3 A];
Isto equivalente a:
B = [ 0 -3 1 .53 1-2*j];
Pode-se tambm mudar ou adicionar valores num vetor atravs de subscrito referenciado em
B(1) = -1;
Um vetor tambm pode ser estendido pela definio de novos elementos. O vetor B que
B(7) = pi;
8
Exerccio 3.1: Dadas as matrizes abaixo, verifique suas dimenses atravs do Matlab
1. A = [1 0 0 0 1];
3. C = [ 3; 4; -1; 2 -j];
4. D = [1 2 3; 4 5 6; 7 8 9];
7. G = [A ; F];
8. H = [E(2,1) A];
Um vetor tambm pode ser criado usando-se o comando (:). Se (:) for usado para se-
parar dois nmeros inteiros m e n, ele ir gerar todos os nmeros inteiros entre m e n. Por
X = 1:10;
Se o operador (:) for usado para separar trs nmeros a, b, e c , ento o comando gera valores
entre a e c com o incremento dado por b. Nos exemplos abaixo o vetor Y contm os nmeros
p/10.
Y = 10:-1:1;
Z = -pi:pi/10:pi;
O comando (:) tambm pode ser usado para selecionar submatrizes a partir de uma outra
9
D = [1 2 3;4 5 6;7 8 9];
dd = D(2:3,1:2); % dd = [4 5;7 8]
dd quer dizer que quero somente as linhas de 2 ate 3 e
somente as colunas de 1 ate 2.
Exerccio 3.2: Dada a matriz R abaixo, verifique as suas respostas usando o Matlab.
1. A = R(:,2);
2. b = R(3,:);
3. c= R(1:3,2:4);
4. C = R(1:2:5, :);
5. D = [4:9; 1:6];
6. E = R';
No Matlab vlido se ter uma matriz vazia. Por exemplo, uma matriz vazia pode ser
gerada com o seguinte comando:
a = [ ]
Deve-se observar que uma matriz vazia diferente de uma matriz que s contenha zeros.
10
Os valores de uma matriz, vetor, ou escalar tambm podem entrar atravs do comando
input. Isto muito til quando se tem o programa num arquivo tipo M.
4. Operaes Escalares
>> 3*pi^2
ans =
29.6088
>> sqrt(ans)
ans =
5.4414
11
>> x = (ans-3)/2
x =
1.2207
>> pi
ans =
3.1416
>> exp(1)
ans =
2.7183
>> log(ans)
ans =
1
Como o Matlab possui um nmero muito grande de funes, para entend-las o melhor
usar o comando help, que pode ser invocado a partir da janela do Matlab, ou como uma
linha de comando do tipo help < nome do comando>. Por exemplo:
Deve-se chamar a ateno para a maneira como os valores numricos das variveis so
mostrados no Matlab. O seu controle feito atravs do comando format. O default a
formatao chamada de format short, ou seja:
12
>> pi
ans =
3.1416
H vrias formas possveis de formatao, que podem ser vistas usando o comando
help format. Por exemplo o comando format compact suprime a linha extra que
aparece nas outras formataes. Esta formatao a utilizada na maioria dos exemplos
apresentados.
ans =
3.1416
Uma outra formatao o format long, que apresenta o resultado com 15 digitos.
>> pi
ans =
3.14159265358979
Deve-se observar que o Matlab trabalha internamente com preciso dupla em todas as
suas operaes, e que o comando format altera apenas a forma com que os resultados so
apresentados.
13
5. Criao de Matrizes e Vetores
O Matlab possui comandos que permitem a criao de algumas matrizes e vetores especi-
ais:
tamanho n).
Com as funes zeros e ones pode-se criar vetores, como por exemplo:
>> x = zeros(1,5)
x =
0 0 0 0 0
>> y = ones(5,1)
y =
>> size(x)
ans =
14
1 5
m =
n =
>> lx = length(x)
lx =
>> ly = length(y)
ly =
a = 1:5; b = 1:2:9;
a*2
ans =
2 4 6 8 10
15
As operaes matemticas entre vetores no so to simples quanto aquelas entre ve-
tores e escalares. Quando dois vetores forem de mesmo tamanho, as operaes de adio,
subtrao, multiplicao, e diviso so aplicadas elemento a elemento. Por exemplo:
a+b
ans =
2 5 8 11 14
ans-a
ans =
1 3 5 7 9
A multiplicao e diviso elemento por elemento feita de maneira similar, exceto por
uma pequena alterao na notao:
a.*b
ans =
1 6 15 28 45
Os vetores a e b foram multiplicados elemento a elemento usando o operador (.*), que dife-
a./b
ans =
1.0000 0.6667 0.6000 0.5714 0.5556
b.\a
ans =
1.0000 0.6667 0.6000 0.5714 0.5556
a.^2
ans =
1 4 9 16 25
2.^a
16
ans =
2 4 8 16 32
neste caso o escalar 2 elevado a uma potncia dada por cada elemento de a.
a.^b
ans =
aqui cada elemento do vetor a elevado a uma potncia dada por cada elemento do vetor b. A
7. Grficos
17
O grfico resultante mostrado na Figura 1. Observe que o Matlab une os pontos do
grfico por meio de retas.
3.5
2.5
1.5
0.5
-0.5
-1
1 1.5 2 2.5 3 3.5 4 4.5 5 5.5 6
plot(x,y,'+')
3.5
2.5
1.5
0.5
-0.5
-1
1 1.5 2 2.5 3 3.5 4 4.5 5 5.5 6
18
Aos grficos das figuras 7.1 e 7.2 pode-se acrescentar ttulo, nomes dos eixos, e
reticulado. Pode-se tambm controlar as cores das curvas, bem como o tipo de linha utilizado.
possvel se ter mais de uma curva num mesmo grfico. Alm destas, h muitas outras
facilidades grficas oferecidas pelo Matlab. Uma boa opo para se aprender mais sobre os
recursos da funo plot o de entrar com o comando help plot.
O Matlab pode gerar diversos tipos de grficos: curvas em 2D, superfcies em 3D,
grficos de contorno de superfcies em 3D, curvas paramtricas em 2D e em 3D. Os detalhes de
como so gerados esses grficos podem ser encontrados com o auxlio do help.
O comando subplot cria diversos grficos numa mesma janela grfica. A sua sintaxe
subplot(m,n,k), em que mn o nmero de grficos a serem criados, organizado numa
matriz com m linhas e n colunas, e k a ordem em que aparecem os grfico ao longo das
linhas. Vejamos o seguinte exemplo: 4 grficos sero gerados numa mesma janela, e mostrados
na Figura 7.3. outro exemplo:
x=-5:5;
subplot(2,2,1), plot(x,sin(x)),
subplot(2,2,2), plot(x,x),
subplot(2,2,3),plot(x,x.^2),
x = 0:pi/20:2*pi; subplot(2,2,4) , plot(x,exp(x))
n = 0:.3:6;
subplot(2,2,1)
plot(x, sin(x))
subplot(2,2,2)
plot(x, exp(-x))
subplot(2,2,3)
stem(n, sin(2*pi*n/4))
subplot(2,2,4)
stem(n, 0.5.^n)
19
plot(x,y) liga todos os pontos entre si.
j o stem(x,y) faz com q uma reta saia do eixo x, ligando o ponto x1 a um ponto
y1 e nesse local (x1,y1) marcada uma bolinha. assim em diante.
1 1
0.8
0.5
0.6
0
0.4
-0.5
0.2
-1 0
0 2 4 6 8 0 2 4 6 8
1 1
0.8
0.5
0.6
0
0.4
-0.5
0.2
-1 0
0 2 4 6 0 2 4 6
O produto escalar definido como a soma dos produtos dos elementos correspondentes
de dois vetores do mesmo tamanho. No Matlab isto implementado da seguinte forma:
prod_esc = sum(P.*Q);
20
A = [0 1 2;-1 3 5];
C = A*B
C =
7 10 1
16 23 2
D = B*A
Do exemplo acima pode-se ver que o Matlab no executa a operao D=BA, pois ela no
prod_esc = P*Q'
A inversa de uma matriz quadrada A pode ser computada no Matlab atravs da instruo
inv(A). Por exemplo:
inv(A) = A^-1
B =
1 2 3
-1 0 5
4 5 -2
inv_B = inv(B)
inv_B =
21
1.2500 -0.7500 -0.5000
B*inv_B
ans =
No exemplo acima, foi computado tambm o produto B*B-1 , que nada mais do que a matriz
identidade.
O determinante de uma matriz pode ser computado, utilizando-se a instruo det(A),
A =
1 2 3
-1 0 5
4 5 -2
det(A)
ans =
-4
2x1 + x2 - 3x3 = 5
3x1 - 2x2 + 2x3 = 5
5x1 - 3x2 - x3 = 16
22
AX = B
2 1 -3 x1 5
A = 3 -2 2 X = x2 B = 5
5 -3 -1 x 3 16
A determinao de X pode ser feita por diviso de matrizes ou pela utilizao da matriz
inversa, ou seja:
X = B/A
B = [5 5 16]';
X = A\B
X =
-3
-2
pode ser:
X = A-1B a=[2 1 -3; 3 -2 2; 5 -3 -1] , b=[5; 5; 16], x=inv(a)*b
B = [5 5 16]';
X = inv(A)*B
X =
1.0000
23
-3.0000
-2.0000
9. Programao em Matlab
24
for k = 1:3
x(k) = k^2;
end
t = (0: .0001:10;
y=sin(t);
t = 0:.0001:10;
for i=1:length(t)
y(i)=sin(t(i));
end
25
>> x=3 , xp=x/2, df=1 , while df>eps , y=0.5*(xp+x/xp) , df=abs(y-xp) , xp=y; end
x= 3
x = 3; xp = x/2; xp = 1.5000
df = 1; df = 1
--------------------
while df > eps y = 1.7500
df = 0.2500
y = 0.5*(xp + x/xp); --------
df = abs(y-xp); y = 1.7321
df = 0.0179
xp = y; --------
y = 1.7321
end df = 9.2047e-005
y ---------
y = 1.7321
y = df = 2.4459e-009
---------
1.73205080756888 y = 1.7321 ( aqui t arredondado - format short )
df = 0
4 > 3
ans =
1
4 < 3
4 == 3
ans =
4 ~= 3
ans =
26
if expresso 1 if 5>3 if 2>3
x=2 , y=3 x=2 , y=3
comandos
plot(x,y,'+') plot(x,y,'+')
elseif expresso 2 elseif 5==3 elseif 2==3
x=5 , y=6 x=5 , y=6
comandos plot(x,y,'+') plot(x,y,'+')
else else
else
x=8 , y=9 x=8 , y=9
comandos plot(y,x,'+') plot(y,x,'+')
end end
end
Por exemplo, vamos supor que o arquivo seno.m contenha o script mostrado abaixo.
x = linspace(0,2*pi,N);
y = sin(x); % gera o vetor y a partir de x
plot(x,y),title('Grfico do Seno')
xlabel ('ngulo em rad'),ylabel('Amplitude'),grid
Grfico do Seno
1
0.8
0.6
0.4
0.2
Amplitude
-0.2
-0.4
-0.6
-0.8
-1
0 1 2 3 4 5 6 7
ngulo em rad
Como pode ser visto neste exemplo, os comandos que aparecem no script podem se
referir a variveis que j existam no espao de trabalho do Matlab. Quando um script
executado, as suas variveis passam tambm a fazer parte do espao de trabalho.
As funes so bem mais gerais que os scripts, pois permitem ao usurio criar novos
comandos no Matlab. As diversas toolboxes que fazem parte to Matlab so constitudas por
funes. A funo difere do script apenas na primeira linha, que tem a seguinte sintaxe:
Com exceo desta linha, as demais so linhas com comandos do Matlab, de maneira similar
aos scripts. Diferentemente dos scripts, as variveis que aparecem na funo so internas, ou
28
seja, elas no aparecem no espao de trabalho do Matlab. Por exemplo, vamos considerar uma
funo que compute a mdia e a varincia de um conjunto de nmeros. Seja estat o nome dessa
funo. Abaixo esta mostrada a listagem do arquivo estat.m.
nx = length(x);
m = sum(x)/nx;
v = sum((x - m).^2)/(nx-1);
0.4652
var =
note q na janela do Command Window do matlab, s tem
0.0778 >> , mas quando aparece K>> pq se est em debug mode
pois tem alguma bolinha vermelha aparecendo em alguma
linha da funo criada. no caso, tem q abrir a funo, estat.m,
no editor do matlab e clicar na bolinha vermelha pra sumir.
29
10. Uso da "Toolbox Signal"
Esta "toolbox" possui uma coleo muito grande de funes que so largamente
utilizadas em processamento de sinais.
Os sinais para serem tratados pelo computador devem estar na forma discreta, embora
possamos gerar grficos como se eles fossem contnuos, para isto basta que se use um nmero
suficientemente grande de pontos do sinal contnuo. Estes pontos, ou amostras, so obtidos
pelo processo de amostragem. que consiste em dividir o eixo do tempo, por exemplo, em
intervalos com espaamento uniforme Dt, que chamado de intervalo de amostragem. O
inverso do intervalo de amostragem denominado de freqncia de amostragem fs, que indica a
cadncia com que uma dada varivel amostrada, no caso mais comum esta varivel o
tempo.
Para se gerar um vetor t no intervalo [0,1s], com Dt = 0,001s (fs = 1 kHz), usam-se os
seguintes comandos:
Exemplo 10.1: Gerar uma onda quadrada peridica com amplitude unitria, com freqncia
fundamental de 10 Hz, e ciclo de repetio de 50% ( ciclo de repetio a poro de cada ciclo
para a qual o sinal positivo, e 0 < cr < 100%).
A = 1; % amplitude de pico
30
cr = 50; % onda quadrada simtrica em %
onda_quadrada = A*square(2*pi*f0*t,cr);
0.5
Amplitude
-0.5
-1
-1.5
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1
Exerccio 10.1: Gere uma onda triangular simtrica com amplitude 2 de pico, freqncia
fundamental de 5 Hz, e amostrada com fs = 2 kHz. Use a funo sawtooth do Matlab.
Exemplo 10.2: Gerar uma onda quadrada simtrica e discreta, com amplitude unitria,
freqncia fundamental de p/6 rad, e no intervalo [-15,15].
31
% Programa para gerar uma onda quadrada discreta
A = 1; % amplitude de pico
dquadrada = A*square(wd*n,cr);
stem(n,dquadrada), xlabel('n'),ylabel('Amplitude')
0.5
Amplitude
-0.5
-1
-1.5
-15 -10 -5 0 5 10 15
Da mesma forma que se pode gerar uma onda quadrada contnua ou discreta, tambm podem
ser gerados sinais senoidais ou cossenoidais atravs das funes sin(wt+f) e cos(wt+f).
32
Exerccio 10.2: Gere um sinal senoidal contnuo de amplitude unitria, com freqncia
fundamental de 2 Hz, no intervalo [-1,1], e com fase inicial nula. Utilize uma freqncia de
amostragem de 500 Hz.
Exerccio 10.3: Gere uma seqncia cossenoidal com amplitude de pico de 2, freqncia
fundamental de p/4, no intervalo [-10,10]. Considere a fase inicial como sendo -p/3.
Exemplo 10.3: Gerar o sinal x(t) = 5e-4t sen(20pt). Considere a freqncia de amostragem como
sendo de 1 kHz.
fi = 0; % fase inicial
A = 5; % amplitude da senide
x = A*sin(2*pi*fo*t + fi).*exp(a*t);
plot(t,x),xlabel('t (s)'),ylabel('Amplitude')
title('Senide Amortecida')
axis([0 1 -6 6]);
Exerccio 10.4: Gere a seqncia senoidal amortecida dada por x[n] = 5(0,8)nsen(pn/4), no
intervalo [0,20].
33
Senide Amortecida
6
2
Amplitude
0
-2
-4
-6
0 0.2 0.4 0.6 0.8 1
t (s)
Figura 10.3: Senide Amortecida
A gerao de seqncias tipo delta ( d[n] ) e degrau unitrio ( u[n] ) pode ser feita com o
auxlio das funes zeros(m,n) e ones(m,n). Por exemplo, para se gerar a seqncia u[n-10] com
50 amostras, escreve-se a seguinte linha de comando:
u = [zeros(1,10),ones(1,40)];
Para se gerar uma seqncia d[n-6] com 50 amostras, pode-se fazer assim:
delta(1,6) = 1;
N -1 N -1
E x = x[n]x * [n] = | x[n] | 2
n =0 n =0
34
o que pode ser computado no Matlab como:
Ex = sum(x.*conj(x));
ou
Ex = sum(abs(x).^2);
De forma similar, a potncia mdia de um sinal peridico com perodo N dada por:
1 N -1
Px =
N n =0
| x[n] | 2
Para um sistema linear e invariante (SLI) caracterizado por uma resposta impulsional
h[n], a sada y[n], para uma entrada x[n], dada pelo somatrio da convoluo:
y[n] = h[n] * x[n] = h[k]x[n - k]
k =-
n
y[n] = h[k]x[n - k]
k =0
Exemplo 10.4: Um SLIC possui uma resposta impulsional dada por h[n] = (0,85)n u[n]. Para
uma entrada x[n] = u[n] - u[n-15], determine as 40 primeiras amostras da sada y[n].
35
% Programa para computar a convoluo de duas seqncias
N=40;
n=0:N-1;
h=(.85).^n;
x=[ones(1,15),zeros(1,25)];
y=conv(x,h);
subplot(3,1,1)
stem(n,x),xlabel('n'),ylabel('x[n]'),title('Entrada')
subplot(3,1,2)
stem(n,h)
xlabel('n'),ylabel('h[n]'),title('Resposta Impulsional')
subplot(3,1,3)
stem(n,y(1:N)),xlabel('n'),ylabel('y[n]'),title('Sada')
A sada de um SLI discreto tambm pode ser obtida atravs da soluo da equao
diferena que descreve este sistema.
N M
ak y[n - k ] = b k x[n - k ]
k =0 k =0
36
Entrada
1
x[n]
0.5
0
0 5 10 15 20 25 30 35 40
Resposta Impulsional
1
h[n]
0.5
0
0 5 10 15 20 25 30 35 40
Sada
10
y[n]
0
0 5 10 15 20 25 30 35 40
%0,532x[n].
n = 0:N-1;
37
subplot(2,1,1)
stem(n,h)
xlabel('n'),ylabel('h[n]'),title('Resposta Impulsional')
subplot(2,1,2)
stem(n,y)
xlabel('n'),ylabel('y[n]'),title('Resposta ao Degrau')
Resposta Impulsional
1
0.5
h[n]
-0.5
0 10 20 30 40 50
Resposta nao Degrau
2
1.5
y[n]
0.5
0
0 10 20 30 40 50
n
No Exemplo 10.5, o sistema dito recursivo ou IIR (Infinite Impulse Response), pois a
resposta impulsional de durao infinita. H tambm os sistemas no-recursivos ou FIR
(Finite Impulse Response), cuja resposta impulsional de durao finita. Um exemplo destes
sistemas o filtro de mdia mvel descrito pela seguinte equao diferena:
38
1 M -1
y[n] = x[n - k]
M k =0
6
s[n]
0
0 10 20 30 40 50
Ruido
0.5
r[n]
-0.5
0 10 20 30 40 50
n
As seqncias s[n] e r[n] so somadas, resultando na seqncia x[n], que nada mais
do que o sinal original s[n] contaminado pelo rudo aditivo r[n]. Para se atenuar o efeito
indesejvel deste rudo, pode-se passar o sinal x[n] por um filtro de mdias mveis. No
presente exemplo, usou-se um filtro com 3 atrasos (M = 3). A Figura 10.7a mostra o sinal
39
original s[n], o rudo r[n], e a soma dos dois x[n]. A Figura 10.7b mostra as curvas da entrada
x[n] e da sada y[n] do filtro de mdias mveis. Deve-se observar que a sada y[n] muito
prxima do sinal original s[n], exceto por um atraso de uma amostra, o que conseqncia do
processo de filtragem.
6 r[n]
Amplitudes
s[n]
4 x[n]
2
0
-2
0 10 20 30 40 50
n
6 s[n]
y[n]
Amplitudes
4
2
0
-2
0 10 20 30 40 50
n
Figura 10.7: a) sinal s[n], rudo r[n] e x[n]=s[n]+r[n]; b) sinal s[n] e sada do filtro y[n]
N = 50;
n = 0:N-1;
s = (4*sin(n*pi/8).*(.95).^n) + 3*ones(1,N);
figure(1)
subplot(2,1,1)
subplot(2,1,2)
40
stem(n,r),xlabel('n'),ylabel('r[n]'),title('Ruido')
x = s + r;
b = ones(1,M)/M;
y = filter(b,1,x);
figure(2)
subplot(2,1,1)
plot(n,r,'g-',n,s,'y--',n,x,'b:')
xlabel('n'),ylabel('Amplitudes')
legend('g-','r[n]','y--','s[n]','b:','x[n]')
axis([0 50 -2 8]);
subplot(2,1,2)
plot(n,s,'y-',n,y,'b:'),xlabel('n'),ylabel('Amplitudes')
legend('y-','s[n]','b:','y[n]')
axis([0 50 -2 8]);
X(e jw ) = x[n]e
n =-
- jwn
1 e jw
X (e jw ) = (0,5) n e - jwn = =
n =0 1 - 0,5e - jw e jw - 0,5
41
Observe que na soluo acima, o somatrio nada mais do que a soma de uma progresso
geomtrica cuja razo (0,5e-jw).
No Exemplo 10.7, como x[n] uma seqncia de durao infinita no se pode usar o
Matlab para computar X(ejw) diretamente. Entretanto, pode-se computar X(ejw) usando-se a
expresso acima, no intervalo [0,p] e ento traar grficos de magnitude e fase, ou das partes
real e imaginria.
Exemplo 10.8: Computar e plotar os espectros de magnitude e fase de X(ejw), bem como as suas
partes real e imaginria.
N = 256;
ex = exp(j*w);
X = ex./(ex - .5*ones(1,N));
rex = real(X);
imx = imag(X);
subplot(2,2,1)
plot(wnorm,ampl)
tle('Espectro de Amplitude')
subplot(2,2,3)
42
plot(wnorm,fase),xlabel('Freqncia Normalizada') yla-
bel('Radianos'),title('Espectro de Fase')
subplot(2,2,2)
plot(wnorm,rex),xlabel('Freqncia Normali-
zada'),ylabel('Real[X(jw)]'),title('Parte Real')
subplot(2,2,4)
bel('Imag[X(jw)]'),title('Parte Imaginria')
1.5 1.5
Magnitude
1 1
0.5 0.5
0 0.5 1 0 0.5 1
Frequncia Normalizada Frequncia Normalizada
Espectro de Fase Parte Imaginria
0 0
-0.2
Imag[X(jw)]
-0.2
Radianos
-0.4
-0.4
-0.6
-0.6 -0.8
0 0.5 1 0 0.5 1
Frequncia Normalizada Frequncia Normalizada
Figura 10.8: Grficos da transformada de Fourier: magnitude e fase; partes real e imaginria.
Nos grficos da Figura 10.8 deve-se observar que o eixo das freqncias est
normalizado, ou seja, a freqncia p corresponde ao valor 1. Muitos autores chamam este ponto
43
de freqncia de Nyquist, pois a freqncia que corresponde metade da freqncia de
amostragem. Um outro ponto que deve ser observado o que se refere forma de se plotar uma
funo complexa X(ejw). Isto pode ser feito atravs de grficos que mostrem as partes real e
imaginria, ou de grficos de magnitude e fase. Esta ltima forma a preferida quando a funo
complexa estiver relacionada a sistemas lineares discretos, como por exemplo filtros digitais.
No caso em que a seqncia discreta x[n] for de durao finita, ento ser possvel se
utilizar o Matlab para o cmputo da transformada de Fourier. Na realidade o que se faz
computar a Transformada Discreta de Fourier (DFT), que uma seqncia discreta, definida
como:
N -1 2p
- kn
X [k ] = x[n]e N
k [0, N - 1]
n =0
Exemplo 10.9: Repetir o Exemplo 10.7, utilizando a DFT para computar X(ejw). Como x[n]
deve ser finita, o que se pode fazer obter uma verso truncada de x[n] num intervalo finito
adequado.
No programa abaixo foi utilizada a funo fft(x,M) para computar a DFT da seqncia x
de comprimento N, com M pontos. Se M for omitido o cmputo da DFT se dar com o nmero
de pontos de x, neste caso N. Se M>N, ento sero apendados (M-N) zeros ao final da
seqncia x. Este procedimento no altera a forma da envoltria de X[k], apenas a define
melhor. A FFT (Fast Fourier Transform) apenas um algoritmo que computa de forma
eficiente a DFT. Esses algoritmos so mais rpidos quando M for uma potncia inteira de 2
(M= 2p).
44
% Programa para computar a transformada de Fourier usando o
% algoritmo de FFT
N = 256;
rex = real(X);
imx = imag(X);
subplot(2,2,1)
plot(wnorm,ampl)
xlabel('Freqncia Normalizada'),ylabel('Magnitude')
title('Espectro de Amplitude')
subplot(2,2,3)
plot(wnorm,fase)
xlabel('Freqncia Normalizada'),ylabel('Radianos')
title('Espectro de Fase')
subplot(2,2,2)
plot(wnorm,rex)
xlabel('Freqncia Normalizada'),ylabel('Real[X(jw)]')
title('Parte Real')
subplot(2,2,4)
plot(wnorm,imx)
xlabel('Freqncia Normalizada'),ylabel('Imag[X(jw)]')
title('Parte Imaginria')
45
Comparando-se os resultados mostrados nas Figuras 10.8 com os da Figura 10.9 , pode-se ver
que a aproximao obtida utilizando a DFT muito boa.
Real[X(jw)]
Magnitude
1.5 1.5
1 1
0.5 0.5
0 0.5 1 0 0.5 1
Frequncia Normalizada Frequncia Normalizada
Espectro de Fase Parte Imaginria
0 0
-0.2
Imag[X(jw)]
-0.2
Radianos
-0.4
-0.4
-0.6
-0.6 -0.8
0 0.5 1 0 0.5 1
Frequncia Normalizada Frequncia Normalizada
Exemplo 10.11: Computar e plotar a DFT da seqncia x[n] = u[n] -u[n-8], com 8, 16, 32, e 64
pontos.
% seqncia finita
x = ones(1,8); % x[n]=u[n]-u[n-8]
46
X2 = fft(x,32); % fft com 32 pontos, 24 zeros apendados a x[n]
subplot(2,2,1)
stem([(0:4)/4],abs(XO(1:5)))
xlabel('Freqncia Normalizada'),ylabel('Magnitude')
title('N = 8')
subplot(2,2,3)
stem([(0:8)/8],abs(X1(1:9)))
xlabel('Freqncia Normalizada'),ylabel('Magnitude')
title('N = 16 (8 zeros)')
subplot(2,2,2)
stem([(0:16)/16],abs(X2(1:17)))
xlabel('Freqncia Normalizada'),ylabel('Magnitude')
subplot(2,2,4)
stem([(0:32)/32],abs(X3(1:33)))
xlabel('Freqncia Normalizada'),ylabel('Magnitude')
O programa acima computa 4 DFTs com diferentes nmeros de pontos. A primeira com
8 pontos, a segunda com 16 pontos, sendo que destes 8 so zeros que foram apendados ao final
de x[n]. As outras duas so computadas com 32 e 64 pontos, sendo que nestes casos foram
apendados 24 e 56 zeros respectivamente.
Os resultados mostrados na Figura 10.10 indicam que ao se apender zeros a uma
seqncia finita, obtm-se uma amostragem mais fina da envoltria X(ejw), sem que isto altere
a sua forma.
47
Exerccio 10.5: Para a seqncia x[n] = u[n] - 2u[n-8] + u[n-16] compute e plote |X[k]|, para
N=16, e N=64 (apendendo-se 48 zeros). Comente os resultados.
6 6
Magnitude
Magnitude
4 4
2 2
0 0
0 0.5 1 0 0.5 1
Freqncia Normalizada Freqncia Normalizada
N = 16 (8 zeros) N = 64 (56 zeros)
8 8
6 6
Magnitude
Magnitude
4 4
2 2
0 0
0 0.5 1 0 0.5 1
Freqncia Normalizada Freqncia Normalizada
A resposta em freqncia de um SLID dada por H(ejw), que nada mais do que a
transformada de Fourier da resposta impulsional h[n] do sistema. Como H(ejw) uma funo
complexa, a resposta em freqncia composta da resposta em magnitude, ou em amplitude,
que |H(ejw)|, e da resposta em fase que o argumento de H(ejw).
48
O Matlab possui uma funo que permite computar a resposta em freqncia a partir
dos coeficientes da equao diferena que descreve o sistema. tambm possvel comput-la a
partir dos coeficientes da funo de transferncia H(z), que a transformada z de h[n]. Estes
coeficientes so na realidade os mesmos da equao diferena. A funo [H,w]=freqz(b,a,N).
Maiores detalhes podem ser obtidos atravs do help do Matlab.
Exemplo 10.12: Para o sistema de 2a ordem do Exemplo 10.5, descrito por y[n] - 1,2728y[n-1]
+0,81y[n-2] = 0,532x[n], determine e plote a resposta em freqncia do sistema.
b = 0.532;
a = [1 -1.2728 .81];
[H w] = freqz(b,a,N);
subplot(2,1,1)
plot(w/pi,abs(H))
xlabel('Freqncia Normalisada'),ylabel('Magnitude')
title('Resposta em Magnitude')
subplot(2,1,2)
plot(w/pi,angle(H))
xlabel('Freqncia Normalisada'),ylabel('Radianos')
title('Resposta em Fase')
Exerccio 10.6: Repetir o Exemplo 10.12 usando a opo whole em freqz. Esta opo permite
computar a resposta em freqncia no intervalo [0,2p]. O que pode ser dito em termos de
simetria das resposta em magnitude e fase?
49
Resposta em Magnitude
4
3
Magnitude
0
0 0.2 0.4 0.6 0.8 1
Freqncia Normalisada
Resposta em Fase
0.5
0
Radianos
-0.5
-1
-1.5
-2
0 0.2 0.4 0.6 0.8 1
Freqncia Normalisada
Exemplo 10.13: Para um filtro tipo mdia mvel, determine e plote as respostas de magnitude e
fase, para M = 3, e M = 10.
b1 = [1 1 1]/3; b2 = ones(1,10)/10;
a = 1;
50
[H1 w] = freqz(b1,a,N);
[H2 w] = freqz(b2,a,N);
subplot(2,1,1)
plot(w/pi,abs(H1),'r:',w/pi,abs(H2),'b--')
xlabel('Freqncia Normalisada'),ylabel('Magnitude')
title('Resposta em Magnitude'),legend('r:','M=3','b--','M=10');
subplot(2,1,2)
plot(w/pi,angle(H1),'r:',w/pi,angle(H2),'b--')
xlabel('Freqncia Normalisada'),ylabel('Radianos')
title('Resposta em Fase'),legend('r:','M=3','b--','M=10');
Resposta em Magnitude
1
0.8 M=3
M=10
Magnitude
0.6
0.4
0.2
0
0 0.2 0.4 0.6 0.8 1
Freqncia Normalisada
Resposta em Fase
2
1
Radianos
-1
-2 M=3
M=10
-3
0 0.2 0.4 0.6 0.8 1
Freqncia Normalisada
Figura 10.12: Resposta em freqncia de um filtro de mdia mvel, com M=3, e M=10.
51
10.5 Transformada z
X ( z ) = x[n]z - n
n =0
No caso de SLI a transformada z de h[n] H(z), que uma funo racional da forma
H(z)=N(z)/D(z), em que N(z) e D(z) so polinmios em z. As razes de N(z) = 0 so os zeros
de H(z), e as razes de D(z) = 0 correspondem aos plos de H(z). H(z) chamada de funo
sistema ou funo de transferncia, servindo juntamente com h[n], para caracterizar os SLIs. O
Matlab possui funes que permitem decompor H(z) em seus plos e zeros
([z,p,k]=tf2zp(num,den)), ou fazer um grfico dos plos e zeros no plano z ( zplane(num,den) ).
H tambm uma funo que permite obter H(z) na forma racional, a partir de seus plos e zeros
( [num,den] = zp2tf(z,p,k) ).
Exemplo 10.13: Expressar a FT, dada abaixo, na forma fatorada, fazer um grfico de p/olos e
zeros e indicar a regio de convergncia.
zplane(num,den)
52
zeros =
2.0000
-1.5000
0.7071
polos =
0.6364 + 0.6364i
0.6364 - 0.6364i
-0.8000
-0.5000
ganho =
53
1.5
0.5
Imaginary part
-0.5
-1
-1.5
-1.5 -1 -0.5 0 0.5 1 1.5 2
Real part
Exemplo 10.14: Determinar h[n] da FT dada abaixo, pelo mtodo da expanso em fraes
parciais.
z(z - 1)
H ( z) = 3 2
z - 1,1z + 0,14z + 0,08
num = [0 1 -1];
54
coeficientes =
-0.6667
2.3810
-1.7143
polos =
0.8000
0.5000
-0.2000
constante =
[]
z z z
H ( z ) = 2,381 - 0,667 - 1,7143
z - 0,5 z - 0,8 z + 0,2
55