% MATLAB Ex III-3 % Script principal % Generation des frequences f = logspace(-3,3,121) ; w = 2*pi*f ; N = [ 1 ] ; % adapater D au type de correction apportee. % activer Question 1 %D = [ 1 2 1] ; % pas de correction % activer question 2 %D = [ 1 3 3 1 ] ; % detection de position %activer question 3 D = [ 1 3.2361 5.2361 5.2361 3.2361 1 ] ; % detection de seuil / franchissement. Gn = polyval(N, j*w ) ./ polyval( D, j*w ) ; % trace brut, sans correction GdB = 20*log10(abs(Gn)); Ph = angle(Gn)/pi*180 ; % calcul de la phase en degres. figure(1) subplot(2,1,1) semilogx(w,GdB) subplot(2,1,2) semilogx(w,Ph) % au bilan, le saut de phase n'est pas un saut réel, il est du % a la periodicité de la fonction calculant l'angle (elle va de -pi a pi) % or ici l'angle va de 0 a -3*pi/2 donc en deca de -pi => angle retourne % alors un angle positif... d'ou le saut. % On teste chaque angle, et si l'on est en cadran 3 ou 4, il faut corriger l'angle % en retirant 2 pi... for k=1:length(Gn) if ( cadre(Gn(k))> 2 ) % donc en cadran 3 ou 4 Ph(k) = Ph(k) - 360 ; % 360 et non 2*pi on est passe en degre, ligne 22 end end figure(2) subplot(2,1,1) semilogx(w,GdB) subplot(2,1,2) semilogx(w,Ph) % La solution fonctionne... jusqu'à l'odre 4 inclus, au dela on franchi % a nouveau une limite : on revient en cadran 1. L'angle est correct, mais % on a fait un tour complet ! Pour eviter le saut, il faut un compteur de tours. % la solution consiste a detecter non pas la position mais le franchissement de zone % cela se fait ici en comparant le cadran de deux points consecutifs % si l'on passe du cadran 2 (au point n-1) au cadran 3 (au point n) on % positionne un drapeau pour indiquer que l'on a fait un tour. %il est plus astucieux de compter les tours au passage d'une pariode % a l'autre de la fonction angle, cela minimise le nombre de tests. cor = 0 ; % au debut on suppose qu'il n'y a pas de correction a apporter Ph = angle(Gn)/pi*180 ; % re-calcul de la phase en degres % pour ne pas fausser les resultats de la methode par la correction precedente. % warning off for k=2:length(Gn) % debut a 2 on teste k-1 et k ! if ( ( cadre(Gn(k-1)) == 2 ) & ( cadre(Gn(k)) == 3 ) ) cor = cor - 360 ; % mise a jour de la correction apportee.. end Ph(k) = Ph(k) + cor ; % on applique toujours la correction... end % warning on figure(3) subplot(2,1,1) semilogx(w,GdB) subplot(2,1,2) semilogx(w,Ph) % Vous aurez peut etre des warning du type : % warning: Matlab-style short-circuit operation performed for operator & % Matlab n'évalue pas le second terme du test ligne 65. Si le premier terme % d'un et logique est faux, le resultat sera faux de toutes façons. % ces messages peuvent se neutraliser avec l'option warning off / on..