Unidad 7 · PLL · La latencia del lazo y el ancho de banda que deja
Un PLL corrige la fase del oscilador del receptor con lo que mide del error, y en un receptor digital esa corrección no llega en el acto: entre que el detector ve el error y que el oscilador lo corrige pasan varios ciclos de reloj, porque el hardware procesa en etapas. Esa demora es la latencia del lazo. Qué son el filtro de lazo y sus constantes Kp y Ki está en el ensayo anterior y en el PLL.
El lazo del script de la clase, sin latencia, no tiene techo: se le puede multiplicar el ancho de banda por mil y sigue estable. El techo aparece con el retardo de la realimentación, y es chico. Con Kp = 0,005 y Ki = Kp/100 el lazo aguanta 85 ciclos de latencia y con 86 se cae: a 16 GHz son 5,3 nanosegundos, contra 92 ns que tarda en asentarse. Y el techo no depende de la tasa de símbolo. Con la forma del lazo de la clase, el ancho de banda máximo multiplicado por la latencia en segundos da 0,095, a 16 GBd o a cualquier otra tasa: la frecuencia natural más alta que se puede pedir es una décima de la inversa del retardo.
Lo que sigue tiene cinco partes: por qué sin latencia no hay techo y con un ciclo el techo queda lejísimos; la tabla de la latencia y el umbral exacto; el margen de fase, que lo predice con una resta; cómo escala el techo, que es como ; y cuánto retardo tiene un receptor real y qué ruido de fase deja seguir.
El script arma el lazo con un filtro PI, un NCO que acumula fase y un retardo puro en la realimentación. La pieza por pieza, con la transferencia derivada a mano, está en el PLL en tiempo discreto. Lo que importa acá es la forma final:
Con Lat = 0 los polos son las raíces de , y quedan adentro del círculo para cualquier par de ganancias positivas; la cuenta está en el PLL en tiempo discreto. Medido con la misma forma del lazo — por y por , que sube en un factor sin tocar —, el polo más grande va de 0,9975 con a 0,9736 con 10, 0,7071 con 100 y 0,1336 con 1000. Más ganancia, más estable.
Un ciclo de latencia ya pone techo, y se calcula a mano. Con Lat = 1 el polinomio, sacando el polo en el origen, es . Evaluado en da , que tiene que ser positivo. Con y la condición es , o sea exacto: una frecuencia natural de 3,6 GHz. Hay techo, pero doscientas veces arriba del lazo de la clase. Con un ciclo nadie lo toca.
El script trae Lat = 0. Subiéndolo, con todo lo demás como está, el escalón de fase de un radián da esto:
| Lat | 0 | 1 | 2 | 5 | 10 | 20 | 50 | 85 | 86 | 100 |
|---|---|---|---|---|---|---|---|---|---|---|
| en ns | 0 | 0,06 | 0,13 | 0,31 | 0,63 | 1,25 | 3,13 | 5,31 | 5,38 | 6,25 |
| sobrepico | 39,72 % | 40,14 % | 40,58 % | 41,93 % | 44,37 % | 50,02 % | 75,14 % | 123,44 % | inestable | inestable |
| |polo| mayor | 0,997485 | 0,997497 | 0,997510 | 0,997549 | 0,997623 | 0,997800 | 0,998620 | 0,999996 | 1,000035 | 1,000555 |
Los primeros veinte ciclos casi no se notan: diez puntos de sobrepico. Lo que la tabla no dice a simple vista es cuán abrupto es el final. Con 85 ciclos el lazo es estable y con 86 no, y el sobrepico de 85 ya es 123 %: la fase estimada se pasa más del doble del salto antes de volver. El polo mayor, que con cero latencia estaba a 0,0025 del círculo, con 85 está a . La latencia no lo empuja de a poco: los primeros cincuenta ciclos lo corren 0,0011, y los treinta y cinco siguientes, lo que queda.
Puesto en tiempo, contra la escala propia del lazo: el asentamiento del escalón sin latencia son 1477 muestras, 92 ns. Un retardo diecisiete veces más corto que eso lo tumba.
El lazo abierto sin latencia, , cruza ganancia unitaria en rad/muestra —20,40 MHz a 16 GHz— con un margen de fase de 39,07°. Un retardo tiene módulo 1 y fase : no mueve el cruce, sólo le resta fase. Cada ciclo se come radianes, 0,459°, y el lazo se cae cuando el margen llega a cero:
Las raíces dicen 85 y el margen dice 85,11. Es el mismo número por dos caminos que no comparten una cuenta: uno factoriza el polinomio característico con latencia, el otro evalúa en un solo punto del círculo. Y la resta explica la forma de la tabla: el margen baja lineal con la latencia, pero el sobrepico depende del margen como la cuerda que separa a del punto , y esa cuerda se achica sin aviso cerca de cero. Por eso los primeros diez ciclos cuestan 4,65 puntos de sobrepico, y los cinco que van de 80 a 85 cuestan 8,10.
La resta también dice qué compra latencia. Con fijo y , el umbral es 4 ciclos con , 10 con 10, 24 con 25, 85 con 100 y 208 con 400, que es el de libro. Más amortiguamiento es más margen, y más margen aguanta más retardo; pero subir a fijo también baja a la mitad, así que esa fila mezcla las dos cosas. Para separarlas hay que mover el ancho de banda sin tocar la forma, que es lo que sigue.
Escalando por y por , la respuesta es la misma curva con el eje de tiempo comprimido veces: fijo y MHz. Para cada latencia se busca por bisección el más grande con todos los polos adentro:
| Lat | en ns | a máx | fn máx | a máx · Lat |
|---|---|---|---|---|
| 1 | 0,063 | 200,0 | 3601 MHz | 200,0 |
| 2 | 0,125 | 66,67 | 1200 MHz | 133,3 |
| 5 | 0,313 | 19,91 | 358,5 MHz | 99,55 |
| 10 | 0,625 | 9,138 | 164,5 MHz | 91,38 |
| 20 | 1,25 | 4,386 | 78,98 MHz | 87,73 |
| 50 | 3,13 | 1,713 | 30,85 MHz | 85,66 |
| 85 | 5,31 | 1,001 | 18,03 MHz | 85,11 |
| 100 | 6,25 | 0,8500 | 15,30 MHz | 85,00 |
| 200 | 12,5 | 0,4233 | 7,622 MHz | 84,66 |
| 500 | 31,3 | 0,1689 | 3,042 MHz | 84,47 |
| 1000 | 62,5 | 0,0844 | 1,520 MHz | 84,40 |
De veinte ciclos para arriba el producto de la última columna se queda entre 87,7 y 84,4: el techo es 1/Lat, con un 4 % de diferencia entre 20 y 1000 ciclos. Abajo de eso se despega, porque con dos o cinco ciclos el cruce ya no está en frecuencias bajas y la cuenta del margen deja de ser lineal; pero ahí el techo está en cientos de megahertz y no limita nada.
La cuenta de la sección anterior dice por qué. Con la forma fija, el cruce escala con y el margen sin latencia no se mueve, así que el lazo se cae cuando . Pasado a hertz y con la latencia en segundos, :
Las bisecciones dan 0,0958 con 85 ciclos y 0,0950 con mil. Lo que no aparece en la fórmula es . Duplicar la tasa de símbolo no sube el techo si el retardo en nanosegundos es el mismo: duplica los ciclos de latencia y deja el producto quieto. El techo lo fija cuánto tarda la corrección en volver, medido con un reloj de pared.
El widget arranca en el lazo de la clase sin latencia: 39,72 % de sobrepico, 39,07° de margen y nada que ver. Subí el ancho de banda primero, todo lo que quieras: el escalón se comprime y el lazo no se cae. Volvé a 18 MHz y subí la latencia. Abajo, la curva es el techo para cada latencia y el punto es tu lazo: cuando cruza la curva, se cae.
Con el ancho de banda de la clase, el punto cruza la curva entre 85 y 86 ciclos. Con 36 MHz, el doble, cruza en la mitad: entre 42 y 43. Y en cualquier lugar de la curva la lectura fn·τ del techo marca lo mismo, alrededor de 0,095. La curva de abajo es una sola hipérbola: frecuencia por tiempo, constante.
A 16 GBd ningún circuito digital procesa una muestra por ciclo de reloj: el DSP trabaja con muestras en paralelo por ciclo, a un reloj de . Si el camino del detector de fase al NCO y de vuelta atraviesa ciclos de ese reloj —registros de pipeline, el multiplicador, el filtro—, la latencia en muestras es
Cuántas muestras van en paralelo y cuántos registros hay en el camino depende del chip, y ni la filmina ni el script dan un número para ninguno de los dos: y quedan como parámetros. Lo que sí sale sin suponer nada es cuántos ciclos de reloj le entran al lazo de la clase, :
| muestras en paralelo | reloj del DSP | ciclos de reloj que aguanta | techo con un solo ciclo |
|---|---|---|---|
| 16 | 1 GHz | 5 | 99,73 MHz |
| 32 | 500 MHz | 2 | 48,63 MHz |
| 64 | 250 MHz | 1 | 24,02 MHz |
| 128 | 125 MHz | ninguno | 11,94 MHz |
La última columna es el techo con Lat = P, medido igual que la tabla de la sección anterior. Con 64 muestras por ciclo, el lazo de la clase admite un solo registro en toda la realimentación; con 128, ni uno. Y como la tasa de símbolo se cancela, la cuenta se puede leer directo en el reloj: el techo es . Un lazo que tarda diez ciclos de un reloj de 250 MHz —640 muestras a 16 GBd— no puede pasar de 2,38 MHz de frecuencia natural, sea cual sea el baudio.
Para el lazo óptico de fase, que es otra implementación del mismo problema, Noé toma como realista un retardo de cien duraciones de símbolo (Journal of Lightwave Technology, 2005, en el trabajo que propone recuperar la portadora sin lazo). Cien ciclos es la última columna de la tabla de la sección 02: ahí el lazo de la clase ya es inestable. Ésa es la razón que da para abandonar la realimentación, y es la misma que asoma en la filmina cuando, para el ruido de fase, nombra la búsqueda ciega de fase y no un PLL.
El techo de estabilidad no es el ancho de banda que conviene: en el techo el lazo oscila para siempre. Lo que conviene depende de lo que haya que seguir. Para el ruido de fase de un oscilador, el modelo de siempre es un paseo al azar: la fase recibe en cada muestra un incremento gaussiano de varianza , con el ancho de línea. El error que ve el detector, , tiene entonces varianza
donde es el error ante un escalón de fase. Un lazo lento deja crecer el paseo antes de corregirlo; uno rápido, cerca del techo, amplifica con su sobrepico. Hay un que minimiza , y se busca con fminbnd para cada latencia. Con MHz, que es el ancho de línea de los láseres DFB comerciales que cita el mismo trabajo:
| Lat | en ns | fn óptima | sobrepico ahí | J | J / Lat | σe con 1 MHz |
|---|---|---|---|---|---|---|
| 5 | 0,31 | 173,6 MHz | 66,84 % | 21,98 | 4,396 | 5,32° |
| 10 | 0,63 | 79,50 MHz | 66,68 % | 48,12 | 4,812 | 7,88° |
| 20 | 1,25 | 38,13 MHz | 66,59 % | 100,4 | 5,022 | 11,38° |
| 50 | 3,13 | 14,89 MHz | 66,54 % | 257,4 | 5,148 | 18,22° |
| 85 | 5,31 | 8,70 MHz | 66,52 % | 440,5 | 5,183 | 23,83° |
| 100 | 6,25 | 7,38 MHz | 66,52 % | 519,0 | 5,190 | 25,87° |
| 200 | 12,5 | 3,68 MHz | 66,51 % | 1042 | 5,211 | 36,65° |
Tres cosas en la misma tabla. La primera: el óptimo está siempre a la mitad del techo — entre 42,4 y 40,7 de veinte ciclos para arriba, contra 85— y con el mismo sobrepico, 66,5 %, que es mucho más que el 39,72 % de la clase. La segunda: tiende a 5,2, así que el error mínimo es
y otra vez manda la latencia en segundos: ningún ancho de banda baja el error de fase por debajo de un piso que crece como la raíz del retardo. La tercera es la que pesa: con un láser de 1 MHz y los cien símbolos de retardo de Noé, el mejor lazo posible con esta forma deja casi 26° de error de fase eficaz, y en una QPSK la frontera de decisión está a 45°. El lazo de la clase tal cual, sin latencia, deja 11,28° con el mismo láser: su ancho de banda está pensado para un lazo sin retardo, y ningún hardware da un lazo sin retardo.
El ruido aditivo tira para el otro lado: pide menos ancho de banda, no más. Las fórmulas de y del compromiso entre adquisición y tracking están en ancho de banda, adquisición y tracking.
El lazo de phase_system.m tal cual, con la latencia barrida: la tabla, el umbral, el margen, el techo contra la latencia, el barrido de Ki = Kp/r y el ruido de fase. Lo que figura como comentario es la salida real de correrlo en R2026a.
%% 0. El lazo de phase_system.m, tal cual fs = 16e9; Ts = 1/fs; z = tf('z', Ts); Kp = 0.005; Ki = Kp/100; L = Kp + Ki*z/(z-1); NCO = z/(z-1); G = L*NCO; %% 1. Sobrepico contra Lat (H = z^-Lat en la realimentación) for Lat = [0 1 2 5 10 20 50 100] F = feedback(G, z^-Lat); p = max(abs(pole(F))); if isstable(F) s = stepinfo(F); fprintf('Lat = %3d sobrepico %6.2f %% |polo| %.6f\n', Lat, s.Overshoot, p); else fprintf('Lat = %3d inestable |polo| %.6f\n', Lat, p); end end %% 2. El umbral exacto, y el margen de fase que lo predice Lat = 0; while isstable(feedback(G, z^-(Lat+1))), Lat = Lat + 1; end fprintf('última Lat estable: %d (%.4f ns)\n', Lat, Lat*Ts*1e9); for Lat = [80 85 86] F = feedback(G, z^-Lat); s = stepinfo(F); y = filter([Kp+Ki, -Kp], [1 -2 1 zeros(1, Lat)] + [zeros(1, Lat) Kp+Ki, -Kp, 0], ones(1, 4e5)); fprintf('Lat = %d: estable %d, |polo| %.6f, stepinfo %.2f %%, con filter %.2f %%\n', ... Lat, isstable(F), max(abs(pole(F))), s.Overshoot, 100*(max(y) - 1)); end s = stepinfo(feedback(G, 1)); fprintf('asentamiento sin latencia: %.0f muestras = %.1f ns\n', s.SettlingTime/Ts, s.SettlingTime*1e9); [~, Pm, ~, Wcp] = margin(G); fprintf('margen %.2f° en %.2f MHz; PM/Ωc = %.2f muestras\n', Pm, Wcp/2/pi/1e6, deg2rad(Pm)/(Wcp*Ts)); %% 3. Sin latencia no hay techo: la misma forma, a veces más rápida for a = [10 100 1000] Fa = feedback((a*Kp + a^2*Ki*z/(z-1))*NCO, 1); fprintf('Lat = 0, a = %4d: estable %d, |polo| %.4f\n', a, isstable(Fa), max(abs(pole(Fa)))); end %% 4. El techo contra la latencia: Kp·a y Ki·a², misma ζ % Polinomio característico en potencias de z: (z-1)² z^Lat + (Kp+Ki) z - Kp, por z. car = @(a, Lat) [1 -2 1 zeros(1, Lat)] + [zeros(1, Lat) a*Kp + a^2*Ki, -a*Kp, 0]; esta = @(a, Lat) max(abs(roots(car(a, Lat)))) < 1; fn0 = sqrt(Ki)*fs/(2*pi); fprintf('\n Lat ns a_max fn_max [MHz] a_max·Lat\n'); for Lat = [1 2 5 10 16 20 32 50 64 85 100 128 200 500 640 1000] lo = 1e-3; hi = 1e3; for k = 1:45, m = sqrt(lo*hi); if esta(m, Lat), lo = m; else, hi = m; end, end fprintf('%5d %7.3f %9.4f %12.3f %11.2f\n', Lat, Lat*Ts*1e9, lo, lo*fn0/1e6, lo*Lat); end %% 5. Ki = Kp/r: el amortiguamiento compra latencia for r = [4 10 25 100 400] cr = @(Lat) [1 -2 1 zeros(1, Lat)] + [zeros(1, Lat) Kp + Kp/r, -Kp, 0]; Lat = 0; while max(abs(roots(cr(Lat+1)))) < 1, Lat = Lat + 1; end fprintf('r = %3d ζ = %.3f fn = %.2f MHz última Lat estable %d\n', ... r, Kp/(2*sqrt(Kp/r)), sqrt(Kp/r)*fs/(2*pi)/1e6, Lat); end %% 6. Ruido de fase de Wiener: el mejor ancho de banda para cada Lat % e = θ - z^-Lat φ; con θ de incrementos de varianza 2πΔν·Ts, % var(e) = 2πΔν·Ts·J, J = suma de la respuesta al escalón del error al cuadrado. J = @(a, Lat) sum(filter([1 -2 1], car(a, Lat), ones(1, round(60000/a))).^2); sobre = @(a, Lat) 100*(max(filter([a*Kp + a^2*Ki, -a*Kp], car(a, Lat), ones(1, round(60000/a)))) - 1); fprintf('\n Lat fn_opt [MHz] a·Lat sobrepico J J/Lat σ con Δν = 1 MHz\n'); for Lat = [5 10 20 50 85 100 200 500] lo = log10(5/Lat); hi = log10(80/Lat); % el óptimo cae en a·Lat ≈ 40 la = fminbnd(@(x) J(10^x, Lat), lo, hi); a = 10^la; Jm = J(a, Lat); fprintf('%5d %12.2f %7.2f %9.2f %% %9.2f %8.3f %8.2f°\n', Lat, a*fn0/1e6, a*Lat, sobre(a, Lat), ... Jm, Jm/Lat, rad2deg(sqrt(2*pi*1e6*Ts*Jm))); end fprintf('lazo de clase, Lat = 0: J = %.2f, σ = %.2f°\n', J(1, 0), rad2deg(sqrt(2*pi*1e6*Ts*J(1, 0)))); % Lat = 0 sobrepico 39.72 % |polo| 0.997485 % Lat = 1 sobrepico 40.14 % |polo| 0.997497 % Lat = 2 sobrepico 40.58 % |polo| 0.997510 % Lat = 5 sobrepico 41.93 % |polo| 0.997549 % Lat = 10 sobrepico 44.37 % |polo| 0.997623 % Lat = 20 sobrepico 50.02 % |polo| 0.997800 % Lat = 50 sobrepico 75.14 % |polo| 0.998620 % Lat = 100 inestable |polo| 1.000555 % última Lat estable: 85 (5.3125 ns) % Lat = 80: estable 1, |polo| 0.999796, stepinfo 115.34 %, con filter 115.34 % % Warning: Simulation did not reach steady state. Please specify YFINAL if this system is stable and eventually settles. % Lat = 85: estable 1, |polo| 0.999996, stepinfo NaN %, con filter 123.44 % % Warning: Simulation did not reach steady state. Please specify YFINAL if this system is stable and eventually settles. % Lat = 86: estable 0, |polo| 1.000035, stepinfo NaN %, con filter 143129527.05 % % asentamiento sin latencia: 1477 muestras = 92.3 ns % margen 39.07° en 20.40 MHz; PM/Ωc = 85.11 muestras % Lat = 0, a = 10: estable 1, |polo| 0.9736 % Lat = 0, a = 100: estable 1, |polo| 0.7071 % Lat = 0, a = 1000: estable 1, |polo| 0.1336 % Lat ns a_max fn_max [MHz] a_max·Lat % 1 0.062 200.0000 3601.265 200.00 % 2 0.125 66.6667 1200.422 133.33 % 5 0.312 19.9093 358.493 99.55 % 10 0.625 9.1378 164.539 91.38 % 16 1.000 5.5385 99.729 88.62 % 20 1.250 4.3865 78.984 87.73 % 32 2.000 2.7009 48.633 86.43 % 50 3.125 1.7133 30.850 85.66 % 64 4.000 1.3339 24.019 85.37 % 85 5.312 1.0013 18.030 85.11 % 100 6.250 0.8500 15.304 85.00 % 128 8.000 0.6629 11.936 84.85 % 200 12.500 0.4233 7.622 84.66 % 500 31.250 0.1689 3.042 84.47 % 640 40.000 0.1319 2.376 84.44 % 1000 62.500 0.0844 1.520 84.40 % r = 4 ζ = 0.071 fn = 90.03 MHz última Lat estable 4 % r = 10 ζ = 0.112 fn = 56.94 MHz última Lat estable 10 % r = 25 ζ = 0.177 fn = 36.01 MHz última Lat estable 24 % r = 100 ζ = 0.354 fn = 18.01 MHz última Lat estable 85 % r = 400 ζ = 0.707 fn = 9.00 MHz última Lat estable 208 % Lat fn_opt [MHz] a·Lat sobrepico J J/Lat σ con Δν = 1 MHz % 5 173.56 48.19 66.84 % 21.98 4.396 5.32° % 10 79.49 44.15 66.68 % 48.12 4.812 7.88° % 20 38.13 42.35 66.59 % 100.43 5.022 11.38° % 50 14.89 41.33 66.54 % 257.39 5.148 18.22° % 85 8.70 41.06 66.52 % 440.51 5.183 23.83° % 100 7.38 41.00 66.52 % 519.00 5.190 25.87° % 200 3.68 40.84 66.51 % 1042.21 5.211 36.65° % 500 1.47 40.74 66.50 % 2611.85 5.224 58.03° % lazo de clase, Lat = 0: J = 98.76, σ = 11.28°
Tres detalles que muerden:
margin(G) con G definido sobre tf('z', Ts) devuelve la frecuencia de cruce en rad/s, no en rad/muestra: hay que multiplicarla por Ts antes de dividir el margen. Sin eso el cociente da , que son los segundos y no las muestras.feedback(G, z^-Lat): el polinomio característico con roots da los mismos polos y es directo.stepinfo con Lat = 85 devuelve el sobrepico en NaN y avisa que la simulación no llegó al régimen, aunque isstable diga que el lazo es estable: con el polo a del círculo, el transitorio dura más que la ventana que elige solo. El 123,44 % sale de filter con cuatrocientas mil muestras.Kp = 0,005 y Ki = Kp/100 el lazo aguanta 85 ciclos y con 86 se cae: 5,3 ns a 16 GHz, diecisiete veces menos que su propio asentamiento. Con 85 el sobrepico ya es 123 %.Lat = c·P. Con 64 en paralelo, el lazo de la clase admite un solo registro en la realimentación.