SlideShare uma empresa Scribd logo
1 de 55
Baixar para ler offline
INTRODUÇÃO AO USO DO MATLAB E DA
"TOOLBOX" DE SINAIS
NOTAS DE AULA
PAULO LÉO M. OSORIO
( DEE/PUC-RIO )
2002
2
3
AVISO
Estas notas destinam-se aqueles que estão usando o Matlab pela primeira vez. Os
exemplos apresentados utilizam uma pequena parcela das funções disponíveis e tem por obje-
tivo familiarizar o usuário com as funções e os comandos mais comuns. Há também uma
introdução ao uso das principais funções da "toolbox signal", que é de grande utilidade no
estudo de sinais e sistemas discretos.
Atualmente existe no mercado uma oferta considerável de livros que se utilizam do
Matlab para implementar exemplos e exercícios. Uma listagem desses livros pode ser
encontrada na página da Mathworks ( http://www.mathworks.com ).
4
5
1.Introdução
O Matlab foi originalmente desenvolvido para ser um "laboratório matricial".
Atualmente ele é um sistema interativo e uma linguagem de programação para a computação
técnica e científica em geral. A sua filosofia de processamento está baseada em matrizes. Como
os comandos do Matlab são muito similares à maneira como expressamos as soluções dos
problemas em termos matemáticos, a tarefa de se escrever soluções computacionais no Matlab
é muito mais rápida do que escrever programas em linguagens de alto nível, tais como
FORTRAN e C. Além disto, ele possui facilidades gráficas que tornam a interface homem
máquina muito amigável.
2. Área de Trabalho (Workspace)
Quando o programa Matlab é acionado a mensagem abaixo irá aparecer na tela. O
prompt (>>) indica que o Matlab está esperando pela entrada de comandos.
To get started, select "MATLAB Help" from the Help menu.
>>
O Matlab trabalha com duas janelas: uma janela de comandos que é usada para a
entrada dos comandos, dados, e para mostrar os resultados na tela, e uma outra janela gráfica
onde são gerados os gráficos. As duas janelas são apagadas quando do início de cada sessão de
Matlab. A janela de comando pode ser limpa durante uma sessão de trabalho através do
comando clc. Para se limpar a janela gráfica é usado o comando clg.
A medida que se trabalha na janela de comando, o Matlab memoriza os comandos
entrados, bem como as variáveis que foram criadas. Desta forma, os comandos e as variáveis
6
ficam residentes no espaço de trabalho do Matlab, e podem ser chamados sempre que se
desejar. Para se limpar o espaço de trabalho usa-se o comando clear.
O Matlab é uma linguagem sensível ao tipo (caracter maiúsculo ou minúsculo)
utilizado, ou seja, RH, Rh, rH e rh são tratadas como variáveis diferentes.
Os comandos de Matlab são usualmente entrados em linhas separadas, embora possa-se
ter múltiplos comandos na mesma linha, desde que separados por ponto e vírgula (;). Os
comentários são entrados precedidos do sinal de porcentagem (%).
Além de executar comandos que são entrados pelo teclado, o Matlab também é capaz de
executar seqüências de comandos que estão armazenadas em arquivos com extensão .m, como
será mostrado no item 9.2. Estes arquivos são chamados de arquivos-M.
O comando what mostra uma listagem dos arquivos-M, disponíveis no diretório cor-
rente. Estes arquivos podem ser vistos por meio do comando type. Se o arquivo especificado
com este comando não tiver uma extensão, ele é assumido como sendo do tipo M.
3. Matrizes, Vetores e Escalares
O Matlab, como já foi dito, é orientado para trabalhar com matrizes. Uma matriz é
notada como A(i,j) ou a(i,j), em que A e a são matrizes diferentes. O índice i se refere
às linhas e o índice j às colunas. O tamanho de uma matriz é especificado pelo número de
linhas e colunas. Uma matriz que possui somente uma linha ou somente uma coluna é chamada
de vetor. Por outro lado, se uma matriz possuir somente uma linha e uma coluna, ela é um
escalar.
Há várias formas de se criar uma matriz no Matlab, sendo a mais simples através de
uma lista de números entre colchetes, como mostrado abaixo.
a = 0.5;
b = [ 1 3 5 7 9];
c = [2;4;6;8;10];
7
D = [1 2 3;4 5 6;7 8 9];
Um comando muito útil é o whos que mostra o nome de todas as variáveis existentes
no espaço de trabalho global, bem como os seus tipos e dimensões. Se as variáveis acima
estiverem no espaço de trabalho, o resultado da aplicação desse comando é o seguinte:
» whos
Name Size Bytes Class
D 3x3 72 double array
a 1x1 8 double array
b 1x5 40 double array
c 5x1 40 double array
Grand total is 20 elements using 160 bytes
Deve-se observar, nos exemplos acima, que todas linhas estão finalizadas por ponto e
vírgula (;). Isto evita que as matrizes sejam impressas na tela. A omissão do (;), faz com que o
resultado de um dado comando apareça imediatamente na tela, como por exemplo:
» b=[1 3 5 7 9]
b =
1 3 5 7 9
Nos exemplos acima a é um escalar, b é um vetor linha, c é um vetor coluna, e D é uma
matriz 3x3. Observe que os números dentro dos colchetes ou estão separados por vírgulas ou
por espaços. O ponto e vírgula separa as linhas da matriz. Uma forma alternativa de se entrar a
matriz D é a seguinte:
8
D = [1 2 3
4 5 6
7 8 9];
O Matlab permite também se definir uma matriz a partir de outra já existente. Por
exemplo, considere os seguintes comandos:
A = [1 .53 1-2*j];
B = [0 -3 A];
Isto é equivalente a:
B = [ 0 -3 1 .53 1-2*j];
Pode-se também mudar ou adicionar valores num vetor através de subscrito referenciado em
parêntesis. O seguinte comando:
B(1) = -1;
troca o primeiro elemento do vetor B de 0 para -1.
Um vetor também pode ser estendido pela definição de novos elementos. O vetor B que
possui 5 elementos passa a ter 7 elementos se o seguinte comando for executado:
B(7) = pi;
Neste caso B(6) terá , automaticamente, o valor 0.
9
Exercício 3.1: Dadas as matrizes abaixo, verifique suas dimensões através do Matlab
1. A = [1 0 0 0 1];
2. B = [3; 4; -1; 2-j];
3. C = [ 3; 4; -1; 2 -j];
4. D = [1 2 3; 4 5 6; 7 8 9];
5. E = [3 -5 0 11; 9 7 3.5 2.1; -1 4...
0 1; 3.4 5.6 7.8 9.1]
6. F = [A([1 2 3]) 5 6];
7. G = [A ; F];
8. H = [E(2,1) A];
Um vetor também pode ser criado usando-se o comando (:). Se (:) for usado para se-
parar dois números inteiros m e n, ele irá gerar todos os números inteiros entre m e n. Por
exemplo, o comando abaixo gera um vetor chamado X com os inteiros de 1 a 10.
X = 1:10;
Se o operador (:) for usado para separar três números a, b, e c , então o comando gera valores
entre a e c com o incremento dado por b. Nos exemplos abaixo o vetor Y contém os números
de 10 a 1, enquanto o vetor Z é formado pelos números no intervalo [-p , p ], separados de
p/10.
Y = 10:-1:1;
Z = -pi:pi/10:pi;
O comando (:) também pode ser usado para selecionar submatrizes a partir de uma outra
matriz. Por exemplo seja a matriz D:
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.2
0.1 4.3 7.8 9.2
-5.9 3.3 -4.7 -0.4
p
p
é
ë
ê
ê
ê
ê
ù
û
ú
ú
ú
ú
1. A = R(:,2);
2. b = R(3,:);
3. c= R(1:3,2:4);
4. C = R(1:2:5, :);
5. D = [4:9; 1:6];
6. E = R';
No Matlab é válido se ter uma matriz vazia. Por exemplo, uma matriz vazia pode ser
gerada com o seguinte comando:
a = [ ]
Deve-se observar que uma matriz vazia é diferente de uma matriz que só contenha zeros.
11
Os valores de uma matriz, vetor, ou escalar também podem entrar através do comando
input. Isto é muito útil quando se tem o programa num arquivo tipo M.
z = input('Entre com o valor de z ')
4. Operações Escalares
As operações aritméticas entre dois escalares são mostrada na Tabela 1
Operação Forma Algébrica MATLAB
Adição a + b a + b
Subtração a - b a - b
Multiplicação a ´ b a * b
Divisão à direita a / b a/b
Divisão à esquerda b  a a  b
Exponenciação ab a ^ b
Tabela 1: Operações aritméticas entre dois escalares
O resultado de uma operação que não é relacionada diretamente a uma variável é
automaticamente colocado numa variável chamada de ans, que pode ser usada como qualquer
outra variável, como por exemplo:
>> 3*pi^2
ans =
29.6088
>> sqrt(ans)
ans =
5.4414
12
>> x = (ans-3)/2
x =
1.2207
O Matlab possui muitas funções do tipo “built-in”, como por exemplo:
>> pi
ans =
3.1416
>> exp(1)
ans =
2.7183
>> log(ans)
ans =
1
Como o Matlab possui um número muito grande de funções, para entendê-las o melhor
é usar o comando “help”, que pode ser invocado a partir da janela do Matlab, ou como uma
linha de comando do tipo help < nome do comando>. Por exemplo:
>> help ans
ANS Most recent answer.
ANS is the variable created automatically when expressions
are not assigned to anything else. ANSwer.
Deve-se chamar a atenção para a maneira como os valores numéricos das variáveis são
mostrados no Matlab. O seu controle é feito através do comando format. O default é a
formatação chamada de format short, ou seja:
13
>> pi
ans =
3.1416
Há várias formas possíveis de formatação, que podem ser vistas usando o comando
help format. Por exemplo o comando format compact suprime a linha extra que
aparece nas outras formatações. Esta formatação é a utilizada na maioria dos exemplos
apresentados.
>> format compact
>> pi
ans =
3.1416
Uma outra formatação é o format long, que apresenta o resultado com 15 digitos.
>> format long
>> pi
ans =
3.14159265358979
Deve-se observar que o Matlab trabalha internamente com precisão dupla em todas as
suas operações, e que o comando format altera apenas a forma com que os resultados são
apresentados.
14
5. Criação de Matrizes e Vetores
O Matlab possui comandos que permitem a criação de algumas matrizes e vetores especi-
ais:
zeros(m,n) cria uma matriz m x n de zeros.
ones(m,n) cria uma matriz m x n de uns.
eye(m,n) cria uma matriz identidade m x n.
diag(v) cria uma matriz n x n com v na diagonal principal (v é um vetor de
tamanho n).
Com as funções zeros e ones pode-se criar vetores, como por exemplo:
>> x = zeros(1,5)
x =
0 0 0 0 0
>> y = ones(5,1)
y =
1
1
1
1
1
Os comandos size e length permitem determina as dimensões de matrizes e vetores,
respectivamente. Por exemplo:
>> size(x)
ans =
15
1 5
>> [m,n] = size(y)
m =
5
n =
1
>> lx = length(x)
lx =
5
>> ly = length(y)
ly =
5
Deve-se observar que o comando length não consegue diferenciar se o vetor é linha
ou coluna.
6. Operações com Vetores
Sejam os vetores a e b dados por:
» a = 1:5; b = 1:2:9;
As operações adição, subtração, multiplicação, e divisão de um vetor por um escalar são apli-
cadas a todos os elementos do vetor:
» a*2
ans =
2 4 6 8 10
16
As operações matemáticas entre vetores não são tão simples quanto aquelas entre ve-
tores e escalares. Quando dois vetores forem de mesmo tamanho, as operações de adição,
subtração, multiplicação, e divisão são aplicadas elemento a elemento. Por exemplo:
» a+b
ans =
2 5 8 11 14
» ans-a
ans =
1 3 5 7 9
A multiplicação e divisão elemento por elemento é feita de maneira similar, exceto por
uma pequena alteração na notação:
» a.*b
ans =
1 6 15 28 45
Os vetores a e b foram multiplicados elemento a elemento usando o operador (.*), que é dife-
rente da operação multiplicação matricial (*).
A divisão de vetores elemento a elemento requer o uso do símbolo ponto (.):
» a./b
ans =
1.0000 0.6667 0.6000 0.5714 0.5556
» b.a
ans =
1.0000 0.6667 0.6000 0.5714 0.5556
A exponenciação de vetores também é feita elemento a elemento, podendo ser definida
de várias maneiras:
» a.^2
ans =
1 4 9 16 25
os elementos individuais de a elevados ao quadrado.
» 2.^a
17
ans =
2 4 8 16 32
neste caso o escalar 2 é elevado a uma potência dada por cada elemento de a.
» a.^b
ans =
1 8 243 16384 1953125
aqui cada elemento do vetor a é elevado a uma potência dada por cada elemento do vetor b. A
Tabela 2 mostra um resumo das operações aritméticas com vetores.
Operação Forma Algébrica MATLAB
Adição a + b a + b
Subtração a - b a - b
Multiplicação a ´ b a.* b
Divisão à direita a / b a. / b
Divisão à esquerda b  a a.  b
Exponenciação ab a. ^ b
Tabela 2: Operações aritméticas elemento a elemento entre dois vetores
7. Gráficos
O Matlab oferece um processador gráfico com extensiva capacidade de gerar toda a
gama de gráficos, e ao mesmo tempo simplificando muito o seu uso. Pode-se gerar gráficos
com apenas um comando. O gráfico mais simples é o de um conjunto de pontos no plano x-y.
Por exemplo:
» x = 1:6; y = [-1 1/4 1 pi 2 1]; plot(x,y)
18
O gráfico resultante é mostrado na Figura 1. Observe que o Matlab une os pontos do
gráfico por meio de retas.
Figura 7.1 Gráfico x-y
Um gráfico alternativo, mostrado na Figura 7.2, pode ser obtido da seguinte forma:
» plot(x,y,'+')
Figura 7.2: Forma alternativa do gráfico x-y.
1 1.5 2 2.5 3 3.5 4 4.5 5 5.5 6
-1
-0.5
0
0.5
1
1.5
2
2.5
3
3.5
1 1.5 2 2.5 3 3.5 4 4.5 5 5.5 6
-1
-0.5
0
0.5
1
1.5
2
2.5
3
3.5
19
Aos gráficos das figuras 7.1 e 7.2 pode-se acrescentar título, nomes dos eixos, e
reticulado. Pode-se também controlar as cores das curvas, bem como o tipo de linha utilizado.
É possível se ter mais de uma curva num mesmo gráfico. Além destas, há muitas outras
facilidades gráficas oferecidas pelo Matlab. Uma boa opção para se aprender mais sobre os
recursos da função plot é o de entrar com o comando help plot.
O Matlab pode gerar diversos tipos de gráficos: curvas em 2D, superfícies em 3D,
gráficos de contorno de superfícies em 3D, curvas paramétricas em 2D e em 3D. Os detalhes de
como são gerados esses gráficos podem ser encontrados com o auxílio do help.
O comando subplot cria diversos gráficos numa mesma janela gráfica. A sua sintaxe
é subplot(m,n,k), em que mn é o número de gráficos a serem criados, organizado numa
matriz com m linhas e n colunas, e k é a ordem em que aparecem os gráfico ao longo das
linhas. Vejamos o seguinte exemplo: 4 gráficos serão gerados numa mesma janela, e mostrados
na Figura 7.3.
» x = 0:pi/20:2*pi;
» n = 0:.3:6;
»subplot(2,2,1)
»plot(x, sin(x))
»subplot(2,2,2)
»plot(x, exp(-x))
»subplot(2,2,3)
»stem(n, sin(2*pi*n/4))
»subplot(2,2,4)
»stem(n, 0.5.^n)
20
Figura 7.3: Gráficos múltiplos numa mesma janela.
8. Operações com Matrizes
As operações de multiplicação por escalar, soma e subtração de matrizes são efetuadas
elemento a elemento de forma similar aos vetores, como visto anteriormente. A operação de
transposição de matrizes ou vetores é feita por meio do ( ' ), ou seja, b = a' faz com que a
matriz b seja a transposta da matriz a.
O produto escalar é definido como a soma dos produtos dos elementos correspondentes
de dois vetores do mesmo tamanho. No Matlab isto é implementado da seguinte forma:
prod_esc = sum(P.*Q);
em que P e Q são ambos vetores linha ou vetores coluna.
O produto de AB de duas matrizes A e B só existirá se o número de colunas de A for
idêntico ao número de linhas de B. Por exemplo:
0 2 4 6 8
-1
-0.5
0
0.5
1
0 2 4 6 8
0
0.2
0.4
0.6
0.8
1
0 2 4 6
-1
-0.5
0
0.5
1
0 2 4 6
0
0.2
0.4
0.6
0.8
1
21
» A = [0 1 2;-1 3 5];
» B = [1 2 3;-1 0 5;4 5 -2];
» C = A*B
C =
7 10 1
16 23 2
» D = B*A
??? Error using ==> *
Inner matrix dimensions must agree.
Do exemplo acima pode-se ver que o Matlab não executa a operação D=BA, pois ela não
satisfaz as condições para multiplicação de duas matrizes.
Do que foi visto acima é possível simplificar a operação de produto escalar entre dois
vetores linhas P e Q, usando o seguinte comando:
prod_esc = P*Q'
A inversa de uma matriz quadrada A pode ser computada no Matlab através da instrução
inv(A). Por exemplo:
B =
1 2 3
-1 0 5
4 5 -2
» inv_B = inv(B)
inv_B =
6.2500 -4.7500 -2.5000
-4.5000 3.5000 2.0000
22
1.2500 -0.7500 -0.5000
» B*inv_B
ans =
1.0000 0.0000 0.0000
0.0000 1.0000 0.0000
0.0000 0.0000 1.0000
No exemplo acima, foi computado também o produto B*B-1 , que nada mais é do que a matriz
identidade.
O determinante de uma matriz pode ser computado, utilizando-se a instrução det(A),
como mostrado no exemplo abaixo:
A =
1 2 3
-1 0 5
4 5 -2
» det(A)
ans =
-4
Vamos supor que se deseje resolver o seguinte sistema de equações lineares:
2x1 + x2 - 3x3 = 5
3x1 - 2x2 + 2x3 = 5
5x1 - 3x2 - x3 = 16
Este sistema pode ser escrito na forma matricial, como:
23
AX = B
A
x
=
2 1 -3
3 -2 2
5 -3 -1
X =
x
x B =
5
5
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 = AB
X =
1
-3
-2
A outra solução utiliza a matriz inversa, ou seja:
X = A-1B
» A = [2 1 -3;3 -2 2;5 -3 -1];
» B = [5 5 16]';
» X = inv(A)*B
X =
1.0000
24
-3.0000
-2.0000
9. Programação em Matlab
A solução de problemas mais complexos pode ser implementada através da programa-
ção na própria linguagem do Matlab. O programa pode ser escrito num arquivo texto com
extensão .m. O Matlab fornece um editor de textos ASCII que permite criar e editar tais
arquivos.
9.1 “Loops” e Operações Condicionais
A linguagem de programação do Matlab fornece comandos para “loops” e operações
condicionais. Há dois tipos de “loops”: um é do tipo for e outro é do tipo while. Um “loop”:
tipo for repete as instruções dentro do “loop” à medida que o índice do “loop” assume os
valores de um dado vetor linha. Por exemplo:
» for k = [1 2 3]
x(k) = k^2;
end
» x
x =
1 4 9
A forma mais comum de escrever esse “loop” seria:
25
» for k = 1:3
x(k) = k^2;
end
Observe que 1:3 é eqüivalente a [1 2 3].
É importante salientar que em termos de eficiência deve-se sempre procurar usar
funções tipo “built-in” e operadores sempre que possível. Isto deve-se ao fato que os “scripts” e
as funções definidas pelo o usuário ( e a maioria das funções existentes nas “toolboxes” ) são
interpretadas, em vez de compiladas. Isto significa que quando um arquivo .m é executado,
cada instrução é lida e depois executada, em vez de todo o programa ser compilado na
linguagem da máquina para depois ser executado. Por isso que muitas vezes os programas
escritos em Matlab são muito mais lentos que os escritos em outras linguagens como C e
Fortran, por exemplo. As duas seqüências de comandos abaixo dão o mesmo resultado:
» t = (0: .0001:10;
» y=sin(t);
e
»t = 0:.0001:10;
»for i=1:length(t)
y(i)=sin(t(i));
end
Entretanto, no meu computador, a segunda implementação é 25 vezes mais lenta que a
primeira. Isto deve-se ao fato que a primeira seqüência de comandos utiliza a função seno
vetorizada ( ‘built-in” ), ou seja, as operações com vetores serão sempre mais eficientes que os
“loops” no Matlab.
O “loop” while se repete enquanto uma dada expressão for verdadeira. O exemplo
abaixo mostra um algoritmo para calcular a raiz quadrada do valor de x. A variável eps é
fornecida pelo Matlab e serve para medir a precisão das operações em ponto flutuante. Seu
valor é 2.2204e-016.
26
» x = 3; xp = x/2;
» df = 1;
» while df > eps
y = 0.5*(xp + x/xp);
df = abs(y-xp);
xp = y;
end
» y
y =
1.73205080756888
As operações condicionais no Matlab são similares às de outras linguagens de alto
nível. Os operadores lógicos são: <, >, <=, >=, = = (igual), ~ = (diferente). Estes operadores são
binários e retornam os valores 0 e 1 ( para argumentos escalares ).
» 4 > 3
ans =
1
» 4 < 3
ans =
0
» 4 == 3
ans =
0
» 4 ~= 3
ans =
1
A forma geral de um comando tipo if é :
27
if expressão 1
comandos
elseif expressão 2
comandos
else
comandos
end
O primeiro bloco de comandos após uma expressão não nula será executado.
9.2 Scripts e Funções
Um “script” é simplesmente uma coleção de comandos do Matlab escritos num arquivo
tipo m ( um arquivo texto com extensão .m). Ao se entrar no “prompt” com o nome do arquivo
(sem a extensão .m), os comandos são executados como se tivessem sido entrados diretamente
no espaço de trabalho do Matlab.
Por exemplo, vamos supor que o arquivo seno.m contenha o script mostrado abaixo.
% Programa para gerar um gráfico da função seno
% Geração um vetor x com N amostras entre 0 e 2pi
x = linspace(0,2*pi,N);
y = sin(x); % gera o vetor y a partir de x
plot(x,y),title('Gráfico do Seno')
xlabel ('Ângulo em rad'),ylabel('Amplitude'),grid
Se entrarmos no espaço de trabalho com os seguintes comandos:
» N=50; a=1;
» seno
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
1
Gráfico do Seno
Ângulo em rad
Amplitude
29
seja, elas não aparecem no espaço de trabalho do Matlab. Por exemplo, vamos considerar uma
função que compute a média e a variância de um conjunto de números. Seja estat o nome dessa
função. Abaixo esta mostrada a listagem do arquivo estat.m.
function [m,v] = estat(x)
% Função que computa a média e a variância de x
nx = length(x);
m = sum(x)/nx;
v = sum((x - m).^2)/(nx-1);
Para testar a função:
» x = rand(1,100);
» [med,var] = estat(x)
med =
0.4652
var =
0.0778
30
10. Uso da "Toolbox Signal"
Esta "toolbox" possui uma coleção muito grande de funções que são largamente
utilizadas em processamento de sinais.
10.1 Geração de Sinais Elementares
Os sinais para serem tratados pelo computador devem estar na forma discreta, embora
possamos gerar gráficos como se eles fossem contínuos, para isto basta que se use um número
suficientemente grande de pontos do sinal contínuo. Estes pontos, ou amostras, são obtidos
pelo processo de amostragem. que consiste em dividir o eixo do tempo, por exemplo, em
intervalos com espaçamento uniforme Dt, que é chamado de intervalo de amostragem. O
inverso do intervalo de amostragem é denominado de freqüência de amostragem fs, que indica a
cadência com que uma dada variável é amostrada, no caso mais comum esta variável é o
tempo.
Para se gerar um vetor t no intervalo [0,1s], com Dt = 0,001s (fs = 1 kHz), usam-se os
seguintes comandos:
» fs = 1000; % freqüência de amostragem
» t = 0:1/fs:1; % vetor com amostras separadas de 0,001s (1 ms)
Exemplo 10.1: Gerar uma onda quadrada periódica com amplitude unitária, com freqüência
fundamental de 10 Hz, e ciclo de repetição de 50% ( ciclo de repetição é a porção de cada ciclo
para a qual o sinal é positivo, e 0 < cr < 100%).
% Programa para gerar uma onda quadrada
A = 1; % amplitude de pico
f0 = 10; % freqüência fundamental em Hz
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 p/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
Amplitude
Onda Quadrada Simétrica
32
% Programa para gerar uma onda quadrada discreta
A = 1; % amplitude de pico
wd = pi/6; % freqüência fundamental em rad
cr = 50; % onda quadrada simétrica em %
n = -15:15; % gera os índices das amostras
dquadrada = A*square(wd*n,cr);
stem(n,dquadrada), xlabel('n'),ylabel('Amplitude')
title('Onda Quadrada Simétrica')
axis([-15 15 -1.5 1.5]);
A onda quadrada discreta é mostrada na Figura 10.2.
Figura 10.2: Onda Quadrada Discreta com wd = p/6
Da mesma forma que se pode gerar uma onda quadrada contínua ou discreta, também podem
ser gerados sinais senoidais ou cossenoidais através das funções sin(wt+f) e cos(wt+f).
-15 -10 -5 0 5 10 15
-1.5
-1
-0.5
0
0.5
1
1.5
Amplitude
Onda Quadrada Simétrica
33
Exercício 10.2: Gere um sinal senoidal contínuo de amplitude unitária, com freqüência
fundamental de 2 Hz, no intervalo [-1,1], e com fase inicial nula. Utilize uma freqüência de
amostragem de 500 Hz.
Exercício 10.3: Gere uma seqüência cossenoidal com amplitude de pico de 2, freqüência
fundamental de p/4, no intervalo [-10,10]. Considere a fase inicial como sendo -p/3.
Exemplo 10.3: Gerar o sinal x(t) = 5e-4t
sen(20pt). Considere a freqüência de amostragem como
sendo de 1 kHz.
% Programa para gerar uma senóide amortecida.
fs = 1000; % freq. de amostragem
fo = 10; % freq. fundamental
a = -4; % coef. da exponencial
fi = 0; % fase inicial
A = 5; % amplitude da senóide
t = 0:1/fs:1; % eixo do tempo
x = A*sin(2*pi*fo*t + fi).*exp(a*t);
plot(t,x),xlabel('t (s)'),ylabel('Amplitude')
title('Senóide Amortecida')
axis([0 1 -6 6]);
A Figura 10.3 mostra a senóide amortecida gerada pelo programa acima.
Exercício 10.4: Gere a seqüência senoidal amortecida dada por x[n] = 5(0,8)n
sen(pn/4), no
intervalo [0,20].
34
Figura 10.3: Senóide Amortecida
A geração de seqüências tipo delta ( d[n] ) e degrau unitário ( u[n] ) pode ser feita com o
auxílio das funções zeros(m,n) e ones(m,n). Por exemplo, para se gerar a seqüência u[n-10] com
50 amostras, escreve-se a seguinte linha de comando:
u = [zeros(1,10),ones(1,40)];
Para se gerar uma seqüência d[n-6] com 50 amostras, pode-se fazer assim:
delta = zeros(1,50);
delta(1,6) = 1;
A energia de uma seqüência de duração finita x[n] é dada por:
åå ==
==
1-N
0n
2
1-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)
Amplitude
Senóide Amortecida
35
o que pode ser computado no Matlab como:
Ex = sum(x.*conj(x));
ou
Ex = sum(abs(x).^2);
De forma similar, a potência média de um sinal periódico com período N é dada por:
å=
=
1-N
0n
2
|x[n]|
N
1
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:
å
¥
¥=
==
-k
k]-h[k]x[nx[n]*h[n]][ny
Se o sistema também for causal, então:
å=
=
n
ny
0k
k]-h[k]x[n][
A expressão acima pode ser facilmente computada usando-se a função conv(h,x).
Exemplo 10.4: Um SLIC possui uma resposta impulsional dada por h[n] = (0,85)n
u[n]. Para
uma entrada x[n] = u[n] - u[n-15], determine as 40 primeiras amostras da saída y[n].
36
% Programa para computar a convolução de duas seqüências
% h[n]=(0.85)^n e x[n]=u[n] - u[n-15]
N=40;
n=0:N-1;
h=(.85).^n;
x=[ones(1,15),zeros(1,25)];
y=conv(x,h);
subplot(3,1,1)
stem(n,x),xlabel('n'),ylabel('x[n]'),title('Entrada')
subplot(3,1,2)
stem(n,h)
xlabel('n'),ylabel('h[n]'),title('Resposta Impulsional')
subplot(3,1,3)
stem(n,y(1:N)),xlabel('n'),ylabel('y[n]'),title('Saída')
A entrada x[n], a resposta impulsional do sistema h[n], e a saída do sistema y[n] são
mostrada na Figura 10.4.
A saída de um SLI discreto também pode ser obtida através da solução da equação
diferença que descreve este sistema.
å å= =
-=-
N
k
M
k
k knxknya
0 0
k ][b][
O Matlab possui uma função filter(a,b,x), em que a = [1, a1,a2,...aN], b = [b0,b1,....bM], e x é o
vetor com as amostras da entrada, para resolver numericamente a equação diferença acima.
37
Figura 10.4: Resposta de um SLI a uma entrada tipo pulso.
Exemplo 10.5: Determinar as respostas impulsional e ao degrau do sistema descrito pela
equação diferença y[n] - 1,2728y[n-1] + 0,81y[n-2] = 0,5372x[n].
% Programa para computar as respostas impulsional e ao degrau
%do sistema descrito por y[n]-1.2728y[n-1]+0.81y[n-2] =
%0,532x[n].
N = 50; % número de amostras
b = 0.5372; a = [1 -1.2728 0.81]; % coeficientes da ED
imp = [1 zeros(1,N-1)]; % gera o impulso
deg = [ones(1,N)]; % gera o degrau unitário
h = filter(b,a,imp); % cômputo da resposta impulsional
y = filter(b,a,deg); % cômputo da resposta ao degrau
n = 0:N-1;
0 5 10 15 20 25 30 35 40
0
0.5
1
x[n]
Entrada
0 5 10 15 20 25 30 35 40
0
0.5
1
h[n]
Resposta Impulsional
0 5 10 15 20 25 30 35 40
0
5
10
y[n]
Saída
38
subplot(2,1,1)
stem(n,h)
xlabel('n'),ylabel('h[n]'),title('Resposta Impulsional')
subplot(2,1,2)
stem(n,y)
xlabel('n'),ylabel('y[n]'),title('Resposta ao Degrau')
A Figura 10.5 mostra as respostas impulsional e ao degrau do sistema do Exemplo 10.5.
Figura 10.5: Respostas impulsional e ao degrau do sistema do Exemplo 10.4.
No Exemplo 10.5, o sistema é dito recursivo ou IIR (Infinite Impulse Response), pois a
resposta impulsional é de duração infinita. Há também os sistemas não-recursivos ou FIR
(Finite Impulse Response), cuja resposta impulsional é de duração finita. Um exemplo destes
sistemas é o filtro de média móvel descrito pela seguinte equação diferença:
0 10 20 30 40 50
-0.5
0
0.5
1
n
h[n]
Resposta Impulsional
0 10 20 30 40 50
0
0.5
1
1.5
2
n
y[n]
Resposta ao Degrau
39
å=
=
1-M
0k
k]-x[n
M
1
][ny
Exemplo 10.6: Um sinal s[n] = 3 + 4(0,95)n
sen(p/8 n) é contaminado por um ruído com
distribuição uniforme entre -0,5 e 0,5.Será utilizado um filtro de média móvel para diminuir os
efeitos do ruído aditivo.
A Figura 10.6 mostra as duas seqüências s[n] e r[n].
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 50
0
2
4
6
8
s[n]
Sinal sem Ruido
0 10 20 30 40 50
-0.5
0
0.5
n
r[n]
Ruido
40
original s[n], o ruído r[n], e a soma dos dois x[n]. A Figura 10.7b mostra as curvas da entrada
x[n] e da saída y[n] do filtro de médias móveis. Deve-se observar que a saída y[n] é muito
próxima do sinal original s[n], exceto por um atraso de uma amostra, o que é conseqüência do
processo de filtragem.
Figura 10.7: a) sinal s[n], ruído r[n] e x[n]=s[n]+r[n]; b) sinal s[n] e saída do filtro y[n]
% Programa que exemplifica o uso de filtros de média móvel
N = 50;
n = 0:N-1;
s = (4*sin(n*pi/8).*(.95).^n) + 3*ones(1,N);
r = rand(1,N) - 0.5; % ruído com distribuição uniforme
figure(1)
subplot(2,1,1)
stem(n,s),xlabel('n'),ylabel('s[n]'),title('Sinal sem Ruido')
subplot(2,1,2)
r[n]
s[n]
x[n]
0 10 20 30 40 50
-2
0
2
4
6
n
Amplitudes
s[n]
y[n]
0 10 20 30 40 50
-2
0
2
4
6
n
Amplitudes
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 ww
em que X(ejw
) é uma função contínua e complexa.
Exemplo 10.7: Calcular a transformada de Fourier da seqüência x[n] = (0,5)n
u[n].
5,05,01
1
)5,0()(
0 -
=
-
== å
¥
=
-
-
w
w
w
ww
j
j
n
j
njnj
e
e
e
eeX
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-jw
).
No Exemplo 10.7, como x[n] é uma seqüência de duração infinita não se pode usar o
Matlab para computar X(ejw
) diretamente. Entretanto, pode-se computar X(ejw
) usando-se a
expressão acima, no intervalo [0,p] e então traçar gráficos de magnitude e fase, ou das partes
real e imaginária.
Exemplo 10.8: Computar e plotar os espectros de magnitude e fase de X(ejw
), bem como as suas
partes real e imaginária.
% Programa para computar e plotar os espectros de amplitude e
% fase da DTFT de x[n]=(0,5)^n u[n], a partir da expressão
% X(w)= exp(jw)/[exp(jw) - 0,5].
N = 256;
w = (0:N-1)*pi/N; % eixo das freqüências dividido em N pontos
ex = exp(j*w);
X = ex./(ex - .5*ones(1,N));
ampl = abs(X); % cômputo do módulo de X(jw)
fase = angle(X); % cômputo da fase de X(jw)
rex = real(X);
imx = imag(X);
wnorm = w/pi; % normalização do eixo das freqüências
subplot(2,2,1)
plot(wnorm,ampl)
xlabel('Freqüência normalizada') ,ylabel('Magnitude'), ti-
tle('Espectro de Amplitude')
subplot(2,2,3)
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 p corresponde ao valor 1. Muitos autores chamam este ponto
0 0.5 1
0.5
1
1.5
2
Frequência Normalizada
Magnitude
Espectro de Amplitude
0 0.5 1
-0.6
-0.4
-0.2
0
Frequência Normalizada
Radianos
Espectro de Fase
0 0.5 1
0.5
1
1.5
2
Frequência Normalizada
Real[X(jw)]
Parte Real
0 0.5 1
-0.8
-0.6
-0.4
-0.2
0
Frequência Normalizada
Imag[X(jw)]
Parte Imaginária
44
de freqüência de Nyquist, pois é a freqüência que corresponde à metade da freqüência de
amostragem. Um outro ponto que deve ser observado é o que se refere à forma de se plotar uma
função complexa X(ejw
). Isto pode ser feito através de gráficos que mostrem as partes real e
imaginária, ou de gráficos de magnitude e fase. Esta última forma é a preferida quando a função
complexa estiver relacionada a sistemas lineares discretos, como por exemplo filtros digitais.
No caso em que a seqüência discreta x[n] for de duração finita, então será possível se
utilizar o Matlab para o cômputo da transformada de Fourier. Na realidade o que se faz é
computar a Transformada Discreta de Fourier (DFT), que é uma seqüência discreta, definida
como:
1]-N[0,kx[n]e][
1
0n
N
2
-
Î= å
-
=
N kn
kX
p
Pode-se mostrar que os X[k] são amostras de X(ejw
) igualmente espaçadas de 2p/N no
círculo unitário, ou seja X(ejw
) é a envoltória das amostras representadas por X[k].
Exemplo 10.9: Repetir o Exemplo 10.7, utilizando a DFT para computar X(ejw
). Como x[n]
deve ser finita, o que se pode fazer é obter uma versão truncada de x[n] num intervalo finito
adequado.
No programa abaixo foi utilizada a função fft(x,M) para computar a DFT da seqüência x
de comprimento N, com M pontos. Se M for omitido o cômputo da DFT se dará com o número
de pontos de x, neste caso N. Se M>N, então serão apendados (M-N) zeros ao final da
seqüência x. Este procedimento não altera a forma da envoltória de X[k], apenas a define
melhor. A FFT (Fast Fourier Transform) é apenas um algoritmo que computa de forma
eficiente a DFT. Esses algoritmos são mais rápidos quando M for uma potência inteira de 2
(M= 2p
).
45
% Programa para computar a transformada de Fourier usando o
% algoritmo de FFT
N = 256;
x = (.5).^(0:N-1); % geração da seqüência x[n]
Xc = fft(x); % cômputo da DFT de x[n]
X = Xc(1:N/2+1); % freqüências no intervalo [0,pi]
ampl = abs(X); % cômputo do módulo de X(jw)
fase = angle(X); % cômputo da fase de X(jw)
rex = real(X);
imx = imag(X);
wnorm = 0:2/N:1; % normalização do eixo das freqüências
subplot(2,2,1)
plot(wnorm,ampl)
xlabel('Freqüência Normalizada'),ylabel('Magnitude')
title('Espectro de Amplitude')
subplot(2,2,3)
plot(wnorm,fase)
xlabel('Freqüência Normalizada'),ylabel('Radianos')
title('Espectro de Fase')
subplot(2,2,2)
plot(wnorm,rex)
xlabel('Freqüência Normalizada'),ylabel('Real[X(jw)]')
title('Parte Real')
subplot(2,2,4)
plot(wnorm,imx)
xlabel('Freqüência Normalizada'),ylabel('Imag[X(jw)]')
title('Parte Imaginária')
46
Comparando-se os resultados mostrados nas Figuras 10.8 com os da Figura 10.9 , pode-se ver
que a aproximação obtida utilizando a DFT é muito boa.
Figura 10.9: Gráficos da transformada de Fourier obtidos através da DFT.
Exemplo 10.11: Computar e plotar a DFT da seqüência x[n] = u[n] -u[n-8], com 8, 16, 32, e 64
pontos.
% Programa que ilustra o efeito de se apendar zeros a uma
% seqüência finita
x = ones(1,8); % x[n]=u[n]-u[n-8]
XO = fft(x); % fft com 8 pontos
X1 = fft(x,16); % fft com 16 pontos, 8 zeros apendados a x[n]
0 0.5 1
0.5
1
1.5
2
Frequência Normalizada
Magnitude
Espectro de Amplitude
0 0.5 1
-0.6
-0.4
-0.2
0
Frequência Normalizada
Radianos
Espectro de Fase
0 0.5 1
0.5
1
1.5
2
Frequência Normalizada
Real[X(jw)]
Parte Real
0 0.5 1
-0.8
-0.6
-0.4
-0.2
0
Frequência Normalizada
Imag[X(jw)]
Parte Imaginária
47
X2 = fft(x,32); % fft com 32 pontos, 24 zeros apendados a x[n]
X3 = fft(x,64); % fft com 64 pontos, 56 zeros apendados a x[n]
subplot(2,2,1)
stem([(0:4)/4],abs(XO(1:5)))
xlabel('Freqüência Normalizada'),ylabel('Magnitude')
title('N = 8')
subplot(2,2,3)
stem([(0:8)/8],abs(X1(1:9)))
xlabel('Freqüência Normalizada'),ylabel('Magnitude')
title('N = 16 (8 zeros)')
subplot(2,2,2)
stem([(0:16)/16],abs(X2(1:17)))
xlabel('Freqüência Normalizada'),ylabel('Magnitude')
title('N = 32 (24 zeros)')
subplot(2,2,4)
stem([(0:32)/32],abs(X3(1:33)))
xlabel('Freqüência Normalizada'),ylabel('Magnitude')
title('N = 64 (56 zeros)')
O programa acima computa 4 DFTs com diferentes números de pontos. A primeira com
8 pontos, a segunda com 16 pontos, sendo que destes 8 são zeros que foram apendados ao final
de x[n]. As outras duas são computadas com 32 e 64 pontos, sendo que nestes casos foram
apendados 24 e 56 zeros respectivamente.
Os resultados mostrados na Figura 10.10 indicam que ao se apender zeros a uma
seqüência finita, obtém-se uma amostragem mais fina da envoltória X(ejw
), sem que isto altere
a sua forma.
48
Exercício 10.5: Para a seqüência x[n] = u[n] - 2u[n-8] + u[n-16] compute e plote |X[k]|, para
N=16, e N=64 (apendendo-se 48 zeros). Comente os resultados.
Figura 10.10: O efeito de se apender zeros ao final de uma seqüência finita
10.4 Resposta em Freqüência dos Sistemas Lineares Invariantes e Discretos (SLID)
A resposta em freqüência de um SLID é dada por H(ejw
), que nada mais é do que a
transformada de Fourier da resposta impulsional h[n] do sistema. Como H(ejw
) é uma função
complexa, a resposta em freqüência é composta da resposta em magnitude, ou em amplitude,
que é |H(ejw
)|, e da resposta em fase que é o argumento de H(ejw
).
0 0.5 1
0
2
4
6
8
Freqüência Normalizada
Magnitude
N = 8
0 0.5 1
0
2
4
6
8
Freqüência Normalizada
Magnitude
N = 16 (8 zeros)
0 0.5 1
0
2
4
6
8
Freqüência Normalizada
Magnitude
N = 32 (24 zeros)
0 0.5 1
0
2
4
6
8
Freqüência Normalizada
Magnitude
N = 64 (56 zeros)
49
O Matlab possui uma função que permite computar a resposta em freqüência a partir
dos coeficientes da equação diferença que descreve o sistema. É também possível computá-la a
partir dos coeficientes da função de transferência H(z), que é a transformada z de h[n]. Estes
coeficientes são na realidade os mesmos da equação diferença. A função é [H,w]=freqz(b,a,N).
Maiores detalhes podem ser obtidos através do help do Matlab.
Exemplo 10.12: Para o sistema de 2a
ordem do Exemplo 10.5, descrito por y[n] - 1,2728y[n-1]
+0,81y[n-2] = 0,532x[n], determine e plote a resposta em freqüência do sistema.
% Programa para computar a resposta em freqüência do SLI
% descrito por: % y[n] - 1,2728y[n-1] + 0,81y[n-2] = 0,532x[n].
b = 0.532;
a = [1 -1.2728 .81];
N = 128; % # de pontos para o cômputo da FFT
[H w] = freqz(b,a,N);
subplot(2,1,1)
plot(w/pi,abs(H))
xlabel('Freqüência Normalisada'),ylabel('Magnitude')
title('Resposta em Magnitude')
subplot(2,1,2)
plot(w/pi,angle(H))
xlabel('Freqüência Normalisada'),ylabel('Radianos')
title('Resposta em Fase')
Exercício 10.6: Repetir o Exemplo 10.12 usando a opção ‘whole’ em freqz. Esta opção permite
computar a resposta em freqüência no intervalo [0,2p]. O que pode ser dito em termos de
simetria das resposta em magnitude e fase?
50
Figura 10.11: Respostas em Magnitude e Fase do sistema do Exemplo 10.12.
Exemplo 10.13: Para um filtro tipo média móvel, determine e plote as respostas de magnitude e
fase, para M = 3, e M = 10.
% Programa para computar a resposta em freqüência do SLI
% descrito por: y[n] ={x[n] + x[n-1] + x[n-2] +...+ x[n-M]}/M.
% Este sistema é um filtro de média móvel
b1 = [1 1 1]/3; b2 = ones(1,10)/10;
a = 1;
N = 128; % # de pontos para o cômputo da FFT
0 0.2 0.4 0.6 0.8 1
0
1
2
3
4
Freqüência Normalisada
Magnitude
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
Radianos
Resposta em Fase
51
[H1 w] = freqz(b1,a,N);
[H2 w] = freqz(b2,a,N);
subplot(2,1,1)
plot(w/pi,abs(H1),'r:',w/pi,abs(H2),'b--')
xlabel('Freqüência Normalisada'),ylabel('Magnitude')
title('Resposta em Magnitude'),legend('r:','M=3','b--','M=10');
subplot(2,1,2)
plot(w/pi,angle(H1),'r:',w/pi,angle(H2),'b--')
xlabel('Freqüência Normalisada'),ylabel('Radianos')
title('Resposta em Fase'),legend('r:','M=3','b--','M=10');
Figura 10.12: Resposta em freqüência de um filtro de média móvel, com M=3, e M=10.
M=3
M=10
0 0.2 0.4 0.6 0.8 1
0
0.2
0.4
0.6
0.8
1
Freqüência Normalisada
Magnitude
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
Radianos
Resposta em Fase
52
10.5 Transformada z
A transformada z unilateral é definida como:
å
¥
=
-
=
0
x[n]z)(
n
n
zX
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,324z0,5439z0,4446z-0,02722z1
2,1213z2,6464z-1,2071z-1
)(
+++
+
=zH
% Programa para determinar na forma fatorada uma função
% racional e fazer um diagrama de pólos e zeros
num = [1 -1.2071 -2.6464 2.1213];
den = [1 0.0272 -0.4446 0.5439 0.3240];
[zeros polos ganho] = tf2zp(num,den)
zplane(num,den)
53
zeros =
2.0000
-1.5000
0.7071
polos =
0.6364 + 0.6364i
0.6364 - 0.6364i
-0.8000
-0.5000
ganho =
1
A figura 10.13 mostra o diagrama de pólos e zeros de H(z). A região de convergência é
o exterior do círculo de raio | 0,6364 + 0,6364i | = 0,9, que corresponde ao módulo dos pólos
mais afastados da origem, para uma solução causal.
A transformada inversa de H(z) é a resposta impulsional h[n]. Esta transformada pode
ser computada de diversas maneiras, porém no caso em que H(z) for racional, é mais
conveniente utilizar o método da expansão em frações parciais. Com este método é possível se
obter uma expressão para h[n] na forma fechada. O Matlab possui a função
[r,p,k]=residuez(num,den), que permite computar os pólos de H(z), os coeficientes da
expansão em frações parciais.
54
Figura 10.13: Diagrama de pólos e zeros de H(z) do Exemplo 10.13.
Exemplo 10.14: Determinar h[n] da FT dada abaixo, pelo método da expansão em frações
parciais.
0,080,14z1,1z-z
1)-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
Imaginarypart
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,2z
z
1,7143-
0,8-z
z
0,667-
0,5-z
z
2,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]

Mais conteúdo relacionado

Mais procurados

Guia prático para criar algoritmos
Guia prático para criar algoritmosGuia prático para criar algoritmos
Guia prático para criar algoritmosMauro Pereira
 
mod4-estruturas-dadosestaticas-ordenacao
mod4-estruturas-dadosestaticas-ordenacaomod4-estruturas-dadosestaticas-ordenacao
mod4-estruturas-dadosestaticas-ordenacaodiogoa21
 
Lista de exercicios algoritmos com pseudocodigo
Lista de exercicios   algoritmos com pseudocodigoLista de exercicios   algoritmos com pseudocodigo
Lista de exercicios algoritmos com pseudocodigoMauro Pereira
 
mod5-estruturas-dadosdinamicas
mod5-estruturas-dadosdinamicasmod5-estruturas-dadosdinamicas
mod5-estruturas-dadosdinamicasdiogoa21
 
Lista de exercicios vetores, matrizes, registros e sub-algoritmos
Lista de exercicios   vetores, matrizes, registros e sub-algoritmosLista de exercicios   vetores, matrizes, registros e sub-algoritmos
Lista de exercicios vetores, matrizes, registros e sub-algoritmosMauro Pereira
 
FIS146 - Informática Aplicada a Fı́sica
FIS146 - Informática Aplicada a Fı́sicaFIS146 - Informática Aplicada a Fı́sica
FIS146 - Informática Aplicada a Fı́sicaMarcilio Guimarães
 
Algoritmos e Programação: Matrizes
Algoritmos e Programação: MatrizesAlgoritmos e Programação: Matrizes
Algoritmos e Programação: MatrizesAlex Camargo
 
Material de Apoio de Algoritmo e Lógica de Programação
Material de Apoio de Algoritmo e Lógica de ProgramaçãoMaterial de Apoio de Algoritmo e Lógica de Programação
Material de Apoio de Algoritmo e Lógica de Programaçãorodfernandes
 
Algoritmos - Formas de Representação de Algoritmos
Algoritmos - Formas de Representação de AlgoritmosAlgoritmos - Formas de Representação de Algoritmos
Algoritmos - Formas de Representação de AlgoritmosElaine Cecília Gatto
 
Lista de exercicios algoritmos resolvida-
Lista de exercicios   algoritmos  resolvida-Lista de exercicios   algoritmos  resolvida-
Lista de exercicios algoritmos resolvida-Mauro Pereira
 
Fórmulas e funções de calc
Fórmulas e funções de calcFórmulas e funções de calc
Fórmulas e funções de calcCDP_Online
 
Apresentação 20130805 algoritmos
Apresentação 20130805 algoritmos Apresentação 20130805 algoritmos
Apresentação 20130805 algoritmos João moreira
 
Descritiva Narrativa (Lógica de Programação)
Descritiva Narrativa (Lógica de Programação)Descritiva Narrativa (Lógica de Programação)
Descritiva Narrativa (Lógica de Programação)Gercélia Ramos
 

Mais procurados (20)

Curso matlab
Curso matlabCurso matlab
Curso matlab
 
Guia prático para criar algoritmos
Guia prático para criar algoritmosGuia prático para criar algoritmos
Guia prático para criar algoritmos
 
mod4-estruturas-dadosestaticas-ordenacao
mod4-estruturas-dadosestaticas-ordenacaomod4-estruturas-dadosestaticas-ordenacao
mod4-estruturas-dadosestaticas-ordenacao
 
Lista de exercicios algoritmos com pseudocodigo
Lista de exercicios   algoritmos com pseudocodigoLista de exercicios   algoritmos com pseudocodigo
Lista de exercicios algoritmos com pseudocodigo
 
mod5-estruturas-dadosdinamicas
mod5-estruturas-dadosdinamicasmod5-estruturas-dadosdinamicas
mod5-estruturas-dadosdinamicas
 
Lista de exercicios vetores, matrizes, registros e sub-algoritmos
Lista de exercicios   vetores, matrizes, registros e sub-algoritmosLista de exercicios   vetores, matrizes, registros e sub-algoritmos
Lista de exercicios vetores, matrizes, registros e sub-algoritmos
 
Mini-Curso: gnuplot
Mini-Curso: gnuplotMini-Curso: gnuplot
Mini-Curso: gnuplot
 
FIS146 - Informática Aplicada a Fı́sica
FIS146 - Informática Aplicada a Fı́sicaFIS146 - Informática Aplicada a Fı́sica
FIS146 - Informática Aplicada a Fı́sica
 
Algoritmos e Programação: Matrizes
Algoritmos e Programação: MatrizesAlgoritmos e Programação: Matrizes
Algoritmos e Programação: Matrizes
 
3 vetor.matriz
3 vetor.matriz3 vetor.matriz
3 vetor.matriz
 
Material de Apoio de Algoritmo e Lógica de Programação
Material de Apoio de Algoritmo e Lógica de ProgramaçãoMaterial de Apoio de Algoritmo e Lógica de Programação
Material de Apoio de Algoritmo e Lógica de Programação
 
Matlab
Matlab Matlab
Matlab
 
Aula 3 algoritmos
Aula 3   algoritmosAula 3   algoritmos
Aula 3 algoritmos
 
Algoritmos - Formas de Representação de Algoritmos
Algoritmos - Formas de Representação de AlgoritmosAlgoritmos - Formas de Representação de Algoritmos
Algoritmos - Formas de Representação de Algoritmos
 
Lista de exercicios algoritmos resolvida-
Lista de exercicios   algoritmos  resolvida-Lista de exercicios   algoritmos  resolvida-
Lista de exercicios algoritmos resolvida-
 
Visualg
VisualgVisualg
Visualg
 
Simulink 4
Simulink 4Simulink 4
Simulink 4
 
Fórmulas e funções de calc
Fórmulas e funções de calcFórmulas e funções de calc
Fórmulas e funções de calc
 
Apresentação 20130805 algoritmos
Apresentação 20130805 algoritmos Apresentação 20130805 algoritmos
Apresentação 20130805 algoritmos
 
Descritiva Narrativa (Lógica de Programação)
Descritiva Narrativa (Lógica de Programação)Descritiva Narrativa (Lógica de Programação)
Descritiva Narrativa (Lógica de Programação)
 

Destaque

Whitepages Pro Signal Deck 5.19.2015
Whitepages Pro Signal Deck 5.19.2015Whitepages Pro Signal Deck 5.19.2015
Whitepages Pro Signal Deck 5.19.2015Whitepages Pro
 
Ensamble y mantenimiento de computadores – fase 2
Ensamble y mantenimiento de computadores – fase 2Ensamble y mantenimiento de computadores – fase 2
Ensamble y mantenimiento de computadores – fase 2Alejandro Fierro
 
Peos raos.. raos.. raoooss
Peos raos.. raos.. raooossPeos raos.. raos.. raoooss
Peos raos.. raos.. raooossRihlatul adni
 
Cloud computing ppt
Cloud computing pptCloud computing ppt
Cloud computing pptRitu Ganeshe
 
Birthday webcast
Birthday webcastBirthday webcast
Birthday webcastlovinglyssa
 
Materi karakteristik software
Materi karakteristik softwareMateri karakteristik software
Materi karakteristik softwarePurwanti Andriani
 
Reaktivitas Ion-Ion Logam Transisi
Reaktivitas Ion-Ion Logam TransisiReaktivitas Ion-Ion Logam Transisi
Reaktivitas Ion-Ion Logam TransisiRihlatul adni
 
Accenture Transformative Power of Healthcare Technology M&A in Life Science 2015
Accenture Transformative Power of Healthcare Technology M&A in Life Science 2015Accenture Transformative Power of Healthcare Technology M&A in Life Science 2015
Accenture Transformative Power of Healthcare Technology M&A in Life Science 2015Arda Ural, MSc, MBA, PhD
 
Calculas sequence and series
Calculas sequence and seriesCalculas sequence and series
Calculas sequence and seriesVrushang Sangani
 
Tourism industry the Gujarat Experience Sector
Tourism industry the Gujarat Experience SectorTourism industry the Gujarat Experience Sector
Tourism industry the Gujarat Experience SectorVibrant Gujarat
 
Skill Development Sector
Skill Development SectorSkill Development Sector
Skill Development SectorVibrant Gujarat
 
Urban Development Department
Urban Development DepartmentUrban Development Department
Urban Development DepartmentVibrant Gujarat
 

Destaque (18)

Whitepages Pro Signal Deck 5.19.2015
Whitepages Pro Signal Deck 5.19.2015Whitepages Pro Signal Deck 5.19.2015
Whitepages Pro Signal Deck 5.19.2015
 
Ensamble y mantenimiento de computadores – fase 2
Ensamble y mantenimiento de computadores – fase 2Ensamble y mantenimiento de computadores – fase 2
Ensamble y mantenimiento de computadores – fase 2
 
Peos raos.. raos.. raoooss
Peos raos.. raos.. raooossPeos raos.. raos.. raoooss
Peos raos.. raos.. raoooss
 
Power Gen-Solar for mail
Power Gen-Solar for mailPower Gen-Solar for mail
Power Gen-Solar for mail
 
Cloud computing ppt
Cloud computing pptCloud computing ppt
Cloud computing ppt
 
Birthday webcast
Birthday webcastBirthday webcast
Birthday webcast
 
Materi karakteristik software
Materi karakteristik softwareMateri karakteristik software
Materi karakteristik software
 
A.PASCUA.resume
A.PASCUA.resumeA.PASCUA.resume
A.PASCUA.resume
 
Kimia unsur
Kimia unsurKimia unsur
Kimia unsur
 
American gestures
American gesturesAmerican gestures
American gestures
 
Reaktivitas Ion-Ion Logam Transisi
Reaktivitas Ion-Ion Logam TransisiReaktivitas Ion-Ion Logam Transisi
Reaktivitas Ion-Ion Logam Transisi
 
Accenture Transformative Power of Healthcare Technology M&A in Life Science 2015
Accenture Transformative Power of Healthcare Technology M&A in Life Science 2015Accenture Transformative Power of Healthcare Technology M&A in Life Science 2015
Accenture Transformative Power of Healthcare Technology M&A in Life Science 2015
 
Engineering Curves
Engineering CurvesEngineering Curves
Engineering Curves
 
Calculas sequence and series
Calculas sequence and seriesCalculas sequence and series
Calculas sequence and series
 
Textile Sector
Textile SectorTextile Sector
Textile Sector
 
Tourism industry the Gujarat Experience Sector
Tourism industry the Gujarat Experience SectorTourism industry the Gujarat Experience Sector
Tourism industry the Gujarat Experience Sector
 
Skill Development Sector
Skill Development SectorSkill Development Sector
Skill Development Sector
 
Urban Development Department
Urban Development DepartmentUrban Development Department
Urban Development Department
 

Semelhante a Introdução ao uso do Matlab e da Toolbox de Sinais

Semelhante a Introdução ao uso do Matlab e da Toolbox de Sinais (20)

Apostila vol1 matlab
Apostila vol1 matlabApostila vol1 matlab
Apostila vol1 matlab
 
apostila matlab
apostila matlabapostila matlab
apostila matlab
 
Matlab – curso básico (1)
Matlab – curso básico (1)Matlab – curso básico (1)
Matlab – curso básico (1)
 
Tutorial matlab
Tutorial matlabTutorial matlab
Tutorial matlab
 
Matlab basico
Matlab basicoMatlab basico
Matlab basico
 
Tutorial matlab
Tutorial matlabTutorial matlab
Tutorial matlab
 
Minicurso Matlab IVSEE 2013 UERJ
Minicurso Matlab IVSEE 2013 UERJMinicurso Matlab IVSEE 2013 UERJ
Minicurso Matlab IVSEE 2013 UERJ
 
Aula Geral Excel
Aula Geral   ExcelAula Geral   Excel
Aula Geral Excel
 
Ipccea cap iv
Ipccea cap ivIpccea cap iv
Ipccea cap iv
 
10-Matlab.pdf
10-Matlab.pdf10-Matlab.pdf
10-Matlab.pdf
 
Utilizando o Winplot como recurso ao ensino da matemática
Utilizando o Winplot como recurso ao ensino da matemáticaUtilizando o Winplot como recurso ao ensino da matemática
Utilizando o Winplot como recurso ao ensino da matemática
 
Apostila condição se visu alg
Apostila condição se visu algApostila condição se visu alg
Apostila condição se visu alg
 
Prova algoritmos
Prova algoritmosProva algoritmos
Prova algoritmos
 
Planilha Eletrônica BrOffice CALC
Planilha Eletrônica BrOffice CALCPlanilha Eletrônica BrOffice CALC
Planilha Eletrônica BrOffice CALC
 
Cartilha de Octave para Matematica Computacional.pdf
Cartilha de Octave para Matematica Computacional.pdfCartilha de Octave para Matematica Computacional.pdf
Cartilha de Octave para Matematica Computacional.pdf
 
Dicas Excel
Dicas ExcelDicas Excel
Dicas Excel
 
Br office.org calc
Br office.org calcBr office.org calc
Br office.org calc
 
Unidade 9
Unidade 9Unidade 9
Unidade 9
 
Tuto calc
Tuto calcTuto calc
Tuto calc
 
Introdução a linguagem C# (CSharp)
Introdução a linguagem C# (CSharp)Introdução a linguagem C# (CSharp)
Introdução a linguagem C# (CSharp)
 

Introdução ao uso do Matlab e da Toolbox de Sinais

  • 1. INTRODUÇÃO AO USO DO MATLAB E DA "TOOLBOX" DE SINAIS NOTAS DE AULA PAULO LÉO M. OSORIO ( DEE/PUC-RIO ) 2002
  • 2. 2
  • 3. 3 AVISO Estas notas destinam-se aqueles que estão usando o Matlab pela primeira vez. Os exemplos apresentados utilizam uma pequena parcela das funções disponíveis e tem por obje- tivo familiarizar o usuário com as funções e os comandos mais comuns. Há também uma introdução ao uso das principais funções da "toolbox signal", que é de grande utilidade no estudo de sinais e sistemas discretos. Atualmente existe no mercado uma oferta considerável de livros que se utilizam do Matlab para implementar exemplos e exercícios. Uma listagem desses livros pode ser encontrada na página da Mathworks ( http://www.mathworks.com ).
  • 4. 4
  • 5. 5 1.Introdução O Matlab foi originalmente desenvolvido para ser um "laboratório matricial". Atualmente ele é um sistema interativo e uma linguagem de programação para a computação técnica e científica em geral. A sua filosofia de processamento está baseada em matrizes. Como os comandos do Matlab são muito similares à maneira como expressamos as soluções dos problemas em termos matemáticos, a tarefa de se escrever soluções computacionais no Matlab é muito mais rápida do que escrever programas em linguagens de alto nível, tais como FORTRAN e C. Além disto, ele possui facilidades gráficas que tornam a interface homem máquina muito amigável. 2. Área de Trabalho (Workspace) Quando o programa Matlab é acionado a mensagem abaixo irá aparecer na tela. O prompt (>>) indica que o Matlab está esperando pela entrada de comandos. To get started, select "MATLAB Help" from the Help menu. >> O Matlab trabalha com duas janelas: uma janela de comandos que é usada para a entrada dos comandos, dados, e para mostrar os resultados na tela, e uma outra janela gráfica onde são gerados os gráficos. As duas janelas são apagadas quando do início de cada sessão de Matlab. A janela de comando pode ser limpa durante uma sessão de trabalho através do comando clc. Para se limpar a janela gráfica é usado o comando clg. A medida que se trabalha na janela de comando, o Matlab memoriza os comandos entrados, bem como as variáveis que foram criadas. Desta forma, os comandos e as variáveis
  • 6. 6 ficam residentes no espaço de trabalho do Matlab, e podem ser chamados sempre que se desejar. Para se limpar o espaço de trabalho usa-se o comando clear. O Matlab é uma linguagem sensível ao tipo (caracter maiúsculo ou minúsculo) utilizado, ou seja, RH, Rh, rH e rh são tratadas como variáveis diferentes. Os comandos de Matlab são usualmente entrados em linhas separadas, embora possa-se ter múltiplos comandos na mesma linha, desde que separados por ponto e vírgula (;). Os comentários são entrados precedidos do sinal de porcentagem (%). Além de executar comandos que são entrados pelo teclado, o Matlab também é capaz de executar seqüências de comandos que estão armazenadas em arquivos com extensão .m, como será mostrado no item 9.2. Estes arquivos são chamados de arquivos-M. O comando what mostra uma listagem dos arquivos-M, disponíveis no diretório cor- rente. Estes arquivos podem ser vistos por meio do comando type. Se o arquivo especificado com este comando não tiver uma extensão, ele é assumido como sendo do tipo M. 3. Matrizes, Vetores e Escalares O Matlab, como já foi dito, é orientado para trabalhar com matrizes. Uma matriz é notada como A(i,j) ou a(i,j), em que A e a são matrizes diferentes. O índice i se refere às linhas e o índice j às colunas. O tamanho de uma matriz é especificado pelo número de linhas e colunas. Uma matriz que possui somente uma linha ou somente uma coluna é chamada de vetor. Por outro lado, se uma matriz possuir somente uma linha e uma coluna, ela é um escalar. Há várias formas de se criar uma matriz no Matlab, sendo a mais simples através de uma lista de números entre colchetes, como mostrado abaixo. a = 0.5; b = [ 1 3 5 7 9]; c = [2;4;6;8;10];
  • 7. 7 D = [1 2 3;4 5 6;7 8 9]; Um comando muito útil é o whos que mostra o nome de todas as variáveis existentes no espaço de trabalho global, bem como os seus tipos e dimensões. Se as variáveis acima estiverem no espaço de trabalho, o resultado da aplicação desse comando é o seguinte: » whos Name Size Bytes Class D 3x3 72 double array a 1x1 8 double array b 1x5 40 double array c 5x1 40 double array Grand total is 20 elements using 160 bytes Deve-se observar, nos exemplos acima, que todas linhas estão finalizadas por ponto e vírgula (;). Isto evita que as matrizes sejam impressas na tela. A omissão do (;), faz com que o resultado de um dado comando apareça imediatamente na tela, como por exemplo: » b=[1 3 5 7 9] b = 1 3 5 7 9 Nos exemplos acima a é um escalar, b é um vetor linha, c é um vetor coluna, e D é uma matriz 3x3. Observe que os números dentro dos colchetes ou estão separados por vírgulas ou por espaços. O ponto e vírgula separa as linhas da matriz. Uma forma alternativa de se entrar a matriz D é a seguinte:
  • 8. 8 D = [1 2 3 4 5 6 7 8 9]; O Matlab permite também se definir uma matriz a partir de outra já existente. Por exemplo, considere os seguintes comandos: A = [1 .53 1-2*j]; B = [0 -3 A]; Isto é equivalente a: B = [ 0 -3 1 .53 1-2*j]; Pode-se também mudar ou adicionar valores num vetor através de subscrito referenciado em parêntesis. O seguinte comando: B(1) = -1; troca o primeiro elemento do vetor B de 0 para -1. Um vetor também pode ser estendido pela definição de novos elementos. O vetor B que possui 5 elementos passa a ter 7 elementos se o seguinte comando for executado: B(7) = pi; Neste caso B(6) terá , automaticamente, o valor 0.
  • 9. 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 [-p , p ], separados de p/10. Y = 10:-1:1; Z = -pi:pi/10:pi; O comando (:) também pode ser usado para selecionar submatrizes a partir de uma outra matriz. Por exemplo seja a matriz D:
  • 10. 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.2 0.1 4.3 7.8 9.2 -5.9 3.3 -4.7 -0.4 p p é ë ê ê ê ê ù û ú ú ú ú 1. A = R(:,2); 2. b = R(3,:); 3. c= R(1:3,2:4); 4. C = R(1:2:5, :); 5. D = [4:9; 1:6]; 6. E = R'; No Matlab é válido se ter uma matriz vazia. Por exemplo, uma matriz vazia pode ser gerada com o seguinte comando: a = [ ] Deve-se observar que uma matriz vazia é diferente de uma matriz que só contenha zeros.
  • 11. 11 Os valores de uma matriz, vetor, ou escalar também podem entrar através do comando input. Isto é muito útil quando se tem o programa num arquivo tipo M. z = input('Entre com o valor de z ') 4. Operações Escalares As operações aritméticas entre dois escalares são mostrada na Tabela 1 Operação Forma Algébrica MATLAB Adição a + b a + b Subtração a - b a - b Multiplicação a ´ b a * b Divisão à direita a / b a/b Divisão à esquerda b a a b Exponenciação ab a ^ b Tabela 1: Operações aritméticas entre dois escalares O resultado de uma operação que não é relacionada diretamente a uma variável é automaticamente colocado numa variável chamada de ans, que pode ser usada como qualquer outra variável, como por exemplo: >> 3*pi^2 ans = 29.6088 >> sqrt(ans) ans = 5.4414
  • 12. 12 >> x = (ans-3)/2 x = 1.2207 O Matlab possui muitas funções do tipo “built-in”, como por exemplo: >> pi ans = 3.1416 >> exp(1) ans = 2.7183 >> log(ans) ans = 1 Como o Matlab possui um número muito grande de funções, para entendê-las o melhor é usar o comando “help”, que pode ser invocado a partir da janela do Matlab, ou como uma linha de comando do tipo help < nome do comando>. Por exemplo: >> help ans ANS Most recent answer. ANS is the variable created automatically when expressions are not assigned to anything else. ANSwer. Deve-se chamar a atenção para a maneira como os valores numéricos das variáveis são mostrados no Matlab. O seu controle é feito através do comando format. O default é a formatação chamada de format short, ou seja:
  • 13. 13 >> pi ans = 3.1416 Há várias formas possíveis de formatação, que podem ser vistas usando o comando help format. Por exemplo o comando format compact suprime a linha extra que aparece nas outras formatações. Esta formatação é a utilizada na maioria dos exemplos apresentados. >> format compact >> pi ans = 3.1416 Uma outra formatação é o format long, que apresenta o resultado com 15 digitos. >> format long >> pi ans = 3.14159265358979 Deve-se observar que o Matlab trabalha internamente com precisão dupla em todas as suas operações, e que o comando format altera apenas a forma com que os resultados são apresentados.
  • 14. 14 5. Criação de Matrizes e Vetores O Matlab possui comandos que permitem a criação de algumas matrizes e vetores especi- ais: zeros(m,n) cria uma matriz m x n de zeros. ones(m,n) cria uma matriz m x n de uns. eye(m,n) cria uma matriz identidade m x n. diag(v) cria uma matriz n x n com v na diagonal principal (v é um vetor de tamanho n). Com as funções zeros e ones pode-se criar vetores, como por exemplo: >> x = zeros(1,5) x = 0 0 0 0 0 >> y = ones(5,1) y = 1 1 1 1 1 Os comandos size e length permitem determina as dimensões de matrizes e vetores, respectivamente. Por exemplo: >> size(x) ans =
  • 15. 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*2 ans = 2 4 6 8 10
  • 16. 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+b ans = 2 5 8 11 14 » ans-a ans = 1 3 5 7 9 A multiplicação e divisão elemento por elemento é feita de maneira similar, exceto por uma pequena alteração na notação: » a.*b ans = 1 6 15 28 45 Os vetores a e b foram multiplicados elemento a elemento usando o operador (.*), que é dife- rente da operação multiplicação matricial (*). A divisão de vetores elemento a elemento requer o uso do símbolo ponto (.): » a./b ans = 1.0000 0.6667 0.6000 0.5714 0.5556 » b.a ans = 1.0000 0.6667 0.6000 0.5714 0.5556 A exponenciação de vetores também é feita elemento a elemento, podendo ser definida de várias maneiras: » a.^2 ans = 1 4 9 16 25 os elementos individuais de a elevados ao quadrado. » 2.^a
  • 17. 17 ans = 2 4 8 16 32 neste caso o escalar 2 é elevado a uma potência dada por cada elemento de a. » a.^b ans = 1 8 243 16384 1953125 aqui cada elemento do vetor a é elevado a uma potência dada por cada elemento do vetor b. A Tabela 2 mostra um resumo das operações aritméticas com vetores. Operação Forma Algébrica MATLAB Adição a + b a + b Subtração a - b a - b Multiplicação a ´ b a.* b Divisão à direita a / b a. / b Divisão à esquerda b a a. b Exponenciação ab a. ^ b Tabela 2: Operações aritméticas elemento a elemento entre dois vetores 7. Gráficos O Matlab oferece um processador gráfico com extensiva capacidade de gerar toda a gama de gráficos, e ao mesmo tempo simplificando muito o seu uso. Pode-se gerar gráficos com apenas um comando. O gráfico mais simples é o de um conjunto de pontos no plano x-y. Por exemplo: » x = 1:6; y = [-1 1/4 1 pi 2 1]; plot(x,y)
  • 18. 18 O gráfico resultante é mostrado na Figura 1. Observe que o Matlab une os pontos do gráfico por meio de retas. Figura 7.1 Gráfico x-y Um gráfico alternativo, mostrado na Figura 7.2, pode ser obtido da seguinte forma: » plot(x,y,'+') Figura 7.2: Forma alternativa do gráfico x-y. 1 1.5 2 2.5 3 3.5 4 4.5 5 5.5 6 -1 -0.5 0 0.5 1 1.5 2 2.5 3 3.5 1 1.5 2 2.5 3 3.5 4 4.5 5 5.5 6 -1 -0.5 0 0.5 1 1.5 2 2.5 3 3.5
  • 19. 19 Aos gráficos das figuras 7.1 e 7.2 pode-se acrescentar título, nomes dos eixos, e reticulado. Pode-se também controlar as cores das curvas, bem como o tipo de linha utilizado. É possível se ter mais de uma curva num mesmo gráfico. Além destas, há muitas outras facilidades gráficas oferecidas pelo Matlab. Uma boa opção para se aprender mais sobre os recursos da função plot é o de entrar com o comando help plot. O Matlab pode gerar diversos tipos de gráficos: curvas em 2D, superfícies em 3D, gráficos de contorno de superfícies em 3D, curvas paramétricas em 2D e em 3D. Os detalhes de como são gerados esses gráficos podem ser encontrados com o auxílio do help. O comando subplot cria diversos gráficos numa mesma janela gráfica. A sua sintaxe é subplot(m,n,k), em que mn é o número de gráficos a serem criados, organizado numa matriz com m linhas e n colunas, e k é a ordem em que aparecem os gráfico ao longo das linhas. Vejamos o seguinte exemplo: 4 gráficos serão gerados numa mesma janela, e mostrados na Figura 7.3. » x = 0:pi/20:2*pi; » n = 0:.3:6; »subplot(2,2,1) »plot(x, sin(x)) »subplot(2,2,2) »plot(x, exp(-x)) »subplot(2,2,3) »stem(n, sin(2*pi*n/4)) »subplot(2,2,4) »stem(n, 0.5.^n)
  • 20. 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 8 0 0.2 0.4 0.6 0.8 1 0 2 4 6 -1 -0.5 0 0.5 1 0 2 4 6 0 0.2 0.4 0.6 0.8 1
  • 21. 21 » A = [0 1 2;-1 3 5]; » B = [1 2 3;-1 0 5;4 5 -2]; » C = A*B C = 7 10 1 16 23 2 » D = B*A ??? Error using ==> * Inner matrix dimensions must agree. Do exemplo acima pode-se ver que o Matlab não executa a operação D=BA, pois ela não satisfaz as condições para multiplicação de duas matrizes. Do que foi visto acima é possível simplificar a operação de produto escalar entre dois vetores linhas P e Q, usando o seguinte comando: prod_esc = P*Q' A inversa de uma matriz quadrada A pode ser computada no Matlab através da instrução inv(A). Por exemplo: B = 1 2 3 -1 0 5 4 5 -2 » inv_B = inv(B) inv_B = 6.2500 -4.7500 -2.5000 -4.5000 3.5000 2.0000
  • 22. 22 1.2500 -0.7500 -0.5000 » B*inv_B ans = 1.0000 0.0000 0.0000 0.0000 1.0000 0.0000 0.0000 0.0000 1.0000 No exemplo acima, foi computado também o produto B*B-1 , que nada mais é do que a matriz identidade. O determinante de uma matriz pode ser computado, utilizando-se a instrução det(A), como mostrado no exemplo abaixo: A = 1 2 3 -1 0 5 4 5 -2 » det(A) ans = -4 Vamos supor que se deseje resolver o seguinte sistema de equações lineares: 2x1 + x2 - 3x3 = 5 3x1 - 2x2 + 2x3 = 5 5x1 - 3x2 - x3 = 16 Este sistema pode ser escrito na forma matricial, como:
  • 23. 23 AX = B A x = 2 1 -3 3 -2 2 5 -3 -1 X = x x B = 5 5 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 = AB X = 1 -3 -2 A outra solução utiliza a matriz inversa, ou seja: X = A-1B » A = [2 1 -3;3 -2 2;5 -3 -1]; » B = [5 5 16]'; » X = inv(A)*B X = 1.0000
  • 24. 24 -3.0000 -2.0000 9. Programação em Matlab A solução de problemas mais complexos pode ser implementada através da programa- ção na própria linguagem do Matlab. O programa pode ser escrito num arquivo texto com extensão .m. O Matlab fornece um editor de textos ASCII que permite criar e editar tais arquivos. 9.1 “Loops” e Operações Condicionais A linguagem de programação do Matlab fornece comandos para “loops” e operações condicionais. Há dois tipos de “loops”: um é do tipo for e outro é do tipo while. Um “loop”: tipo for repete as instruções dentro do “loop” à medida que o índice do “loop” assume os valores de um dado vetor linha. Por exemplo: » for k = [1 2 3] x(k) = k^2; end » x x = 1 4 9 A forma mais comum de escrever esse “loop” seria:
  • 25. 25 » for k = 1:3 x(k) = k^2; end Observe que 1:3 é eqüivalente a [1 2 3]. É importante salientar que em termos de eficiência deve-se sempre procurar usar funções tipo “built-in” e operadores sempre que possível. Isto deve-se ao fato que os “scripts” e as funções definidas pelo o usuário ( e a maioria das funções existentes nas “toolboxes” ) são interpretadas, em vez de compiladas. Isto significa que quando um arquivo .m é executado, cada instrução é lida e depois executada, em vez de todo o programa ser compilado na linguagem da máquina para depois ser executado. Por isso que muitas vezes os programas escritos em Matlab são muito mais lentos que os escritos em outras linguagens como C e Fortran, por exemplo. As duas seqüências de comandos abaixo dão o mesmo resultado: » t = (0: .0001:10; » y=sin(t); e »t = 0:.0001:10; »for i=1:length(t) y(i)=sin(t(i)); end Entretanto, no meu computador, a segunda implementação é 25 vezes mais lenta que a primeira. Isto deve-se ao fato que a primeira seqüência de comandos utiliza a função seno vetorizada ( ‘built-in” ), ou seja, as operações com vetores serão sempre mais eficientes que os “loops” no Matlab. O “loop” while se repete enquanto uma dada expressão for verdadeira. O exemplo abaixo mostra um algoritmo para calcular a raiz quadrada do valor de x. A variável eps é fornecida pelo Matlab e serve para medir a precisão das operações em ponto flutuante. Seu valor é 2.2204e-016.
  • 26. 26 » x = 3; xp = x/2; » df = 1; » while df > eps y = 0.5*(xp + x/xp); df = abs(y-xp); xp = y; end » y y = 1.73205080756888 As operações condicionais no Matlab são similares às de outras linguagens de alto nível. Os operadores lógicos são: <, >, <=, >=, = = (igual), ~ = (diferente). Estes operadores são binários e retornam os valores 0 e 1 ( para argumentos escalares ). » 4 > 3 ans = 1 » 4 < 3 ans = 0 » 4 == 3 ans = 0 » 4 ~= 3 ans = 1 A forma geral de um comando tipo if é :
  • 27. 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 x plot(x,y),title('Gráfico do Seno') xlabel ('Ângulo em rad'),ylabel('Amplitude'),grid Se entrarmos no espaço de trabalho com os seguintes comandos: » N=50; a=1; » seno
  • 28. 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 1 Gráfico do Seno Ângulo em rad Amplitude
  • 29. 29 seja, elas não aparecem no espaço de trabalho do Matlab. Por exemplo, vamos considerar uma função que compute a média e a variância de um conjunto de números. Seja estat o nome dessa função. Abaixo esta mostrada a listagem do arquivo estat.m. function [m,v] = estat(x) % Função que computa a média e a variância de x nx = length(x); m = sum(x)/nx; v = sum((x - m).^2)/(nx-1); Para testar a função: » x = rand(1,100); » [med,var] = estat(x) med = 0.4652 var = 0.0778
  • 30. 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 Dt, que é chamado de intervalo de amostragem. O inverso do intervalo de amostragem é denominado de freqüência de amostragem fs, que indica a cadência com que uma dada variável é amostrada, no caso mais comum esta variável é o tempo. Para se gerar um vetor t no intervalo [0,1s], com Dt = 0,001s (fs = 1 kHz), usam-se os seguintes comandos: » fs = 1000; % freqüência de amostragem » t = 0:1/fs:1; % vetor com amostras separadas de 0,001s (1 ms) Exemplo 10.1: Gerar uma onda quadrada periódica com amplitude unitária, com freqüência fundamental de 10 Hz, e ciclo de repetição de 50% ( ciclo de repetição é a porção de cada ciclo para a qual o sinal é positivo, e 0 < cr < 100%). % Programa para gerar uma onda quadrada A = 1; % amplitude de pico f0 = 10; % freqüência fundamental em Hz
  • 31. 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 p/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 Amplitude Onda Quadrada Simétrica
  • 32. 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 = p/6 Da mesma forma que se pode gerar uma onda quadrada contínua ou discreta, também podem ser gerados sinais senoidais ou cossenoidais através das funções sin(wt+f) e cos(wt+f). -15 -10 -5 0 5 10 15 -1.5 -1 -0.5 0 0.5 1 1.5 Amplitude Onda Quadrada Simétrica
  • 33. 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 p/4, no intervalo [-10,10]. Considere a fase inicial como sendo -p/3. Exemplo 10.3: Gerar o sinal x(t) = 5e-4t sen(20pt). Considere a freqüência de amostragem como sendo de 1 kHz. % Programa para gerar uma senóide amortecida. fs = 1000; % freq. de amostragem fo = 10; % freq. fundamental a = -4; % coef. da exponencial fi = 0; % fase inicial A = 5; % amplitude da senóide t = 0:1/fs:1; % eixo do tempo x = A*sin(2*pi*fo*t + fi).*exp(a*t); plot(t,x),xlabel('t (s)'),ylabel('Amplitude') title('Senóide Amortecida') axis([0 1 -6 6]); A Figura 10.3 mostra a senóide amortecida gerada pelo programa acima. Exercício 10.4: Gere a seqüência senoidal amortecida dada por x[n] = 5(0,8)n sen(pn/4), no intervalo [0,20].
  • 34. 34 Figura 10.3: Senóide Amortecida A geração de seqüências tipo delta ( d[n] ) e degrau unitário ( u[n] ) pode ser feita com o auxílio das funções zeros(m,n) e ones(m,n). Por exemplo, para se gerar a seqüência u[n-10] com 50 amostras, escreve-se a seguinte linha de comando: u = [zeros(1,10),ones(1,40)]; Para se gerar uma seqüência d[n-6] com 50 amostras, pode-se fazer assim: delta = zeros(1,50); delta(1,6) = 1; A energia de uma seqüência de duração finita x[n] é dada por: åå == == 1-N 0n 2 1-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) Amplitude Senóide Amortecida
  • 35. 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]| N 1 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: å ¥ ¥= == -k k]-h[k]x[nx[n]*h[n]][ny Se o sistema também for causal, então: å= = n ny 0k k]-h[k]x[n][ A expressão acima pode ser facilmente computada usando-se a função conv(h,x). Exemplo 10.4: Um SLIC possui uma resposta impulsional dada por h[n] = (0,85)n u[n]. Para uma entrada x[n] = u[n] - u[n-15], determine as 40 primeiras amostras da saída y[n].
  • 36. 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 k k knxknya 0 0 k ][b][ O Matlab possui uma função filter(a,b,x), em que a = [1, a1,a2,...aN], b = [b0,b1,....bM], e x é o vetor com as amostras da entrada, para resolver numericamente a equação diferença acima.
  • 37. 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 40 0 0.5 1 x[n] Entrada 0 5 10 15 20 25 30 35 40 0 0.5 1 h[n] Resposta Impulsional 0 5 10 15 20 25 30 35 40 0 5 10 y[n] Saída
  • 38. 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 50 0 0.5 1 1.5 2 n y[n] Resposta ao Degrau
  • 39. 39 å= = 1-M 0k k]-x[n M 1 ][ny Exemplo 10.6: Um sinal s[n] = 3 + 4(0,95)n sen(p/8 n) é contaminado por um ruído com distribuição uniforme entre -0,5 e 0,5.Será utilizado um filtro de média móvel para diminuir os efeitos do ruído aditivo. A Figura 10.6 mostra as duas seqüências s[n] e r[n]. 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 50 0 2 4 6 8 s[n] Sinal sem Ruido 0 10 20 30 40 50 -0.5 0 0.5 n r[n] Ruido
  • 40. 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 Amplitudes s[n] y[n] 0 10 20 30 40 50 -2 0 2 4 6 n Amplitudes
  • 41. 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 ww em que X(ejw ) é uma função contínua e complexa. Exemplo 10.7: Calcular a transformada de Fourier da seqüência x[n] = (0,5)n u[n]. 5,05,01 1 )5,0()( 0 - = - == å ¥ = - - w w w ww j j n j njnj e e e eeX
  • 42. 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-jw ). No Exemplo 10.7, como x[n] é uma seqüência de duração infinita não se pode usar o Matlab para computar X(ejw ) diretamente. Entretanto, pode-se computar X(ejw ) usando-se a expressão acima, no intervalo [0,p] e então traçar gráficos de magnitude e fase, ou das partes real e imaginária. Exemplo 10.8: Computar e plotar os espectros de magnitude e fase de X(ejw ), bem como as suas partes real e imaginária. % Programa para computar e plotar os espectros de amplitude e % fase da DTFT de x[n]=(0,5)^n u[n], a partir da expressão % X(w)= exp(jw)/[exp(jw) - 0,5]. N = 256; w = (0:N-1)*pi/N; % eixo das freqüências dividido em N pontos ex = exp(j*w); X = ex./(ex - .5*ones(1,N)); ampl = abs(X); % cômputo do módulo de X(jw) fase = angle(X); % cômputo da fase de X(jw) rex = real(X); imx = imag(X); wnorm = w/pi; % normalização do eixo das freqüências subplot(2,2,1) plot(wnorm,ampl) xlabel('Freqüência normalizada') ,ylabel('Magnitude'), ti- tle('Espectro de Amplitude') subplot(2,2,3)
  • 43. 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 p corresponde ao valor 1. Muitos autores chamam este ponto 0 0.5 1 0.5 1 1.5 2 Frequência Normalizada Magnitude Espectro de Amplitude 0 0.5 1 -0.6 -0.4 -0.2 0 Frequência Normalizada Radianos Espectro de Fase 0 0.5 1 0.5 1 1.5 2 Frequência Normalizada Real[X(jw)] Parte Real 0 0.5 1 -0.8 -0.6 -0.4 -0.2 0 Frequência Normalizada Imag[X(jw)] Parte Imaginária
  • 44. 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(ejw ). Isto pode ser feito através de gráficos que mostrem as partes real e imaginária, ou de gráficos de magnitude e fase. Esta última forma é a preferida quando a função complexa estiver relacionada a sistemas lineares discretos, como por exemplo filtros digitais. No caso em que a seqüência discreta x[n] for de duração finita, então será possível se utilizar o Matlab para o cômputo da transformada de Fourier. Na realidade o que se faz é computar a Transformada Discreta de Fourier (DFT), que é uma seqüência discreta, definida como: 1]-N[0,kx[n]e][ 1 0n N 2 - Î= å - = N kn kX p Pode-se mostrar que os X[k] são amostras de X(ejw ) igualmente espaçadas de 2p/N no círculo unitário, ou seja X(ejw ) é a envoltória das amostras representadas por X[k]. Exemplo 10.9: Repetir o Exemplo 10.7, utilizando a DFT para computar X(ejw ). Como x[n] deve ser finita, o que se pode fazer é obter uma versão truncada de x[n] num intervalo finito adequado. No programa abaixo foi utilizada a função fft(x,M) para computar a DFT da seqüência x de comprimento N, com M pontos. Se M for omitido o cômputo da DFT se dará com o número de pontos de x, neste caso N. Se M>N, então serão apendados (M-N) zeros ao final da seqüência x. Este procedimento não altera a forma da envoltória de X[k], apenas a define melhor. A FFT (Fast Fourier Transform) é apenas um algoritmo que computa de forma eficiente a DFT. Esses algoritmos são mais rápidos quando M for uma potência inteira de 2 (M= 2p ).
  • 45. 45 % Programa para computar a transformada de Fourier usando o % algoritmo de FFT N = 256; x = (.5).^(0:N-1); % geração da seqüência x[n] Xc = fft(x); % cômputo da DFT de x[n] X = Xc(1:N/2+1); % freqüências no intervalo [0,pi] ampl = abs(X); % cômputo do módulo de X(jw) fase = angle(X); % cômputo da fase de X(jw) rex = real(X); imx = imag(X); wnorm = 0:2/N:1; % normalização do eixo das freqüências subplot(2,2,1) plot(wnorm,ampl) xlabel('Freqüência Normalizada'),ylabel('Magnitude') title('Espectro de Amplitude') subplot(2,2,3) plot(wnorm,fase) xlabel('Freqüência Normalizada'),ylabel('Radianos') title('Espectro de Fase') subplot(2,2,2) plot(wnorm,rex) xlabel('Freqüência Normalizada'),ylabel('Real[X(jw)]') title('Parte Real') subplot(2,2,4) plot(wnorm,imx) xlabel('Freqüência Normalizada'),ylabel('Imag[X(jw)]') title('Parte Imaginária')
  • 46. 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 1 0.5 1 1.5 2 Frequência Normalizada Magnitude Espectro de Amplitude 0 0.5 1 -0.6 -0.4 -0.2 0 Frequência Normalizada Radianos Espectro de Fase 0 0.5 1 0.5 1 1.5 2 Frequência Normalizada Real[X(jw)] Parte Real 0 0.5 1 -0.8 -0.6 -0.4 -0.2 0 Frequência Normalizada Imag[X(jw)] Parte Imaginária
  • 47. 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(ejw ), sem que isto altere a sua forma.
  • 48. 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(ejw ), que nada mais é do que a transformada de Fourier da resposta impulsional h[n] do sistema. Como H(ejw ) é uma função complexa, a resposta em freqüência é composta da resposta em magnitude, ou em amplitude, que é |H(ejw )|, e da resposta em fase que é o argumento de H(ejw ). 0 0.5 1 0 2 4 6 8 Freqüência Normalizada Magnitude N = 8 0 0.5 1 0 2 4 6 8 Freqüência Normalizada Magnitude N = 16 (8 zeros) 0 0.5 1 0 2 4 6 8 Freqüência Normalizada Magnitude N = 32 (24 zeros) 0 0.5 1 0 2 4 6 8 Freqüência Normalizada Magnitude N = 64 (56 zeros)
  • 49. 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,2p]. O que pode ser dito em termos de simetria das resposta em magnitude e fase?
  • 50. 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 1 0 1 2 3 4 Freqüência Normalisada Magnitude 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 Radianos Resposta em Fase
  • 51. 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 1 0 0.2 0.4 0.6 0.8 1 Freqüência Normalisada Magnitude 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 Radianos Resposta em Fase
  • 52. 52 10.5 Transformada z A transformada z unilateral é definida como: å ¥ = - = 0 x[n]z)( n n zX 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,324z0,5439z0,4446z-0,02722z1 2,1213z2,6464z-1,2071z-1 )( +++ + =zH % Programa para determinar na forma fatorada uma função % racional e fazer um diagrama de pólos e zeros num = [1 -1.2071 -2.6464 2.1213]; den = [1 0.0272 -0.4446 0.5439 0.3240]; [zeros polos ganho] = tf2zp(num,den) zplane(num,den)
  • 53. 53 zeros = 2.0000 -1.5000 0.7071 polos = 0.6364 + 0.6364i 0.6364 - 0.6364i -0.8000 -0.5000 ganho = 1 A figura 10.13 mostra o diagrama de pólos e zeros de H(z). A região de convergência é o exterior do círculo de raio | 0,6364 + 0,6364i | = 0,9, que corresponde ao módulo dos pólos mais afastados da origem, para uma solução causal. A transformada inversa de H(z) é a resposta impulsional h[n]. Esta transformada pode ser computada de diversas maneiras, porém no caso em que H(z) for racional, é mais conveniente utilizar o método da expansão em frações parciais. Com este método é possível se obter uma expressão para h[n] na forma fechada. O Matlab possui a função [r,p,k]=residuez(num,den), que permite computar os pólos de H(z), os coeficientes da expansão em frações parciais.
  • 54. 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,080,14z1,1z-z 1)-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 Imaginarypart
  • 55. 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,2z z 1,7143- 0,8-z z 0,667- 0,5-z z 2,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]