Implementação de filtro IIR de ponto fixo em tempo real em C

7

Gostaria de implementar um filtro IIR passa-baixa de ponto fixo de quarta ordem em C (com aritmética Q15) e prepararei esse filtro usando dois estágios em cascata de filtros bi-quad diretos forma II.

Encontrei inúmeras implementações C e coeficientes de exemplo nos livros de processamento de sinal digital, mas vi que um deles não é confiável durante a verificação (eles criam estouros, não atenuam os componentes de frequência esperados etc.).

Qual implementação de C é adequada para esse problema? E também, existem coeficientes de amostra para verificar essa implementação?

albin
fonte
11
Se você não encontrou nenhuma implementação que funcione para você, o que está impedindo que você faça o seu próprio? Parece que você entende onde os que encontrou não são suficientes, então apenas aumente-os para atender às suas necessidades. Um IIR de quarta ordem baseado em seções de segunda ordem não é tão complicado de escrever.
Jason R
O seu problema é realmente sobre o design de um filtro ou você já possui os coeficientes e deseja implementá-lo?
Dipan Mehta
Eu já preparei o filtro e tenho coeficientes.
Albin

Respostas:

8

Embora isso pareça uma pergunta notavelmente simples, ela exige uma resposta notavelmente complicada.

Eu não acho que exista uma solução "tamanho único". A melhor escolha de algoritmo dependerá do ruído que você pode tolerar e do tipo de passa-baixo (inclinação e frequência). Por exemplo, na taxa de amostragem de 44,1 KHz, um Butterworth de 4ª ordem a 10 kHz é bastante direto, enquanto uma passagem baixa a 100Hz é uma dor real. Em essência, depende de quão próximos seus pólos estão do círculo unitário.

Os erros de quantização e arredondamento dos filtros IIR são geralmente transferidos para a saída ponderada pela função de transferência somente com pólo. Um filtro passa-baixo de 10 kHz Butterworth de quarta ordem possui uma amplificação de ruído no pior dos casos de apenas 5dB, portanto isso não é um problema.

No entanto, em um passe baixo de 100 Hz (novamente BW de 4ª ordem), o ruído é amplificado em 75 dB. Se você usar a matemática Q15, seu nível de ruído básico talvez seja de -100dB ou mais. Após o filtro, o sinal para racionar o ruído será de apenas 25 dB.

Essa é uma das razões pelas quais os filtros IIR de ponto fixo são bastante complicados. Se você precisar de baixas frequências de corte e uma relação sinal / ruído decente a meio caminho, os algoritmos básicos não funcionarão. Você precisa examinar matemática de dupla precisão e / ou modelagem de espectro de erros ou métodos relacionados.

Hilmar
fonte