NCO 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 NCO.

Topologia:

Foi implementada a topologia mais comum, onde uma LUT é alimentada por um acumulador de fase. O acumulador integra o sinal de controle que determinada a fase instantânea de saída, já que:

\phi = \int_{}^{ t} f

O sinal de controle é a frequência instantânea e a fase instantânea determina a saída por uma função seno e/ou coseno.  Um diagrama da topologia pode ser visto a seguir:

NCO - New Page-2

Código:

Abaixo temos o código que define a classe NCO.

NCO_codeA

O construtor da classe recebe o fator de upsampling K. Uma palavra de controle de valor unitário gera uma saída com frequência normalizada:

F_n = 1/K

A palavra máxima de controle, que gera a máxima frequência permissível de saída, conforme o teorema de Nyquist é:

CONTROL = K / 2

O método que devemos usar para iterar o NCO é chamado de .step(control), e recebe como argumento a palavra de controle. Para obter a saída em fase utilize .getSIN() e a saída em quadratura .getCOS(). Ambas retornam o valor instantâneo de saída do oscilador.

Teste de mesa:

Como teste de mesa programei um simples modulador FM utilizando uma onda senoidal como controle do NCO. Lembrando que tal código, em malha aberta, seria melhor implementado diretamente com o MatLab em modo vetorial. Porém, da maneira implementada, vemos a robustez da classe para uso em malha fechada.  O código para testes e o resultado podem ser vistos a seguir:

NCO_cod2

Resultado do teste de mesa:

NCO_plot1

Abraços e boa modelagem!