Professional Documents
Culture Documents
"TOOLBOX" DE SINAIS
NOTAS DE AULA
( DEE/PUC-RIO )
2002
2
AVISO
Estas notas destinam-se aqueles que estão usando o Matlab pela primeira vez. Os
exemplos apresentados utilizam uma pequena parcela das funções disponíveis e tem por obje-
tivo familiarizar o usuário com as funções e os comandos mais comuns. Há também uma
introdução ao uso das principais funções da "toolbox signal", que é de grande utilidade no
Matlab para implementar exemplos e exercícios. Uma listagem desses livros pode ser
3
4
1.Introdução
técnica e científica em geral. A sua filosofia de processamento está baseada em matrizes. Como
os comandos do Matlab são muito similares à maneira como expressamos as soluções dos
é muito mais rápida do que escrever programas em linguagens de alto nível, tais como
FORTRAN e C. Além disto, ele possui facilidades gráficas 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 gráfica
onde são gerados os gráficos. As duas janelas são apagadas quando do início de cada sessão de
Matlab. A janela de comando pode ser limpa durante uma sessão de trabalho através do
comando clc. Para se limpar a janela gráfica é usado o comando clg.
entrados, bem como as variáveis que foram criadas. Desta forma, os comandos e as variáveis
5
ficam residentes no espaço de trabalho do Matlab, e podem ser chamados sempre que se
desejar. Para se limpar o espaço de trabalho usa-se o comando clear.
ter múltiplos comandos na mesma linha, desde que separados por ponto e vírgula (;). Os
Além de executar comandos que são entrados pelo teclado, o Matlab também é capaz de
executar seqüências de comandos que estão armazenadas em arquivos com extensão .m, como
rente. Estes arquivos podem ser vistos por meio do comando type. Se o arquivo especificado
com este comando não tiver uma extensão, 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 são 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á várias formas de se criar uma matriz no Matlab, sendo a mais simples através de
a = 0.5;
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 variáveis existentes
no espaço de trabalho global, bem como os seus tipos e dimensões. Se as variáveis acima
» whos
Deve-se observar, nos exemplos acima, que todas linhas estão finalizadas por ponto e
vírgula (;). Isto evita que as matrizes sejam impressas na tela. A omissão do (;), faz com que o
» b=[1 3 5 7 9]
b =
1 3 5 7 9
matriz 3x3. Observe que os números dentro dos colchetes ou estão separados por vírgulas ou
por espaços. O ponto e vírgula 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 também 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 também mudar ou adicionar valores num vetor através de subscrito referenciado em
B(1) = -1;
Um vetor também pode ser estendido pela definição de novos elementos. O vetor B que
B(7) = pi;
8
Exercício 3.1: Dadas as matrizes abaixo, verifique suas dimensões através 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 também pode ser criado usando-se o comando (:). Se (:) for usado para se-
parar dois números inteiros m e n, ele irá gerar todos os números inteiros entre m e n. Por
X = 1:10;
Se o operador (:) for usado para separar três números a, b, e c , então o comando gera valores
entre a e c com o incremento dado por b. Nos exemplos abaixo o vetor Y contém os números
p/10.
Y = 10:-1:1;
Z = -pi:pi/10:pi;
O comando (:) também pode ser usado para selecionar submatrizes a partir de uma outra
9
D = [1 2 3;4 5 6;7 8 9];
os comandos:
dd = D(2:3,1:2); % dd = [4 5;7 8]
Exercício 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 é válido 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 também podem entrar através do comando
input. Isto é muito útil quando se tem o programa num arquivo tipo M.
4. Operações 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 número muito grande de funções, 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 atenção para a maneira como os valores numéricos das variáveis são
mostrados no Matlab. O seu controle é feito através do comando format. O default é a
formatação chamada de format short, ou seja:
12
>> pi
ans =
3.1416
Há várias formas possíveis de formatação, que podem ser vistas usando o comando
help format. Por exemplo o comando format compact suprime a linha extra que
aparece nas outras formatações. Esta formatação é a utilizada na maioria dos exemplos
apresentados.
>> pi
ans =
3.1416
Uma outra formatação é o format long, que apresenta o resultado com 15 digitos.
>> pi
ans =
3.14159265358979
Deve-se observar que o Matlab trabalha internamente com precisão dupla em todas as
suas operações, e que o comando format altera apenas a forma com que os resultados são
apresentados.
13
5. Criação de Matrizes e Vetores
O Matlab possui comandos que permitem a criação de algumas matrizes e vetores especi-
ais:
tamanho n).
Com as funções 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 =
Deve-se observar que o comando length não consegue diferenciar se o vetor é linha
ou coluna.
» a = 1:5; b = 1:2:9;
As operações adição, subtração, multiplicação, e divisão de um vetor por um escalar são apli-
cadas a todos os elementos do vetor:
» a*2
ans =
2 4 6 8 10
15
As operações matemáticas entre vetores não são tão simples quanto aquelas entre ve-
tores e escalares. Quando dois vetores forem de mesmo tamanho, as operações de adição,
subtração, multiplicação, e divisão são aplicadas elemento a elemento. Por exemplo:
» a+b
ans =
2 5 8 11 14
» ans-a
ans =
1 3 5 7 9
A multiplicação e divisão elemento por elemento é feita de maneira similar, exceto por
uma pequena alteração na notação:
» 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 potência dada por cada elemento de a.
» a.^b
ans =
aqui cada elemento do vetor a é elevado a uma potência dada por cada elemento do vetor b. A
7. Gráficos
17
O gráfico resultante é mostrado na Figura 1. Observe que o Matlab une os pontos do
gráfico 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
Um gráfico 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 1.5 2 2.5 3 3.5 4 4.5 5 5.5 6
18
Aos gráficos das figuras 7.1 e 7.2 pode-se acrescentar título, nomes dos eixos, e
reticulado. Pode-se também controlar as cores das curvas, bem como o tipo de linha utilizado.
É possível se ter mais de uma curva num mesmo gráfico. Além destas, há muitas outras
facilidades gráficas oferecidas pelo Matlab. Uma boa opção para se aprender mais sobre os
recursos da função plot é o de entrar com o comando help plot.
O Matlab pode gerar diversos tipos de gráficos: curvas em 2D, superfícies em 3D,
gráficos de contorno de superfícies em 3D, curvas paramétricas em 2D e em 3D. Os detalhes de
como são gerados esses gráficos podem ser encontrados com o auxílio do help.
O comando subplot cria diversos gráficos numa mesma janela gráfica. A sua sintaxe
é subplot(m,n,k), em que mn é o número de gráficos a serem criados, organizado numa
matriz com m linhas e n colunas, e k é a ordem em que aparecem os gráfico ao longo das
linhas. Vejamos o seguinte exemplo: 4 gráficos serão 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 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 não executa a operação D=BA, pois ela não
prod_esc = P*Q'
A inversa de uma matriz quadrada A pode ser computada no Matlab através da instrução
inv(A). Por exemplo:
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 também o produto B*B-1 , que nada mais é do que a matriz
identidade.
O determinante de uma matriz pode ser computado, utilizando-se a instrução 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 determinação de X pode ser feita por divisão de matrizes ou pela utilização da matriz
inversa, ou seja:
X = B/A
» B = [5 5 16]';
» X = A\B
X =
-3
-2
X = A-1B
» B = [5 5 16]';
» X = inv(A)*B
X =
1.0000
23
-3.0000
-2.0000
9. Programação em Matlab
» for k = [1 2 3]
x(k) = k^2;
end
» x
x =
1 4 9
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;
y = 0.5*(xp + x/xp);
df = abs(y-xp);
xp = y;
end
» y
y =
1.73205080756888
» 4 > 3
ans =
1
» 4 < 3
ans =
» 4 == 3
ans =
» 4 ~= 3
ans =
26
if expressão 1
comandos
elseif expressão 2
comandos
else
comandos
end
O primeiro bloco de comandos após uma expressão não nula será executado.
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('Gráfico do Seno')
xlabel ('Ângulo em rad'),ylabel('Amplitude'),grid
» N=50; a=1;
» seno
27
a Figura 9.1 irá aparecer.
Gráfico 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 variáveis que já existam no espaço de trabalho do Matlab. Quando um script é
executado, as suas variáveis passam também a fazer parte do espaço de trabalho.
As funções são bem mais gerais que os scripts, pois permitem ao usuário criar novos
comandos no Matlab. As diversas “toolboxes” que fazem parte to Matlab são constituídas por
funções. A função difere do script apenas na primeira linha, que tem a seguinte sintaxe:
Com exceção desta linha, as demais são linhas com comandos do Matlab, de maneira similar
aos scripts. Diferentemente dos scripts, as variáveis que aparecem na função são internas, ou
28
seja, elas não aparecem no espaço de trabalho do Matlab. Por exemplo, vamos considerar uma
função que compute a média e a variância de um conjunto de números. Seja estat o nome dessa
função. Abaixo esta mostrada a listagem do arquivo estat.m.
nx = length(x);
m = sum(x)/nx;
v = sum((x - m).^2)/(nx-1);
» x = rand(1,100);
» [med,var] = estat(x)
med =
0.4652
var =
0.0778
29
10. Uso da "Toolbox Signal"
Esta "toolbox" possui uma coleção muito grande de funções que são largamente
utilizadas em processamento de sinais.
Os sinais para serem tratados pelo computador devem estar na forma discreta, embora
possamos gerar gráficos como se eles fossem contínuos, para isto basta que se use um número
suficientemente grande de pontos do sinal contínuo. Estes pontos, ou amostras, são obtidos
pelo processo de amostragem. que consiste em dividir o eixo do tempo, por exemplo, em
intervalos com espaçamento uniforme Dt, que é chamado de intervalo de amostragem. O
inverso do intervalo de amostragem é denominado de freqüência de amostragem fs, que indica a
cadência com que uma dada variável é amostrada, no caso mais comum esta variável é 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 periódica com amplitude unitária, com freqüência
fundamental de 10 Hz, e ciclo de repetição de 50% ( ciclo de repetição é a porção de cada ciclo
para a qual o sinal é positivo, e 0 < cr < 100%).
A = 1; % amplitude de pico
30
cr = 50; % onda quadrada simétrica 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
Exercício 10.1: Gere uma onda triangular simétrica com amplitude 2 de pico, freqüência
fundamental de 5 Hz, e amostrada com fs = 2 kHz. Use a função sawtooth do Matlab.
Exemplo 10.2: Gerar uma onda quadrada simétrica e discreta, com amplitude unitária,
freqüência 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 contínua ou discreta, também podem
ser gerados sinais senoidais ou cossenoidais através das funções sin(wt+f) e cos(wt+f).
32
Exercício 10.2: Gere um sinal senoidal contínuo de amplitude unitária, com freqüência
fundamental de 2 Hz, no intervalo [-1,1], e com fase inicial nula. Utilize uma freqüência de
amostragem de 500 Hz.
Exercício 10.3: Gere uma seqüência cossenoidal com amplitude de pico de 2, freqüência
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 freqüência de amostragem como
sendo de 1 kHz.
fi = 0; % fase inicial
A = 5; % amplitude da senóide
x = A*sin(2*pi*fo*t + fi).*exp(a*t);
plot(t,x),xlabel('t (s)'),ylabel('Amplitude')
title('Senóide Amortecida')
axis([0 1 -6 6]);
Exercício 10.4: Gere a seqüência senoidal amortecida dada por x[n] = 5(0,8)nsen(pn/4), no
intervalo [0,20].
33
Senóide Amortecida
6
2
Amplitude
0
-2
-4
-6
0 0.2 0.4 0.6 0.8 1
t (s)
Figura 10.3: Senóide Amortecida
A geração de seqüências tipo delta ( d[n] ) e degrau unitário ( u[n] ) pode ser feita com o
auxílio das funções zeros(m,n) e ones(m,n). Por exemplo, para se gerar a seqüência u[n-10] com
50 amostras, escreve-se a seguinte linha de comando:
u = [zeros(1,10),ones(1,40)];
Para se gerar uma seqüência d[n-6] com 50 amostras, pode-se fazer assim:
delta = zeros(1,50);
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 potência média de um sinal periódico com período 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 saída y[n], para uma entrada x[n], é dada pelo somatório da convolução:
¥
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 saída y[n].
35
% Programa para computar a convolução de duas seqüências
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('Saída')
A entrada x[n], a resposta impulsional do sistema h[n], e a saída do sistema y[n] são
mostrada na Figura 10.4.
A saída de um SLI discreto também pode ser obtida através da solução da equação
diferença 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
Saída
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 duração infinita. Há também os sistemas não-recursivos ou FIR
(Finite Impulse Response), cuja resposta impulsional é de duração finita. Um exemplo destes
sistemas é o filtro de média móvel descrito pela seguinte equação diferença:
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 seqüências s[n] e r[n] são somadas, resultando na seqüência x[n], que nada mais é
do que o sinal original s[n] contaminado pelo ruído aditivo r[n]. Para se atenuar o efeito
indesejável deste ruído, pode-se passar o sinal x[n] por um filtro de médias móveis. No
presente exemplo, usou-se um filtro com 3 atrasos (M = 3). A Figura 10.7a mostra o sinal
39
original s[n], o ruído r[n], e a soma dos dois x[n]. A Figura 10.7b mostra as curvas da entrada
x[n] e da saída y[n] do filtro de médias móveis. Deve-se observar que a saída y[n] é muito
próxima do sinal original s[n], exceto por um atraso de uma amostra, o que é conseqüência 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], ruído r[n] e x[n]=s[n]+r[n]; b) sinal s[n] e saída 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 solução acima, o somatório nada mais é do que a soma de uma progressão
geométrica cuja razão é (0,5e-jw).
No Exemplo 10.7, como x[n] é uma seqüência de duração infinita não se pode usar o
Matlab para computar X(ejw) diretamente. Entretanto, pode-se computar X(ejw) usando-se a
expressão acima, no intervalo [0,p] e então traçar gráficos de magnitude e fase, ou das partes
real e imaginária.
Exemplo 10.8: Computar e plotar os espectros de magnitude e fase de X(ejw), bem como as suas
partes real e imaginária.
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('Freqüência Normalizada') yla-
bel('Radianos'),title('Espectro de Fase')
subplot(2,2,2)
plot(wnorm,rex),xlabel('Freqüência Normali-
zada'),ylabel('Real[X(jw)]'),title('Parte Real')
subplot(2,2,4)
bel('Imag[X(jw)]'),title('Parte Imaginária')
1.5 1.5
Magnitude
1 1
0.5 0.5
0 0.5 1 0 0.5 1
Frequência Normalizada Frequência Normalizada
Espectro de Fase Parte Imaginária
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
Frequência Normalizada Frequência Normalizada
Figura 10.8: Gráficos da transformada de Fourier: magnitude e fase; partes real e imaginária.
Nos gráficos da Figura 10.8 deve-se observar que o eixo das freqüências está
normalizado, ou seja, a freqüência p corresponde ao valor 1. Muitos autores chamam este ponto
43
de freqüência de Nyquist, pois é a freqüência que corresponde à metade da freqüência de
amostragem. Um outro ponto que deve ser observado é o que se refere à forma de se plotar uma
função complexa X(ejw). Isto pode ser feito através de gráficos que mostrem as partes real e
imaginária, ou de gráficos de magnitude e fase. Esta última forma é a preferida quando a função
complexa estiver relacionada a sistemas lineares discretos, como por exemplo filtros digitais.
No caso em que a seqüência discreta x[n] for de duração finita, então será possível se
utilizar o Matlab para o cômputo da transformada de Fourier. Na realidade o que se faz é
computar a Transformada Discreta de Fourier (DFT), que é uma seqüência discreta, definida
como:
N -1 2p
- kn
X [k ] = å x[n]e N
k Î[0, N - 1]
n =0
Pode-se mostrar que os X[k] são amostras de X(ejw) igualmente espaçadas de 2p/N no
círculo unitário, ou seja X(ejw) é a envoltória das amostras representadas por X[k].
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 versão truncada de x[n] num intervalo finito
adequado.
No programa abaixo foi utilizada a função fft(x,M) para computar a DFT da seqüência x
de comprimento N, com M pontos. Se M for omitido o cômputo da DFT se dará com o número
de pontos de x, neste caso N. Se M>N, então serão apendados (M-N) zeros ao final da
seqüência x. Este procedimento não altera a forma da envoltória de X[k], apenas a define
melhor. A FFT (Fast Fourier Transform) é apenas um algoritmo que computa de forma
eficiente a DFT. Esses algoritmos são mais rápidos quando M for uma potência 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('Freqüência Normalizada'),ylabel('Magnitude')
title('Espectro de Amplitude')
subplot(2,2,3)
plot(wnorm,fase)
xlabel('Freqüência Normalizada'),ylabel('Radianos')
title('Espectro de Fase')
subplot(2,2,2)
plot(wnorm,rex)
xlabel('Freqüência Normalizada'),ylabel('Real[X(jw)]')
title('Parte Real')
subplot(2,2,4)
plot(wnorm,imx)
xlabel('Freqüência Normalizada'),ylabel('Imag[X(jw)]')
title('Parte Imaginária')
45
Comparando-se os resultados mostrados nas Figuras 10.8 com os da Figura 10.9 , pode-se ver
que a aproximação 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
Frequência Normalizada Frequência Normalizada
Espectro de Fase Parte Imaginária
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
Frequência Normalizada Frequência Normalizada
Exemplo 10.11: Computar e plotar a DFT da seqüência x[n] = u[n] -u[n-8], com 8, 16, 32, e 64
pontos.
% seqüência 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('Freqüência Normalizada'),ylabel('Magnitude')
title('N = 8')
subplot(2,2,3)
stem([(0:8)/8],abs(X1(1:9)))
xlabel('Freqüência Normalizada'),ylabel('Magnitude')
title('N = 16 (8 zeros)')
subplot(2,2,2)
stem([(0:16)/16],abs(X2(1:17)))
xlabel('Freqüência Normalizada'),ylabel('Magnitude')
subplot(2,2,4)
stem([(0:32)/32],abs(X3(1:33)))
xlabel('Freqüência Normalizada'),ylabel('Magnitude')
O programa acima computa 4 DFTs com diferentes números de pontos. A primeira com
8 pontos, a segunda com 16 pontos, sendo que destes 8 são zeros que foram apendados ao final
de x[n]. As outras duas são 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
seqüência finita, obtém-se uma amostragem mais fina da envoltória X(ejw), sem que isto altere
a sua forma.
47
Exercício 10.5: Para a seqüência 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
Freqüência Normalizada Freqüência 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
Freqüência Normalizada Freqüência Normalizada
A resposta em freqüência 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 função
complexa, a resposta em freqüência é 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 função que permite computar a resposta em freqüência a partir
dos coeficientes da equação diferença que descreve o sistema. É também possível computá-la a
partir dos coeficientes da função de transferência H(z), que é a transformada z de h[n]. Estes
coeficientes são na realidade os mesmos da equação diferença. A função é [H,w]=freqz(b,a,N).
Maiores detalhes podem ser obtidos através 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 freqüência 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('Freqüência Normalisada'),ylabel('Magnitude')
title('Resposta em Magnitude')
subplot(2,1,2)
plot(w/pi,angle(H))
xlabel('Freqüência Normalisada'),ylabel('Radianos')
title('Resposta em Fase')
Exercício 10.6: Repetir o Exemplo 10.12 usando a opção ‘whole’ em freqz. Esta opção permite
computar a resposta em freqüência 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
Freqüência Normalisada
Resposta em Fase
0.5
0
Radianos
-0.5
-1
-1.5
-2
0 0.2 0.4 0.6 0.8 1
Freqüência Normalisada
Exemplo 10.13: Para um filtro tipo média móvel, 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('Freqüência 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('Freqüência 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
Freqüência Normalisada
Resposta em Fase
2
1
Radianos
-1
-2 M=3
M=10
-3
0 0.2 0.4 0.6 0.8 1
Freqüência Normalisada
Figura 10.12: Resposta em freqüência de um filtro de média móvel, 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 função racional da forma
H(z)=N(z)/D(z), em que N(z) e D(z) são polinômios em z. As raízes de N(z) = 0 são os zeros
de H(z), e as raízes de D(z) = 0 correspondem aos pólos de H(z). H(z) é chamada de função
sistema ou função de transferência, servindo juntamente com h[n], para caracterizar os SLIs. O
Matlab possui funções que permitem decompor H(z) em seus pólos e zeros
([z,p,k]=tf2zp(num,den)), ou fazer um gráfico dos pólos e zeros no plano z ( zplane(num,den) ).
Há também uma função que permite obter H(z) na forma racional, a partir de seus pólos e zeros
( [num,den] = zp2tf(z,p,k) ).
Exemplo 10.13: Expressar a FT, dada abaixo, na forma fatorada, fazer um gráfico de p/olos e
zeros e indicar a região de convergência.
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 método da expansão em frações
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