Unidad 7 · PLL · el amortiguamiento del lazo de la clase
El receptor no conoce la fase exacta de la portadora ni la frecuencia exacta de su propio oscilador: las tiene que seguir. Eso hace un PLL, un lazo de enganche de fase. Un detector mide cuánto está corrida la fase, un filtro de lazo convierte ese error en una corrección, y un oscilador numérico la aplica; la vuelta se repite muestra a muestra hasta que el error queda en cero (el PLL).
El filtro de lazo de la clase es un proporcional-integral, y tiene dos constantes. Kp es la rama proporcional: corrige en proporción al error de fase de este momento, y decide qué tan fuerte reacciona el lazo. Ki es la rama integral: acumula el error a lo largo del tiempo, y es la que termina sosteniendo la corrección cuando el oscilador está corrido en frecuencia; sin ella, ese corrimiento deja un error de fase que no se va nunca (el filtro de lazo). Con esas dos constantes el lazo se comporta como un sistema de segundo orden, y se lo describe con tres números: la frecuencia natural , que dice qué tan rápido reacciona; el amortiguamiento , que dice si llega derecho o se pasa y oscila; y el ancho de banda de ruido , que dice cuánto del ruido de la entrada se cuela en la fase que el lazo estima (ancho de banda, adquisición y tracking).
El script de la clase arma el filtro de lazo con Kp = 0.005 y Ki = Kp/100. Eso da un amortiguamiento , la mitad del que traen los libros, y se ve: ante un escalón de fase el lazo se pasa un 39,72 %, contra el 20,63 % del lazo de libro. Lo que no cambia es el ruido. Con la misma frecuencia natural, 0,354 y 0,707 dan exactamente el mismo ancho de banda de ruido, 60 MHz, porque uno es el espejo del otro: . Medido en el lazo discreto, 59,55 y 59,70 MHz.
Bajar ζ a la mitad no compra silencio. Lo que hace es cambiar de lugar el ruido y cobrar en todo lo que el ancho de banda de ruido no mide: el lazo de la clase tarda 1477 muestras en asentarse contra 694, deja el doble de error ante el ruido de fase del oscilador local, y para enganchar un corrimiento de 100 MHz necesita 6636 muestras contra 3014. Lo único que compra son 6 dB de rechazo lejos de la frecuencia natural.
Y hay una cuenta que llega exactamente a estas constantes. La receta de la filmina para elegirlas, tal como está escrita, con 60 MHz de ancho de banda y , devuelve Kp = 0.005 y Ki = 5e-5. Las del script, exactas.
Con el filtro proporcional-integral el lazo es de segundo orden, y queda descrito por un amortiguamiento y una frecuencia natural (cómo salen de las constantes está en el filtro de lazo). Con la normalización del script, por muestra:
El ancho de banda equivalente de ruido es el de la filmina (de dónde sale y por qué es el que cuenta, en ancho de banda, adquisición y tracking):
Para un fijo el paréntesis tiene su mínimo en , que es lo que muestra la curva de la filmina. Lo que la curva no dice en voz alta es que el paréntesis es simétrico: cambiar por intercambia los dos sumandos y lo deja igual. Cada por debajo de tiene un gemelo por encima con exactamente el mismo , y el gemelo de es . El de la clase.
Que sea el mismo quiere decir que es el mismo. Así que el lazo de libro que hay que poner al lado del de la clase no es Ki = Kp/400: ése conserva , y con fijo bajar a la cuarta parte parte al medio y también el ruido. Es otro presupuesto. El que se compara es el que conserva Ki = 5e-5 y duplica , o sea Ki = Kp/200. Los dos tienen MHz; el de Kp/400, 9,00 MHz:
| lazo | Kp | Ki | ζ | Bn, fórmula | Bn, medido | sobrepico |
|---|---|---|---|---|---|---|
| clase, Kp/100 | 0,005 | 5·10⁻⁵ | 0,354 | 60,00 MHz | 59,55 MHz | 39,72 % |
| libro, mismo ruido, Kp/200 | 0,010 | 5·10⁻⁵ | 0,707 | 60,00 MHz | 59,70 MHz | 20,63 % |
| libro, misma Kp, Kp/400 | 0,005 | 1,25·10⁻⁵ | 0,707 | 30,00 MHz | 29,93 MHz | 20,71 % |
La columna medida es la mitad de la energía de la respuesta al impulso del lazo discreto —que es , por Parseval— multiplicada por GHz; la fórmula es la del lazo continuo equivalente. Las dos primeras filas se separan un 0,25 %, que es lo que el lazo discreto se aparta del continuo. Para tener la escala: el mínimo posible con este , en , da 56,27 MHz, un 5,5 % más abajo. Y un Monte Carlo con dos millones de muestras de ruido blanco en la fase de entrada dice lo mismo por otro camino: con la misma semilla, la varianza de la fase estimada sale 7,575·10⁻³ y 7,582·10⁻³ veces la de la entrada en los dos lazos, y con otra semilla el lazo de la clase da 7,431·10⁻³. Dos semillas del mismo lazo se separan veinte veces más que los dos lazos entre sí.
La filmina cierra con la receta para elegir las constantes: se arranca con y . Las condiciones de partida son y , y del ancho de banda sale . Componiendo, la rama proporcional queda
y la filmina la escribe con un 2 donde la composición da 4; la línea de , , está bien. Con —60 MHz a 16 GHz— y , la línea con el 2 da Kp = 0.0050 y la otra Ki = 5.00e-05: las constantes del script. Con el 4, Kp = 0.0100, el lazo de libro de la tabla.
Si las constantes del script salieron de esa cuenta o de otra, el script no lo dice. Lo que sí se puede ver es por qué el 2 no se delata. Un a la mitad con el mismo deja donde estaba y parte al medio, y el lazo que resulta tiene
que es igual al pedido sólo si , o sea si . El 2 de la receta es invisible en el ruido justo en el único ζ que se elige siempre. Con cualquier otro el ancho de banda sale corrido; con , quien verifique el diseño midiendo encuentra los 60 MHz que pidió.
El mismo es la misma área bajo , no la misma curva. Con ,
Igualando la de un con la de otro y pasando todo de un lado, lo que queda es , que se anula en . Dos lazos con el mismo ωn se cruzan siempre en √2 veces la frecuencia natural, sea cual sea su ζ: acá, 25,5 MHz (25,45 en el lazo discreto). Abajo del cruce el lazo de la clase copia más: tiene un pico de 4,97 dB en 16,3 MHz, contra 2,07 dB en 14,1 MHz el de libro. Arriba copia menos, y lejos la diferencia tiende a la razón de los ζ, 6 dB: en 0,5 GHz, −31,83 dB contra −25,87 dB. El área que gana en el pico es la que pierde en la falda.
Eso es lo único que el ζ bajo compra, y vale según dónde esté el ruido. Si es blanco, lo que entra es el área, y empatan. Si lo que hay que rechazar vive muy por encima de la frecuencia natural, el lazo de la clase lo atenúa 6 dB más.
cuenta una sola cosa: cuánto ruido blanco de la entrada copia el lazo, pasando por . El oscilador local mete otro, y ése pasa por , que es lo que el lazo no logra seguir. El ruido de fase de un oscilador se modela como un paseo al azar: la fase da un paso gaussiano por muestra, de varianza , y su espectro cae como . Pasado por , el se simplifica y la integral es la de un denominador de segundo orden:
El último paso es . El error que deja el LO depende sólo de Kp, que es justo lo que la receta partió al medio. La cuenta continua da y ; el lazo discreto, sumando el cuadrado del error ante un escalón, da 98,76σ² y 49,50σ²; un Monte Carlo de dos millones de pasos, 98,63σ² y 49,72σ². A igual ruido blanco, el lazo de la clase deja el doble de error por el oscilador.
Mirado en frecuencia es más tajante todavía. Con el denominador se vuelve y la transferencia del error queda
un pasaaltos de Butterworth: sube monótono hacia 1 y nunca lo pasa. En general, pide , y eso tiene solución sólo si . 1/√2 es el ζ más chico con el que el lazo no amplifica el ruido de fase del oscilador en ninguna frecuencia. El de libro, en el lazo discreto, no pasa de −0,04 dB; el de la clase lo amplifica hasta +3,50 dB en 20,8 MHz. La filmina pone el ruido de fase del LO en la lista de lo que la recuperación fina de portadora tiene que resolver: el costo cae donde el lazo trabaja.
El escalón de fase ya lo muestra: con el mismo , el lazo de libro se asienta al 2 % en 694 muestras y el de la clase en 1477. Tampoco llega antes: el de libro cruza el valor final por primera vez en la muestra 157 y el de la clase en la 183, porque con el mismo el que tiene el doble de empuja más fuerte desde el principio. A igual ruido, el ζ bajo no compra velocidad en ningún tramo del escalón.
Lo lento de verdad es enganchar desde lejos, y eso el modelo lineal no lo ve. Se simula el lazo con un detector seno —la curva S de la filmina—, el mismo PI y el NCO con una muestra de retardo, que es lo mínimo para que el lazo se pueda correr muestra a muestra (el lazo de la clase con Lat = 1). La entrada es un corrimiento de frecuencia , y se cuenta desde qué muestra el error queda para siempre por debajo de 0,1 rad:
| Δf | clase, ζ = 0,354 | libro, ζ = 0,707 | razón | fórmula de la filmina |
|---|---|---|---|---|
| 20 MHz | 854 | 478 | 1,79 | 465 |
| 50 MHz | 1914 | 907 | 2,11 | 1087 |
| 100 MHz | 6636 | 3014 | 2,20 | 3310 |
| 150 MHz | 14.213 | 6871 | 2,07 | 7013 |
| 200 MHz | 24.979 | 12.383 | 2,02 | 12.199 |
| 300 MHz | 56.094 | 27.542 | 2,04 | 27.013 |
De 50 MHz para arriba la razón es 2 y no se mueve. Tampoco es el umbral: con 0,03 rad o con 1 rad, a 100 y 200 MHz, queda entre 1,99 y 2,20. La última columna es la de la filmina, , que no tiene a ζ adentro: acierta con el lazo de libro y le erra por la mitad al de la clase. La filmina da también un rango de captura proporcional a ζ, , que para la clase son 188 MHz; la simulación engancha 300 MHz igual. Con un integrador perfecto el ζ no le pone techo al rango: le cobra el tiempo.
El deslizador mueve con la frecuencia natural fija —Ki = 5e-5, la del script— y dibuja al lado su espejo, . Arranca en , donde el lazo es su propio espejo y hay una sola curva en cada panel. Bajalo hasta 0,354, el lazo de la clase, y mirá las dos marcas del panel de arriba: quedan a la misma altura. Las curvas de abajo, no.
En 0,354 las lecturas son las de las tablas: 59,55 y 59,70 MHz de ruido, y todo lo demás al doble. Seguí bajando hasta 0,25: el espejo se va a 1, el ruido de los dos sube a 70 MHz —59,55 era casi el piso— y la factura del ζ chico crece: 50,14 % de sobrepico contra 13,44 %, cuatro veces el error por el oscilador, 9832 muestras para enganchar contra 2146. Del otro lado de 1/2 es el mismo lazo con los colores cambiados. Para un ruido dado hay dos lazos, y la fórmula de Bn no distingue cuál elegiste.
El lazo de la clase armado como en phase_system.m, su gemelo de libro y las cuentas de las secciones de arriba. Lo que figura como comentario es la salida real de correrlo en R2026a.
%% 1. El lazo de la clase, como en phase_system.m fs = 16e9; Ts = 1/fs; z = tf('z', Ts); NCO = z/(z-1); Kp = 0.005; Ki = Kp/100; F = feedback((Kp + Ki*z/(z-1))*NCO, 1); %% 2. Su zeta, su wn y su Bn zeta = Kp/(2*sqrt(Ki)); wn = sqrt(Ki); Bn = wn/2*(zeta + 1/(4*zeta))*fs; fprintf('zeta = %.4f fn = %.2f MHz Bn = %.2f MHz\n', zeta, wn*fs/2/pi/1e6, Bn/1e6) % zeta = 0.3536 fn = 18.01 MHz Bn = 60.00 MHz %% 3. La receta de la filmina con el 2, y con el 4 BnT = Bn/fs; zl = 1/sqrt(2); g = zl + 1/(4*zl); fprintf('con 2: Kp = %.4f Ki = %.2e\n', 2*zl*BnT/g, 4*BnT^2/g^2) fprintf('con 4: Kp = %.4f Ki = %.2e\n', 4*zl*BnT/g, 4*BnT^2/g^2) % con 2: Kp = 0.0050 Ki = 5.00e-05 % con 4: Kp = 0.0100 Ki = 5.00e-05 %% 4. El lazo de libro con el mismo Bn: el mismo Ki y el doble de Kp F2 = feedback((2*Kp + Ki*z/(z-1))*NCO, 1); %% 5. Bn medido: la mitad de la energía de la respuesta al impulso t = (0:4e5)*Ts; h = impulse(F, t)*Ts; h2 = impulse(F2, t)*Ts; % en discreto, impulse divide por Ts fprintf('Bn medido: %.2f MHz (clase) %.2f MHz (libro)\n', ... sum(h.^2)/2*fs/1e6, sum(h2.^2)/2*fs/1e6) % Bn medido: 59.55 MHz (clase) 59.70 MHz (libro) %% 6. Lo que no es igual s = stepinfo(F); s2 = stepinfo(F2); fprintf('sobrepico %.2f %% / %.2f %% asentamiento %.0f / %.0f muestras\n', ... s.Overshoot, s2.Overshoot, s.SettlingTime/Ts, s2.SettlingTime/Ts) % sobrepico 39.72 % / 20.63 % asentamiento 1477 / 694 muestras y = step(F, t); y2 = step(F2, t); fprintf('paseo al azar del LO: var(e) = %.2f / %.2f veces sigma^2\n', ... sum((1-y).^2), sum((1-y2).^2)) % paseo al azar del LO: var(e) = 98.76 / 49.50 veces sigma^2 %% 7. Adónde se fue el ruido [gp, wp] = getPeakGain(F); [gp2, wp2] = getPeakGain(F2); fprintf('pico de |F|: %.2f dB en %.2f MHz / %.2f dB en %.2f MHz\n', ... 20*log10(gp), wp/2/pi/1e6, 20*log10(gp2), wp2/2/pi/1e6) % pico de |F|: 4.97 dB en 16.35 MHz / 2.07 dB en 14.08 MHz w05 = 2*pi*0.5e9; fprintf('|F| en 0,5 GHz: %.2f dB / %.2f dB\n', ... 20*log10(abs(freqresp(F, w05))), 20*log10(abs(freqresp(F2, w05)))) % |F| en 0,5 GHz: -31.83 dB / -25.87 dB figure; step(F, F2, 2000*Ts); legend('clase', 'libro, mismo B_n') figure; bodemag(F, F2, {2*pi*1e6, 2*pi*1e9}); grid on; legend('clase', 'libro, mismo B_n') %% 8. Enganchar 100 MHz de corrimiento con un detector seno for K = [Kp, 2*Kp] dw = 2*pi*100e6/fs; phi = 0; I = 0; ultimo = 0; for n = 1:2e5 d = dw*n - phi; e = sin(d); I = I + Ki*e; if abs(angle(exp(1j*d))) > 0.1, ultimo = n; end phi = phi + K*e + I; % NCO: una muestra de retardo end fprintf('Kp = %.3f: |error| < 0,1 rad desde la muestra %d\n', K, ultimo) end % Kp = 0.005: |error| < 0,1 rad desde la muestra 6636 % Kp = 0.010: |error| < 0,1 rad desde la muestra 3014
Tres detalles que muerden:
impulse no devuelve : devuelve , la respuesta a un pulso de área uno. Sin el *Ts el sale multiplicado por . Se puede cruzar contra la integral de entre 0 y dividida por : da lo mismo a la cuarta cifra.getPeakGain y freqresp trabajan en rad/s cuando el sistema tiene Ts, y un escalar en freqresp es una frecuencia. No es el caso de freqz(h,1,w), que con un escalar lee una cantidad de puntos.(1-y).^2 sobre el escalón: el error ante un paso de la fase es el error ante un escalón, y el paseo es una suma de pasos independientes. No hace falta simular el ruido, aunque simularlo, en estos dos lazos, da lo mismo dentro del 0,5 %.Kp = 0.005 y Ki = Kp/100: , MHz, MHz y 39,72 % de sobrepico.Kp = 0.01, Ki = 5e-5 (Kp/200): 59,55 contra 59,70 MHz, 39,72 contra 20,63 % de sobrepico.Ki = Kp/400 con la misma Kp no es el mismo lazo con otra forma: tiene la mitad de y la mitad de ruido.