Bitácora · DCSS · Concepto

El PLL en tiempo discreto

Unidad 7 · PLL · el script de clase pieza por pieza, la transferencia en z, de s a z y la latencia

El PLL de la recuperación fina de portadora no tiene VCO ni capacitores: es aritmética que corre una vez por símbolo. Los dos integradores del lazo de la filmina pasan a ser dos acumuladores, Laplace pasa a ser la transformada Z, y aparece un bloque que en continuo no existe: la latencia. El script de la clase, phase_system.m, arma ese lazo en seis líneas. Hecha a mano, la cuenta da una transferencia de segundo orden con polos que se escriben en una línea, y resulta ser exactamente el lazo continuo pasado por Euler hacia atrás. Por eso valen el mismo ζ y el mismo ωn de la filmina, mientras el lazo sea lento frente a la tasa de símbolo.

01 · La definición

Es el modelo equivalente de fase de la filmina, muestreado. Entra la fase θ[n] de la portadora recibida y sale la fase φ[n] del NCO, una muestra por símbolo. Linealizado alrededor del enganche, el lazo son tres ecuaciones:

e[n]=θ[n]−φ[n−Lat]c[n]=Kpe[n]+Ki∑k≤ne[k]φ[n]=φ[n−1]+c[n]

La primera es el detector de fase: compara la entrada con la fase del NCO, que le llega Lat muestras tarde. La segunda es el filtro de lazo PI de la filmina, L(s)=Kp+Ki/s, con la integral cambiada por una suma: la rama proporcional mira el error de ahora y la integral, todos los errores hasta ahora. La tercera es el NCO, que acumula el control igual que el VCO lo integraba. En diagrama, θ[n] → (+) → L(z) → NCO → φ[n], con el retorno por z^−Lat.

En continuo el detector tenía ganancia KPD y el VCO, KV. Acá las dos están normalizadas, KPDKV=1 por muestra, y lo que quede de ellas vive dentro de Kp y Ki. Es lo que permite usar las fórmulas de la filmina con los números del script sin arrastrar unidades.

02 · El script, pieza por pieza

Y las cuatro figuras:

Dos restos del script: clear all borra todo y close all está comentado, así que las figuras se acumulan entre corridas; y hold all es el nombre viejo de hold on.

03 · Los dos acumuladores

La rama integral. Llamando i[n] a la suma de la segunda ecuación, cada muestra le suma el error nuevo a la anterior:

i[n]=i[n−1]+Kie[n]⟹I(z)(1−z−1)=KiE(z)⟹IE=Ki1−z−1=Kizz−1

Es la propiedad de retardo de la transformada Z, x[n−1]↔z−1X(z), y nada más. La suma incluye la muestra actual, así que el acumulador no retarda: el error de hoy ya está en la salida de hoy.

El NCO. La tercera ecuación es la misma cuenta con c[n] en lugar de Kie[n]: Φ/C=z/(z−1). Con un control constante, la fase crece una cantidad fija por muestra: el NCO cambió de frecuencia, igual que el VCO de la filmina con tensión constante. Un NCO que sumara sólo hasta la muestra anterior tendría un z−1 más; en el script, eso es Lat = 1.

El polo en z=1. z/(z−1) vale infinito en z=ej0=1, que es frecuencia cero. Es el L(0)→∞ que la tabla de filtros de la filmina pide para seguir una rampa de fase sin error, escrito en z.

04 · La transferencia, paso a paso

Con Lat = 0, que es como viene el script.

Paso 1: el PI con un solo denominador. Se multiplica Kp por (z−1)/(z−1) y se suma:

L(z)=Kp+Kizz−1=(Kp+Ki)z−Kpz−1

Paso 2: el lazo abierto. El NCO multiplica por otro z/(z−1):

G(z)=L(z)zz−1=z[(Kp+Ki)z−Kp](z−1)2=ND

Paso 3: cerrar el lazo. Con H=1, se multiplica arriba y abajo por D:

F=G1+G=N/D1+N/D=ND+N

Paso 4: desarrollar el denominador. D+N=z2−2z+1+(Kp+Ki)z2−Kpz, y agrupando por potencias de z:

F(z)=Φ(z)Θ(z)=z[(Kp+Ki)z−Kp](1+Kp+Ki)z2−(2+Kp)z+1

Con los números de la clase, (0,00505z2−0,005z)/(1,00505z2−2,005z+1), que es lo que devuelve tfdata(F, 'v'). Contra feedback coinciden exactamente: la diferencia es 0 en los coeficientes normalizados y 0 en la respuesta en frecuencia, sobre 4000 puntos de 0 a π. feedback llega a los mismos coeficientes por su propio camino, sumando los polinomios de G.

Paso 5: la comprobación en z=1. El numerador da Kp+Ki−Kp=Ki, y el denominador, 1+Kp+Ki−2−Kp+1=Ki. F(1)=1: una fase constante se copia entera.

Paso 6: el error. La transferencia del error es lo que le falta a F:

E(z)Θ(z)=1−F=DD+N=(z−1)2(1+Kp+Ki)z2−(2+Kp)z+1

Doble cero en z=1, uno por acumulador. Con el teorema del valor final discreto, ess=limz→1(z−1)E(z), el escalón Θ=z/(z−1) se lleva un cero y sobra otro, y la rampa Θ=ω0z/(z−1)2 se lleva los dos y deja una (z−1) suelta: los dos errores son cero. Medido con lsim sobre una rampa de 10−3 rad por muestra —a 16 GBd es un corrimiento de 2,546 MHz—, el error a las 20 000 muestras es de 8·10⁻¹² rad: redondeo sobre una fase que ya vale 20 rad. Sin la rama integral el error es (z−1)/((1+Kp)z−1), la rampa deja ω0/Kp —la misma fila de la tabla de la filmina— y la medición da 0,2000 rad, 11,5°.

05 · Los polos

Son las raíces del denominador de F. El discriminante es (2+Kp)2−4(1+Kp+Ki)=Kp2−4Ki, porque el 4 y el 4Kp se cancelan. Queda:

z1,2=(2+Kp)±j4Ki−Kp22(1+Kp+Ki),|z|=11+Kp+Ki

El módulo sale del producto de las raíces, que es el coeficiente independiente sobre el principal: 1/(1+Kp+Ki). Tres lecturas:

06 · De s a z

Con KPDKV=1 y el tiempo contado en muestras, la F(s) de la filmina con el PI es

F(s)=Kps+Kis2+Kps+Ki=2ζωns+ωn2s2+2ζωns+ωn2,ωn=Ki,ζ=Kp2Ki

Con los números de la clase, ζ=0,3536 y ωn=0,00707 rad por muestra; multiplicando por fs/2π, fn=18,01 MHz. El ancho de banda equivalente de ruido de la filmina, Bn=ωn2(ζ+14ζ), da BnTs=3,75·10−3: 60 MHz contra 16 GBd. Ese producto es el que decide todo lo que sigue.

Paso 1: reemplazar cada integrador por un acumulador. El acumulador de la sección 03 es 1/(1−z−1) donde había 1/s. O sea, s→1−z−1=(z−1)/z: la derivada aproximada por la diferencia hacia atrás, que es Euler hacia atrás con Ts=1.

Paso 2: sustituir en F(s). El numerador queda Kp(z−1)/z+Ki=[(Kp+Ki)z−Kp]/z, y el denominador,

(z−1)2z2+Kpz−1z+Ki=(1+Kp+Ki)z2−(2+Kp)z+1z2

El cociente es, letra por letra, la F(z) de la sección 04. El lazo del script es el lazo continuo de la filmina discretizado por Euler hacia atrás, no una aproximación de él.

Paso 3: dónde caen los polos. Si s=1−z−1, entonces z=1/(1−s), y cada polo continuo sc=−ζωn±jωn1−ζ2 va a parar a 1/(1−sc); contra pole(F) la diferencia es 1,1·10⁻¹⁴. Esa función manda todo el semiplano izquierdo adentro del círculo unidad, y por eso el lazo con Lat = 0 no se desestabiliza con ninguna ganancia. Un muestreo ideal del lazo continuo, en cambio, pondría el polo en esc. Las dos funciones coinciden al primer orden y se separan al segundo:

11−s=1+s+s2+…es=1+s+s22+…

La diferencia es del orden de |sc|2/2=ωn2/2, y ωn en radianes por muestra es proporcional a BnTs. Con la clase son 2,5·10⁻⁵ entre esc y el polo de pole(F): invisible. Es el sentido exacto de «el lazo es lento frente a la tasa de símbolo».

Cuándo deja de valer. Con ζ fijo en el 0,3536 de la clase (Ki=2Kp2) y Kp subiendo, el modelo continuo tiene siempre el mismo sobrepico, 40,08 %, porque con el tiempo medido en 1/ωn la forma de la curva depende sólo de ζ. El discreto, medido con stepinfo:

KpBnTssobrepico discretocontra el continuoζ de los polos discretos
0,0050,0037539,72 %−0,360,357
0,010,007539,36 %−0,720,360
0,020,01538,65 %−1,430,366
0,050,037536,63 %−3,450,384
0,10,07533,57 %−6,520,412
0,20,1528,41 %−11,670,463
0,50,37517,97 %−22,110,580
10,7510,94 %−29,140,692

El sobrepico continuo sale de la forma cerrada de la tabla de la filmina; stepinfo, que la muestrea, da 40,07 %. La diferencia crece en proporción a BnTs: −0,36 puntos con la clase, el doble con el doble. Hasta BnTs=0,015 el modelo continuo se equivoca en menos de 1,5 puntos; con 0,075 ya son 6,5, y con 0,375 el discreto tiene menos de la mitad del sobrepico que predice ζ. El sentido es siempre el mismo: Euler hacia atrás amortigua. Los polos discretos, leídos de vuelta como s=lnz, tienen un ζ más alto que el diseñado: 0,357 con la clase, 0,412 con 0,075, 0,692 con 0,75.

07 · La latencia

Con H = z^-Lat en la realimentación, el detector compara θ[n] con φ[n−Lat]: corrige con una fase vieja. En continuo no hay nada parecido, y en el hardware es inevitable por dos razones.

La primera: Lat = 0 no se puede construir. Con Lat = 0, φ[n] depende de e[n] y e[n] depende de φ[n]. Es un lazo algebraico: MATLAB lo resuelve despejando,

φ[n]=φ[n−1]+i[n−1]+(Kp+Ki)θ[n]1+Kp+Ki

y por eso ante el escalón la primera muestra ya se mueve: φ[0]=(Kp+Ki)/(1+Kp+Ki)=0,005025, el mismo valor que da step. Un circuito no despeja ecuaciones: entre medir el error y mover el NCO hay por lo menos un registro, que es Lat = 1.

La segunda: a 16 GBd nada corre a 16 GHz. El receptor procesa muchos símbolos en paralelo en cada ciclo de reloj, y cada etapa del pipeline —el detector, el filtro, el NCO, la rotación de la constelación— agrega ciclos. Contada en símbolos, que es lo que cuenta Lat, esa demora se multiplica por el paralelismo.

Lo que hace con los polos. Con H=z−Lat, F=G/(1+Gz−Lat), y multiplicando por zLat(z−1)2 el denominador pasa a ser

zLat(z−1)2+(Kp+Ki)z2−Kpz

de grado Lat+2. Con Lat≥1 tiene una raíz en el origen que se cancela con un cero del numerador, así que el lazo tiene Lat+1 polos: el par de siempre, cerca de z=1, y Lat−1 nuevos. Con Lat = 1 el par casi no se mueve: 0,997475 ± 0,006605j. Con Lat = 50 está en 0,998590 ± 0,007756j, y los 49 nuevos forman un anillo de módulos entre 0,886 y 0,950, lejos de z=1. El par de siempre se va corriendo hacia afuera, y el sobrepico, medido con stepinfo, sube con él:

Latpolossobrepicomódulo del polo mayor
0239,72 %0,997485
1240,14 %0,997497
2340,58 %0,997510
5641,93 %0,997549
101144,37 %0,997623
202150,02 %0,997800
505175,14 %0,998620
100101inestable1,000555

Con 100 símbolos de latencia el par de siempre sale del círculo y el lazo de la clase, que con Lat = 0 no se desestabilizaba con ninguna ganancia, es inestable. El techo no lo pone la ganancia: lo pone el retardo.

Simulación El plano z del lazo, y su escalón — a la izquierda, todos los polos (×) y ceros (○) de F; a la derecha, la ventana punteada alrededor de z = 1, con los polos discretos y, en gris, dónde los pondría un muestreo ideal del modelo continuo (e^s). Abajo, el escalón de fase: el discreto, sólido, y el modelo continuo, punteado. Arranca con el script tal cual.
ζ y ωₙ del modelo continuo — Bₙ·Tₛ — polos cerca de z = 1 — e^s del modelo continuo — módulo del polo mayor — sobrepico, discreto — sobrepico, continuo — asentamiento al 2 % — fórmula cerrada − raíces —

Con los valores de la clase el discreto y el continuo son la misma curva, y los polos azules tapan a los rombos grises. Subí Kp: la ventana de la derecha se agranda, los polos se alejan de z=1 y se despegan de sus es, y el escalón discreto se queda por debajo del punteado. Con Ki fijo, subir Kp también sube ζ, y las dos curvas cambian de forma; lo que mide la diferencia entre ellas es BnTs. Después volvé a la clase y subí la latencia: aparece el anillo de polos nuevos, el par de siempre se arrima al círculo, el escalón oscila cada vez más, y antes de los 100 símbolos sale. En toda esa excursión el modelo continuo no se mueve: no tiene cómo ver la latencia.

08 · El análisis en MATLAB

El script de la clase tal cual, y abajo la verificación de lo derivado a mano. Lo que figura como comentario es la salida real de correrlo en R2026a.

clear all
%close all

fs = 16e9; %GHz (fs = BR para el FCR)
Ts = 1/fs;
z = tf('z', Ts);

%%
% System modelling
Kp = 0.005;
Ki = Kp/100;

L = Kp + Ki*z/(z-1);
NCO = z/(z-1);
G = L*NCO;
Lat = 0;
H = z^-Lat;
F = feedback(G, H); %Funcion del PLL

%% Step response
figure
step(F)

%% Ramp response
figure
step(F*z/(z-1))
hold all
step(z/(z-1))

% %%
figure
pzmap(F)

%%
figure
bode(F)
hold all

%% Verificación 1: la transferencia derivada a mano contra feedback
Fm = tf([Kp+Ki, -Kp, 0], [1+Kp+Ki, -(2+Kp), 1], Ts);
[nF, dF] = tfdata(F, 'v');
[nM, dM] = tfdata(Fm, 'v');
fprintf('coeficientes: %.1e\n', max(abs([nF/dF(1) - nM/dM(1), dF/dF(1) - dM/dM(1)])))
% coeficientes: 0.0e+00
w = linspace(1e-4, pi, 4000) / Ts;
fprintf('respuesta en frecuencia: %.1e\n', ...
        max(abs(squeeze(freqresp(F, w)) - squeeze(freqresp(Fm, w)))))
% respuesta en frecuencia: 0.0e+00

%% Verificación 2: los polos, por la fórmula cerrada
p  = pole(F);
pm = ((2+Kp) + [1; -1]*1j*sqrt(4*Ki - Kp^2)) / (2*(1+Kp+Ki));
fprintf('polos: %.6f +- %.6fj, |p| = %.6f, formula - pole = %.1e\n', ...
        real(pm(1)), imag(pm(1)), 1/sqrt(1+Kp+Ki), max(abs(sort(pm) - sort(p))))
% polos: 0.997463 +- 0.006581j, |p| = 0.997485, formula - pole = 1.1e-14

%% Verificación 3: el equivalente continuo
zeta = Kp/(2*sqrt(Ki));  wn = sqrt(Ki);
fprintf('zeta = %.4f, wn = %.5f rad/muestra, fn = %.2f MHz\n', zeta, wn, wn*fs/(2*pi)/1e6)
% zeta = 0.3536, wn = 0.00707 rad/muestra, fn = 18.01 MHz
sc = roots([1 Kp Ki]);                     % polos continuos, en rad/muestra
fprintf('1/(1-s) - pole = %.1e;  exp(s) - pole = %.1e\n', ...
        max(abs(sort(1./(1-sc)) - sort(p))), max(abs(sort(exp(sc)) - sort(p))))
% 1/(1-s) - pole = 1.1e-14;  exp(s) - pole = 2.5e-05

%% Lo que dicen las figuras
S = stepinfo(F);
fprintf('sobrepico %.2f %%, asentamiento %.0f muestras, -3 dB en %.1f MHz\n', ...
        S.Overshoot, S.SettlingTime/Ts, bandwidth(F)/(2*pi)/1e6)
% sobrepico 39.72 %, asentamiento 1477 muestras, -3 dB en 30.3 MHz

Tres detalles que muerden:

Para tener a mano

  1. El lazo de FCR corre una muestra por símbolo, fs=BR, con KPDKV=1 por muestra adentro de Kp y Ki.
  2. El PI es Kp+Kiz/(z−1) y el NCO es z/(z−1): dos acumuladores sin retardo, (z−1)2 en el lazo abierto, tipo 2.
  3. Lazo cerrado:F(z)=z[(Kp+Ki)z−Kp](1+Kp+Ki)z2−(2+Kp)z+1y el error, E/Θ, tiene un cero doble en z=1: ni escalón ni rampa dejan error.
  4. Polos complejos si y sólo si ζ<1; módulo 1/1+Kp+Ki: sin latencia, estable con cualquier ganancia.
  5. Es el lazo continuo por Euler hacia atrás, s→1−z−1: ωn=Ki y ζ=Kp/(2Ki) por muestra. Vale mientras BnTs sea chico: con ζ=0,3536, el sobrepico discreto se aparta 0,36 puntos con 3,75·10⁻³ y 6,5 con 0,075, siempre hacia menos.
  6. La clase: ζ=0,3536, fn=18,01 MHz, BnTs=3,75·10−3; sobrepico 39,72 %, asentamiento 1477 muestras.
  7. La latencia es z−Lat en la realimentación: Lat+1 polos. Lat = 0 es un lazo algebraico que el hardware no puede hacer. Con el lazo de la clase, 100 símbolos lo vuelven inestable.
← Anterior Inicio
Relacionados El PLL El VCO y el NCO El filtro de lazo y el PLL de segundo orden Ancho de banda, adquisición y tracking Polos y ceros El techo del PLL se mide en nanosegundos