Escolar Documentos
Profissional Documentos
Cultura Documentos
"TOOLBOX" DE SINAIS
NOTAS DE AULA
PAULO LO M. OSORIO
( DEE/PUC-RIO )
2002
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 objetivo 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
estudo de sinais e sistemas discretos.
Atualmente existe no mercado uma oferta considervel de livros que se utilizam do
Matlab para implementar exemplos e exerccios. Uma listagem desses livros pode ser
encontrada na pgina da Mathworks ( http://www.mathworks.com ).
1.Introduo
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.
O Matlab uma linguagem sensvel ao tipo (caracter maisculo ou minsculo)
utilizado, ou seja, RH, Rh, rH e rh so tratadas como variveis diferentes.
Os comandos de Matlab so usualmente entrados em linhas separadas, embora possa-se
ter mltiplos comandos na mesma linha, desde que separados por ponto e vrgula (;). Os
comentrios so entrados precedidos do sinal de porcentagem (%).
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
ser mostrado no item 9.2. Estes arquivos so chamados de arquivos-M.
O comando what mostra uma listagem dos arquivos-M, disponveis no diretrio corrente. 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
s linhas e o ndice j s colunas. O tamanho de uma matriz especificado pelo nmero de
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
uma lista de nmeros entre colchetes, como mostrado abaixo.
a = 0.5;
b = [ 1 3 5 7 9];
c = [2;4;6;8;10];
6
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
estiverem no espao de trabalho, o resultado da aplicao desse comando o seguinte:
whos
Name
Size
Bytes
Class
3x3
72
double array
1x1
double array
1x5
40
double array
5x1
40
double array
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
resultado de um dado comando aparea imediatamente na tela, como por exemplo:
b=[1 3 5 7 9]
b =
1
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
exemplo, considere os seguintes comandos:
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
parntesis. O seguinte comando:
B(1) = -1;
B(7) = pi;
Exerccio 3.1: Dadas as matrizes abaixo, verifique suas dimenses atravs do Matlab
1.
A = [1 0 0 0 1];
2.
3.
C = [ 3; 4; -1; 2 -j];
4.
D = [1 2 3; 4 5 6; 7 8 9];
5.
6.
7.
G = [A ; F];
8.
H = [E(2,1) A];
Um vetor tambm pode ser criado usando-se o comando (:). Se (:) for usado para separar dois nmeros inteiros m e n, ele ir gerar todos os nmeros inteiros entre m e n. Por
exemplo, o comando abaixo gera um vetor chamado X com os inteiros de 1 a 10.
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
de 10 a 1, enquanto o vetor Z formado pelos nmeros no intervalo [-p , p ], separados de
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
matriz. Por exemplo seja a matriz D:
9
os comandos:
dl2 = D(2,:);
dc1 = D(:,1);
dd = D(2:3,1:2);
% dd = [4 5;7 8]
Exerccio 3.2: Dada a matriz R abaixo, verifique as suas respostas usando o Matlab.
-p
-0.1
R =
0.1p
-5.9
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
Operao
Forma Algbrica
MATLAB
Adio
a+b
a+b
Subtrao
a-b
a-b
Multiplicao
ab
a*b
Diviso direita
a/b
a/b
Diviso esquerda
b\a
a\b
Exponenciao
ab
a^b
>> 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.
Uma outra formatao o format long, que apresenta o resultado com 15 digitos.
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
O Matlab possui comandos que permitem a criao de algumas matrizes e vetores especiais:
zeros(m,n)
ones(m,n)
eye(m,n)
diag(v)
Com as funes zeros e ones pode-se criar vetores, como por exemplo:
>> x = zeros(1,5)
x =
0
>> y = ones(5,1)
y =
1
1
1
1
1
>> size(x)
ans =
14
As operaes adio, subtrao, multiplicao, e diviso de um vetor por um escalar so aplicadas a todos os elementos do vetor:
a*2
ans =
2
4
10
15
As operaes matemticas entre vetores no so to simples quanto aquelas entre vetores 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
ans-a
ans =
1
3
11
14
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 diferente da operao multiplicao matricial (*).
A diviso de vetores elemento a elemento requer o uso do smbolo ponto (.):
a./b
ans =
1.0000
b.\a
ans =
1.0000
0.6667
0.6000
0.5714
0.5556
0.6667
0.6000
0.5714
0.5556
16
25
16
ans =
2
16
32
neste caso o escalar 2 elevado a uma potncia dada por cada elemento de a.
a.^b
ans =
1
243
16384
1953125
aqui cada elemento do vetor a elevado a uma potncia dada por cada elemento do vetor b. A
Tabela 2 mostra um resumo das operaes aritmticas com vetores.
Operao
Forma Algbrica
MATLAB
Adio
a+b
a+b
Subtrao
a-b
a-b
Multiplicao
ab
a.* b
Diviso direita
a/b
a. / b
Diviso esquerda
b\a
a. \ b
Exponenciao
ab
a. ^ b
7. Grficos
17
2.5
1.5
0.5
-0.5
-1
1.5
2.5
3.5
4.5
5.5
Um grfico alternativo, mostrado na Figura 7.2, pode ser obtido da seguinte forma:
plot(x,y,'+')
3.5
2.5
1.5
0.5
-0.5
-1
1.5
2.5
3.5
4.5
5.5
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.
x = 0:pi/20:2*pi;
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
1
0.8
0.5
0.6
0
0.4
-0.5
-1
0.2
1
0.8
0.5
0.6
0
0.4
-0.5
-1
0.2
prod_esc = sum(P.*Q);
A = [0 1 2;-1 3 5];
B = [1 2 3;-1 0 5;4 5 -2];
C = A*B
C =
7
10
16
23
D = B*A
??? Error using ==> *
Inner matrix dimensions must agree.
Do exemplo acima pode-se ver que o Matlab no executa a operao D=BA, pois ela no
satisfaz as condies para multiplicao de duas matrizes.
Do que foi visto acima possvel simplificar a operao de produto escalar entre dois
vetores linhas P e Q, usando o seguinte comando:
prod_esc = P*Q'
A inversa de uma matriz quadrada A pode ser computada no Matlab atravs da instruo
inv(A). Por exemplo:
B =
1
-1
-2
inv_B = inv(B)
inv_B =
6.2500
-4.7500
-2.5000
-4.5000
3.5000
2.0000
21
1.2500
-0.7500
-0.5000
1.0000
0.0000
0.0000
0.0000
1.0000
0.0000
0.0000
0.0000
1.0000
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),
como mostrado no exemplo abaixo:
A =
1
-1
-2
det(A)
ans =
-4
2x1 + x2 - 3x3 = 5
3x1 - 2x2 + 2x3 = 5
5x1 - 3x2 - x3 = 16
AX = B
2 1 -3
A = 3 -2 2
5 -3 -1
x1
X = x2
x 3
5
B = 5
16
A determinao de X pode ser feita por diviso de matrizes ou pela utilizao da matriz
inversa, ou seja:
X = B/A
X = A-1B
23
-3.0000
-2.0000
9. Programao em Matlab
A soluo de problemas mais complexos pode ser implementada atravs da programao na prpria linguagem do Matlab. O programa pode ser escrito num arquivo texto com
extenso .m. O Matlab fornece um editor de textos ASCII que permite criar e editar tais
arquivos.
for k = [1 2 3]
x(k) = k^2;
end
x
x =
1
24
for k = 1:3
x(k) = k^2;
end
e
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
y
y =
1.73205080756888
4 > 3
ans =
1
4 < 3
ans =
0
4 == 3
ans =
0
4 ~= 3
ans =
1
if expresso 1
comandos
elseif expresso 2
comandos
else
comandos
end
Por exemplo, vamos supor que o arquivo seno.m contenha o script mostrado abaixo.
% Programa para gerar um grfico da funo seno
% Gerao um vetor x com N amostras entre 0 e 2pi
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
27
Grfico do Seno
1
0.8
0.6
0.4
Amplitude
0.2
0
-0.2
-0.4
-0.6
-0.8
-1
3
4
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.
29
Esta "toolbox" possui uma coleo muito grande de funes que so largamente
utilizadas em processamento de sinais.
fs = 1000;
% freqncia de amostragem
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%).
% amplitude de pico
% freqncia fundamental em Hz
30
cr = 50;
fs = 1000;
% freqncia de amostragem em Hz
t = 0:1/fs:1;
onda_quadrada = A*square(2*pi*f0*t,cr);
plot(t,onda_quadrada), xlabel('t (s)'),ylabel('Amplitude')
title('Onda Quadrada Simtrica')
axis([0 1 -1.5 1.5]);
Amplitude
0.5
-0.5
-1
-1.5
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
Exerccio 10.1: Gere uma onda triangular simtrica com amplitude 2 de pico, freqncia
Exemplo 10.2: Gerar uma onda quadrada simtrica e discreta, com amplitude unitria,
31
% amplitude de pico
wd = pi/6;
cr = 50;
n = -15:15;
dquadrada = A*square(wd*n,cr);
stem(n,dquadrada), xlabel('n'),ylabel('Amplitude')
title('Onda Quadrada Simtrica')
axis([-15 15 -1.5 1.5]);
Amplitude
0.5
-0.5
-1
-1.5
-15
-10
-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.
% freq. de amostragem
% freq. fundamental
a = -4;
% coef. da exponencial
fi = 0;
% fase inicial
A = 5;
% amplitude da senide
t = 0:1/fs:1;
% eixo do tempo
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
4
Amplitude
2
0
-2
-4
-6
0.2
0.4
0.6
0.8
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 = zeros(1,50);
delta(1,6) = 1;
N -1
n =0
n =0
34
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:
Px =
1 N -1
| x[n] | 2
N n =0
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:
h[k]x[n - k]
k =-
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
A sada de um SLI discreto tambm pode ser obtida atravs da soluo da equao
diferena que descreve este sistema.
N
k =0
k =0
ak y[n - k ] = b k x[n - k ]
O Matlab possui uma funo filter(a,b,x), em que a = [1, a1,a2,...aN], b = [b0,b1,....bM], e x o
vetor com as amostras da entrada, para resolver numericamente a equao diferena acima.
36
Entrada
x[n]
1
0.5
0
10
15
20
25
Resposta Impulsional
10
15
20
Sada
10
15
20
30
35
40
25
30
35
40
25
30
35
40
h[n]
1
0.5
0
y[n]
10
5
0
% nmero de amostras
% coeficientes da ED
% gera o impulso
h = filter(b,a,imp);
y = filter(b,a,deg);
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
h[n]
0.5
0
-0.5
10
20
30
40
50
40
50
y[n]
1.5
1
0.5
0
10
20
30
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
y[n] =
1 M -1
x[n - k]
M k =0
distribuio uniforme entre -0,5 e 0,5.Ser utilizado um filtro de mdia mvel para diminuir os
efeitos do rudo aditivo.
s[n]
6
4
2
0
10
20
30
40
50
30
40
50
Ruido
r[n]
0.5
-0.5
10
20
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
Amplitudes
processo de filtragem.
r[n]
s[n]
x[n]
4
2
0
-2
10
20
30
40
50
40
50
Amplitudes
n
s[n]
y[n]
6
4
2
0
-2
10
20
30
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]
40
stem(n,r),xlabel('n'),ylabel('r[n]'),title('Ruido')
x = s + r;
M = 3;
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
- jwn
n =-
X (e jw ) = (0,5) n e - jwn =
n =0
1
e jw
=
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.
ex = exp(j*w);
X = ex./(ex - .5*ones(1,N));
ampl = abs(X);
fase = angle(X);
rex = real(X);
imx = imag(X);
wnorm = w/pi;
subplot(2,2,1)
plot(wnorm,ampl)
xlabel('Freqncia normalizada') ,ylabel('Magnitude'), title('Espectro de Amplitude')
subplot(2,2,3)
42
Parte Real
2
Real[X(jw)]
Magnitude
2
1.5
1
0.5
0.5
1
Frequncia Normalizada
Parte Imaginria
0.5
1
Frequncia Normalizada
0
Imag[X(jw)]
Radianos
1
0.5
0.5
1
Frequncia Normalizada
Espectro de Fase
0
-0.2
-0.4
-0.6
1.5
0.5
1
Frequncia Normalizada
-0.2
-0.4
-0.6
-0.8
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
X [k ] = x[n]e
2p
kn
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
rex = real(X);
imx = imag(X);
wnorm = 0:2/N:1;
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.
Espectro de Amplitude
1.5
1
0.5
1.5
1
0.5
0.5
1
Frequncia Normalizada
Espectro de Fase
0.5
1
Frequncia Normalizada
Parte Imaginria
0.5
1
Frequncia Normalizada
0
Imag[X(jw)]
Radianos
0
-0.2
-0.4
-0.6
Parte Real
2
Real[X(jw)]
Magnitude
0.5
1
Frequncia Normalizada
-0.2
-0.4
-0.6
-0.8
Exemplo 10.11: Computar e plotar a DFT da seqncia x[n] = u[n] -u[n-8], com 8, 16, 32, e 64
pontos.
46
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
Magnitude
4
2
0
Magnitude
N = 32 (24 zeros)
4
2
0
0.5
1
Freqncia Normalizada
N = 16 (8 zeros)
Magnitude
Magnitude
N=8
4
2
0
0.5
1
Freqncia Normalizada
0.5
1
Freqncia Normalizada
N = 64 (56 zeros)
0.5
1
Freqncia Normalizada
4
2
0
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.
[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
Magnitude
4
3
2
1
0
0.2
0.4
0.6
Freqncia Normalisada
Resposta em Fase
0.8
0.2
0.4
0.6
Freqncia Normalisada
0.8
0.5
Radianos
0
-0.5
-1
-1.5
-2
Exemplo 10.13: Para um filtro tipo mdia mvel, determine e plote as respostas de magnitude e
fase, para M = 3, e M = 10.
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
M=3
M=10
Magnitude
0.8
0.6
0.4
0.2
0
0.2
0.4
0.6
Freqncia Normalisada
Resposta em Fase
0.8
Radianos
1
0
-1
-2
-3
M=3
M=10
0
0.2
0.4
0.6
Freqncia Normalisada
0.8
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
zeros
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.
H ( z) =
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
Imaginary part
1
0.5
0
-0.5
-1
-1.5
-1.5
-1
-0.5
0
0.5
Real part
1.5
Exemplo 10.14: Determinar h[n] da FT dada abaixo, pelo mtodo da expanso em fraes
parciais.
z(z - 1)
z - 1,1z + 0,14z + 0,08
H ( z) =
num = [0 1 -1];
den = [1 -1.1 .14 .08];
[coeficientes polos constante] = residuez(num,den)
54
coeficientes =
-0.6667
2.3810
-1.7143
polos =
0.8000
0.5000
-0.2000
constante =
[]
H ( z ) = 2,381
z
z
z
- 0,667
- 1,7143
z - 0,5
z - 0,8
z + 0,2
55