Bonjour,
je cherche à programmer basiquement un Numerically Controlled oscillator :
Voilà les étapes :
1) j'ai un signal S1 en entrée dont je veux mesurer continuellement la phase S1 = sin(w1t+p1(t))
2) Le NCO mixe ce S1 à un signal S2 issu de sa boucle S2 = cos(w2t + p2(t))
On a donc S3 = S1 x S2
3) ce signal est filtré pour ne récupérer que les basses fréquences donc en gros S3filtre = sin((w1-w2)t+p1(t)-p2(t))
4) on va considérer que w1=w2 et que p1(t)-p2(t) = Dp(t) donc S3filtre = sin(Dp(t))
5) cette différence de phase Dp(t) est utilisée pour corriger le S2(t) dans une boucle de retroaction donc typiquement le nouveau p2(t+1) = p2(t) + Dp(t) soit S2(t+1) = cos(w2t + p2(t+1))
6) à chaque boucle le Dp(t) calculé est enregistré dans un tableau
Voilà ce que j'ai essayé de faire et qui ne marche pas :
CANenv1 est le signal S1 dont je veux mesurer la phase
l'erreur qu'il me donne est celle là :Code:[b,a]=butter(8,1500/(fph/2),'low'); DeltaOmega = 0; dt = tt(2)-tt(1); for ii = 1:LL-1; Mixenv1(ii+1) = CANenv1(ii+1) * slo1(ii+1); % on mixe les signaux (étape 2) filt1(ii+1) = filter(b,a,Mixenv1(ii+1)); % on filtre pour supprimer freq élevées (étape 3) omega(ii+1) = asin(filt1(ii+1)); % on prend l'arcsin pour avoir la composante dans le sinus (pas du tout sur qu'on fait comme ça) DeltaOmega(ii+1) = omega(ii+1) - omega(ii); % on calcule la différence par rapport au loop d'avant DeltaPhase(ii+1) = integral(DeltaOmega(ii+1),0,dt); % la phase est l'intégrale de la différence de fréquence slo1(ii+1) = sin(DeltaPhase(ii+1)); % on calcule la nouvelle valeur de p2(t) end
"Error using integral (line 82)
First input argument must be a function handle."
donc le soucis c'est que l'intégrale est apparemment mal utilisée, cependant de manière générale je ne suis pas du tout sur que la méthode globale soit correcte ….
-----