Uno dei modi migliori per creare un'onda sinusoidale è utilizzare un phasor complesso con aggiornamento ricorsivo. ie
z[ n + 1 ] = z[ n ] Ω
dove z [n] è il fasore, , con ω essendo la frequenza angolare dell'oscillatore in radianti e n l'indice di campionamento. Sia la parte reale che quella immaginaria di z [ n ] sono onde sinusoidali, sfasate di 90 gradi. Molto conveniente se hai bisogno sia di seno che di coseno. Un singolo calcolo di esempio richiede solo 4 multipli e 4 aggiunte ed è MOLTO più economico di qualsiasi cosa contenga tabelle sin () cos () o di ricerca. Il potenziale problema è che l'ampiezza può spostarsi nel tempo a causa di problemi di precisione numerica. Tuttavia c'è un modo abbastanza semplice per ripararlo. Diciamo che z [ nΩ = exp( j ω )ωnz[ n ] . Sappiamo che z [ n ] dovrebbe avere unità magnitudo, cioè z[ n ] = a + j bz[ n ]
a ⋅ a + b ⋅ b = 1
Quindi possiamo controllare di tanto in tanto se è ancora così e correggere di conseguenza. La correzione esatta sarebbe
z'[ n ] = z[ n ]a ⋅ a + b ⋅ b---------√
Questo è un calcolo imbarazzante ma poiché è molto vicino all'unità puoi approssimare 1 / √a ⋅ a + b ⋅ b1 / x--√x = 1
1X--√≅3 - x2
quindi la correzione si semplifica
z'[ n ] = z[ n ] 3 - a2- b22
L'applicazione di questa semplice correzione ogni poche centinaia di campioni manterrà l'oscillatore stabile per sempre.
Per variare continuamente la frequenza, il moltiplicatore W deve essere aggiornato di conseguenza. Anche una variazione non continua del moltiplicatore manterrà una funzione di oscillatore continuo. Se è necessario lo speed ramping, l'aggiornamento può essere suddiviso in pochi passaggi oppure è possibile utilizzare lo stesso algoritmo oscillatore per aggiornare il moltiplicatore stesso (poiché è anche un phasor complesso con guadagno unitario).