You are on page 1of 55

INTRODUÇÃO AO USO DO MATLAB E DA

"TOOLBOX" DE SINAIS

NOTAS DE AULA

PAULO LÉO M. OSORIO

( 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

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 ).

3
4
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

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.

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];

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

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:

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

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.

8
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 [-p , p ], separados de

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

matriz. Por exemplo seja a matriz D:

9
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.

é -p 0.5 1.3 2.2 ù


ê -0.1 3.2 -5.6 1.2 ú
R = ê ú
ê 0.1p 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.

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.

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

11
>> 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:

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.

>> 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.

13
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 =

Os comandos size e length permitem determina as dimensões de matrizes e vetores,

respectivamente. Por exemplo:

>> size(x)

ans =

14
1 5

>> [m,n] = size(y)

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.

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*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-

rente da operação multiplicação matricial (*).


A divisão de vetores elemento a elemento requer o uso do símbolo ponto (.):

» 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 exponenciação de vetores também é feita elemento a elemento, podendo ser definida


de várias maneiras:

» a.^2
ans =
1 4 9 16 25

os elementos individuais de a elevados ao quadrado.

» 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 =

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)

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

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,'+')

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

Figura 7.2: Forma alternativa do gráfico x-y.

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

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:

20
» 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

21
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:

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

» A = [2 1 -3;3 -2 2;5 -3 -1];

» B = [5 5 16]';

» X = A\B

X =

-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

23
-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:

24
» 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);

»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.

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

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 =

» 4 == 3

ans =

» 4 ~= 3

ans =

A forma geral de um comando tipo if é :

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.

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 x
plot(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

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

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

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.

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

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.

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 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:

» 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

30
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


Onda Quadrada Simétrica
1.5

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

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 p/6 rad, e no intervalo [-15,15].

31
% 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.


Onda Quadrada Simétrica
1.5

0.5
Amplitude

-0.5

-1

-1.5
-15 -10 -5 0 5 10 15

Figura 10.2: Onda Quadrada Discreta com wd = p/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(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.

% 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(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;

A energia de uma seqüência de duração finita x[n] é dada por:

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

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:

¥
y[n] = h[n] * x[n] = å h[k]x[n - k]
k =- ¥

Se o sistema também for causal, então:

n
y[n] = å h[k]x[n - k]
k =0

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].

35
% 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 M

å ak y[n - k ] = å b k x[n - k ]
k =0 k =0

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.

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

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;

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')

A Figura 10.5 mostra as respostas impulsional e ao degrau do sistema do Exemplo 10.5.

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

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:

38
1 M -1
y[n] = å x[n - k]
M k =0

Exemplo 10.6: Um sinal s[n] = 3 + 4(0,95)nsen(p/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].

Sinal sem Ruido


8

6
s[n]

0
0 10 20 30 40 50
Ruido
0.5
r[n]

-0.5
0 10 20 30 40 50
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

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]

% 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)

40
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:

¥
X(e jw ) = å x[n]e
n =- ¥
- jwn

em que X(ejw) é 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].

¥
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.

% 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)

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)

plot(wnorm,imx),xlabel('Freqüência Normalizada') yla-

bel('Imag[X(jw)]'),title('Parte Imaginária')

Espectro de Amplitude Parte Real


2 Real[X(jw)] 2

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;

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')

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.

Espectro de Amplitude Parte Real


2 2

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

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]

46
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(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.

N=8 N = 32 (24 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
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

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(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.

% 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,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

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

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

A transformada z unilateral é definida como:

¥
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.

1 - 1,2071z -1 - 2,6464z -2 + 2,1213z -3


H ( z) =
1 + 0,02722z -1 - 0,4446z -2 + 0,5439z -3 + 0,324z -4

% 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)

52
zeros =

2.0000

-1.5000

0.7071

polos =

0.6364 + 0.6364i

0.6364 - 0.6364i

-0.8000

-0.5000

ganho =

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.

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

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.

z(z - 1)
H ( z) = 3 2
z - 1,1z + 0,14z + 0,08

% 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)

54
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:

z z z
H ( z ) = 2,381 - 0,667 - 1,7143
z - 0,5 z - 0,8 z + 0,2

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]

55