Filtro FIR Iterativo em MATLAB

Devido a dificuldade de simular loops em malha fechada com o MatLab sem o uso do simulink, que necessitam de implementação iterativa (step by step),  decidi criar algumas classes que facilitam a modelagem de esquemas com feedback.  Nesse post apresento a classe filterFIR.

Topologia:

Diversas topologias para implementação de filtros digitais FIR foram desenvolvidas, cada qual com vantagens e desvantagens. Para manter o projeto simples e funcional decidi utilizar a forma direta. Nessa topologia, uma rede de atrasos armazena as N antigas amostras do sinal que, a cada iteração, são multiplicadas  paralelamente pelos coeficientes do filtro. Uma rede de somadores em série gera o sinal de saída.

Dessa forma, convoluimos a entrada com a resposta ao impulso do filtro, passo a passo, conforme cada nova amostra é inserida no sistema.  Um diagrama da topologia usada pode ser visto a seguir:

Captura de Tela 2014-09-21 às 19.06.16

Código:

O código implementa o esquema utilizando um registrador de deslocamento e um vetor que armazena os coeficientes do filtro. Tais coeficientes serão fornecidos por um vetor no construtor, e a classe se auto configurará para o correto número de elementos. Para iterar o filtro utiliza-se a o método .step(entrada) que recebe como argumento a entrada instantânea e retorna a saída atual para aquele step. Abaixo o código que define a classe.

Captura de Tela 2014-09-19 às 21.19.50

Teste de mesa:

Para testar a classe desenvolvida modelei um PLL de primeira ordem. Também foi utilizada a classe NCO, exibida no post anterior. Podemos frisar que uma simulação desse tipo, em malha fechada, seria impossível de realizar no modo vetorial do MATLAB. O  esquema do PLL é mostrado abaixo.

filterFIR_PLL - New Page

A iteração de malha fechada acontece no loop for.

Resultado do teste de mesa:

pll_result

Abraços e boa simulação!