Download - Apost Matlab
INTRODUÇÃO AO USO DO MATLAB E DA"TOOLBOX" DE SINAIS
NOTAS DE AULA
PAULO LÉO M. OSORIO
( DEE/PUC-RIO )
2002
2
3
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
estudo de sinais e sistemas discretos.
Atualmente existe no mercado uma oferta considerável de livros que se utilizam do
Matlab para implementar exemplos e exercícios. Uma listagem desses livros pode ser
encontrada na página da Mathworks ( http://www.mathworks.com ).
4
5
1.Introdução
O Matlab foi originalmente desenvolvido para ser um "laboratório matricial".
Atualmente ele é um sistema interativo e uma linguagem de programação para a computaçã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
problemas em termos matemáticos, a tarefa de se escrever soluções computacionais no Matlab
é 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
máquina muito amigável.
2. Área de Trabalho (Workspace)
Quando o programa Matlab é acionado a mensagem abaixo irá aparecer na tela. O
prompt (>>) indica que o Matlab está esperando pela entrada de comandos.
To get started, select "MATLAB Help" from the Help menu.
>>
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.
A medida que se trabalha na janela de comando, o Matlab memoriza os comandos
entrados, bem como as variáveis que foram criadas. Desta forma, os comandos e as variáveis
6
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.
O Matlab é uma linguagem sensível ao tipo (caracter maiúsculo ou minúsculo)
utilizado, ou seja, RH, Rh, rH e rh são tratadas como variáveis diferentes.
Os comandos de Matlab são usualmente entrados em linhas separadas, embora possa-se
ter múltiplos comandos na mesma linha, desde que separados por ponto e vírgula (;). Os
comentários são entrados precedidos do sinal de porcentagem (%).
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
será mostrado no item 9.2. Estes arquivos são chamados de arquivos-M.
O comando what mostra uma listagem dos arquivos-M, disponíveis no diretório cor-
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.
3. Matrizes, Vetores e Escalares
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
às linhas e o índice j às colunas. O tamanho de uma matriz é especificado pelo número 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á várias formas de se criar uma matriz no Matlab, sendo a mais simples através de
uma lista de números entre colchetes, como mostrado abaixo.
a = 0.5;
b = [ 1 3 5 7 9];
c = [2;4;6;8;10];
7
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
estiverem no espaço de trabalho, o resultado da aplicação desse comando é o seguinte:
» whos
Name Size Bytes Class
D 3x3 72 double array
a 1x1 8 double array
b 1x5 40 double array
c 5x1 40 double array
Grand total is 20 elements using 160 bytes
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
resultado de um dado comando apareça imediatamente na tela, como por exemplo:
» b=[1 3 5 7 9]
b =
1 3 5 7 9
Nos exemplos acima a é um escalar, b é um vetor linha, c é um vetor coluna, e D é uma
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:
8
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
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 também mudar ou adicionar valores num vetor através de subscrito referenciado em
parêntesis. O seguinte comando:
B(1) = -1;
troca o primeiro elemento do vetor B de 0 para -1.
Um vetor também pode ser estendido pela definição de novos elementos. O vetor B que
possui 5 elementos passa a ter 7 elementos se o seguinte comando for executado:
B(7) = pi;
Neste caso B(6) terá , automaticamente, o valor 0.
9
Exercício 3.1: Dadas as matrizes abaixo, verifique suas dimensões através do Matlab
1. A = [1 0 0 0 1];
2. B = [3; 4; -1; 2-j];
3. C = [ 3; 4; -1; 2 -j];
4. D = [1 2 3; 4 5 6; 7 8 9];
5. E = [3 -5 0 11; 9 7 3.5 2.1; -1 4...
0 1; 3.4 5.6 7.8 9.1]
6. F = [A([1 2 3]) 5 6];
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
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 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
de 10 a 1, enquanto o vetor Z é formado pelos números no intervalo [-� , � ], separados de
�/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
matriz. Por exemplo seja a matriz D:
10
D = [1 2 3;4 5 6;7 8 9];
os comandos:
dl2 = D(2,:); % Segunda linha da matriz D.
dc1 = D(:,1); % Primeira coluna da matriz D.
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.
R =
- 0.5 1.3 2.2-0.1 3.2 -5.6 1.20.1 4.3 7.8 9.2-5.9 3.3 -4.7 -0.4
�
�
�
�
����
�
�
����
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.
11
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.
z = input('Entre com o valor de z ')
4. Operações Escalares
As operações aritméticas entre dois escalares são mostrada na Tabela 1
Operação Forma Algébrica MATLAB
Adição a + b a + b
Subtração a - b a - b
Multiplicação a � b a * b
Divisão à direita a / b a/b
Divisão à esquerda b \ a a \ b
Exponenciação ab a ^ b
Tabela 1: Operações aritméticas entre dois escalares
O resultado de uma operação que não é relacionada diretamente a uma variável é
automaticamente colocado numa variável chamada de ans, que pode ser usada como qualquer
outra variável, como por exemplo:
>> 3*pi^2
ans =
29.6088
>> sqrt(ans)
ans =
5.4414
12
>> x = (ans-3)/2
x =
1.2207
O Matlab possui muitas funções do tipo “built-in”, como por exemplo:
>> 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:
>> help ans
ANS Most recent answer.
ANS is the variable created automatically when expressions
are not assigned to anything else. ANSwer.
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:
13
>> 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.
>> format compact
>> pi
ans =
3.1416
Uma outra formatação é o format long, que apresenta o resultado com 15 digitos.
>> format long
>> 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.
14
5. Criação de Matrizes e Vetores
O Matlab possui comandos que permitem a criação de algumas matrizes e vetores especi-
ais:
zeros(m,n) cria uma matriz m x n de zeros.
ones(m,n) cria uma matriz m x n de uns.
eye(m,n) cria uma matriz identidade m x n.
diag(v) cria uma matriz n x n com v na diagonal principal (v é um vetor de
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 =
1
1
1
1
1
Os comandos size e length permitem determina as dimensões de matrizes e vetores,
respectivamente. Por exemplo:
>> size(x)
ans =
15
1 5
>> [m,n] = size(y)
m =
5
n =
1
>> lx = length(x)
lx =
5
>> ly = length(y)
ly =
5
Deve-se observar que o comando length não consegue diferenciar se o vetor é linha
ou coluna.
6. Operações com Vetores
Sejam os vetores a e b dados por:
» 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*2ans =2 4 6 8 10
16
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+bans =2 5 8 11 14» ans-aans =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.*bans =1 6 15 28 45
Os vetores a e b foram multiplicados elemento a elemento usando o operador (.*), que é dife-
rente da operação multiplicação matricial (*).
A divisão de vetores elemento a elemento requer o uso do símbolo ponto (.):
» a./bans =1.0000 0.6667 0.6000 0.5714 0.5556» b.\aans =1.0000 0.6667 0.6000 0.5714 0.5556
A exponenciação de vetores também é feita elemento a elemento, podendo ser definida
de várias maneiras:
» a.^2ans =1 4 9 16 25
os elementos individuais de a elevados ao quadrado.
» 2.^a
17
ans =
2 4 8 16 32
neste caso o escalar 2 é elevado a uma potência dada por cada elemento de a.» a.^bans =
1 8 243 16384 1953125
aqui cada elemento do vetor a é elevado a uma potência dada por cada elemento do vetor b. A
Tabela 2 mostra um resumo das operações aritméticas com vetores.
Operação Forma Algébrica MATLAB
Adição a + b a + b
Subtração a - b a - b
Multiplicação a � b a.* b
Divisão à direita a / b a. / b
Divisão à esquerda b \ a a. \ b
Exponenciação ab a. ^ b
Tabela 2: Operações aritméticas elemento a elemento entre dois vetores
7. Gráficos
O Matlab oferece um processador gráfico com extensiva capacidade de gerar toda a
gama de gráficos, e ao mesmo tempo simplificando muito o seu uso. Pode-se gerar gráficos
com apenas um comando. O gráfico mais simples é o de um conjunto de pontos no plano x-y.
Por exemplo:
» x = 1:6; y = [-1 1/4 1 pi 2 1]; plot(x,y)
18
O gráfico resultante é mostrado na Figura 1. Observe que o Matlab une os pontos do
gráfico por meio de retas.
Figura 7.1 Gráfico x-y
Um gráfico alternativo, mostrado na Figura 7.2, pode ser obtido da seguinte forma:
» plot(x,y,'+')
Figura 7.2: Forma alternativa do gráfico x-y.
1 1.5 2 2.5 3 3.5 4 4.5 5 5.5 6-1
-0.5
0
0.5
1
1.5
2
2.5
3
3.5
1 1.5 2 2.5 3 3.5 4 4.5 5 5.5 6-1
-0.5
0
0.5
1
1.5
2
2.5
3
3.5
19
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)
20
Figura 7.3: Gráficos múltiplos numa mesma janela.
8. Operações com Matrizes
As operações de multiplicação por escalar, soma e subtração de matrizes são efetuadas
elemento a elemento de forma similar aos vetores, como visto anteriormente. A operação de
transposição de matrizes ou vetores é feita por meio do ( ' ), ou seja, b = a' faz com que a
matriz b seja a transposta da matriz a.
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);
em que P e Q são ambos vetores linha ou vetores coluna.
O produto de AB de duas matrizes A e B só existirá se o número de colunas de A for
idêntico ao número de linhas de B. Por exemplo:
0 2 4 6 8-1
-0.5
0
0.5
1
0 2 4 6 80
0.2
0.4
0.6
0.8
1
0 2 4 6-1
-0.5
0
0.5
1
0 2 4 60
0.2
0.4
0.6
0.8
1
21
» A = [0 1 2;-1 3 5];
» B = [1 2 3;-1 0 5;4 5 -2];
» C = A*B
C =
7 10 1
16 23 2
» D = B*A
??? Error using ==> *
Inner matrix dimensions must agree.
Do exemplo acima pode-se ver que o Matlab não executa a operação D=BA, pois ela não
satisfaz as condições para multiplicação de duas matrizes.
Do que foi visto acima é possível simplificar a operação 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 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 =
6.2500 -4.7500 -2.5000
-4.5000 3.5000 2.0000
22
1.2500 -0.7500 -0.5000
» B*inv_B
ans =
1.0000 0.0000 0.0000
0.0000 1.0000 0.0000
0.0000 0.0000 1.0000
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),
como mostrado no exemplo abaixo:
A =
1 2 3
-1 0 5
4 5 -2
» det(A)
ans =
-4
Vamos supor que se deseje resolver o seguinte sistema de equações lineares:
2x1 + x2 - 3x3 = 5
3x1 - 2x2 + 2x3 = 5
5x1 - 3x2 - x3 = 16
Este sistema pode ser escrito na forma matricial, como:
23
AX = B
A x
= 2 1 -33 -2 25 -3 -1
X = xx B =
55
16
1
2
�
�
���
�
�
���
�
�
���
�
�
���
�
�
���
�
�
���3
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
» A = [2 1 -3;3 -2 2;5 -3 -1];
» B = [5 5 16]';
» X = A\B
X =
1
-3
-2
A outra solução utiliza a matriz inversa, ou seja:
X = A-1B
» A = [2 1 -3;3 -2 2;5 -3 -1];
» B = [5 5 16]';
» X = inv(A)*B
X =
1.0000
24
-3.0000
-2.0000
9. Programação em Matlab
A solução de problemas mais complexos pode ser implementada através da programa-
ção na própria linguagem do Matlab. O programa pode ser escrito num arquivo texto com
extensão .m. O Matlab fornece um editor de textos ASCII que permite criar e editar tais
arquivos.
9.1 “Loops” e Operações Condicionais
A linguagem de programação do Matlab fornece comandos para “loops” e operações
condicionais. Há dois tipos de “loops”: um é do tipo for e outro é do tipo while. Um “loop”:
tipo for repete as instruções dentro do “loop” à medida que o índice do “loop” assume os
valores de um dado vetor linha. Por exemplo:
» for k = [1 2 3]
x(k) = k^2;
end
» x
x =
1 4 9
A forma mais comum de escrever esse “loop” seria:
25
» for k = 1:3
x(k) = k^2;
end
Observe que 1:3 é eqüivalente a [1 2 3].
É importante salientar que em termos de eficiência deve-se sempre procurar usar
funções tipo “built-in” e operadores sempre que possível. Isto deve-se ao fato que os “scripts” e
as funções definidas pelo o usuário ( e a maioria das funções existentes nas “toolboxes” ) são
interpretadas, em vez de compiladas. Isto significa que quando um arquivo .m é executado,
cada instrução é lida e depois executada, em vez de todo o programa ser compilado na
linguagem da máquina para depois ser executado. Por isso que muitas vezes os programas
escritos em Matlab são muito mais lentos que os escritos em outras linguagens como C e
Fortran, por exemplo. As duas seqüências de comandos abaixo dão o mesmo resultado:
» t = (0: .0001:10;» y=sin(t);
e
»t = 0:.0001:10;»for i=1:length(t) y(i)=sin(t(i));end
Entretanto, no meu computador, a segunda implementação é 25 vezes mais lenta que a
primeira. Isto deve-se ao fato que a primeira seqüência de comandos utiliza a função seno
vetorizada ( ‘built-in” ), ou seja, as operações com vetores serão sempre mais eficientes que os
“loops” no Matlab.
O “loop” while se repete enquanto uma dada expressão for verdadeira. O exemplo
abaixo mostra um algoritmo para calcular a raiz quadrada do valor de x. A variável eps é
fornecida pelo Matlab e serve para medir a precisão das operações em ponto flutuante. Seu
valor é 2.2204e-016.
26
» 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
As operações condicionais no Matlab são similares às de outras linguagens de alto
nível. Os operadores lógicos são: <, >, <=, >=, = = (igual), ~ = (diferente). Estes operadores são
binários e retornam os valores 0 e 1 ( para argumentos escalares ).
» 4 > 3
ans =
1
» 4 < 3
ans =
0
» 4 == 3
ans =
0
» 4 ~= 3
ans =
1
A forma geral de um comando tipo if é :
27
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.
9.2 Scripts e Funções
Um “script” é simplesmente uma coleção de comandos do Matlab escritos num arquivo
tipo m ( um arquivo texto com extensão .m). Ao se entrar no “prompt” com o nome do arquivo
(sem a extensão .m), os comandos são executados como se tivessem sido entrados diretamente
no espaço de trabalho do Matlab.
Por exemplo, vamos supor que o arquivo seno.m contenha o script mostrado abaixo.
% Programa para gerar um gráfico da função seno
% Geração 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 xplot(x,y),title('Gráfico do Seno')xlabel ('Ângulo em rad'),ylabel('Amplitude'),grid
Se entrarmos no espaço de trabalho com os seguintes comandos:
» N=50; a=1;
» seno
28
a Figura 9.1 irá aparecer.
Figura 9.1: Gráfico da função sen(x).
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:
function [saida1,saida2,....] = nomedafuncao(entrada1,entrada2,....)
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
0 1 2 3 4 5 6 7-1
-0.8
-0.6
-0.4
-0.2
0
0.2
0.4
0.6
0.8
1Gráfico do Seno
Ângulo em rad
Am
plitu
de
29
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.
function [m,v] = estat(x)% Função que computa a média e a variância de x
nx = length(x);m = sum(x)/nx;v = sum((x - m).^2)/(nx-1);
Para testar a função:
» x = rand(1,100);
» [med,var] = estat(x)
med =
0.4652
var =
0.0778
30
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.
10.1 Geração de Sinais Elementares
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 �t, 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 �t = 0,001s (fs = 1 kHz), usam-se os
seguintes comandos:
» fs = 1000; % freqüência de amostragem
» t = 0:1/fs:1; % vetor com amostras separadas de 0,001s (1 ms)
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%).
% Programa para gerar uma onda quadrada
A = 1; % amplitude de pico
f0 = 10; % freqüência fundamental em Hz
31
cr = 50; % onda quadrada simétrica em %
fs = 1000; % freqüência de amostragem em Hz
t = 0:1/fs:1; % gera o eixo do tempo
onda_quadrada = A*square(2*pi*f0*t,cr);
plot(t,onda_quadrada), xlabel('t (s)'),ylabel('Amplitude')
title('Onda Quadrada Simétrica')
axis([0 1 -1.5 1.5]);
A onda quadrada resultante é mostrada na Figura 10.1
Figura 10.1: Onda Quadrada Simétrica
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 �/6 rad, e no intervalo [-15,15].
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1-1.5
-1
-0.5
0
0.5
1
1.5
Am
plitu
de
Onda Quadrada Simétrica
32
% Programa para gerar uma onda quadrada discreta
A = 1; % amplitude de pico
wd = pi/6; % freqüência fundamental em rad
cr = 50; % onda quadrada simétrica em %
n = -15:15; % gera os índices das amostras
dquadrada = A*square(wd*n,cr);
stem(n,dquadrada), xlabel('n'),ylabel('Amplitude')
title('Onda Quadrada Simétrica')
axis([-15 15 -1.5 1.5]);
A onda quadrada discreta é mostrada na Figura 10.2.
Figura 10.2: Onda Quadrada Discreta com wd = �/6
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(�t+�) e cos(�t+�).
-15 -10 -5 0 5 10 15-1.5
-1
-0.5
0
0.5
1
1.5
Am
plitu
de
Onda Quadrada Simétrica
33
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 �/4, no intervalo [-10,10]. Considere a fase inicial como sendo -�/3.
Exemplo 10.3: Gerar o sinal x(t) = 5e-4t sen(20�t). Considere a freqüência de amostragem como
sendo de 1 kHz.
% Programa para gerar uma senóide amortecida.
fs = 1000; % freq. de amostragem
fo = 10; % freq. fundamental
a = -4; % coef. da exponencial
fi = 0; % fase inicial
A = 5; % amplitude da senóide
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('Senóide Amortecida')
axis([0 1 -6 6]);
A Figura 10.3 mostra a senóide amortecida gerada pelo programa acima.
Exercício 10.4: Gere a seqüência senoidal amortecida dada por x[n] = 5(0,8)nsen(�n/4), no
intervalo [0,20].
34
Figura 10.3: Senóide Amortecida
A geração de seqüências tipo delta ( �[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 �[n-6] com 50 amostras, pode-se fazer assim:
delta = zeros(1,50);
delta(1,6) = 1;
A energia de uma seqüência de duração finita x[n] é dada por:
����
��
1-N
0n
21-N
0n
* |x[n]| ][x[n]x nEx
0 0.2 0.4 0.6 0.8 1-6
-4
-2
0
2
4
6
t (s)
Am
plitu
de
Senóide Amortecida
35
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
0n
2|x[n]|N1 xP
10.2 Sistemas Discretos
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:
��
��
��
-kk]-h[k]x[n x[n]*h[n] ][ny
Se o sistema também for causal, então:
��
�
n
ny0k
k]-h[k]x[n ][
A expressão acima pode ser facilmente computada usando-se a função conv(h,x).
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].
36
% Programa para computar a convolução de duas seqüências
% h[n]=(0.85)^n e x[n]=u[n] - u[n-15]
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
k
M
kk knxknya
0 0k ][b ][
O Matlab possui uma função 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 equação diferença acima.
37
Figura 10.4: Resposta de um SLI a uma entrada tipo pulso.
Exemplo 10.5: Determinar as respostas impulsional e ao degrau do sistema descrito pela
equação diferença y[n] - 1,2728y[n-1] + 0,81y[n-2] = 0,5372x[n].
% Programa para computar as respostas impulsional e ao degrau
%do sistema descrito por y[n]-1.2728y[n-1]+0.81y[n-2] =
%0,532x[n].
N = 50; % número de amostras
b = 0.5372; a = [1 -1.2728 0.81]; % coeficientes da ED
imp = [1 zeros(1,N-1)]; % gera o impulso
deg = [ones(1,N)]; % gera o degrau unitário
h = filter(b,a,imp); % cômputo da resposta impulsional
y = filter(b,a,deg); % cômputo da resposta ao degrau
n = 0:N-1;
0 5 10 15 20 25 30 35 400
0.5
1
x[n]
Entrada
0 5 10 15 20 25 30 35 400
0.5
1
h[n]
Resposta Impulsional
0 5 10 15 20 25 30 35 400
5
10
y[n]
Saída
38
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')
A Figura 10.5 mostra as respostas impulsional e ao degrau do sistema do Exemplo 10.5.
Figura 10.5: Respostas impulsional e ao degrau do sistema do Exemplo 10.4.
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:
0 10 20 30 40 50-0.5
0
0.5
1
n
h[n]
Resposta Impulsional
0 10 20 30 40 500
0.5
1
1.5
2
n
y[n]
Resposta ao Degrau
39
��
�
1-M
0kk]-x[n
M1 ][ny
Exemplo 10.6: Um sinal s[n] = 3 + 4(0,95)nsen(�/8 n) é contaminado por um ruído com
distribuição uniforme entre -0,5 e 0,5.Será utilizado um filtro de média móvel para diminuir os
efeitos do ruído aditivo.
A Figura 10.6 mostra as duas seqüências s[n] e r[n].
Figura 10.6: Sinal s[n] e ruído r[n] com ditribuição uniforme
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
0 10 20 30 40 500
2
4
6
8
s[n]
Sinal sem Ruido
0 10 20 30 40 50-0.5
0
0.5
n
r[n]
Ruido
40
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.
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]
% Programa que exemplifica o uso de filtros de média móvel
N = 50;
n = 0:N-1;
s = (4*sin(n*pi/8).*(.95).^n) + 3*ones(1,N);
r = rand(1,N) - 0.5; % ruído com distribuição uniforme
figure(1)
subplot(2,1,1)
stem(n,s),xlabel('n'),ylabel('s[n]'),title('Sinal sem Ruido')
subplot(2,1,2)
r[n]s[n]x[n]
0 10 20 30 40 50-2
0
2
4
6
n
Ampl
itude
s
s[n]y[n]
0 10 20 30 40 50-2
0
2
4
6
n
Ampl
itude
s
41
stem(n,r),xlabel('n'),ylabel('r[n]'),title('Ruido')
x = s + r;
M = 3; % número de atrasos do filtro
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]);
10.3 Análise de Fourier
A transformada de Fourier de uma seqüência discreta é definida como:
��
��
�
-n
nj-j x[n]e )X(e ��
em que X(ej�) é uma função contínua e complexa.
Exemplo 10.7: Calcular a transformada de Fourier da seqüência x[n] = (0,5)n u[n].
5,05,011)5,0()(
0 �
�
�
����
�
�
�
�
�
�
��
j
j
nj
njnj
ee
eeeX
42
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-j�).
No Exemplo 10.7, como x[n] é uma seqüência de duração infinita não se pode usar o
Matlab para computar X(ej�) diretamente. Entretanto, pode-se computar X(ej�) usando-se a
expressão acima, no intervalo [0,�] 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(ej�), bem como as suas
partes real e imaginária.
% Programa para computar e plotar os espectros de amplitude e
% fase da DTFT de x[n]=(0,5)^n u[n], a partir da expressão
% X(w)= exp(jw)/[exp(jw) - 0,5].
N = 256;
w = (0:N-1)*pi/N; % eixo das freqüências dividido em N pontos
ex = exp(j*w);
X = ex./(ex - .5*ones(1,N));
ampl = abs(X); % cômputo do módulo de X(jw)
fase = angle(X); % cômputo da fase de X(jw)
rex = real(X);
imx = imag(X);
wnorm = w/pi; % normalização do eixo das freqüências
subplot(2,2,1)
plot(wnorm,ampl)
xlabel('Freqüência normalizada') ,ylabel('Magnitude'), ti-
tle('Espectro de Amplitude')
subplot(2,2,3)
43
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)
plot(wnorm,imx),xlabel('Freqüência Normalizada') yla-
bel('Imag[X(jw)]'),title('Parte Imaginária')
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 � corresponde ao valor 1. Muitos autores chamam este ponto
0 0.5 10.5
1
1.5
2
Frequência Normalizada
Mag
nitu
de
Espectro de Amplitude
0 0.5 1-0.6
-0.4
-0.2
0
Frequência Normalizada
Rad
iano
s
Espectro de Fase
0 0.5 10.5
1
1.5
2
Frequência Normalizada
Rea
l[X(jw
)]Parte Real
0 0.5 1-0.8
-0.6
-0.4
-0.2
0
Frequência Normalizada
Imag
[X(jw
)]
Parte Imaginária
44
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(ej�). 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:
1]-N[0, k x[n]e ][1
0n
N2-
����
�
N knkX
�
Pode-se mostrar que os X[k] são amostras de X(ej�) igualmente espaçadas de 2�/N no
círculo unitário, ou seja X(ej�) é a envoltória das amostras representadas por X[k].
Exemplo 10.9: Repetir o Exemplo 10.7, utilizando a DFT para computar X(ej�). 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).
45
% Programa para computar a transformada de Fourier usando o
% algoritmo de FFT
N = 256;
x = (.5).^(0:N-1); % geração da seqüência x[n]
Xc = fft(x); % cômputo da DFT de x[n]
X = Xc(1:N/2+1); % freqüências no intervalo [0,pi]
ampl = abs(X); % cômputo do módulo de X(jw)
fase = angle(X); % cômputo da fase de X(jw)
rex = real(X);
imx = imag(X);
wnorm = 0:2/N:1; % normalização do eixo das freqüências
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')
46
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.
Figura 10.9: Gráficos da transformada de Fourier obtidos através da DFT.
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.
% Programa que ilustra o efeito de se apendar zeros a uma
% seqüência finita
x = ones(1,8); % x[n]=u[n]-u[n-8]
XO = fft(x); % fft com 8 pontos
X1 = fft(x,16); % fft com 16 pontos, 8 zeros apendados a x[n]
0 0.5 10.5
1
1.5
2
Frequência Normalizada
Mag
nitu
de
Espectro de Amplitude
0 0.5 1-0.6
-0.4
-0.2
0
Frequência Normalizada
Rad
iano
s
Espectro de Fase
0 0.5 10.5
1
1.5
2
Frequência NormalizadaR
eal[X
(jw)]
Parte Real
0 0.5 1-0.8
-0.6
-0.4
-0.2
0
Frequência Normalizada
Imag
[X(jw
)]
Parte Imaginária
47
X2 = fft(x,32); % fft com 32 pontos, 24 zeros apendados a x[n]
X3 = fft(x,64); % fft com 64 pontos, 56 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')
title('N = 32 (24 zeros)')
subplot(2,2,4)
stem([(0:32)/32],abs(X3(1:33)))
xlabel('Freqüência Normalizada'),ylabel('Magnitude')
title('N = 64 (56 zeros)')
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(ej�), sem que isto altere
a sua forma.
48
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.
Figura 10.10: O efeito de se apender zeros ao final de uma seqüência finita
10.4 Resposta em Freqüência dos Sistemas Lineares Invariantes e Discretos (SLID)
A resposta em freqüência de um SLID é dada por H(ej�), que nada mais é do que a
transformada de Fourier da resposta impulsional h[n] do sistema. Como H(ej�) é uma função
complexa, a resposta em freqüência é composta da resposta em magnitude, ou em amplitude,
que é |H(ej�)|, e da resposta em fase que é o argumento de H(ej�).
0 0.5 10
2
4
6
8
Freqüência Normalizada
Mag
nitu
deN = 8
0 0.5 10
2
4
6
8
Freqüência Normalizada
Mag
nitu
de
N = 16 (8 zeros)
0 0.5 10
2
4
6
8
Freqüência Normalizada
Mag
nitu
de
N = 32 (24 zeros)
0 0.5 10
2
4
6
8
Freqüência Normalizada
Mag
nitu
deN = 64 (56 zeros)
49
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.
% Programa para computar a resposta em freqüência do SLI
% descrito por: % y[n] - 1,2728y[n-1] + 0,81y[n-2] = 0,532x[n].
b = 0.532;
a = [1 -1.2728 .81];
N = 128; % # de pontos para o cômputo da FFT
[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,2�]. O que pode ser dito em termos de
simetria das resposta em magnitude e fase?
50
Figura 10.11: Respostas em Magnitude e Fase do sistema do Exemplo 10.12.
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.
% Programa para computar a resposta em freqüência do SLI
% descrito por: y[n] ={x[n] + x[n-1] + x[n-2] +...+ x[n-M]}/M.
% Este sistema é um filtro de média móvel
b1 = [1 1 1]/3; b2 = ones(1,10)/10;
a = 1;
N = 128; % # de pontos para o cômputo da FFT
0 0.2 0.4 0.6 0.8 10
1
2
3
4
Freqüência Normalisada
Mag
nitu
de
Resposta em Magnitude
0 0.2 0.4 0.6 0.8 1-2
-1.5
-1
-0.5
0
0.5
Freqüência Normalisada
Rad
iano
s
Resposta em Fase
51
[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');
Figura 10.12: Resposta em freqüência de um filtro de média móvel, com M=3, e M=10.
M=3 M=10
0 0.2 0.4 0.6 0.8 10
0.2
0.4
0.6
0.8
1
Freqüência Normalisada
Mag
nitu
de
Resposta em Magnitude
M=3 M=10
0 0.2 0.4 0.6 0.8 1-3
-2
-1
0
1
2
Freqüência Normalisada
Rad
iano
s
Resposta em Fase
52
10.5 Transformada z
A transformada z unilateral é definida como:
��
�
�
�
0x[n]z )(
n
nzX
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.
4-3-2-1-
-3-2-1
0,324z 0,5439z 0,4446z - 0,02722z 12,1213z 2,6464z - 1,2071z - 1 )(
���
��zH
% Programa para determinar na forma fatorada uma função
% racional e fazer um diagrama de pólos e zeros
num = [1 -1.2071 -2.6464 2.1213];
den = [1 0.0272 -0.4446 0.5439 0.3240];
[zeros polos ganho] = tf2zp(num,den)
zplane(num,den)
53
zeros =
2.0000
-1.5000
0.7071
polos =
0.6364 + 0.6364i
0.6364 - 0.6364i
-0.8000
-0.5000
ganho =
1
A figura 10.13 mostra o diagrama de pólos e zeros de H(z). A região de convergência é
o exterior do círculo de raio | 0,6364 + 0,6364i | = 0,9, que corresponde ao módulo dos pólos
mais afastados da origem, para uma solução causal.
A transformada inversa de H(z) é a resposta impulsional h[n]. Esta transformada pode
ser computada de diversas maneiras, porém no caso em que H(z) for racional, é mais
conveniente utilizar o método da expansão em frações parciais. Com este método é possível se
obter uma expressão para h[n] na forma fechada. O Matlab possui a função
[r,p,k]=residuez(num,den), que permite computar os pólos de H(z), os coeficientes da
expansão em frações parciais.
54
Figura 10.13: Diagrama de pólos e zeros de H(z) do Exemplo 10.13.
Exemplo 10.14: Determinar h[n] da FT dada abaixo, pelo método da expansão em frações
parciais.
0,08 0,14z 1,1z- z1) - z(z )( 23
��
�zH
% Programa para determinar os pólos e os coeficientes da
% expansão em frações parciais de uma função racional em z.
num = [0 1 -1];
den = [1 -1.1 .14 .08];
[coeficientes polos constante] = residuez(num,den)
-1.5 -1 -0.5 0 0.5 1 1.5 2-1.5
-1
-0.5
0
0.5
1
1.5
Real part
Imag
inar
y pa
rt
55
coeficientes =
-0.6667
2.3810
-1.7143
polos =
0.8000
0.5000
-0.2000
constante =
[]
A expansão em frações parciais será da forma:
0,2 zz1,7143-
0,8 - zz0,667 -
0,5 - zz2,381 )(
�
�zH
o que resulta numa transformada inversa causal dada por:
h[n] = [2,381(0,5)n -0,667(0,8)n - 1,7143(-0,2)n]u[n]