Uma das melhores maneiras de criar uma onda senoidal é usar um fasor complexo com atualização recursiva. Ou seja,
z[ n + 1 ] = z[ n ] Ω
onde z [n] é a fasor, , com sendo a frequência angular do oscilador em radianos e o índice da amostra. Tanto a parte real quanto a imaginária de são ondas senoidais, estão 90 graus fora de fase. Muito conveniente se você precisar de seno e cosseno. Um cálculo de amostra única requer apenas quatro múltiplos e quatro adições e é MUITO mais barato do que qualquer coisa que contenha sin () cos () ou tabelas de pesquisa. O problema potencial é que a amplitude pode sofrer variações ao longo do tempo devido a problemas de precisão numérica. No entanto, existe um processo bastante simples de reparar isso. Digamos que . Sabemos que deve ter magnitude de unidade, ou seja, ω n z [ n ] z [ n ] = um + j b z [ n ]Ω = exp( j ω )ωnz[ n ]z[ n ] = a + j bz[ n ]
a ⋅ a + b ⋅ b = 1
Assim, podemos verificar de vez em quando se esse ainda é o caso e corrigir de acordo. A correção exata seria
z′[ n ] = z[ n ]a ⋅ a + b ⋅ b---------√
Esse é um cálculo complicado, mas como está muito próximo da unidade, você pode aproximar os termos com uma expansão de Taylor em torno de e obtemos1 / √a ⋅ a + b ⋅ b x=11 / x--√x = 1
1 1x--√≅3 - x2
então a correção simplifica para
z′[ n ] = z[ n ] 3 - a2- b22
A aplicação dessa correção simples a cada poucas centenas de amostras manterá o oscilador estável para sempre.
Para variar a frequência continuamente, o multiplicador W precisa ser atualizado de acordo. Mesmo uma mudança não contínua no multiplicador manterá uma função de oscilador contínuo. Se for necessário aumentar a frequência, a atualização pode ser dividida em algumas etapas ou você pode usar o mesmo algoritmo do oscilador para atualizar o próprio multiplicador (já que também é um fasor complexo de ganho de unidade).