A função filter() do Matlab pode ser útil para determinar resposta temporal (no domínio tempo discreto) da saída de um filtro discreto/digital.
Sintaxe de uso:
>> Y = filter(B, A, X);
onde: vetor das amostras (sinal) de entrada do filtro; vetor das amostras (sinal) de saída do filtro; os parâmetros e são os coeficientes do filtro e estão associados com a implementação da equação de diferenças relacionada com a forma "Direta II Transposta", no Matlab:
(eq. (1))
o que dá no mesmo algébricamente (eq. de diferenças) que:
(eq. (2))
Note que no Matlab, os índices dos vetores/matrizes iniciam em 1 e não em zero como em outras linguagens de programação como C, C++..
Se (como normalmente acontece), então podemos generalizar a eq. (2) para:
(eq. (3))
Podemos realizar a transformada Z sobre a eq. (2) e obter:
(eq. (4))
Percebe-se que este filtro trabalha com até amostras atrasadas do sinal de entrada e amostras atrasadas do sinal filtrado .
Trabalhando um pouco mais com a eq. (4), podemos rescreve-la na forma:
(eq. (5))
(eq. (6))
Note que as equações (5) e (6) representam a função transferência de um filtro digital, no plano-z.
Note ainda que no Matlab, os valores dos coeficientes e do filtro, correspondem à polinômios e seus valores são ingressados simplesmente fazendo algo como:
xxxxxxxxxx
>> H = tf(B, A, T);
onde corresponde ao período de amostragem adorado para realização do filtro. Modificar o valor de sem modificar os valores de e vai resultar num filtro com diferente resposta frequêncial (a frequência onde ocorrem ganhos e atenuações varia conforme varia ).
vetor (polinômio) do numerador da função transferência do filtro; vetor (polinômio) do denomindador da função transferência do filtro.
Note que e se refere aos termos de mais alta ordem dos filtros (na notação positiva para expoentes em -- eq. (6)).
Ou, de outro ponto de vista, note que corresponde ao ganho (fator aternuação ou ganho) que será aplicado sobre o maior atraso sofrido no sinal de saída do filtro, , ou seja:
.
E corresponde então ao ganho/atenuação que será aplicado sobre o sinal atual (sem atraso).
A eq. (3), para um filtro digital de 2a-ordem pode ser visualizada num diagrama de fluxo de sinais como:
Obs.: Este diagrama está no formato conhecido como Forma Direta I.
filter()
Determinar a saída de sistemas discretos (implementar um sistema discreto) pode ser uma tarefa tediosa quando você lida com muitas amostras. Felizmente, os computadores podem realizar os cálculos para nós com extrema rapidez e precisão. Tanto o Matlab quanto o Octave são usados com muita frequência para esse propósito e possuem comandos/funções integrados que o tornam um processo muito simples; no entanto, essas funções exigem que os sistemas discretos sejam descritos em termos de coeficientes e .
Depois de desenvolver uma compreensão dos coeficientes e , você será capaz de implementar e analisar rapidamente sistemas discretos usando funções Matlab/Octave integradas.
Talvez a maneira mais rápida de entender como determinar os coeficientes e de um sistema seja examinar alguns exemplos. A tabela abaixo mostra cinco sistemas discretos em sua forma de equação de diferenças na coluna da esquerda e seus correspondentes coeficientes e no lado direito da tabela.
Ex. | Eq. de diferença | Coeficientes e |
---|---|---|
Ex1 | ||
Ex2 | ||
Ex3 | ||
Ex4 | ||
Ex5 |
Os mapeamentos dos vetores de coeficientes e para os coeficientes da equação de diferenças para cada um dos exemplos mostrados na tabela acima são ilustrados nos parágrafos abaixo. Ao se referir a cada uma das ilustrações, você deve observar que os coeficientes estão todos associados aos termos na equação de diferenças e os coeficientes estão todos associados aos termos .
Observe também que o primeiro elemento do vetor de coeficientes está associado a ; o segundo elemento (se houver) está associado a ; o terceiro elemento (se houver) está associado a ; etc.
Da mesma forma, o primeiro elemento do vetor de coeficiente está associado a ; o segundo elemento (se houver) está associado a ; o terceiro elemento (se houver) está associado a ; etc.
Depois de ter os coeficientes e de um sistema, a implementação é uma tarefa trivial usando funções Matlab/Octave integradas. Esta seção aborda os exemplos mostrados antes (amplificador, média móvel e modelo de sistema) que você mesmo deve experimentar. Se você não possui Matlab ou Octave instalado em seu computador, você pode usar uma versão online http://octave-online.net.
Exemplo_1: Amplificador Um sistema amplificador que amplifica por um fator de 2 é descrito pela seguinte equação de diferenças:
Os coeficientes e têm apenas um valor cada, ou seja, e .
Use o código abaixo para determinar a saída deste sistema após aplicar uma entrada que é dado por:
xxxxxxxxxx
>> x = [2 1.1 3.2 0.31 0];
>> b = 2;
>> a = 1;
>> y = filter(b, a, x)
Exemplo_2: filtro de média móvel de 4 pontos Seja um filtro de média móvel de 4 amostras, cuja equação de diferenças é dada abaixo:
Os coeficientes e seriam: e .
Use o código abaixo para determinar e traçar a saída após passar o rio seguinte sinal de nível através do sistema:
xxxxxxxxxx
>> x = [.375 .35 .425 .475 .4 .375 .525 .425 .475 .425 .5 .45 .575 .525 .6 .675 .575 .7 .725 .6]; b = [0.25 0.25 0.25 0.25];
>> a = 1;
>> y = filter(b, a, x)
>> plot(y)
Exemplo_3: Modelo térmico Um modelo da mudança de temperatura de um copo de água colocado em uma geladeira é dado pela equação abaixo:
A constante de resfriamento é 0,01 e o modelo opera com dados amostrados a 1 Hz.
O vetor representa a diferença inicial de temperatura entre a água e a geladeira e representa a mudança na temperatura da água em relação à temperatura inicial.
Usando o exemplo anterior da temperatura da água sendo inicialmente de 15 °C e depois colocada em uma geladeira a 4 °C, então estará constantemente à 11 °C.
Use o código a seguir para modelar esta configuração por 1.000 segundos:
xxxxxxxxxx
>> x = ones(1, 1000)*11; %1000 seconds
>> b = [ -0.0099 ];
>> a = [ 1 -0.9901];
>> y = filter(b, a , x);
>> n=0:1000-1;
>> plot(n,y)
>> xlabel('Tempo (segundos)')
>> ylabel('\Delta Temp (^oC)')
>> title('Variação da Temperatura')
>> figure
>> plot(n,y+15)
>> xlabel('Tempo (segundos)')
>> ylabel('Temp (^oC)')
>> title('Temperatura da água')
Fim.