Tópicos em Processamento de Sinais Departamento de Engenharia Elétrica Faculdade de Tecnologia Universidade de Brasília MATLAB 1) Introdução O aplicativo Matlab é uma das ferramentas mais úteis para as áreas de processamento de sinais, controle, e outras aplicações. O “Mat” do nome Matlab está relacionado com “Matriz”, ou seja, é um laboratório que permite a manipulação eficiente de matrizes. Pode-se dizer também que o Matlab permite também a manipulação eficiente de vetores, já que um vetor de tamanho N pode ser visto como uma matriz de Nx1. Uma das melhores formas de se familiarizar com o Matlab é através do comando intro, que provê uma turnê pelas características básicas do programa. Exercício 1 Use o comando intro e, com atenção, procure entender todos os exemplos fornecidos. A aplicação predominante no presente curso será o processamento digital se sinais. Para isto, preparamos algumas técnicas em Matlab que facilitarão o uso do aplicativo para esta tarefa. 2) Geração de Sinais Amostrados Como primeiro exemplo, geraremos a seguinte função senoidal no Matlab: f(t)=sin(2*pi*fo*t) Onde fo=1 Hz. A função é mostrada na seguinte figura: Senoide de 1 Hz 1 0.8 0.6 0.4 0.2 f(t) 0 -0.2 -0.4 -0.6 -0.8 -1 0 0.2 0.4 0.6 Tempo (seg.) 0.8 1 1 Tópicos em Processamento de Sinais Departamento de Engenharia Elétrica Faculdade de Tecnologia Universidade de Brasília Para permitir o processamento de sinais por computador, o sinal analógico deve ser digitalizado por um conversor analógico para digital (A/D). Neste processo o sinal é amostrado em vários instantes, em intervalos de tempo constante. O intervalo de tempo é o período de amostragem (T), e o recíproco de T é a freqüência de amostragem (fs= 1/T). A unidade de tempo do período de amostragem em geral é segundos, e a de Freqüência é em Hz. 100 Hz significa que 100 amostras do sinal são tomadas em 1 segundo. Pode-se simular funções amostradas no Matlab. O exemplo abaixo mostra como se pode simular a amostragem de uma senóide no Matlab: Exercício 2 Siga os passos descritos para simular a amostragem de uma onda senoidal no seguinte exemplo. Digite os comandos na Matlab, e observe os efeitos. 1) Crie o eixo do tempo: t=0:0.05:1; O comando acima cria uma variável (vetor) com os elementos 0, 0.05, 0.1, ..., 1. O ponto e vírgula evita que a variável seja exibida na tela. Tente rodar o comando acima e observe o que acontece. Caso você tenha errado, e o vetor inteiro comece a aparecer na tela, você pode parar o processo usando CTRL-C. O comando size(t) exibe o tamanho da matriz t, e o comando length(t) mostrará o comprimento do vetor. Experimente estes comandos. 2) Crie a função: f=sin(2*pi*t); O comando acima cria um vetor cujas componentes são a função senoidal calculada a cada valor do vetor t. Assim, no Matlab, você pode calcular o seno de um vetor, ou mesmo de uma matriz. Execute este comando. 3) Plotar a função: plot(t,f) Este comando faz a plotagem do sinal, tendo f no eixo y, e o correspondente t no eixo x. Execute este comando. 4) Coloque o Titulo e as variáveis dos eixos x e y: title(‘Funcao Senoidal’) xlabel(‘Tempo (segundos)’) ylabel(‘Amplitude (Volts)’) 2 Tópicos em Processamento de Sinais Departamento de Engenharia Elétrica Faculdade de Tecnologia Universidade de Brasília Experimente os comandos acima. Tente também os seguintes comandos: plot(f,t) plot(f) plot(t) O que aconteceu no primeiro comando? No segundo comando, a senóide foi plotada, mas o eixo y mostrou simplesmente o número da amostra, mas não o tempo correspondente a cada abcissa y. Explique o que acontece no terceiro exemplo. Tente também as seguintes opções: plot(t,f,’*’) plot(t,f,’b*’) plot(t,f,’.’) plot(t,f,’c.’) plot(t,f,’-’) plot(t,f,’y-’) Observe as cores e características dos gráficos. Agora digite help plot, e leia cuidadosamente as descrições da função plot. Agora digite a seguinte função: grid Note o efeito da função, e digite help grid, para ver as características desta função. Agora gere uma segunda função: f2=sin(2*pi*2*t) E plote as funções f e f2 no mesmo gráfico: plot(t,f,t,f2) Verifique as cores dos gráficos. Agora digite: plot(t,f,’b*’,t,f2,’c-.’) E verifique os efeitos. Agora tente os seguintes comandos: stem(t,f) stem(t,f2) 3 Tópicos em Processamento de Sinais Departamento de Engenharia Elétrica Faculdade de Tecnologia Universidade de Brasília O que estes comandos fazem? Digite help stem, e estude o funcionamento desta função. Tente mudar as cores dos traçados desta função. Note que a função não é tão flexível quanto a cores do traçado quanto a função plot. 3) Geração de sinais mais complexos Digite os seguintes vetores: A=[0 1 2 3 4 5 6]; B=[0 2 4 6 8 10 12]; Tente multiplicar A*B. Note que o Matlab não realizará tal operação. O fato é que o Matlab sempre interpretará o vetor como uma matriz, e o programa sempre interpreta uma multiplicação como uma multiplicação de matrizes. Entretanto, há uma opção que permite ao usuário fazer uma multiplicação ponto a ponto de dois vetores ou matrizes (isto é o primeiro elemento do resultado é o produto dos primeiros elementos dos fatores, o segundo elemento do resultado é o produto dos segundos elementos dos fatores, e assim por diante). Tente digitar: C=A.*B Note que o vetor C é o resultado da multiplicação ponto a ponto do dos vetores A e B. Exercício 3 Queremos plotar a seguinte função no intervalo 0<x<4: y(x)=(x-1)(x-2) Para isto, criamos primeiro o vetor representando a variável x, e em seguida a função em questão: x=0:0.05:4; y=(x-1).*(x-2); plot(x,y) Note o comando “.*”. Cada expressão entre parênteses é um novo vetor, e os vetores são multiplicados ponto a ponto, resultando no efeito desejado. Agora geraremos a função: y(x)=x3-6x2+11x-6 4 Tópicos em Processamento de Sinais Departamento de Engenharia Elétrica Faculdade de Tecnologia Universidade de Brasília Para isto, criamos primeiro o vetor representando a variável x, e em seguida a função em questão: x=0:0.05:4; y=x.^3-6*x.^2+11*x-6; plot(x,y) Note que o operador “.^” é também um operador ponto a ponto, que eleve cada elemento da matriz à potência desejada. Tente digitar x^2, e veja que este comando não funcionará. Tente descobrir porque (lembre-se que o Matlab sempre assume operações matriciais). PROBLEMAS 1) Gere e plot a função f(t)=exp(-t)sin(2*5*pi*t), no intervalo 0<x<6. Use várias escolhas de intervalo para o eixo x: 0.1 sec., 0.05 sec., etc., e escolha o que tem melhor aparência. 2) Ache graficamente as raízes da função y=x3+2x2-x+1. (Dica: procure, por tentativa e erro o intervalo, a o período de amostragem do eixo x, realizando sucessivas plotagens das tentativas). 3) Plote a seguinte função: y=sin(x)*cos(2x)/(2+sin(x)). Escolha um eixo x apropriado (Não se esqueça que as multiplicações e divisões devem ser operações ponto a ponto). 4) Gere a função f(t)=sin(2*pi*10*t), no intervalo 0<x<10. Qual é a freqüência desta senóide? Use as seguintes escolhas de freqüência de amostragem: 5 Hz, 10 Hz, 20 Hz, 40 Hz, e 200 Hz. Use a função stem. Observe bem o efeito, pois será analisado na próxima aula. 5) Gere a função f(t)=exp(-t)sin(2*5*pi*t), e depois plote um histograma da mesma. Dica: use a função intro, e observe o uso da função bar. Em seguida digite help bar, para analisar aquela função. 5 Tópicos em Processamento de Sinais Departamento de Engenharia Elétrica Faculdade de Tecnologia Universidade de Brasília EXERCÍCIOS COM O MATLAB Nesta seção, veremos algumas funções extras do Matlab. Primeiramente, consideremos o seguinte trecho a seguir. Analise atentamente o programa abaixo (consulte o help para as funções que você não conhece): % exemplo: geracão de uma forma de onda ruidosa t=0:0.01:pi; %linha 1 y=2*sin(5*t); %linha 2 figure(GCF) %linha 3 plot(t,y) %linha 4 pause %linha 5 ruido=randn(1,length(t)); %linha 6 plot(t,ruido) %linha 7 pause %linha 8 y_ruido=y+ruido; %linha 9 plot(t,y_ruido); %linha 10 Execute o programa. A linha 1 cria o vetor do tempo de amostragem. A linha 2 cria uma função senoidal (qual é a freqüência?). A linha três faz com que a janela com o gráfico seja colocada à frente de todas as outras. A linha 4 plota uma senóide, como mostrado abaixo: 2 1.5 1 0.5 0 -0.5 -1 -1.5 -2 0 0.5 1 1.5 2 2.5 3 3.5 O comando pause, na linha 5, causa uma pausa no programa. Para continuar o programa, o usuário deve pressionar <Enter>. [Pergunta: o que acontece se este comando for substituído por pause(2)? Dica: use o comando help]. A linha 6 utiliza o comando randn (utilize o help para aprender sobre este comando). Este comando gera uma seqüência de números aleatórios com distribuição normal, com uma linha e tantas colunas quanto for o comprimento do vetor t. O comando lenght(t) fornece o número de elementos de t. Observe a plotagem do sinal de ruído: 6 Tópicos em Processamento de Sinais Departamento de Engenharia Elétrica Faculdade de Tecnologia Universidade de Brasília 3 2 1 0 -1 -2 -3 0 0.5 1 1.5 2 2.5 3 3.5 Em seguida, a linha 9 calcula uma nova variável y_noise, que é o sinal senoidal mais o ruído. Observe o resultado: 4 3 2 1 0 -1 -2 -3 -4 -5 0 0.5 1 1.5 2 2.5 3 3.5 Neste exemplo, você aprendeu como gerar um sinal com ruído. Agora, vejamos outros comandos. Para isto considere o seguinte código: % Exemplo 2 A=[1 2 3; 4 5 6] B=[3 4 ; 3 6 ; 7 8] C=[1 2 3 ; 4 5 6 ; 7 8 9]; D=[5 6 ; 7 8 ; 9 10]; pause size(A) size(B) pause 7 Tópicos em Processamento de Sinais Departamento de Engenharia Elétrica Faculdade de Tecnologia Universidade de Brasília length(A) length(B) Após executar o código acima, realize manualmente, e em seguida usando o Matlab, as seguintes operações (indique quando a operação não é possível): A*B= B*A= A*C= A^2= A.^2= C^2= C.^2= A’= C*inv(C)= [B B B]= [A;A;A] Veremos agora alguns comandos estatísticos. Considere o seguinte trecho de código: % exemplo 3 A=[ 1 2 3 4 5 6 7] %linha 1 B=mean(A) %linha 2 C=std(A) %linha 3 Pause %linha 4 RUIDOSO=randn(1,5000); %linha 5 figure(gcf) %linha 6 plot(RUIDOSO) %linha 7 title('sinal ruidoso') %linha 8 pause %linha 9 MEDIA_RUIDOSO=mean(RUIDOSO) %linha 10 DP_RUIDOSO=std(RUIDOSO) %linha 11 Pause %linha 12 MAISRUIDO=5*randn(1,5000); %linha 13 MEDIA=mean(MAISRUIDO) %linha 14 DP=std(MAISRUIDO) %linha 15 8 Tópicos em Processamento de Sinais Departamento de Engenharia Elétrica Faculdade de Tecnologia Universidade de Brasília Use o comando help para estudar os comandos mean, e std. Execute o programa. Tome cuidado de só incluir o ponto-e-vírgula quando necessário. Estes comandos calculam a média e o desvio padrão dos vetores em questão (relembre na literatura o que estes termos significam). Na linha 2, o resultado, B, será a média dos elementos do vetor A Na linha 3, o resultado C será o desvio padrão dos elementos do vetor A. Calcule A e B manualmente, e cheque os resultados com os resultados do Matlab. Na linha 5 um sinal de ruído normal é gerado, e é plotado na linha 6. A média e o desvio padrão são calculados e mostrados nas linhas 10 e 11. Note que a função randn gera ruído aleatório com média 0, e desvio padrão 1 (na verdade, próximos de 0 e 1). Para obter um ruído com maior intensidade (maior desvio padrão), basta multiplicar o ruído pelo desvio padrão desejado, como é feito nas linhas 13, 14 e 15. Analise com cuidado estas três últimas linhas. EXERCÍCIOS 1) Usando o comando help, aprenda a lidar com os comandos max, min, mean, median, sort. 2) Usando o comando help, aprenda a usar os comandos fix, floor, ceil, round, mod, rem, sign. 3) Gere uma senóide com freqüência de 50 Hz e amplitude 3V, amostrada a uma freqüência de amostragem de 1 kHz. Adicione a esta senóide ruído gaussiano com desvio padrão de 2V. Plote o sinal resultante. Determine os valores máximo e mínimo deste sinal. Não se esqueça de incluir título e unidades. Procure plotar o sinal de forma que suas características fiquem claras ao leitor (deve ficar claro que o sinal é uma senóide com ruído). 4) Usando o comando help square, aprenda como gerar uma onda quadrada. Gere uma onda quadrada de 10 Hz, amostrada a uma freqüência de 1 KHz. 9 Tópicos em Processamento de Sinais Departamento de Engenharia Elétrica Faculdade de Tecnologia Universidade de Brasília REVISÃO: NÚMEROS COMPLEXOS 1) Representação dos Números Complexos Números complexos são uma estrutura criada como uma extensão dos números reais. À primeira vista, esta estrutura parece ser artificial e inútil. Entretanto, na prática suas aplicações são inúmeras. Este capítulo apresentará uma revisão resumida do tópico, devida à sua importância nas séries de Fourier. Um número complexo é um par ordenado de números reais (R,I), e é muito usualmente representado na seguinte forma: C=R+iI, ou C=R+jI Sendo que matemáticos preferem o uso do i, enquanto os engenheiros preferem o j. R é chamado parte real, e I é chamado parte imaginária do número complexo. Note que se I é zero, o número se transforma em puramente complexo, e se R é zero, o número é puramente imaginário. Os números complexos seguem certas regras algébricas, que a princípio parecem estranhas, mas que permitem a extensão de várias técnicas matemáticas, bem como possibilitam um grande números de aplicações. É muito comum se representar os números complexos em um plano ordenado x,y, da forma ilustrada na Figura 1. imaginario (x,y) M cos(α) M a=tan-1(y/x) X=M sin(α) Real Figura 1 - Representação gráfica de um número complexo O módulo ou magnitude M de um número complexo é representado geometricamente pela reta ligando a origem à coordenado do par ordenado, e é definido como: M=sqrt(x2+y2) O ângulo ou fase α, do número complexo é o ângulo entre a reta mencionada e o eixo x, e é definido como: α=tan-1(I/R) É fácil mostrar, observando a geometria da Figura 1 que: 10 Tópicos em Processamento de Sinais Departamento de Engenharia Elétrica Faculdade de Tecnologia Universidade de Brasília R=M cos(α) I=M sin(α) Muitas vezes o número complexo é representado por seu módulo e sua fase, da seguinte maneira: M∠α Exercício 1: Considere os seguintes números: A=1+j2 B=-2+j3 C=4-j1 D=-2-j2 1) Plote manualmente cada um do números, e enumere em que quadrante o número está (1o., 2o., 3o., ou 4o.) e depois plote os mesmo usando o Matlab (plot(A) plota o número complexo, caso o mesmo realmente seja complexo). 2) Para cada número, calcule manualmente o módulo M, e depois faça os cálculos com o Matlab (comando abs(A)). Confira os resultados com os cálculos manuais. 3) Calcule manualmente os ângulos α (atente para os quadrantes) e em seguida repita os cálculos em Matlab (comando atan(x/y)). Tente também a função atan2(x/y), e observe que a mesma leva em consideração o quadrante em que o número está. 4) A partir dos valores de M e α calculados, determine x e y. Faça o mesmo em Matlab (Exemplo, x=M*cos(alfa), y=M*sin(alfa)). 5) Digite A=1+j2, e em seguida, digite: real(A) imag(A) O que acontece? Qual é a função dos comandos acima?1 6) Digite o seguinte código: A=[ 1+j*2 ; 2+j*3 ; 4-j*1 ; 2-j*2 ] plot(A) M=abs(A) grid alfa1=atan(real(A)./imag(A)) 11 Tópicos em Processamento de Sinais Departamento de Engenharia Elétrica Faculdade de Tecnologia Universidade de Brasília alfa2=atan2(real(A),imag(A)) Areal=M.*cos(alfa2) Aimag=M.*sin(alfa2) Tente entender todos os comandos. Note que os exercícios de 1 a 4 foram implementados nesta linha. Note o caráter matricial (ou vetorial) das variáveis (preste atenção nos pontos do .*, e ./ . 6) Converta os seguintes números para a forma R+jI: 2 π/3 3 60o 4 π/2 2) Álgebra dos Números Complexos Os números complexos são sujeitos a regras de álgebra, algumas delas semelhantes à álgebra dos números reais, e algumas diferentes. Quando os números complexos são puramente reais, a álgebra simplesmente se transforma na álgebra dos números reais. Suponha os números complexos A e B: A=Ar+ j Ai B=Br+ j Bi Estes números complexos são sujeitos às seguintes regras: Soma: A+B=(Ar + Br) + j ( Ai + Bi) Valor de j: j=i=sqrt(-1) Quadrado de i: i2=-1 Multiplicação: A . B=( Ar+ j Ai).( Br+ j Bi)= Ar Br +j Ai Br+j BrAi+j2AiBi = (ArBr - AiBi)+j (ArBi+AiBr) Raiz n-ésima (fórmula de de Moivre): 1/n A = n a+2kp |A| ∠ n Complexo conjugado de R+jI : R-jI Multiplicação de um número complexo por seu conjugado: (A+jB)(A-jB)=A2+B2 (note a eliminação da parte complexa) 12 Tópicos em Processamento de Sinais Departamento de Engenharia Elétrica Faculdade de Tecnologia Universidade de Brasília Eliminação de partes complexas no denominador: A+jB = A+jB C-jD = (AC-BD) + j(AD-BC) C+jD C+jD C-jD C2+D2 Exercício 2 Suponha: M= 1+j2 N= 3+j4 Calcule primeiro manualmente, e depois em Matlab. Dê os resultados na forma R+jI : 1) M+N 2) MN 3) M/N 4) M2 5) sqrt(M) 6) M1/3 7) M1/5 8) Determine todas as raízes cúbicas de 8 (Fórmula de de Moivre ou Matlab) 9) Eleve todas as raízes encontradas em na questão 8 ao cubo. 3) Fórmula de Euler: Duas fórmulas fazem os números complexos muito úteis: ejω = cos ω + j sin ω e-jω = cos ω - j sin ω Ou equivalentemente: cos ω = ejω + e-jω 2 jω sin ω = e − e-jω j2 Note que cos ω = Re (ejω) sin ω = Im (ejω) 13 Tópicos em Processamento de Sinais Departamento de Engenharia Elétrica Faculdade de Tecnologia Universidade de Brasília Exercício 3 1) Defina uma variável de tempo com 0<t<5, amostrada em intervalos de 0.01 segundos, e calcule a função f(t)=e2jπt Usando seus conhecimentos, tente prever o comportamento desta função. Note que a função é formada por uma parte real senoidal, e uma parte imaginária cossenoidal. Plote a parte real e a parte imaginária na Função no Matlab: ParteReal=real(f); ParteImag=imag(f); subplot(2,1,1) plot(t,ParteReal) subplot(2,1,2) plot(t,ParteImag) 2) A função também pode ser dividida em uma parte função módulo e fase. Tente prever a forma das funções módulo e fase da função seus conhecimentos. Use o Matlab para plotar estas funções: Módulo=abs(f); Fase=atan2(imag(f),real(f)); subplot(2,1,1) plot(t,Módulo) subplot(2,1,2) plot(t,Fase) 3) Multiplique a função complexa f, calculada no exercício anterior, pelo número complexo 1+j1, e chame a nova função de f2. Plote as partes reais de f1 e f2 no mesmo gráfico. Observe o efeito da multiplicação por um número complexo. Por que este efeito ocorre? Preste bastante atenção a esta questão, pois é central para o entendimento posterior dos conceitos de resposta em freqüência, e FFT. 4) Gere a função f(t)=sin(2πt). Multiplique esta função por 1+j1, gerando f2. Plote no mesmo gráfico as partes imaginárias de f e f2. Note os efeitos, e explique-os. A FFT e a DFT O Matlab permite o cálculo fácil da DFT e da FFT. Se tivermos um vetor A, de n elementos, a DFT do mesmo é: 14 Tópicos em Processamento de Sinais Departamento de Engenharia Elétrica Faculdade de Tecnologia Universidade de Brasília FFTdeA=fft(A); E para a FFT inversa, é usada a seguinte forma: IFFTdeA=ifft(FFTdeA); Caso o número de elementos de A seja da forma 2k, o Matlab usa o algoritmo da FFT (mais rápido). Caso contrário, é usado o algoritmo da DFT. Considere o seguinte exemplo: t=(0:.01:.99); f=sin(2*pi*2*t); F=fft(f); subplot(2,1,1) plot(abs(F),'ko') subplot(2,1,2) plot(angle(F),'ko') O resultado é mostrado a seguir: 50 40 30 20 10 0 0 10 20 30 40 50 60 70 80 90 100 0 10 20 30 40 50 60 70 80 90 100 4 2 0 -2 -4 Note que foram plotados o ângulo e a fase da FFT. Isto porque o resultado é um vetor com números complexos. Tente plotar o vetor sem a função abs. Explique a razão para o resultado aparentemente absurdo. Neste exemplo, é calculada a DFT de 1 segundo de amostragem de uma senóide com 2 Hz. 15 Tópicos em Processamento de Sinais Departamento de Engenharia Elétrica Faculdade de Tecnologia Universidade de Brasília Note que o resultado da fase foi estranho. A razão é que a fase é o resultado de divisões de números muito pequenos por números muito pequenos, resultando num valor não significativo. Substitua agora a primeira linha por t=(0:.01:1.3); e execute o programa. O resultado é mostrado a seguir: 50 40 30 20 10 0 0 20 40 60 80 100 120 140 0 20 40 60 80 100 120 140 4 2 0 -2 -4 Nota-se que neste último caso ocorreu o fenômeno do “leakage”. Este fenômeno não ocorreu no primeiro caso porque as amostras completavam um ciclo completo (a menos de uma amostra). Para que não ocorra leakage, é necessário que esta precaução seja tomada. Voltemos agora ao primeiro exemplo. Nota-se que o eixo dos x não corresponde ã freqüência e sim ao número da amostra. Para que seja mostrada a amostra, é necessário que a mesma seja calculada. Para tal, suponhamos que a freqüência de amostragem seja fs e que o sinal contenha N amostras. Neste caso, a primeira amostra corresponderia à freqüência zero, e a amostra N (que não existe, já que as amostras vão de 0 a N-1) corresponderia à freqüência de amostragem. Assim, a freqüência de cada amostra, na DFT resultante corresponderia a fs/N. Por exemplo, a 16 Tópicos em Processamento de Sinais Departamento de Engenharia Elétrica Faculdade de Tecnologia Universidade de Brasília primeira amostra corresponderia à freqüência zero, a Segunda a fsN, a terceira a 2fs/N, e a n-ésima a (n-1)fs/N. Outra observação importante é com respeito à amplitude. A amplitude da senóide no exemplo é de 1 V, e a amplitude da DFT foi de 50. Isto se deve ao fato de que o resultado da FFT é sempre multiplicado pelo número de amostras. Assim, para se Ter uma estimativa confiável das componentes espectrais, é necessário que se divida o resultado por N. Tendo essas considerações em mente, execute o seguinte código: clear % Limpa variáveis clf % Limpa gráficos t=(0:.01:.99); % Gera instantes das amostras fs=100; % Freqüência de amostragem N=length(t); % Determina o número de amostras f=1+sin(2*pi*10*t);% Amostra o sinal formado por % uma cte + senóide F=fft(f); % Calcula a DFT Fesc=F/N; % Escalona para o valor correto freq=(0:N-1)*fs/N; % Calcula eixo das freqüências plot(freq,abs(Fesc),’ko’) % Plota o módulo da DFT xlabel(‘Freqüência ’) % Label do eixo x ylabel(‘Amplitude’) % Label do eixo y O resultado é mostrado a seguir: 17 Tópicos em Processamento de Sinais Departamento de Engenharia Elétrica Faculdade de Tecnologia Universidade de Brasília 1.4 1.2 Amplitude 1 0.8 0.6 0.4 0.2 0 0 10 20 30 40 50 60 Freqüência 70 80 90 100 FILTROS DIGITAIS O Matlab apresenta muitas funções que facilitam a implementação de filtros digitais. Observe o help da função filter. FILTER One-dimensional digital filter. Y = FILTER(B,A,X) filters the data in vector X with the filter described by vectors A and B to create the filtered data Y. The filter is a "Direct Form II Transposed" implementation of the standard difference equation: a(1)*y(n) = b(1)*x(n) + b(2)*x(n-1) + ... + b(nb+1)*x(n-nb) - a(2)*y(n-1) - ... - a(na+1)*y(n-na) If a(1) is not equal to 1, FILTER normalizes the filter coefficients by a(1). When X is a matrix, FILTER operates on the columns of X. When X 18 Tópicos em Processamento de Sinais Departamento de Engenharia Elétrica Faculdade de Tecnologia Universidade de Brasília is an N-D array, FILTER operates along the first non-singleton dimension. [Y,Zf] = FILTER(B,A,X,Zi) gives access to initial and final conditions, Zi and Zf, of the delays. Zi is a vector of length MAX(LENGTH(A),LENGTH(B))-1 or an array of such vectors, one for each column of X. FILTER(B,A,X,[],DIM) or FILTER(B,A,X,Zi,DIM) operates along the dimension DIM. See also FILTER2, FILTFILT (in the Signal Processing Toolbox). Assim, a função tem, em geral, três argumentos: os vetores A e B, correspondentes aos coeficientes dos filtros, e o vetor de entrada. O resultado da função é o vetor de saída. Antes de fazermos um exemplo com a função filter, vamos observar que o Matlab possui várias ferramentas que permitem a determinação dos coeficientes A e B. Um exemplo é a função butter. Observe o help desta função: BUTTER Butterworth digital and analog filter design. [B,A] = BUTTER(N,Wn) designs an N'th order lowpass digital Butterworth filter and returns the filter coefficients in length N+1 vectors B and A. The cut-off frequency Wn must be 0.0 < Wn < 1.0, with 1.0 corresponding to half the sample rate. If Wn is a two-element vector, Wn = [W1 W2], BUTTER returns an order 2N bandpass filter with passband W1 < W < W2. [B,A] = BUTTER(N,Wn,'high') designs a highpass filter. [B,A] = BUTTER(N,Wn,'stop') is a bandstop filter if Wn = [W1 W2]. When used with three left-hand arguments, as in [Z,P,K] = BUTTER(...), the zeros and poles are returned in length N column vectors Z and P, and the gain in scalar K. When used with four left-hand arguments, as in [A,B,C,D] = BUTTER(...), state-space matrices are returned. BUTTER(N,Wn,'s'), BUTTER(N,Wn,'high','s') and BUTTER(N,Wn,'stop','s') design analog Butterworth filters. In this case, Wn can be bigger than 1.0. See also BUTTORD, BESSELF, CHEBY1, CHEBY2, ELLIP, FREQZ, FILTER. 19 Tópicos em Processamento de Sinais Departamento de Engenharia Elétrica Faculdade de Tecnologia Universidade de Brasília Vê-se que esta função determina os coeficientes de um filtro de Butterworth de ordem n, com uma freqüência de corte fc. A freqüência de corte é indicada de forma que o valor 1 corresponda à metade da freqüência de amostragem fs. Por exemplo, se fs=100Hz, 0.1 corresponderia a uma freqüência de corte de 5 Hz. Como exemplo, será filtrada uma senóide de 15 Hz, amostrada a 100 Hz, por um filtro com fc=10 Hz. clear clf t=(0:.01:1); f=sin(2*pi*5*t); % amostragem do sinal subplot(2,1,1) plot(t,f) % Sinal de entrada ª [B,A]=butter(1,0.1); % Calcula coeficientes do filtro de 2 ordem, % fs/2=50Hz e fo=5Hz, entao Wn=5/50=0.1 saida=filter(B,A,f); % Filtra o sinal. Resultando no vetor de % saída. subplot(2,1,2) plot(t,saida) Execute este código, e explique o resultado. EXERCÍCIOS 1) Gerar um sinal f(x)=1+sin(2100t), amostrado a 1KHz. 2) Passar o sinal por um filtro passa-baixas Butterworth com fc=50 Hz. 3) Passar o sinal por um filtro passa-baixas Butterworth com fc=50 Hz. 4) O Matlab possui a função freqz, que permite plotar a resposta em freqüência de filtros digitais. Examine o help desta função, e use-a para plotar a resposta em freqüência do filtro do último exemplo. 20