flamingo_parque_bicentenario_chile

Flamingos no Parque Bicentenário, bairro de Vitacura, Santiago, Chile.

Projeto usando Alocação Pólo-Zero

Intro

No tópico anterior (Papel dos pólos e zeros na magnitude da resposta em frequência), você deve ter percebido que:

Depois de ter entendido como a posição dos pólos e zeros afeta a resposta de frequência (no tópico anterior), você pode então projetar um sistema para ter uma resposta de frequência específica alocando pólos e zeros em locais apropriados e derivando a função de transferência do sistema usando esses locais, como mostrado nos exemplos abaixo. Depois de ter a função de transferência, e os coeficientes e da equação de diferenças do sistema pode ser determinada e o filtro implementado na prática.

Exemplo 1: Filtro Notch - Parte 1/2

O exemplo a seguir descreve o processo para projetar um filtro Notch, que remove uma faixa muito pequena de componentes de frequência de um sinal, usando alocação de pólos e zeros.

Isto pode ser usado para remover o ruído de “zumbido da rede elétrica” (na faixa de 50 Hz para o caso dos dados usados para fins de simulação). Esta frequência á ser removida depende da frequência da fonte de alimentação elétrica local (no caso do Brasil, provavelmente seria na frequênica de 60 Hz)

Neste exemplo, vamos considerar uma situação em que um sinal de ECG (uma medida da atividade elétrica do coração), foi amostrado na frequência de 120 Hz, e foi corrompido com ruído de rede de 50 Hz. O sinal original bruto do ECG pode ser baixado em: noisy_ecg.txt.

Projetando o filtro

Sabe-se que no círculo unitário: (rad) corresponde à frequència de Nyquist. Então, neste caso: (rad) , ou:

Nesta frequência de amostragem, os 50 Hz equivalem à radianos por amostra (isto é, (rad) ):

, ou:

.

ou generalizando:

ou

Para reduzir o ruído em 50 Hz do sinal de ECG, podemos então posicionar um par de zeros na localização:

No Matlab:

ou seja:

.

Num diagrama pólo-zero (ou ROC) fica:

filtro_notch_pz_map.png

Montando a função transferência do filtro e testando:

Note que a eq. de diferenças associada com esta função transferência rende:

Note porém que esta função transferência não possui denominador, e que o grau no numerador é superior ao grau do denominador (zero), o que leva a um sistema com atrasos na resposta ou um sistema antecipativo 👀 -- observe o desenvolvimento à seguir:

A eq. de diferenças desta é:

(eq. (1))

Note que não existem os termos ou .

Apenas temos , isto significa que este filtro só passará a emitir um sinal de saída depois da 2a-amostragem realizada sobre o sinal de entrada (ver simulação mais aditante).

Lembrando que a função filter() tabalha com eq. do tipo:

Então:

, , , , e .

⚠️ O detalhe é que a funçao filter() não aceita , então a forma de compensar isto, é "atrasando" o sistema em 2 períodos de amostragem (ou 2 amostras):

Ou:

O problema é que representa uma amostra do sinal adiantado no tempo em 2 amostras e uma amostra do sinal adiantado no tempo em 2 amostras. Valores impossíveis de serem computados. Este sistema desta forma seria o que chamamos de um "sistema antecipativo" 👀.

Mas podemos voltar a eq. (1) para tentar computar/simular os termos de usando um Diagrama de Fluxo de sinal e o Simulink (filtro_ECG0.slx):

 

filtro_EC0

Note que o último bloco de ganho trabalha com um ganho com valor para compensar o "ganho DC" de :

A simulação rende:

filtro_ECG0_teste.png

Note na figura anterior, que sinal composto pela soma das 2 senóides (uma oscilando à 2 Hz e outra oscilando à 5 Hz) e que sinal entregue ao filtro, "contaminado" pelo ruído de 50 Hz.

Perceba que a saída do filtro , corresponde ao sinal amostrado , mas atrasado de 2 períodos de amostragem (neste caso: 0,0167 segundos).


Exemplo 2: Filtro Notch - Parte 2/2 (sem atrasos desnecessários)

Ocorre que, se não quisermos atrasos desnecessários num sistema (caso do exemplo 1 anterior), devemos acrescentar um par de pólos na origem, para garantir que não sejam introduzidos atrasos desnecessários no sistema.

Note que esses pólos não afetarão a resposta de frequência do sistema (consulte o tópico anterior: Papel dos pólos e zeros na magnitude da resposta em frequência.

Por acaso, o gráfico de superfície de associado a este sistema é mostrado à seguir:

O diagrama pólo-zero (ou ROC) deste fica:

filtro_notch_2_pz_map

O gráfico de superfíce deste rende:

filtro_notch_superficie_H

Observe como o efeito dos dois pólos se acumula na origem. Eles não afetam a superfície nos pontos correspondentes ao círculo unitário, ou seja, se os pólos foram removidos, a amplitude da superfície nos pontos correspondentes ao círculo unitário ficaria inalterado.

A amplitude da superfície nos pontos correspondentes ao círculo unitário é mostrada abaixo e plotada em relação ao ângulo feito com o eixo real:

filtro_notch_bode_a.png

O gráfico à seguir é igual ao gráfico acima, exceto que apenas os pontos de amplitude da superfície de 0 a radianos são mostrados, uma vez que esses pontos refletem os pontos entre e 0 radianos.

filtro_notch_bode_b.png

Neste tipo de gráfico (como antes), a resposta de frequência associada a este sistema pode ser obtida substituindo as unidades do gráfico acima por unidades de frequência de radianos por amostra.

O diagrama equivalente de Bode equivalente, usando Matlab, resultaria:

filtro_notch_bode_matlab

Pode-se ver que um sistema associado ao diagrama pólo-zero acima atenuaria significativamente o ruído de 50 Hz (lembre-se que 50 Hz equivale a radianos por amostra) (Note: dB ). No entanto, você deve apreciar que uma ampla faixa de frequências fora de 50 Hz também seria alterado, ver distorção em fase causado por esta , o que não é o ideal, uma vez que a forma do sinal de ECG pode ser significativamente alterada (atrasos introduzidos em harmônicas elevadas), talvez dificultando a interpretação do profissional de saúde. Uma melhoria neste projeto será fornecida posteriormente, mas por enquanto vamos determinar os coeficientes e associados ao sistema, para que possamos implementar o filtro.

A função transferência associada com este filtro fica:

Multiplicando numerador e denominador por , obtemos:

Sendo assim:

Resulta na seguinte equação de diferenças:

e assim teremos: , , e .

Obs: Note que os coeficientes de correspondem ao denominador da transfer function e que os coeficientes de correspondem ao numerador da transfer function , mas considerando a notação de expressa como expoentes negativos em () 👀

Simulando este filtro usando o diagrama de fluxo de sinais atualizado para esta -- arquivo: filtro_ECG1.slx:

filtro_EC1

E neste caso, a simulação rende:

filtro_ECG1_teste.png

O atraso de 2 períodos de amostragem sobre o sinal de entrada foi eliminado, entretanto, perceba um ligeiro atraso no sinal de saída que aumenta conforme aumenta a frequência do sinal de entrada.

Calculando as distorções (atrasos) incorporados nos sinais de entrada:

filtro_ECG1_freqz_1.png

Frequência (Hz)Fase ()Atraso (ms)
28,5806 ms
58,3722 ms

Lembrando que corresponde a um período do sinal de entrada:

E lembrando que ms, percebemos que estes atrasos, apesar de parecerem pequenos, equivalem aproximadamente à um período de amostragem.

Podemos usar o Matlab/Octave para comprovar o funcionamento deste filtro sobre o sinal de ECG ( noisy_ecg.txt ):

E então temos o resultado:

filtro_notch_sinal_ECG

Você pode ver nos gráficos no domínio do tempo do ECG e nos sinais de ECG filtrados acima que o “ruído” foi reduzido. Mas..., a amplitude do sinal também foi alterada. A relação entre a amplitude do pico dominante da "onda R" e da "onda T" vizinha também foi ligeiramente alterada.

dog_ufa.gif

Filtro Notch Melhorado

Um filtro notch melhorado pode ser obtido posicionando um par de pólos “muito próximo” dos zeros. Adicionar os pólos desta forma tem o efeito de “compensar” a contribuição de zero para a forma da superfície H(z) para a maior parte do plano z, exceto nas regiões muito próximas dos zeros.

Isso pode ser melhor compreendido considerando o que aconteceria se um pólo fosse posicionado exatamente no local do zero; você deve perceber que o pólo cancelaria completamente a contribuição do zero e a superfície seria plana para todo o plano z.

Quando os pólos e os zeros são colocados próximos uns dos outros, eles tendem a se anular na maioria das regiões do plano z, exceto nas regiões que estão muito próximas do pólo ou do zero.

A título de exemplo, vamos posicionar pólos no mesmo ângulo dos zeros, mas distantes 0,9 da origem, como ilustrado adiante. Estes pólos seriam localizados em: ; ver cálculos à seguir:

Ou seja, terminamos por obter a seguinte função transferência:

Verificando como ficou o ROC e resposta espectral:

ROC_Notch_melhorado.png

boded_Notch_melhorado.png

Pode-se perceber as diferenças, principalmente no diagrama de Fase. Desta vez, maiores defasagens no sinal serão acrescentadas nas frequências próximas da frequência de corte deste filtro (50 Hz).

Aplicando-se sobre o sinal de ECG resulta:

filter_Notch_melhorado.png

Note que desta vez, o filtro Notch melhorado além de reduzir atrasos em certos componentes frequenciais próximos de 50 Hz, também não distorceu tanto as amplitudes originais do sinal.

Fim.