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?
Respostas:
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.
fonte