Você está na página 1de 55

INTRODUO AO USO DO MATLAB E DA

"TOOLBOX" DE SINAIS

NOTAS DE AULA

PAULO LO M. OSORIO

( DEE/PUC-RIO )

2002
2
AVISO

Estas notas destinam-se aqueles que esto usando o Matlab pela primeira vez. Os

exemplos apresentados utilizam uma pequena parcela das funes disponveis e tem por obje-

tivo familiarizar o usurio com as funes e os comandos mais comuns. H tambm uma

introduo ao uso das principais funes da "toolbox signal", que de grande utilidade no

estudo de sinais e sistemas discretos.

Atualmente existe no mercado uma oferta considervel de livros que se utilizam do

Matlab para implementar exemplos e exerccios. Uma listagem desses livros pode ser

encontrada na pgina da Mathworks ( http://www.mathworks.com ).

3
4
1.Introduo

O Matlab foi originalmente desenvolvido para ser um "laboratrio matricial".

Atualmente ele um sistema interativo e uma linguagem de programao para a computao

tcnica e cientfica em geral. A sua filosofia de processamento est baseada em matrizes. Como

os comandos do Matlab so muito similares maneira como expressamos as solues dos

problemas em termos matemticos, a tarefa de se escrever solues computacionais no Matlab

muito mais rpida do que escrever programas em linguagens de alto nvel, tais como

FORTRAN e C. Alm disto, ele possui facilidades grficas que tornam a interface homem

mquina muito amigvel.

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 grfica

onde so gerados os grficos. As duas janelas so apagadas quando do incio de cada sesso de

Matlab. A janela de comando pode ser limpa durante uma sesso de trabalho atravs do
comando clc. Para se limpar a janela grfica usado o comando clg.

A medida que se trabalha na janela de comando, o Matlab memoriza os comandos

entrados, bem como as variveis que foram criadas. Desta forma, os comandos e as variveis

5
ficam residentes no espao de trabalho do Matlab, e podem ser chamados sempre que se
desejar. Para se limpar o espao de trabalho usa-se o comando clear.

O Matlab uma linguagem sensvel ao tipo (caracter maisculo ou minsculo)

utilizado, ou seja, RH, Rh, rH e rh so tratadas como variveis diferentes.

Os comandos de Matlab so usualmente entrados em linhas separadas, embora possa-se

ter mltiplos comandos na mesma linha, desde que separados por ponto e vrgula (;). Os

comentrios so entrados precedidos do sinal de porcentagem (%).

Alm de executar comandos que so entrados pelo teclado, o Matlab tambm capaz de
executar seqncias de comandos que esto armazenadas em arquivos com extenso .m, como

ser mostrado no item 9.2. Estes arquivos so chamados de arquivos-M.


O comando what mostra uma listagem dos arquivos-M, disponveis no diretrio cor-

rente. Estes arquivos podem ser vistos por meio do comando type. Se o arquivo especificado

com este comando no tiver uma extenso, ele assumido como sendo do tipo M.

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 so matrizes diferentes. O ndice i se refere

s linhas e o ndice j s colunas. O tamanho de uma matriz especificado pelo nmero de

linhas e colunas. Uma matriz que possui somente uma linha ou somente uma coluna chamada

de vetor. Por outro lado, se uma matriz possuir somente uma linha e uma coluna, ela um

escalar.

H vrias formas de se criar uma matriz no Matlab, sendo a mais simples atravs de

uma lista de nmeros entre colchetes, como mostrado abaixo.

quando se coloca ; e depois d enter, o resultado nao


aparece, mas fica armazenado.
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 variveis existentes

no espao de trabalho global, bem como os seus tipos e dimenses. Se as variveis acima

estiverem no espao de trabalho, o resultado da aplicao desse comando o seguinte:

whos

Name Size Bytes Class

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 esto finalizadas por ponto e

vrgula (;). Isto evita que as matrizes sejam impressas na tela. A omisso do (;), faz com que o

resultado de um dado comando aparea imediatamente na tela, como por exemplo:

b=[1 3 5 7 9]

b =

1 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 nmeros dentro dos colchetes ou esto separados por vrgulas ou

por espaos. O ponto e vrgula separa as linhas da matriz. Uma forma alternativa de se entrar a
matriz D a seguinte:

7
D = [1 2 3

4 5 6

7 8 9];

O Matlab permite tambm se definir uma matriz a partir de outra j existente. Por

exemplo, considere os seguintes comandos:

A = [1 .53 1-2*j];

B = [0 -3 A];

Isto equivalente a:

B = [ 0 -3 1 .53 1-2*j];

Pode-se tambm mudar ou adicionar valores num vetor atravs de subscrito referenciado em

parntesis. O seguinte comando:

B(1) = -1;

troca o primeiro elemento do vetor B de 0 para -1.

Um vetor tambm pode ser estendido pela definio 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
Exerccio 3.1: Dadas as matrizes abaixo, verifique suas dimenses atravs 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 tambm pode ser criado usando-se o comando (:). Se (:) for usado para se-

parar dois nmeros inteiros m e n, ele ir gerar todos os nmeros inteiros entre m e n. Por

exemplo, o comando abaixo gera um vetor chamado X com os inteiros de 1 a 10.

X = 1:10;

Se o operador (:) for usado para separar trs nmeros a, b, e c , ento o comando gera valores

entre a e c com o incremento dado por b. Nos exemplos abaixo o vetor Y contm os nmeros

de 10 a 1, enquanto o vetor Z formado pelos nmeros no intervalo [-p , p ], separados de

p/10.

Y = 10:-1:1;

Z = -pi:pi/10:pi;

O comando (:) tambm pode ser usado para selecionar submatrizes a partir de uma outra

matriz. Por exemplo seja a matriz D:

9
D = [1 2 3;4 5 6;7 8 9];

os comandos: submatriz d12 que tem a segunda linha de D e


todas colunas dessa segunda linha, ou seja,
d12= 4 5 6

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]
dd quer dizer que quero somente as linhas de 2 ate 3 e
somente as colunas de 1 ate 2.
Exerccio 3.2: Dada a matriz R abaixo, verifique as suas respostas usando o Matlab.

-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 vlido se ter uma matriz vazia. Por exemplo, uma matriz vazia pode ser
gerada com o seguinte comando:

a = [ ]

Deve-se observar que uma matriz vazia diferente de uma matriz que s contenha zeros.

10
Os valores de uma matriz, vetor, ou escalar tambm podem entrar atravs do comando
input. Isto muito til quando se tem o programa num arquivo tipo M.

z = input('Entre com o valor de z ')

4. Operaes Escalares

As operaes aritmticas entre dois escalares so mostrada na Tabela 1

Operao Forma Algbrica MATLAB


Adio a+b a+b
Subtrao a-b a-b
Multiplicao ab a*b
Diviso direita a/b a/b
Diviso esquerda b\a a\b
Exponenciao ab a^b
Tabela 1: Operaes aritmticas entre dois escalares

O resultado de uma operao que no relacionada diretamente a uma varivel


automaticamente colocado numa varivel chamada de ans, que pode ser usada como qualquer

outra varivel, 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 funes 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 nmero muito grande de funes, para entend-las o melhor
usar o comando help, que pode ser invocado a partir da janela do Matlab, ou como uma
linha de comando do tipo help < nome do comando>. Por exemplo:

>> 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 ateno para a maneira como os valores numricos das variveis so
mostrados no Matlab. O seu controle feito atravs do comando format. O default a
formatao chamada de format short, ou seja:

12
>> pi

ans =

3.1416

H vrias formas possveis de formatao, que podem ser vistas usando o comando
help format. Por exemplo o comando format compact suprime a linha extra que

aparece nas outras formataes. Esta formatao a utilizada na maioria dos exemplos
apresentados.

>> format compact format loose volta


com a linha
>> pi

ans =

3.1416

Uma outra formatao 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 preciso dupla em todas as
suas operaes, e que o comando format altera apenas a forma com que os resultados so

apresentados.

13
5. Criao de Matrizes e Vetores

O Matlab possui comandos que permitem a criao de algumas matrizes e vetores especi-
ais:

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 funes zeros e ones pode-se criar vetores, como por exemplo:

>> x = zeros(1,5)

x =

0 0 0 0 0

>> y = ones(5,1)

y =

Os comandos size e length permitem determina as dimenses 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 no consegue diferenciar se o vetor linha


ou coluna.

6. Operaes com Vetores

Sejam os vetores a e b dados por:

a = 1:5; b = 1:2:9;

As operaes adio, subtrao, multiplicao, e diviso de um vetor por um escalar so apli-


cadas a todos os elementos do vetor:

a*2
ans =
2 4 6 8 10

15
As operaes matemticas entre vetores no so to simples quanto aquelas entre ve-
tores e escalares. Quando dois vetores forem de mesmo tamanho, as operaes de adio,
subtrao, multiplicao, e diviso so aplicadas elemento a elemento. Por exemplo:

a+b
ans =
2 5 8 11 14
ans-a
ans =
1 3 5 7 9

A multiplicao e diviso elemento por elemento feita de maneira similar, exceto por
uma pequena alterao na notao:

a.*b
ans =
1 6 15 28 45

Os vetores a e b foram multiplicados elemento a elemento usando o operador (.*), que dife-

rente da operao multiplicao matricial (*).


A diviso de vetores elemento a elemento requer o uso do smbolo 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 exponenciao de vetores tambm feita elemento a elemento, podendo ser definida


de vrias 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 potncia dada por cada elemento de a.
a.^b
ans =

1 8 243 16384 1953125

aqui cada elemento do vetor a elevado a uma potncia dada por cada elemento do vetor b. A

Tabela 2 mostra um resumo das operaes aritmticas com vetores.

Operao Forma Algbrica MATLAB


Adio a+b a+b
Subtrao a-b a-b
Multiplicao ab a.* b
Diviso direita a/b a. / b
Diviso esquerda b\a a. \ b
Exponenciao ab a. ^ b
Tabela 2: Operaes aritmticas elemento a elemento entre dois vetores

7. Grficos

O Matlab oferece um processador grfico com extensiva capacidade de gerar toda a


gama de grficos, e ao mesmo tempo simplificando muito o seu uso. Pode-se gerar grficos
com apenas um comando. O grfico mais simples o de um conjunto de pontos no plano x-y.
Por exemplo: aqui eu nao tenho uma funo, entao quem define o par (x,y)
sao pontos 1, 2, 3, 4, 5, e 6 por parte de x.

x = 1:6; y = [-1 1/4 1 pi 2 1]; plot(x,y)

17
O grfico resultante mostrado na Figura 1. Observe que o Matlab une os pontos do
grfico por meio de retas.

3.5

2.5

1.5

0.5

-0.5

-1
1 1.5 2 2.5 3 3.5 4 4.5 5 5.5 6

Figura 7.1 Grfico x-y

exemplo: x=[-5:5];plot(x,x.^2) vai gerar uma parabola.


Um grfico alternativo, mostrado na Figura 7.2, pode ser obtido da seguinte forma:

plot(x,y,'+')

3.5

2.5

1.5

0.5

-0.5

-1
1 1.5 2 2.5 3 3.5 4 4.5 5 5.5 6

Figura 7.2: Forma alternativa do grfico x-y.

18
Aos grficos das figuras 7.1 e 7.2 pode-se acrescentar ttulo, nomes dos eixos, e
reticulado. Pode-se tambm controlar as cores das curvas, bem como o tipo de linha utilizado.
possvel se ter mais de uma curva num mesmo grfico. Alm destas, h muitas outras
facilidades grficas oferecidas pelo Matlab. Uma boa opo para se aprender mais sobre os
recursos da funo plot o de entrar com o comando help plot.
O Matlab pode gerar diversos tipos de grficos: curvas em 2D, superfcies em 3D,
grficos de contorno de superfcies em 3D, curvas paramtricas em 2D e em 3D. Os detalhes de
como so gerados esses grficos podem ser encontrados com o auxlio do help.
O comando subplot cria diversos grficos numa mesma janela grfica. A sua sintaxe
subplot(m,n,k), em que mn o nmero de grficos a serem criados, organizado numa
matriz com m linhas e n colunas, e k a ordem em que aparecem os grfico ao longo das
linhas. Vejamos o seguinte exemplo: 4 grficos sero gerados numa mesma janela, e mostrados
na Figura 7.3. outro exemplo:
x=-5:5;
subplot(2,2,1), plot(x,sin(x)),
subplot(2,2,2), plot(x,x),
subplot(2,2,3),plot(x,x.^2),
x = 0:pi/20:2*pi; subplot(2,2,4) , plot(x,exp(x))
n = 0:.3:6;
subplot(2,2,1)

plot(x, sin(x))

subplot(2,2,2)

plot(x, exp(-x))

subplot(2,2,3)

stem(n, sin(2*pi*n/4))

subplot(2,2,4)

stem(n, 0.5.^n)

19
plot(x,y) liga todos os pontos entre si.
j o stem(x,y) faz com q uma reta saia do eixo x, ligando o ponto x1 a um ponto
y1 e nesse local (x1,y1) marcada uma bolinha. assim em diante.

1 1

0.8
0.5

0.6
0
0.4

-0.5
0.2

-1 0
0 2 4 6 8 0 2 4 6 8

1 1

0.8
0.5

0.6
0
0.4

-0.5
0.2

-1 0
0 2 4 6 0 2 4 6

Figura 7.3: Grficos mltiplos numa mesma janela.

8. Operaes com Matrizes

As operaes de multiplicao por escalar, soma e subtrao de matrizes so efetuadas


elemento a elemento de forma similar aos vetores, como visto anteriormente. A operao de
transposio 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 so ambos vetores linha ou vetores coluna.


O produto de AB de duas matrizes A e B s existir se o nmero de colunas de A for
idntico ao nmero 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 no executa a operao D=BA, pois ela no

satisfaz as condies para multiplicao de duas matrizes.


Do que foi visto acima possvel simplificar a operao de produto escalar entre dois
vetores linhas P e Q, usando o seguinte comando:

prod_esc = P*Q'

A inversa de uma matriz quadrada A pode ser computada no Matlab atravs da instruo
inv(A). Por exemplo:

inv(A) = A^-1
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 tambm o produto B*B-1 , que nada mais do que a matriz

identidade.
O determinante de uma matriz pode ser computado, utilizando-se a instruo det(A),

como mostrado no exemplo abaixo:

A =

1 2 3

-1 0 5

4 5 -2

det(A)

ans =

-4

Vamos supor que se deseje resolver o seguinte sistema de equaes 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 determinao de X pode ser feita por diviso de matrizes ou pela utilizao 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 soluo utiliza a matriz inversa, ou seja:

pode ser:
X = A-1B a=[2 1 -3; 3 -2 2; 5 -3 -1] , b=[5; 5; 16], x=inv(a)*b

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. Programao em Matlab

A soluo de problemas mais complexos pode ser implementada atravs da programa-


o na prpria linguagem do Matlab. O programa pode ser escrito num arquivo texto com
extenso .m. O Matlab fornece um editor de textos ASCII que permite criar e editar tais
arquivos.

9.1 Loops e Operaes Condicionais

A linguagem de programao do Matlab fornece comandos para loops e operaes


condicionais. H dois tipos de loops: um do tipo for e outro do tipo while. Um loop:
tipo for repete as instrues dentro do loop medida que o ndice do loop assume os
valores de um dado vetor linha. Por exemplo:
seu eu nao botar o ; entao aparece assim
-------------------------------
for k = [1 2 3] for k=[1 2 3]
x(k)=k^2
x(k) = k^2; end
x=
end
1
note q eu ainda
x x=
preciso digitar o "x"
1 4
x = para ver a resposta
x=
1 4 9
1 4 9
-------------------------------
ou seja, eu vejo as etapas do loop

A forma mais comum de escrever esse loop seria:

24
for k = 1:3

x(k) = k^2;

end

Observe que 1:3 eqivalente a [1 2 3].


importante salientar que em termos de eficincia deve-se sempre procurar usar
funes tipo built-in e operadores sempre que possvel. Isto deve-se ao fato que os scripts e
as funes definidas pelo o usurio ( e a maioria das funes existentes nas toolboxes ) so
interpretadas, em vez de compiladas. Isto significa que quando um arquivo .m executado,
cada instruo lida e depois executada, em vez de todo o programa ser compilado na
linguagem da mquina para depois ser executado. Por isso que muitas vezes os programas
escritos em Matlab so muito mais lentos que os escritos em outras linguagens como C e
Fortran, por exemplo. As duas seqncias de comandos abaixo do 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 implementao 25 vezes mais lenta que a


primeira. Isto deve-se ao fato que a primeira seqncia de comandos utiliza a funo seno
vetorizada ( built-in ), ou seja, as operaes com vetores sero sempre mais eficientes que os
loops no Matlab.
O loop while se repete enquanto uma dada expresso for verdadeira. O exemplo
abaixo mostra um algoritmo para calcular a raiz quadrada do valor de x. A varivel eps
fornecida pelo Matlab e serve para medir a preciso das operaes 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

x= 3
x = 3; xp = x/2; xp = 1.5000
df = 1; df = 1
--------------------
while df > eps y = 1.7500
df = 0.2500
y = 0.5*(xp + x/xp); --------
df = abs(y-xp); y = 1.7321
df = 0.0179
xp = y; --------
y = 1.7321
end df = 9.2047e-005
y ---------
y = 1.7321
y = df = 2.4459e-009
---------
1.73205080756888 y = 1.7321 ( aqui t arredondado - format short )
df = 0

As operaes condicionais no Matlab so similares s de outras linguagens de alto


nvel. Os operadores lgicos so: <, >, <=, >=, = = (igual), ~ = (diferente). Estes operadores so
binrios e retornam os valores 0 e 1 ( para argumentos escalares ).

4 > 3

ans =

1
4 < 3

ans = como se 1 fosse igual a "sim" e 0 fosse igual a "no"


0

4 == 3

ans =

4 ~= 3

ans =

A forma geral de um comando tipo if :

26
if expresso 1 if 5>3 if 2>3
x=2 , y=3 x=2 , y=3
comandos
plot(x,y,'+') plot(x,y,'+')
elseif expresso 2 elseif 5==3 elseif 2==3
x=5 , y=6 x=5 , y=6
comandos plot(x,y,'+') plot(x,y,'+')
else else
else
x=8 , y=9 x=8 , y=9
comandos plot(y,x,'+') plot(y,x,'+')
end end
end

O primeiro bloco de comandos aps uma expresso no nula ser executado.

9.2 Scripts e Funes

Um script simplesmente uma coleo de comandos do Matlab escritos num arquivo


tipo m ( um arquivo texto com extenso .m). Ao se entrar no prompt com o nome do arquivo
(sem a extenso .m), os comandos so executados como se tivessem sido entrados diretamente
no espao de trabalho do Matlab.

Por exemplo, vamos supor que o arquivo seno.m contenha o script mostrado abaixo.

% Programa para gerar um grfico da funo seno

% Gerao um vetor x com N amostras entre 0 e 2pi

x = linspace(0,2*pi,N);
y = sin(x); % gera o vetor y a partir de x
plot(x,y),title('Grfico do Seno')
xlabel ('ngulo em rad'),ylabel('Amplitude'),grid

Se entrarmos no espao de trabalho com os seguintes comandos:


% Programa para gerar um grfico da funo seno
N=50; a=1; % Gerao um vetor x com N amostras entre 0 e 2pi
% linspace q gera os espaos com N amostras.
seno % linspace sem nada( sem o N )tem padro = 100
% grid o q coloca as linhas de grade no grafico.
x = linspace(0,2*pi,N);
y = sin(x); % gera o vetor y a partir de x
plot(x,y),title('Grfico da funo Seno')
27
xlabel ('ngulo em radianos'),ylabel('Amplitude'),grid
a Figura 9.1 ir aparecer.

Grfico do Seno
1

0.8

0.6

0.4

0.2
Amplitude

-0.2

-0.4

-0.6

-0.8

-1
0 1 2 3 4 5 6 7
ngulo em rad

Figura 9.1: Grfico da funo sen(x).

Como pode ser visto neste exemplo, os comandos que aparecem no script podem se
referir a variveis que j existam no espao de trabalho do Matlab. Quando um script
executado, as suas variveis passam tambm a fazer parte do espao de trabalho.
As funes so bem mais gerais que os scripts, pois permitem ao usurio criar novos
comandos no Matlab. As diversas toolboxes que fazem parte to Matlab so constitudas por
funes. A funo difere do script apenas na primeira linha, que tem a seguinte sintaxe:

function [saida1,saida2,....] = nomedafuncao(entrada1,entrada2,....)

Com exceo desta linha, as demais so linhas com comandos do Matlab, de maneira similar
aos scripts. Diferentemente dos scripts, as variveis que aparecem na funo so internas, ou

28
seja, elas no aparecem no espao de trabalho do Matlab. Por exemplo, vamos considerar uma
funo que compute a mdia e a varincia de um conjunto de nmeros. Seja estat o nome dessa
funo. Abaixo esta mostrada a listagem do arquivo estat.m.

function [m,v] = estat(x)


% Funo que computa a mdia e a varincia de x

nx = length(x);
m = sum(x)/nx;
v = sum((x - m).^2)/(nx-1);

Para testar a funo:


function [ m,v ] = estat( x )
%Funo q computa a media e a variancia de x
x = rand(1,100);
nx=length(x);
m=sum(x)/nx;
[med,var] = estat(x)
v=sum((x-m).^2)/(nx-1);
end
med =

0.4652

var =
note q na janela do Command Window do matlab, s tem
0.0778 >> , mas quando aparece K>> pq se est em debug mode
pois tem alguma bolinha vermelha aparecendo em alguma
linha da funo criada. no caso, tem q abrir a funo, estat.m,
no editor do matlab e clicar na bolinha vermelha pra sumir.

29
10. Uso da "Toolbox Signal"

Esta "toolbox" possui uma coleo muito grande de funes que so largamente
utilizadas em processamento de sinais.

10.1 Gerao de Sinais Elementares

Os sinais para serem tratados pelo computador devem estar na forma discreta, embora
possamos gerar grficos como se eles fossem contnuos, para isto basta que se use um nmero
suficientemente grande de pontos do sinal contnuo. Estes pontos, ou amostras, so obtidos
pelo processo de amostragem. que consiste em dividir o eixo do tempo, por exemplo, em
intervalos com espaamento uniforme Dt, que chamado de intervalo de amostragem. O
inverso do intervalo de amostragem denominado de freqncia de amostragem fs, que indica a
cadncia com que uma dada varivel amostrada, no caso mais comum esta varivel o
tempo.
Para se gerar um vetor t no intervalo [0,1s], com Dt = 0,001s (fs = 1 kHz), usam-se os
seguintes comandos:

fs = 1000; % freqncia de amostragem

t = 0:1/fs:1; % vetor com amostras separadas de 0,001s (1 ms)

Exemplo 10.1: Gerar uma onda quadrada peridica com amplitude unitria, com freqncia
fundamental de 10 Hz, e ciclo de repetio de 50% ( ciclo de repetio a poro de cada ciclo
para a qual o sinal positivo, e 0 < cr < 100%).

% Programa para gerar uma onda quadrada

A = 1; % amplitude de pico

f0 = 10; % freqncia fundamental em Hz

30
cr = 50; % onda quadrada simtrica em %

fs = 1000; % freqncia 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 Simtrica')

axis([0 1 -1.5 1.5]);

A onda quadrada resultante mostrada na Figura 10.1


Onda Quadrada Simtrica
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 Simtrica

Exerccio 10.1: Gere uma onda triangular simtrica com amplitude 2 de pico, freqncia
fundamental de 5 Hz, e amostrada com fs = 2 kHz. Use a funo sawtooth do Matlab.

Exemplo 10.2: Gerar uma onda quadrada simtrica e discreta, com amplitude unitria,
freqncia fundamental de p/6 rad, e no intervalo [-15,15].

31
% Programa para gerar uma onda quadrada discreta

A = 1; % amplitude de pico

wd = pi/6; % freqncia fundamental em rad

cr = 50; % onda quadrada simtrica 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 Simtrica')

axis([-15 15 -1.5 1.5]);

A onda quadrada discreta mostrada na Figura 10.2.


Onda Quadrada Simtrica
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 contnua ou discreta, tambm podem
ser gerados sinais senoidais ou cossenoidais atravs das funes sin(wt+f) e cos(wt+f).

32
Exerccio 10.2: Gere um sinal senoidal contnuo de amplitude unitria, com freqncia
fundamental de 2 Hz, no intervalo [-1,1], e com fase inicial nula. Utilize uma freqncia de
amostragem de 500 Hz.

Exerccio 10.3: Gere uma seqncia cossenoidal com amplitude de pico de 2, freqncia
fundamental de p/4, no intervalo [-10,10]. Considere a fase inicial como sendo -p/3.

Exemplo 10.3: Gerar o sinal x(t) = 5e-4t sen(20pt). Considere a freqncia de amostragem como
sendo de 1 kHz.

% Programa para gerar uma senide amortecida.

fs = 1000; % freq. de amostragem

fo = 10; % freq. fundamental

a = -4; % coef. da exponencial

fi = 0; % fase inicial

A = 5; % amplitude da senide

t = 0:1/fs:1; % eixo do tempo

x = A*sin(2*pi*fo*t + fi).*exp(a*t);

plot(t,x),xlabel('t (s)'),ylabel('Amplitude')

title('Senide Amortecida')

axis([0 1 -6 6]);

A Figura 10.3 mostra a senide amortecida gerada pelo programa acima.

Exerccio 10.4: Gere a seqncia senoidal amortecida dada por x[n] = 5(0,8)nsen(pn/4), no
intervalo [0,20].

33
Senide Amortecida
6

2
Amplitude
0

-2

-4

-6
0 0.2 0.4 0.6 0.8 1
t (s)
Figura 10.3: Senide Amortecida

A gerao de seqncias tipo delta ( d[n] ) e degrau unitrio ( u[n] ) pode ser feita com o
auxlio das funes zeros(m,n) e ones(m,n). Por exemplo, para se gerar a seqncia u[n-10] com
50 amostras, escreve-se a seguinte linha de comando:

u = [zeros(1,10),ones(1,40)];

Para se gerar uma seqncia d[n-6] com 50 amostras, pode-se fazer assim:

delta = zeros(1,50); matriz delta com 1 linha e 50 colunas.

delta(1,6) = 1;

A energia de uma seqncia de durao 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 potncia mdia de um sinal peridico com perodo 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 sada y[n], para uma entrada x[n], dada pelo somatrio da convoluo:


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

Se o sistema tambm for causal, ento:

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

A expresso acima pode ser facilmente computada usando-se a funo 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 sada y[n].

35
% Programa para computar a convoluo de duas seqncias

% 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('Sada')

A entrada x[n], a resposta impulsional do sistema h[n], e a sada do sistema y[n] so


mostrada na Figura 10.4.

A sada de um SLI discreto tambm pode ser obtida atravs da soluo da equao
diferena que descreve este sistema.

N M

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

O Matlab possui uma funo filter(a,b,x), em que a = [1, a1,a2,...aN], b = [b0,b1,....bM], e x o


vetor com as amostras da entrada, para resolver numericamente a equao diferena acima.

36
Entrada
1

x[n]
0.5

0
0 5 10 15 20 25 30 35 40
Resposta Impulsional
1
h[n]

0.5

0
0 5 10 15 20 25 30 35 40
Sada
10
y[n]

0
0 5 10 15 20 25 30 35 40

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


equao diferena 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; % nmero 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 unitrio

h = filter(b,a,imp); % cmputo da resposta impulsional


y = filter(b,a,deg); % cmputo 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 durao infinita. H tambm os sistemas no-recursivos ou FIR
(Finite Impulse Response), cuja resposta impulsional de durao finita. Um exemplo destes
sistemas o filtro de mdia mvel descrito pela seguinte equao diferena:

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

Exemplo 10.6: Um sinal s[n] = 3 + 4(0,95)nsen(p/8 n) contaminado por um rudo com


distribuio uniforme entre -0,5 e 0,5.Ser utilizado um filtro de mdia mvel para diminuir os
efeitos do rudo aditivo.

A Figura 10.6 mostra as duas seqncias 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 rudo r[n] com ditribuio uniforme

As seqncias s[n] e r[n] so somadas, resultando na seqncia x[n], que nada mais
do que o sinal original s[n] contaminado pelo rudo aditivo r[n]. Para se atenuar o efeito
indesejvel deste rudo, pode-se passar o sinal x[n] por um filtro de mdias mveis. No
presente exemplo, usou-se um filtro com 3 atrasos (M = 3). A Figura 10.7a mostra o sinal

39
original s[n], o rudo r[n], e a soma dos dois x[n]. A Figura 10.7b mostra as curvas da entrada
x[n] e da sada y[n] do filtro de mdias mveis. Deve-se observar que a sada y[n] muito
prxima do sinal original s[n], exceto por um atraso de uma amostra, o que conseqncia do
processo de filtragem.

6 r[n]
Amplitudes

s[n]
4 x[n]
2
0
-2
0 10 20 30 40 50
n

6 s[n]
y[n]
Amplitudes

4
2
0
-2
0 10 20 30 40 50
n

Figura 10.7: a) sinal s[n], rudo r[n] e x[n]=s[n]+r[n]; b) sinal s[n] e sada do filtro y[n]

% Programa que exemplifica o uso de filtros de mdia mvel

N = 50;

n = 0:N-1;

s = (4*sin(n*pi/8).*(.95).^n) + 3*ones(1,N);

r = rand(1,N) - 0.5; % rudo com distribuio 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; % nmero 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 Anlise de Fourier

A transformada de Fourier de uma seqncia discreta definida como:


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

em que X(ejw) uma funo contnua e complexa.

Exemplo 10.7: Calcular a transformada de Fourier da seqncia 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 soluo acima, o somatrio nada mais do que a soma de uma progresso
geomtrica cuja razo (0,5e-jw).
No Exemplo 10.7, como x[n] uma seqncia de durao infinita no se pode usar o
Matlab para computar X(ejw) diretamente. Entretanto, pode-se computar X(ejw) usando-se a
expresso acima, no intervalo [0,p] e ento traar grficos de magnitude e fase, ou das partes
real e imaginria.

Exemplo 10.8: Computar e plotar os espectros de magnitude e fase de X(ejw), bem como as suas
partes real e imaginria.

% Programa para computar e plotar os espectros de amplitude e

% fase da DTFT de x[n]=(0,5)^n u[n], a partir da expresso

% X(w)= exp(jw)/[exp(jw) - 0,5].

N = 256;

w = (0:N-1)*pi/N; % eixo das freqncias dividido em N pontos

ex = exp(j*w);

X = ex./(ex - .5*ones(1,N));

ampl = abs(X); % cmputo do mdulo de X(jw)

fase = angle(X); % cmputo da fase de X(jw)

rex = real(X);

imx = imag(X);

wnorm = w/pi; % normalizao do eixo das freqncias

subplot(2,2,1)

plot(wnorm,ampl)

xlabel('Freqncia normalizada') ,ylabel('Magnitude'), ti-

tle('Espectro de Amplitude')

subplot(2,2,3)

42
plot(wnorm,fase),xlabel('Freqncia Normalizada') yla-

bel('Radianos'),title('Espectro de Fase')

subplot(2,2,2)

plot(wnorm,rex),xlabel('Freqncia Normali-

zada'),ylabel('Real[X(jw)]'),title('Parte Real')

subplot(2,2,4)

plot(wnorm,imx),xlabel('Freqncia Normalizada') yla-

bel('Imag[X(jw)]'),title('Parte Imaginria')

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
Frequncia Normalizada Frequncia Normalizada
Espectro de Fase Parte Imaginria
0 0

-0.2
Imag[X(jw)]

-0.2
Radianos

-0.4
-0.4
-0.6

-0.6 -0.8
0 0.5 1 0 0.5 1
Frequncia Normalizada Frequncia Normalizada

Figura 10.8: Grficos da transformada de Fourier: magnitude e fase; partes real e imaginria.

Nos grficos da Figura 10.8 deve-se observar que o eixo das freqncias est
normalizado, ou seja, a freqncia p corresponde ao valor 1. Muitos autores chamam este ponto

43
de freqncia de Nyquist, pois a freqncia que corresponde metade da freqncia de
amostragem. Um outro ponto que deve ser observado o que se refere forma de se plotar uma
funo complexa X(ejw). Isto pode ser feito atravs de grficos que mostrem as partes real e
imaginria, ou de grficos de magnitude e fase. Esta ltima forma a preferida quando a funo
complexa estiver relacionada a sistemas lineares discretos, como por exemplo filtros digitais.
No caso em que a seqncia discreta x[n] for de durao finita, ento ser possvel se
utilizar o Matlab para o cmputo da transformada de Fourier. Na realidade o que se faz
computar a Transformada Discreta de Fourier (DFT), que uma seqncia discreta, definida
como:

N -1 2p
- kn
X [k ] = x[n]e N
k [0, N - 1]
n =0

Pode-se mostrar que os X[k] so amostras de X(ejw) igualmente espaadas de 2p/N no


crculo unitrio, ou seja X(ejw) a envoltria 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 verso truncada de x[n] num intervalo finito
adequado.
No programa abaixo foi utilizada a funo fft(x,M) para computar a DFT da seqncia x
de comprimento N, com M pontos. Se M for omitido o cmputo da DFT se dar com o nmero
de pontos de x, neste caso N. Se M>N, ento sero apendados (M-N) zeros ao final da
seqncia x. Este procedimento no altera a forma da envoltria de X[k], apenas a define
melhor. A FFT (Fast Fourier Transform) apenas um algoritmo que computa de forma
eficiente a DFT. Esses algoritmos so mais rpidos quando M for uma potncia inteira de 2
(M= 2p).

44
% Programa para computar a transformada de Fourier usando o

% algoritmo de FFT

N = 256;

x = (.5).^(0:N-1); % gerao da seqncia x[n]

Xc = fft(x); % cmputo da DFT de x[n]

X = Xc(1:N/2+1); % freqncias no intervalo [0,pi]

ampl = abs(X); % cmputo do mdulo de X(jw)

fase = angle(X); % cmputo da fase de X(jw)

rex = real(X);

imx = imag(X);

wnorm = 0:2/N:1; % normalizao do eixo das freqncias

subplot(2,2,1)

plot(wnorm,ampl)

xlabel('Freqncia Normalizada'),ylabel('Magnitude')

title('Espectro de Amplitude')

subplot(2,2,3)

plot(wnorm,fase)

xlabel('Freqncia Normalizada'),ylabel('Radianos')

title('Espectro de Fase')

subplot(2,2,2)

plot(wnorm,rex)

xlabel('Freqncia Normalizada'),ylabel('Real[X(jw)]')

title('Parte Real')

subplot(2,2,4)

plot(wnorm,imx)

xlabel('Freqncia Normalizada'),ylabel('Imag[X(jw)]')

title('Parte Imaginria')

45
Comparando-se os resultados mostrados nas Figuras 10.8 com os da Figura 10.9 , pode-se ver
que a aproximao obtida utilizando a DFT muito boa.

Espectro de Amplitude 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
Frequncia Normalizada Frequncia Normalizada
Espectro de Fase Parte Imaginria
0 0

-0.2
Imag[X(jw)]

-0.2
Radianos

-0.4
-0.4
-0.6

-0.6 -0.8
0 0.5 1 0 0.5 1
Frequncia Normalizada Frequncia Normalizada

Figura 10.9: Grficos da transformada de Fourier obtidos atravs da DFT.

Exemplo 10.11: Computar e plotar a DFT da seqncia 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

% seqncia 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('Freqncia Normalizada'),ylabel('Magnitude')

title('N = 8')

subplot(2,2,3)

stem([(0:8)/8],abs(X1(1:9)))

xlabel('Freqncia Normalizada'),ylabel('Magnitude')

title('N = 16 (8 zeros)')

subplot(2,2,2)

stem([(0:16)/16],abs(X2(1:17)))

xlabel('Freqncia Normalizada'),ylabel('Magnitude')

title('N = 32 (24 zeros)')

subplot(2,2,4)

stem([(0:32)/32],abs(X3(1:33)))

xlabel('Freqncia Normalizada'),ylabel('Magnitude')

title('N = 64 (56 zeros)')

O programa acima computa 4 DFTs com diferentes nmeros de pontos. A primeira com
8 pontos, a segunda com 16 pontos, sendo que destes 8 so zeros que foram apendados ao final
de x[n]. As outras duas so computadas com 32 e 64 pontos, sendo que nestes casos foram
apendados 24 e 56 zeros respectivamente.
Os resultados mostrados na Figura 10.10 indicam que ao se apender zeros a uma
seqncia finita, obtm-se uma amostragem mais fina da envoltria X(ejw), sem que isto altere
a sua forma.

47
Exerccio 10.5: Para a seqncia x[n] = u[n] - 2u[n-8] + u[n-16] compute e plote |X[k]|, para
N=16, e N=64 (apendendo-se 48 zeros). Comente os resultados.

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
Freqncia Normalizada Freqncia Normalizada
N = 16 (8 zeros) N = 64 (56 zeros)
8 8

6 6
Magnitude

Magnitude

4 4

2 2

0 0
0 0.5 1 0 0.5 1
Freqncia Normalizada Freqncia Normalizada

Figura 10.10: O efeito de se apender zeros ao final de uma seqncia finita

10.4 Resposta em Freqncia dos Sistemas Lineares Invariantes e Discretos (SLID)

A resposta em freqncia de um SLID dada por H(ejw), que nada mais do que a
transformada de Fourier da resposta impulsional h[n] do sistema. Como H(ejw) uma funo
complexa, a resposta em freqncia composta da resposta em magnitude, ou em amplitude,
que |H(ejw)|, e da resposta em fase que o argumento de H(ejw).

48
O Matlab possui uma funo que permite computar a resposta em freqncia a partir
dos coeficientes da equao diferena que descreve o sistema. tambm possvel comput-la a
partir dos coeficientes da funo de transferncia H(z), que a transformada z de h[n]. Estes
coeficientes so na realidade os mesmos da equao diferena. A funo [H,w]=freqz(b,a,N).
Maiores detalhes podem ser obtidos atravs do help do Matlab.

Exemplo 10.12: Para o sistema de 2a ordem do Exemplo 10.5, descrito por y[n] - 1,2728y[n-1]
+0,81y[n-2] = 0,532x[n], determine e plote a resposta em freqncia do sistema.

% Programa para computar a resposta em freqncia 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 cmputo da FFT

[H w] = freqz(b,a,N);

subplot(2,1,1)

plot(w/pi,abs(H))

xlabel('Freqncia Normalisada'),ylabel('Magnitude')

title('Resposta em Magnitude')

subplot(2,1,2)

plot(w/pi,angle(H))

xlabel('Freqncia Normalisada'),ylabel('Radianos')

title('Resposta em Fase')

Exerccio 10.6: Repetir o Exemplo 10.12 usando a opo whole em freqz. Esta opo permite
computar a resposta em freqncia no intervalo [0,2p]. O que pode ser dito em termos de
simetria das resposta em magnitude e fase?

49
Resposta em Magnitude
4

3
Magnitude

0
0 0.2 0.4 0.6 0.8 1
Freqncia Normalisada
Resposta em Fase
0.5
0
Radianos

-0.5
-1

-1.5

-2
0 0.2 0.4 0.6 0.8 1
Freqncia Normalisada

Figura 10.11: Respostas em Magnitude e Fase do sistema do Exemplo 10.12.

Exemplo 10.13: Para um filtro tipo mdia mvel, determine e plote as respostas de magnitude e
fase, para M = 3, e M = 10.

% Programa para computar a resposta em freqncia do SLI

% descrito por: y[n] ={x[n] + x[n-1] + x[n-2] +...+ x[n-M]}/M.

% Este sistema um filtro de mdia mvel

b1 = [1 1 1]/3; b2 = ones(1,10)/10;

a = 1;

N = 128; % # de pontos para o cmputo 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('Freqncia Normalisada'),ylabel('Magnitude')

title('Resposta em Magnitude'),legend('r:','M=3','b--','M=10');

subplot(2,1,2)

plot(w/pi,angle(H1),'r:',w/pi,angle(H2),'b--')

xlabel('Freqncia Normalisada'),ylabel('Radianos')

title('Resposta em Fase'),legend('r:','M=3','b--','M=10');

Resposta em Magnitude
1

0.8 M=3
M=10
Magnitude

0.6

0.4

0.2

0
0 0.2 0.4 0.6 0.8 1
Freqncia Normalisada
Resposta em Fase
2

1
Radianos

-1

-2 M=3
M=10
-3
0 0.2 0.4 0.6 0.8 1
Freqncia Normalisada

Figura 10.12: Resposta em freqncia de um filtro de mdia mvel, com M=3, e M=10.

51
10.5 Transformada z

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 funo racional da forma
H(z)=N(z)/D(z), em que N(z) e D(z) so polinmios em z. As razes de N(z) = 0 so os zeros
de H(z), e as razes de D(z) = 0 correspondem aos plos de H(z). H(z) chamada de funo
sistema ou funo de transferncia, servindo juntamente com h[n], para caracterizar os SLIs. O
Matlab possui funes que permitem decompor H(z) em seus plos e zeros
([z,p,k]=tf2zp(num,den)), ou fazer um grfico dos plos e zeros no plano z ( zplane(num,den) ).
H tambm uma funo que permite obter H(z) na forma racional, a partir de seus plos e zeros
( [num,den] = zp2tf(z,p,k) ).

Exemplo 10.13: Expressar a FT, dada abaixo, na forma fatorada, fazer um grfico de p/olos e
zeros e indicar a regio de convergncia.

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 funo

% racional e fazer um diagrama de plos 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 plos e zeros de H(z). A regio de convergncia


o exterior do crculo de raio | 0,6364 + 0,6364i | = 0,9, que corresponde ao mdulo dos plos
mais afastados da origem, para uma soluo causal.
A transformada inversa de H(z) a resposta impulsional h[n]. Esta transformada pode
ser computada de diversas maneiras, porm no caso em que H(z) for racional, mais
conveniente utilizar o mtodo da expanso em fraes parciais. Com este mtodo possvel se
obter uma expresso para h[n] na forma fechada. O Matlab possui a funo
[r,p,k]=residuez(num,den), que permite computar os plos de H(z), os coeficientes da
expanso em fraes 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 plos e zeros de H(z) do Exemplo 10.13.

Exemplo 10.14: Determinar h[n] da FT dada abaixo, pelo mtodo da expanso em fraes
parciais.

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

% Programa para determinar os plos e os coeficientes da

% expanso em fraes parciais de uma funo 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 expanso em fraes 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

Você também pode gostar