Filtros analógicos e digitais
No processamento de sinal, a função de um filtro é remover partes indesejadas do sinal, tais como ruídos aleatórios, ou para extrair partes úteis do sinal, tais como componentes dentro de determinada faixa de frequências.
O diagrama bloco seguinte ilustra a ideia básica.
Existem dois tipos de filtros, analógicos e digitais. Eles são bastante diferentes na sua composição física e na forma como eles funcionam.
Um filtro analógico usa circuitos electrónicos feitos com componentes resistências, condensadores e amplificadores operacionais para produzir o efeito de filtro desejado. Tais filtros são amplamente usados em aplicações para redução de ruído, melhoramento do sinal de vídeo, igualização gráfica em sistemas hi-fi, e muitas outras áreas.
Um filtro digital usa um processador digital para fazer cálculos numéricos sobre os valores de amostragem do sinal. O processador pode ser um computador de uso geral como um PC, ou um circuito integrado (chip) especializado em DSP (Digital Signal Processor).
O sinal analógico deve ser primeiro amostrado e digitalizado usando um ADC (analog to digital converter). Os números binários resultantes, que representam as amostragens sucessivas do sinal de entrada, são transferidos para o processado, que realiza cálculos numéricos sobre eles. Estes cálculos envolvem tipicamente a multiplicação dos valores de entrada por constantes e adição dos produtos. Se for necessário o resultado destes cálculos, que representam agora os valores amostrados do sinal filtrado, são enviados para um DAC (digital to analog converter) para converter novamente o sinal para a forma analógica.
Note que em filtragem digital, o sinal é representado por uma sequência de números, em vez de tensão ou corrente.
O diagrama seguinte mostra a configuração básica de um sistema deste tipo.
Operação dos filtros digitais
A seguir mostra-se a teoria básica de operação dos filtros digitais.
Primeiro, necessitamos de uma notação básica.
Supondo que o sinal “raw” (“bruto”) que será filtrado digitalmente está na forma de uma onda de tensão descrita pela função
V = x(t)
onde t é o tempo.
Este sinal é amostrado a intervalos de tempo h (o intervalo de amostragem). O valor amostrado no tempo t = ih é
xi = x (ih)
Então os valores digitais transferidos do ADC para o processador podem ser representados pela sequência
x0, x1, x2, x3, …
Correspondendo aos valores da onda do sinal nos tempos t = 0, h, 2h, 3h, … (onde t = 0 é o instante no qual a amostragem começa).
No tempo t =nh ( onde n é um inteiro positivo), os valores disponíveis para o processador, guardados em, são
x0, x1, x2, x3, … , xn
Note que os valores amostrados xn+1, xn+2 etc. não estão disponíveis porque ainda não aconteceram!
A saída digital do processador para o DAC consiste na sequência de valores
y0, y1, y2, y3, … , yn
Em geral, o valor de yn é calculado dos valores x0, x1, x2, x3, … , xn. O modo como os y's são calculados dos x's determina a acção de filtragem do filtro digital.
Exemplos de filtros digitais simples
Os exemplos seguintes ilustram as características essenciais dos filtros digitais.
- FILTRO GANHO UNITARIO: yn = xn
Cada valor de saída yn é exactamente o mesmo que o valor correspondente de entrada xn:
y0 = x0
y1 = x1
y2 = x2
… etcEste é um caso trivial em que o não tem qualquer efeito sobre o sinal.
- FILTRO GANHO SIMPLES: yn = Kxn (K = constante)
Aplica simplesmente um factor de ganho K a cada valor de entrada:
y0 = Kx0
y1 = Kx1
y2 = Kx2
… etcK > 1 faz do filtro um amplificador, enquanto 0 < K < 1 faz dele um atenuador. K < 0 corresponde ao amplificador inversor. O exemplo (1) acima é o caso especial onde K = 1.
- FILTRO PURO DELAY: yn = xn-1
O valor de saída no tempo t = nh é simplesmente a entrada no tempo t = (n-1)h, i.e. o sinal está atrasado pelo tempo h:
y0 = x-1
y1 = x0
y2 = x1
y3 = x2
… etcNote que como se assume que a amostragem começa em t = 0, o valor de entrada x-1 a t = -h é indefinido. È usual tomar estes valores (e quaisquer outros valores de x anteriores a t = 0) como zero.
- FILTRO MEDIA DE DOIS-TERMOS: yn = (xn + xn-1) / 2
A saída é a media (media aritmética) da entrada corrente e anterior:
y0 = (x0 + x-1) / 2
y1 = (x1 + x0) / 2
y2 = (x2 + x1) / 2
y3 = (x3 + x2) / 2
… etcEste é um tipo simples de filtro passa baixo uma vez que tende a atenuar as varações de alta-frequência do sinal.
Ordem de um filtro digital
A ordem de um filtro digital pode ser definida como o número das entradas anteriores (armazenadas na memoria do processador) usadas para calcular a saída corrente.
Isto é ilustrado pelos exemplos anteriores.
Exemplo (1): yn = xn
Este é um filtro de ordem zero, visto que a saída corrente yn depende só da entrada corrente xn e não das entradas anteriores.
Exemplo (2): yn = Kxn
A ordem deste filtro é também zero.
Exemplo (3): yn = xn-1
Este é um filtro de primeira ordem, visto que é necessária uma entrada anterior (xn-1) para calcular yn. (Note que este filtro é classificado como de primeira ordem porque ele usa uma entrada anterior, mesmo não usando a entrada corrente).
Exemplo (4): yn = (xn + xn-1) / 2
A ordem deste filtro é novamente igual a 1 visto que usa só um valor de entrada anterior.
A ordem de um filtro digital pode ser qualquer inteiro positive.
Coeficientes do filtro digital
Todos os filtros anteriores podem ser escritos da forma seguinte:
Ordem Zero: yn = a0xn
Primeira ordem: yn = a0xn + a1xn-1
Segunda ordem: yn = a0xn + a1xn-1 + a2xn-2
As constantes a0, a1, a2, … que aparecem nas expressões são chamadas coeficientes do filtro. O valor destes coeficientes determina as características de um filtro particular.
Questão de autoavaliação
QA 1
Para cada um dos filtros seguintes, indique a ordem do filtro e identifique os valores de seus coeficientes:
(a) yn = 2xn - xn-1
(b) yn = xn-2
(c) yn = xn - 2xn-1 + 2xn-2 + xn-3
Filtros Recursivos e não recursivos
Em todos os exemplos anteriores a saída corrente (yn) é calculada somente dos valores das entradas corrente e anteriores (xn, xn-1, xn-2, …). Este tipo de filtro é dito ser não recursivo.
Um filtro recursivo é um que alem dos valores de entrada anteriores usa também valores das saídas anteriores. Estes, como os valores das entradas anteriores, são armazenados na memória do processador. A expressão para um filtro recursivo contem não só os termos envolvendo os valores de entrada (xn, xn-1, xn-2, …) mas também os termos yn-1, yn-2, …
Desta explicação, pode parecer que os filtros recursivos requerem que sejam feitos mais cálculos, visto que existem termos de saída anteriores na expressão do filtro bem como termos de entrada. Mas, normalmente acontece o inverso. Para obter uma dada característica de resposta em frequência usando um filtro recursivo requer um filtro de ordem muito mais baixa, e dessa forma menos termos para calcular pelo processador, do que o equivalente filtro não recursivo.
Nota: Filtros FIR e IIR
Um filtro não recursivo é conhecido como filtro FIR (Finite Impulse Response), e um filtro recursivo como IIR (Infinite Impulse Response). Estes termos referem-se às diferentes “respostas ao impulso” dos dois tipos de filtros.
A resposta ao impulso de um filtro digital é a sequência de saída do filtro quando um impulso unitário é aplicado a sua entrada. (Um impulso unitário é uma sequencia de entrada muito simples consistindo de um único valor de 1 no tempo t = 0, seguido por zeros em todos os instantes de amostragem subsequentes). Um filtro FIR é um cuja resposta ao impulso é de duração finita. Um filtro IIR é um cuja resposta ao impulso continua para sempre (teoricamente).
Exemplo de um filtro recursivo
Um exemplo simples de um filtro recursivo é dado por
yn = xn + yn-1
Por outras palavras, este filtro determina a saída corrente (yn) pela adição da entrada corrente (xn) à saída anterior (yn-1).
Então:
y0 = x0 + y-1
y1 = x1 + y0
y2 = x2 + y1
y3 = x3 + y2
… etc
Note que y-1 (como x-1) é indefinido, e é normalmente tomado como zero.
Ordem de um filtro digital recursivo (IIR)
A ordem de um filtro digital foi definida anteriormente como o número de entradas anteriores que tinham de ser guardadas de modo a gerar uma dada saída. Esta definição é apropriada para os filtros não recursivos (FIR), que usam só entradas correntes e anteriores. No caso dos filtros recursivos, a definição pode ser estendida da forma seguinte:
A ordem de um filtro recursivo é o maior número das entradas ou saídas anteriores, que são necessárias para calcular a saída corrente.
Esta definição pode ser considerada geral: aplica-se tanto aos filtros FIR como aos IIR.
Por exemplo, o filtro recursivo discutido acima, dado pela expressão
yn = xn + yn-1
é classificado como sendo de primeira ordem, porque usa um valor de saída anterior (yn-1), mesmo não sendo necessário entrada anterior.
Na prática, os filtros recursivos normalmente requerem o mesmo número de entradas e saídas anteriores. Então, um filtro recursivo de primeira ordem geralmente requer uma entrada anterior (xn-1) e uma saída anterior (yn-1), enquanto um filtro recursivo de segunda ordem faz uso de duas entradas anteriores (xn-1 e xn-2) e duas saídas anteriores (yn-1 e yn-2); e assim sucessivamente, para ordens superiores.
QA 2
Indique a ordem de cada um dos filtros recursivos seguintes:
(a) yn = 2xn - xn-1 + yn-1
(b) yn = xn-1 - xn-3 - 2yn-1
(c) yn = xn + 2xn-1 + xn-2 - 2yn-1 + yn-2
Coeficientes dos filtros digitais recursivos (IIR)
Da discussão acima, podemos ver que um filtro recursivo é basicamente como um filtro não recursivo, com a adição de termos extra envolvendo as saídas anteriores (yn-1, yn-2 etc.).
Um filtro recursivo de primeira ordem pode ser escrito na forma geral
yn = (a0xn + a1xn-1 - b1yn-1) / b0
Note o sinal menos em frente do termo "recursivo" b1yn-1, bem como o factor (1/b0) aplicado a todos os coeficientes. A razão para expressar o filtro desta forma é que ela nos permite reescrever a expressão na forma simétrica seguinte:
b0yn + b1yn-1 = a0xn + a1xn-1
No caso de um filtro de segunda ordem, a forma geral é
yn = (a0xn + a1xn-1 + a2xn-2 - b1yn-1 - b2yn-2) / b0
Uma forma “simétrica” alternativa desta expressão é
b0yn + b1yn-1 + b2yn-2 = a0xn + a1xn-1 + a2xn-2
Note a convenção de que os coeficientes das entradas (os x's) são denotados por a’s, enquanto os coeficientes das saídas (os y's) são denotados por b's.
QA 3
Identifique os valores dos coeficientes do filtro para o filtro recursivo de primeira ordem
yn = xn + yn-1
discutido anteriormente.
Repita isso para cada um dos filtros na QA 2.
A função de transferência de um filtro digital
A função de transferência de um filtro digital é obtida da forma simétrica da expressão do filtro, e permite-nos descrever um filtro por meio de uma expressão mais conveniente e compacta. A função de transferência de um filtro pode ser usada para determinar muitas das características do filtro, tais como a sua frequência de resposta.
O operador atraso unitário
Primeiro, introduzimos o operado atraso unitário, denotado pelo símbolo
z-1
Quando aplicado a uma sequencia de valores digitais, este operador dá o valor anterior na sequencia. Ele, portanto, introduz um atraso de um intervalo de amostragem.
Aplicando o operador z-1 a um valor de entrada (digamos xn) dá a entrada anterior (xn-1):
z-1 xn = xn-1
Suponhamos que temos uma sequência de entrada
x0 = 5
x1 = -2
x2 = 0
x3 = 7
x4 = 10
Então
z-1 x1 = x0 = 5
z-1 x2 = x1 = -2
z-1 x3 = x2 = 0
e assim por diante. Note que z-1 x0 seria x-1 que é desconhecido (e é usualmente tomado como sendo zero, como já vimos).
Similarmente, aplicando o operador z-1 a uma saída dá a saída anterior:
z-1 yn = yn-1
Aplicando o operador atraso z-1 duas vezes produz um atraso de dois intervalos de amostragem:
z-1 (z-1 xn) = z-1 xn-1 = xn-2
Nos adoptamos a convenção (bastante lógica)
z-1 z-1 = z-2
i.e. o operador z-2 representa um atraso de dois intervalos de amostragem:
z-2 xn = xn-2
Esta notação pode ser estendida para atrasos de três ou mais intervalos de amostragem, sendo usada a potência de z-1 apropriada.
Vamos agora usar esta notação na descrição de um filtro digital recursivo. Consideremos, por exemplo, um filtro de segunda ordem geral, dado na forma simétrica pela expressão
b0yn + b1yn-1 + b2yn-2 = a0xn + a1xn-1 + a2xn-2
Faremos uso das seguintes identidades:
yn-1 = z-1 yn
yn-2 = z-2 yn
xn-1 = z-1 xn
xn-2 = z-2 xn
Substituindo estas expressões no filtro digital dá
(b0 + b1z-1 + b2z-2) yn = (a0 + a1z-1 + a2z-2) xn
Rearranjando para dar uma relação directa entre a saída e a entrada do filtro digital, obtemos
yn / xn = (a0 + a1z-1 + a2z-2) / (b0 + b1z-1 + b2z-2)
Esta é a forma geral da função de transferência para um filtro recursivo de segunda ordem (IIR).
Para um filtro de primeira ordem, os termos em z-2 são omitidos. Para filtros de ordem superior a 2, são adicionados termos envolvendo potências superiores de z-1 ao numerador e ao denominador da função de transferência.
Um filtro não recursivo (FIR) tem uma função de transferência mais simples que não contem qualquer termo no denominador. O coeficiente b0 é considerado como sendo igual a 1, e todos os outros coeficientes b são zero. A função de transferência de um filtro FIR de segunda ordem pode, porem, ser expresso na forma geral
yn / xn = a0 + a1z-1 + a2z-2
Exemplos de funções de transferência
1. O filtro media de três termos, definido pela expressão
yn = 1/3 (xn + xn-1 + xn-2)
pode ser escrito usando a notação operador z-1 como
yn = 1/3 (xn + z-1xn + z-2xn)
= 1/3 (1 + z-1 + z-2) xn
A função de transferência para o filtro é portanto
yn / xn = 1/3 (1 + z-1 + z-2)
2. A forma geral da função de transferência para um filtro recursivo de primeira ordem pode ser escrita como
yn / xn = (a0 + a1z-1) / (b0 + b1z-1)
Considere, por exemplo, o filtro recursivo de primeira ordem simples
yn = xn + yn-1
que discutimos anteriormente. Para obter a função de transferência para este filtro, reescrevemos a expressão do filtro usando o operador z-1 :
(1 - z-1) yn = xn
Reorganizando dá a função de transferência do filtro como
yn / xn = 1 / (1 - z-1)
3. Como mais um exemplo, consideremos o filtro IIR de segunda ordem
yn = xn + 2xn-1 + xn-2 - 2yn-1 + yn-2
Coleccionando os termos de saída na esquerda e os termos de entrada na direita para dar a forma “simétrica” da expressão do filtro, obtemos
yn + 2yn-1 - yn-2 = xn + 2xn-1 + xn-2
Expressando isto em termos do operador z-1 dá
(1 + 2z-1 - z-2) yn = (1 + 2z-1 + z-2) xn
e então a função de transferência é
yn / xn = (1 + 2z-1 + z-2) / (1 + 2z-1 - z-2)
Especificação de um filtro no domínio da frequência
Modelos de Filtros
Metas ou requisitos para um filtro prático:
-
Ganho constante na banda passante (r1)
-
Resposta de fase linear na banda passante (r2)
-
Máxima rejeição fora da na banda passante (r3)
A simultaneidade destas metas não pode ser alcançada por um único tipo de filtro que seja fisicamente realizável.
Modelos
-
Filtro de Butterworth -> maximiza a meta (r1)
-
Filtro de Chebyshev -> maximiza a meta (r3)
-
Filtro de Bessel -> maximiza a meta (r2)
-
Filtro Elíptico -> maximiza a meta (r3)
Respostas às Questões de autoavaliação
QA 1
-
Ordem = 1: a0 = 2, a1 = -1
-
Ordem = 2: a0 = 0, a1 = 0, a2 = 1
-
Ordem = 3: a0 = 1, a1 = -2, a2 = 2, a3 = 1
QA 2
-
Ordem = 1
-
Ordem = 3
-
Ordem = 2
QA 3
a0 = 1
a1 = 0
b0 = 1
b1= -1
Para filtros listados em QA 2:
a.
a0 = 2
a1 = -1
b0 = 1
b1 = -1
b.
a0 = 0
a1 = 1
a2 = 0
a3 = -1
b0 = 1
b1 = 2
b2 = 0
b3 = 0
c.
a0 = 1
a1 = 2
a2 = 1
b0 = 1
b1 = 2
b2 = -1
Source: [Digital Signal Processing Tutorial] Actualmente não disponível online.
Só acessível ainda através https://web.archive.org/
[Interactive Digital Filter Design] Tony Fisher's webpages have now been retired.
Tony Fisher, from the Computer Science Dept at York University, died on February 29 2000.
We have set up a github repository at https://github.com/university-of-york/cs-www-users-fisher to host his source code, and other relevant parts of his website.
Também acessível ainda através de: https://web.archive.org/web/20200830000623/https://www-users.cs.york.ac.uk/~fisher/mkfilter/
[Infinite Impulse Response (IIR) - Butterworth / Bessel / Chebyshev Filters]
Também acessível ainda através de: https://web.archive.org/web/20191207101707/http://www-users.cs.york.ac.uk/~fisher/mkfilter/trad.html mas não funcional.
NOTA: Como é dito acima http://www-users.cs.york.ac.uk/~fisher/mkfilter/ já não está disponível online, mas é possível usar esse o código existente em: https://github.com/enrikb/cs-www-users-fisher/tree/resurrect/mkfilter
Very quick and dirty instructions:
-
make sure a C++ compiler, libgd-dev and libcgicc-dev are installed
-
clone this repo
-
checkout branch
resurrect/mkfilter
-
build and install the backend binaries from
software/mkfilter/current
-
build and install the frontend from
mkfilter
-
run a simple CGI capable webserver serving
mkfilter
git clone https://github.com/enrikb/cs-www-users-fisher.git
cd cs-www-users-fisher
git checkout resurrect/mkfilter
cd software/mkfilter/current
make install
cd ../../../mkfilter
make install
python3 -m http.server --cgi 8000
Then open http://localhost:8000/ and enjoy…
EXEMPLO:
Desenvolvimento interactivo de filtros digitais
Em http://www-users.cs.york.ac.uk/~fisher/mkfilter/, pode-se projectar filtros digitais. Basta preencher o formulário e pressionar o botão “submit” e será projectado um filtro. Pode especificar os seguintes tipos de filtro:
-
Filtros (IIR) Butterworth, Bessel ou Chebyshev, com características passa-baixo, passa-alto, passa-banda ou stopband, concebido pelo método de transformada bilinear ou transformada-z;
-
IIR resonantes passabanda, bandstop ou passtudo, concebidos directamente no plano-z;
-
FIR raiz de coseno elevada, opcionalmente com resposta raiz quadrada;
-
FIR transformadores Hilbert.
Exemplo para um filtro passbaixo de segunda ordem com frequência de corte 4 Hz e para uma taxa de amostragem de 100 amostras por segundo:
Resultados do projecto do Filtro
Gerado por: http://www-users.cs.york.ac.uk/~fisher/mkfilter/trad.html
Summary
You specified the following parameters:
-
filtertype = Butterworth
passtype = Lowpass
ripple =
-
order = 2
samplerate = 100
corner1 = 4
corner2 =
-
adzero =
logmin =
Results
Command line: ./helpers/mkfilter -Bu -Lp -o 2 -a 4.0000000000e-02 0.0000000000e+00 raw alpha1 = 0.0400000000 raw alpha2 = 0.0400000000 warped alpha1 = 0.0402118901 warped alpha2 = 0.0402118901 gain at dc : mag = 7.485478157e+01 phase = 0.0000000000 pi gain at centre: mag = 5.293032365e+01 phase = -0.5000000000 pi gain at hf : mag = 0.000000000e+00 S-plane zeros: S-plane poles: -0.1786567203 + j 0.1786567203 -0.1786567203 + j -0.1786567203 Z-plane zeros: -1.0000000000 + j 0.0000000000 2 times Z-plane poles: 0.8237299905 + j 0.1495516094 0.8237299905 + j -0.1495516094 Recurrence relation: y[n] = ( 1 * x[n- 2]) + ( 2 * x[n- 1]) + ( 1 * x[n- 0]) + ( -0.7008967812 * y[n- 2]) + ( 1.6474599811 * y[n- 1])
Ansi ``C'' Code
/* Digital filter designed by mkfilter/mkshape/gencode A.J. Fisher Command line: ./helpers/mkfilter -Bu -Lp -o 2 -a 4.0000000000e-02 0.0000000000e+00 -l */ #define NZEROS 2 #define NPOLES 2 #define GAIN 7.485478157e+01 static float xv[NZEROS+1], yv[NPOLES+1]; static void filterloop() { for (;;) { xv[0] = xv[1]; xv[1] = xv[2]; xv[2] = next input value / GAIN; yv[0] = yv[1]; yv[1] = yv[2]; yv[2] = (xv[0] + xv[2]) + 2 * xv[1] + ( -0.7008967812 * yv[0]) + ( 1.6474599811 * yv[1]); next output value = yv[2]; } }
Download code and/or coefficients:
Magnitude (red) and phase (blue) vs. frequency
-
x axis: frequency, as a fraction of the sampling rate (i.e. 0.5 represents the Nyquist frequency, which is 50 Hz)
-
y axis (red): magnitude (linear, normalized)
-
y axis (blue): phase
Impulse response
-
x axis: time, in samples (i.e. 100 represents 1 second)
-
y axis (red): filter response (linear, normalized)
Step response
-
x axis: time, in samples (i.e. 100 represents 1 second)
-
y axis (red): filter response (linear, normalized)