Apost Matlab

of 55 /55
INTRODUÇÃO AO USO DO MATLAB E DA "TOOLBOX" DE SINAIS NOTAS DE AULA PAULO LÉO M. OSORIO ( DEE/PUC-RIO ) 2002

Transcript of Apost Matlab

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

Page 2: Apost Matlab

2

Page 3: Apost Matlab

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

Page 4: Apost Matlab

4

Page 5: Apost Matlab

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

Page 6: Apost Matlab

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

Page 7: Apost Matlab

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:

Page 8: Apost Matlab

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.

Page 9: Apost Matlab

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:

Page 10: Apost Matlab

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.

Page 11: Apost Matlab

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

Page 12: Apost Matlab

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:

Page 13: Apost Matlab

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.

Page 14: Apost Matlab

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 =

Page 15: Apost Matlab

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

Page 16: Apost Matlab

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

Page 17: Apost Matlab

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)

Page 18: Apost Matlab

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

Page 19: Apost Matlab

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)

Page 20: Apost Matlab

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

Page 21: Apost Matlab

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

Page 22: Apost Matlab

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:

Page 23: Apost Matlab

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

Page 24: Apost Matlab

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:

Page 25: Apost Matlab

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.

Page 26: Apost Matlab

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

Page 27: Apost Matlab

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

Page 28: Apost Matlab

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

Page 29: Apost Matlab

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

Page 30: Apost Matlab

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

Page 31: Apost Matlab

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

Page 32: Apost Matlab

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

Page 33: Apost Matlab

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

Page 34: Apost Matlab

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

Page 35: Apost Matlab

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

Page 36: Apost Matlab

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.

Page 37: Apost Matlab

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

Page 38: Apost Matlab

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

Page 39: Apost Matlab

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

Page 40: Apost Matlab

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

Page 41: Apost Matlab

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

Page 42: Apost Matlab

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)

Page 43: Apost Matlab

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

Page 44: Apost Matlab

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

Page 45: Apost Matlab

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

Page 46: Apost Matlab

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

Page 47: Apost Matlab

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.

Page 48: Apost Matlab

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)

Page 49: Apost Matlab

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?

Page 50: Apost Matlab

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

Page 51: Apost Matlab

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

Page 52: Apost Matlab

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)

Page 53: Apost Matlab

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.

Page 54: Apost Matlab

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

Page 55: Apost Matlab

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]