Unidad 7 · PLL · para qué hace falta, los tres bloques, qué es estar enganchado, el modelo equivalente de fase y las transferencias F(s) y E(s)
Un PLL (phase-locked loop, lazo de enganche de fase) es un lazo realimentado que genera su propia sinusoide y la va corrigiendo hasta que su fase sigue a la de una sinusoide de entrada. Tiene tres bloques: un detector que mide la diferencia de fase, un filtro que decide cuánto corregir y un oscilador que aplica la corrección. En el receptor es la herramienta para lo único que el ecualizador no arregla: que el oscilador local y el reloj del receptor no son los del transmisor. Analizado con fases en lugar de señales, es un sistema lineal con dos transferencias, para la fase que copia y para la que deja como error, y se comporta como un pasabajos de fase.
La cadena de la Unidad 6 termina en un ecualizador adaptativo que abre el ojo, y todo lo que mide supone dos cosas que en un receptor de verdad no pasan. Que el oscilador local (LO) que baja la señal a banda base está exactamente a la frecuencia y en la fase de la portadora del transmisor. Y que el ADC muestrea con el mismo reloj que usó el transmisor para sacar los símbolos. Son osciladores distintos en equipos distintos: nunca coinciden, y además se corren con la temperatura y el tiempo. La filmina de introducción repasa la cadena entera, de a , y ordena lo que queda por resolver:
| problema | de dónde sale | remedio en la filmina |
|---|---|---|
| ruido | canal y receptor | minimizarlo; FEC (redundancia) |
| interferencia intersímbolo | el canal recorta la banda | ecualizador (FSE) |
| portadora | el LO no coincide con la portadora | FCR; para el ruido de fase, BPS y CPR |
| sincronismo | el reloj del ADC no coincide con el del transmisor | timing recovery (PLL) |
Las dos filas de abajo son el mismo problema: seguir una fase que se mueve y que el receptor no controla. La de portadora es la fase del LO contra la de la portadora; la de sincronismo, la fase del reloj de muestreo contra la del reloj de símbolos. Para la segunda la filmina ya escribe el nombre de la herramienta, y la primera es lo mismo: el FCR (fine carrier recovery, recuperación fina de portadora) es un PLL que corre una vez por símbolo, y es el lazo que modela el script de la clase, con «para el FCR», dice su comentario. Los scripts de la Unidad 6 no tienen este problema porque no lo simulan: la señal no llega girada, y por eso el del CMA anuncia que ecualiza «sin FCR» (el algoritmo CMA).
Después de bajar a banda base con un LO corrido, cada símbolo llega multiplicado por un fasor. Es la cuenta de la filmina, por una exponencial compleja con la fase del LO:
con la diferencia entre la fase de la portadora y la del LO en el instante del símbolo . Multiplicar por no cambia el módulo: gira el símbolo un ángulo alrededor del origen. Hay dos casos, y son las dos entradas con las que la filmina prueba el lazo.
Un error de fase fijo, : el LO está a la frecuencia justa pero corrido en fase. La constelación entera aparece girada , y quieta. Un slicer de QPSK decide por cuadrante, y los puntos están a 45° de los ejes, así que sin ruido aguanta cualquier ; con ruido, el margen que se come el giro es margen que le falta al ruido. En fase es un escalón: .
Un error de frecuencia, : el LO está a otra frecuencia. Ahora la fase crece sin parar y la constelación gira todo el tiempo, radianes por símbolo. Con rad por símbolo —a los 16 GBd del script, MHz de corrimiento— da una vuelta entera cada símbolos, y arrancando sin error de fase pasa los 45° en el símbolo 197. No hay giro chico que aguantar: tarde o temprano, todas las decisiones están en el cuadrante equivocado. En fase es una rampa, : un corrimiento de frecuencia se escribe como una fase que crece linealmente, y así lo trata todo el análisis.
Hay un tercer efecto, el ruido de fase del LO, que en lugar de girar la constelación la desparrama en arcos. La filmina le asigna otros remedios (BPS y CPR), y quedan para cuando lleguen. La pregunta que deja abierta la filmina, si un giro de se puede detectar, tiene una respuesta incómoda: una QPSK girada 90° es la misma QPSK, y nada en la constelación lo delata. El CMA, que no ve la fase, cae justo ahí (el algoritmo CMA), y la ambigüedad que eso trae al detector está en el detector de fase.
Con la notación de la filmina, la entrada y la salida son dos sinusoides a la misma frecuencia , cada una con su fase:
Todo lo que la entrada tiene de distinto —un corrimiento de fase, un corrimiento de frecuencia— está escrito adentro de , y todo lo que el lazo hace para seguirlo, adentro de . El PLL, dice la filmina, es un sistema que «trackea» la frecuencia y la fase de la sinusoide de entrada.
El signo de la realimentación es el que hace que el lazo corrija en lugar de escaparse. Si el VCO está atrasado, , el detector entrega una tensión positiva, el VCO acelera y crece hacia ; si está adelantado, al revés.
La filmina define el estado phase-locked así: el PLL está enganchado si la fase de salida es la de entrada más una constante, , y entonces la frecuencia de salida es igual a la de entrada, en promedio. Dos cosas se leen de esa definición.
Enganchado no quiere decir error cero. Quiere decir error constante: la diferencia de fase dejó de crecer. En la constelación, que dejó de girar. Si la constante no es cero, la constelación queda quieta pero girada, como con un error de fase fijo. Que la constante termine en cero o no depende del filtro de lazo y de la entrada: ante una rampa, un filtro sólo proporcional engancha en frecuencia y deja un error de fase fijo, y un PI lo lleva a cero. Esa cuenta es la de el filtro de lazo.
Engancharse es un proceso. Desde un corrimiento de frecuencia, el lazo primero iguala la frecuencia (frequency lock) y después achica el error de fase (phase lock), y la filmina estima cuánto tarda cada etapa en función del ancho de banda del lazo (ancho de banda, adquisición y tracking). Todo el análisis lineal que sigue vale con el lazo enganchado: es ahí donde el error es chico y el detector se puede reemplazar por su recta. La filmina lo dice al empezar: se enfoca en el régimen permanente, con el lazo enganchado, usando sólo un análisis linealizado.
Con el lazo abierto, la nube de cada cuadrante es un arco: en 200 símbolos la constelación giró radianes, 45,8° con el valor de partida, y al mover el arco recorre el círculo y las decisiones se ponen rojas cada vez que cruza un eje. El error de abajo es un diente de sierra: crece sin parar, y el detector lo ve módulo 360°. Con la constelación se queda quieta y girada . Al cerrar el lazo, la fase del NCO arranca en cero y persigue a la de entrada, se pasa, vuelve, y termina corriendo pegada a ella con la misma pendiente. Con los valores de partida el error llega a 31,71° y queda dentro de ±1° desde el símbolo 1201; la corrección de frecuencia del NCO termina en exacto, que es lo que dice enganchado. Para ver la diferencia entre enganchar y seguir girando, conviene volver a con el lazo cerrado y avanzar de a poco: en los primeros cientos de símbolos la constelación todavía gira, y el giro se frena antes de que el error llegue a cero.
El lazo del widget es el del script de la clase —, , detector y NCO de ganancia 1— con la corrección aplicada al símbolo siguiente, que es lo mínimo que se puede construir: el NCO no puede desrotar el símbolo con una fase que se calcula a partir del propio símbolo . Ese símbolo de retardo sube el sobrepico del escalón de 39,72 % a 40,14 %; por qué, y qué pasa con más retardo, está en el PLL en tiempo discreto. El detector es el ideal de la filmina, la diferencia de fases módulo 360°. Barrida en MATLAB una grilla de entre −90° y 90° cada 15° y de entre 0 y 8·10⁻³ cada 0,5·10⁻³, el error nunca pasa de 90°, que es el inicial: el detector nunca da la vuelta, y la simulación es la transferencia lineal. Contra lsim en cinco de esos casos, la diferencia más grande es 2,6·10⁻¹³ rad.
En el lazo de la sección 03 circulan cosenos a , pero lo que el lazo controla es la fase, que cambia mucho más despacio. El modelo equivalente de fase de la filmina dibuja el mismo lazo con otras señales: entra , sale , y la frecuencia desaparece porque es la misma en la entrada y en el VCO y se cancela en la resta. Cada bloque pasa a decir qué le hace a la fase:
Linealizar es lo que permite usar Laplace, y es la única aproximación. Mientras el error sea chico frente a la curva del detector, el lazo de abajo es exacto; cuando el error es grande —al engancharse desde lejos, o con un salto de ciclo— deja de valer, y el comportamiento lo decide la curva entera de .
La filmina caracteriza el PLL con dos funciones: la transferencia , de la fase de entrada a la de salida, y el error de fase . Las dos salen del diagrama de arriba, con condiciones iniciales nulas.
Paso 1: el restador. El error es la entrada menos la salida, y la transformada de una resta es la resta de las transformadas:
Paso 2: el camino directo. El error pasa por , por y por , en serie, y las transferencias en serie se multiplican. Al producto la filmina lo llama , la ganancia de lazo abierto:
Paso 3: cerrar el lazo. Se reemplaza el error del paso 1 en el paso 2 y se despeja la salida:
Es la realimentación de siempre, , con porque la fase de salida vuelve entera al restador. Multiplicando arriba y abajo por para sacar la fracción del VCO:
Paso 4: el error. Del paso 1, . La transferencia del error es lo que la salida no copia:
Es la cuenta de la segunda filmina de dinámica, hecha desde el otro lado: ahí se parte del error y se lo despeja, acá se lo saca de . Las dos funciones suman 1 en todas las frecuencias: lo que la salida no copia queda como error. Y la del error tiene una en el numerador, un cero en continua, porque el VCO es un integrador: una fase que no cambia termina copiada sin error mientras . Qué pasa con una rampa, y por qué pide un integrador en el filtro, es el teorema del valor final aplicado a esta misma : está en el filtro de lazo.
Con el filtro de la clase, el PI , el paso 3 da un sistema de segundo orden:
El amortiguamiento y la frecuencia natural salen de igualar coeficientes; con las constantes del script, tomando por muestra, y MHz. El lazo de segundo orden entero, con su transitorio, está en el filtro de lazo.
Pensada la fase de entrada como una suma de sinusoides de distintas frecuencias, dice cuánto de cada una copia el VCO. En continua vale 1: , siempre que . Las variaciones lentas de , el lazo tiene tiempo de corregirlas y las copia. Para las rápidas, el término del denominador manda, se va a cero, y no llega a reaccionar antes de que cambien de signo: quedan enteras en el error, porque . Es lo que la filmina resume en una línea: el PLL es un pasabajos operando en la zona lineal.
Con el lazo de la clase, evaluada en MATLAB sobre el círculo unidad:
| frecuencia de la variación de fase | |F| | en dB |
|---|---|---|
| 1 MHz | 1,003 | 0,03 dB |
| 16,35 MHz (el pico) | 1,772 | 4,97 dB |
30,34 MHz (bandwidth) | 0,708 | −3,01 dB |
| 100 MHz | 0,135 | −17,40 dB |
| 1 GHz | 0,013 | −37,82 dB |
Hasta unos pocos megahertz el lazo copia la fase entera: es la deriva del LO, que se mueve despacio, y que el lazo tiene que seguir. Desde unos cientos de megahertz no copia casi nada: es el ruido que trae cada símbolo, que el lazo no tiene que seguir. Entre medio hay un pico de casi 5 dB, por debajo de : alrededor de 16 MHz el lazo no sólo copia la fase de entrada, la agranda. Es el mismo fenómeno que el sobrepico del escalón, visto en frecuencia. Dónde poner ese ancho es el compromiso central del PLL —ancho, engancha rápido; angosto, deja pasar menos ruido a la fase— y está en ancho de banda, adquisición y tracking.
phase_system.m, el script de la clase, es el modelo equivalente de fase en tiempo discreto: no hay señales ni símbolos, sólo la fase que entra, la que sale y las transferencias entre ellas. El filtro de lazo es el PI con la integral hecha acumulador, Kp + Ki*z/(z-1); el VCO es un NCO, otro acumulador, z/(z-1); G = L*NCO es la ganancia de lazo abierto del paso 2, y feedback(G, H) hace la cuenta del paso 3, , con realimentación negativa por omisión. y no aparecen: valen 1 por muestra y quedan adentro de Kp y Ki. Abajo, el script corrido entero y sin tocar, seguido de las líneas que miden lo que el script dibuja y no imprime. 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 %% Lo que el script dibuja y no imprime si = stepinfo(F); fprintf('sobrepico %.2f %%, asentamiento %.0f muestras, dcgain %.4f\n', si.Overshoot, si.SettlingTime/Ts, dcgain(F)); % sobrepico 39.72 %, asentamiento 1477 muestras, dcgain 1.0000 p = pole(F); c0 = zero(F); fprintf('polos %.5f %+.5fj, |p| = %.5f, angulo %.5f rad\n', real(p(1)), abs(imag(p(1))), abs(p(1)), abs(angle(p(1)))); % polos 0.99746 +0.00658j, |p| = 0.99748, angulo 0.00660 rad fprintf('ceros: '); fprintf('%.5f ', c0); fprintf('\n'); % ceros: 0.00000 0.99010 fprintf('bandwidth(F) = %.2f MHz\n', bandwidth(F)/2/pi/1e6); % bandwidth(F) = 30.34 MHz [gpk, wpk] = getPeakGain(F); fprintf('pico de |F| = %.2f dB en %.2f MHz\n', 20*log10(gpk), wpk/2/pi/1e6); % pico de |F| = 4.97 dB en 16.35 MHz E = feedback(1, G); % el error, armado como lazo aparte w = logspace(log10(2*pi*1e5), log10(2*pi*7.9e9), 400); dE = max(abs(squeeze(freqresp(E, w)) - (1 - squeeze(freqresp(F, w))))); fprintf('max |feedback(1,G) - (1 - F)| = %.2e\n', dE); % max |feedback(1,G) - (1 - F)| = 1.19e-11 [nE, dEn] = tfdata(E, 'v'); fprintf('E num: '); fprintf('%.6g ', nE); fprintf('| den: '); fprintf('%.6g ', dEn); fprintf('\n'); % E num: 1 -2 1 | den: 1.00505 -2.005 1 n = (0:20000)'; th = 1e-3*n; % rampa de fase de 1e-3 rad por muestra ph = lsim(F, th, n*Ts); fprintf('rampa, PI: error final %.2e rad\n', th(end) - ph(end)); % rampa, PI: error final 7.99e-12 rad ph = lsim(feedback(Kp*NCO, 1), th, n*Ts); fprintf('rampa, solo Kp: error final %.4f rad\n', th(end) - ph(end)); % rampa, solo Kp: error final 0.2000 rad
El script abre cuatro figuras, una por cada figure:
step(F): el escalón de fase. La entrada salta 1 rad y la curva es la fase del NCO. Sube, se pasa hasta 1,397, oscila y se asienta: sobrepico de 39,72 % y 1477 muestras para quedar dentro del 2 %. El eje de tiempo está en segundos, porque z se creó con Ts: las 1477 muestras son 92 ns a 16 GBd. Es el lazo enganchándose después de un error de fase fijo, el primer caso de la sección 02.step(F*z/(z-1)) y step(z/(z-1)): la rampa. No hay una función que meta una rampa, así que el script mete un escalón por un acumulador más: step(z/(z-1)) es la rampa misma, 1 rad por muestra, y step(F*z/(z-1)) es la fase del NCO persiguiéndola. Es el segundo caso de la sección 02, un error de frecuencia. Las dos curvas se dibujan una arriba de la otra y no se distinguen: step elige un horizonte de 6·10⁻⁵ s, casi un millón de muestras, y a esa escala un error de una fracción de radián es invisible. Para leerlo hay que restar, que es lo que hacen las dos últimas líneas: con el PI el error final es 8·10⁻¹² rad, y con sólo la rama proporcional es 0,2000 rad, exactamente , el error de fase fijo de un lazo que enganchó en frecuencia y no en fase (sección 04).pzmap(F): polos y ceros. Dos polos complejos en , de módulo 0,99748, adentro del círculo unidad: el lazo es estable. Un cero en 0 y otro en 0,99010. A la escala del círculo entero los dos polos y el segundo cero se amontonan sobre y no se separan: hay que hacer zoom. Que estén tan cerca de 1 dice que el lazo es lento comparado con la tasa de símbolo, que es lo que se quiere: un ángulo de 0,0066 rad por muestra es una oscilación de 16,8 MHz contra 16 GHz de muestreo.bode(F): el pasabajos de fase. Módulo y fase de hasta la frecuencia de Nyquist, la línea vertical en . Es la sección 07 dibujada: 0 dB abajo, el pico de 4,97 dB, y la caída. El eje está en rad/s, no en Hz: el pico de 16,35 MHz aparece en 1,03·10⁸.Lo que esta primera lectura deja afuera —qué es cada acumulador, por qué Lat = 0 no se puede construir y qué hace la latencia con el lazo, y cómo se pasa de a — está en el PLL en tiempo discreto. Los detalles que muerden en la primera corrida:
feedback(1, G) es el error. El script calcula sólo ; el error del paso 4 sale armando el lazo con en el camino directo y en la realimentación. Coincide con 1 - F a 1,19·10⁻¹¹ en 400 frecuencias, y su numerador es [1 -2 1]: , un cero doble en continua, uno por cada acumulador.%close all está comentado. Las figuras de una corrida quedan abiertas en la siguiente, y con hold all —el nombre viejo de hold on— una curva nueva se puede dibujar encima de una vieja.phase_system.m: feedback(G, H) es ; el error es feedback(1, G); la rampa es un escalón por z/(z-1), y su error se lee restando, no mirando la figura.