Unidad 7 · PLL · el compromiso entre adquisición y tracking, medido
El ancho de banda de ruido es el número con el que se diseña un PLL: cuanto más ancho, más rápido sigue el lazo a una entrada que se mueve, y más ruido de la entrada deja pasar a la fase que estima. Cuando el oscilador del receptor arranca corrido en frecuencia, el lazo primero tiene que alcanzar esa frecuencia y recién después quedarse quieto en fase: eso es engancharse (ancho de banda, adquisición y tracking).
La filmina cierra el PLL con dos fórmulas que, puestas una al lado de la otra, parecen un regalo. El tiempo de enganche en frecuencia va como y la varianza del error de fase como : duplicar el ancho de banda engancha ocho veces más rápido y paga sólo el doble de ruido. Simulado con el PI de la clase, un salto de 16 MHz y un barrido de de dos órdenes de magnitud, el ocho está: duplicar da 8,0 veces, y la fórmula acierta el tiempo dentro del 4 %. Pero sólo mientras el error de fase da vueltas enteras antes de quedarse quieto, y ahí da cientos o miles. A partir de no da ninguna, la fórmula predice un tiempo para algo que no ocurre, y duplicar el ancho de banda compra entre 2,3 y 3,1 veces. La varianza, en cambio, se duplica en los dos lados. El cambio desparejo existe, pero sólo en la zona donde el lazo tarda.
La filmina parte la adquisición en dos etapas: primero el enganche en frecuencia, donde el NCO se arrima a la frecuencia de la entrada, y después el enganche en fase, que es el transitorio lineal de siempre. Los tiempos se suman:
Y una vez enganchado, con un tono de potencia y ruido blanco de densidad , la fase estimada tiembla con varianza
Con en hertz, el ancho de banda equivalente de ruido del lazo. Qué es, cómo sale de y y cómo se eligen las constantes a partir de él está en el concepto del ancho de banda; el PI, el y el transitorio, en el del filtro de lazo. Acá importa sólo una cuenta: los dos exponentes. Al duplicar , se divide por y la varianza se multiplica por 2. Si las dos fórmulas valieran en todo el rango, achicar el ancho de banda sería carísimo y agrandarlo casi gratis. La pregunta es si valen.
El de la clase, con dos cambios que hacen falta para ver lo que las fórmulas describen. El filtro es el PI, con por muestra y las constantes de la receta de la filmina para cada :
con , que es el para el que vale el 4 de la fórmula (sección 04). La muestra es la del script, fs = 16 GHz, y la entrada tiene un salto de frecuencia de MHz, o sea ciclos por muestra.
El primer cambio es el detector. El modelo equivalente de fase usa uno lineal, , y con un detector lineal el lazo nunca tiene que «enganchar en frecuencia»: responde a un salto de frecuencia con un transitorio que dura lo mismo para cualquier . La etapa que mide sólo existe con la curva S de verdad, así que el detector es el de producto, más ruido.
El segundo es el NCO. En phase_system.m es z/(z-1), sin retardo: la fase de la muestra depende del error de la misma muestra, que a su vez depende de esa fase. Con un detector lineal eso se resuelve despejando; con un seno no se despeja, así que la simulación le pone al NCO una muestra de retardo. Con los de acá eso no mueve nada: el ancho de banda integrado, sobre la respuesta al impulso del lazo cerrado, coincide con el que pide la receta dentro del 1,8 % hasta ciclos por muestra, y recién se despega a , donde la aproximación continua de la receta ya no corre.
Un tiempo de enganche es el instante a partir del cual algo deja de pasar, y antes de medir hay que decidir qué. Con un salto de frecuencia el error crece al principio sin parar: la entrada gira más rápido que el NCO, y cada vez que le saca de ventaja el detector, que no distingue de , vuelve a empezar. El error da vueltas enteras. Cuando el integrador del PI aprendió la frecuencia, deja de darlas y se asienta cerca de un múltiplo de . Las dos métricas son:
Las dos tienen un umbral, y la guía pide barrerlo antes de creerle al número. Con y sin ruido, la última vuelta medida con , y da 4.136.525, 4.121.852 y 4.116.150 muestras, y el enganche a 1, 0,3 y 0,1 rad da 4.141.456, 4.146.091 y 4.160.006. Seis umbrales, seis números dentro del 1,1 %. Mientras el error da vueltas la métrica no depende del umbral, porque casi todo el tiempo se va en la etapa de las vueltas y el transitorio final es una propina.
El ruido es otra historia. Con un ruido que deja a la fase en régimen un desvío de 0,05 rad, el enganche a 0,1 rad está a dos desvíos y el ruido lo cruza para siempre: medido sobre registros de 0,75, 1,5 y 3 millones de muestras da 737.275, 1.495.181 y 2.998.432. El «tiempo de enganche» es el largo del registro. La última vuelta, sobre los mismos tres registros, da 480.718 las tres veces. Lo que sí hace el ruido es volver al tiempo una tirada: con ocho semillas la última vuelta va de 471.454 a 556.892 muestras, alrededor de las 506.874 que da sin ruido. Por eso la tabla que sigue se mide sin ruido, que es el caso que describe la fórmula, y por la última vuelta.
El barrido va de a , duplicando, sin ruido. Los tiempos en muestras (a 16 GHz, 16.000 muestras son un microsegundo):
| Bn/Δf | vueltas | TFL medido | 4Δf²/Bn³ | TLOCK a 0,1 rad | duplicar: TFL | duplicar: TLOCK |
|---|---|---|---|---|---|---|
| 0,05 | 22.169 | 33.218.702 | 32.000.000 | 33.296.984 | 8,06 | 8,00 |
| 0,1 | 2.757 | 4.121.852 | 4.000.000 | 4.160.006 | 8,13 | 7,99 |
| 0,2 | 338 | 506.874 | 500.000 | 520.351 | 8,76 | 8,07 |
| 0,4 | 39 | 57.872 | 62.500 | 64.481 | 15,45 | 7,48 |
| 0,8 | 3 | 3.745 | 7.812 | 8.615 | — | 6,88 |
| 1,6 | 0 | 0 | 977 | 1.252 | — | 2,26 |
| 3,2 | 0 | 0 | 122 | 554 | — | 2,44 |
| 6,4 | 0 | 0 | 15 | 227 | — | 3,07 |
| 12,8 | 0 | 0 | 2 | 74 | — | — |
Las tres primeras filas son la tesis de la filmina, y mejor de lo que uno esperaría de una fórmula con «≈». En dos décadas y media de tiempo el cociente entre lo medido y va de 1,01 a 1,04, y duplicar el ancho de banda divide el tiempo por 8,0, con cualquiera de las dos métricas. El precio está en la segunda columna: con el error da 2.757 vueltas antes de quedarse, y la última vuelta llega a los 258 µs. Con dieciséis veces más ancho de banda el mismo salto se engancha en 78 ns, tres mil trescientas veces antes.
El 4, en cambio, no es una constante del PLL: es el de . La forma de la que sale la fórmula es , que pasada a da 4,16 con y 8,33 con el de la clase; la simulación mide 4,1 y 8,3. Por qué el lazo de la clase tarda el doble con el mismo ruido está en la nota de su ζ. Para el exponente no cambia nada: es 3 en los dos.
Las vueltas se acaban de a una: 3 con , 2 desde 0,84, 1 desde 0,94 y ninguna desde 1,08. De ahí para arriba el lazo es lineal en todo su recorrido: el error crece, llega a un máximo menor que y vuelve. No hay enganche en frecuencia. La fórmula sigue dando un número —977 muestras con — para una etapa que no ocurre.
Lo que queda es el transitorio de un lazo lineal con fijo ante un salto de frecuencia, y ese tiene forma cerrada en lo que importa: el error es , con la misma curva para todo . Duplicar el ancho de banda comprime la curva a la mitad en el tiempo y la achica a la mitad en altura. Con un umbral relativo a su propio pico, el tiempo se divide por 2 exacto; con un umbral fijo en radianes, un poco más, porque además la curva arranca más cerca del umbral. La tabla da 2,26, 2,44 y 3,07. El exponente del lado de arriba es 1, con una corrección logarítmica, y no 3.
En el medio, en el borde, el cociente se dispara: de a la última vuelta se adelanta 15,5 veces, porque pasar de 39 vueltas a 3 es más que el ocho. Esa fila depende de la métrica —con el enganche a 0,1 rad da 7,48— y no hay que leerle la cifra: lo que dice es que la transición entre los dos regímenes no es suave, se cae de golpe cuando las vueltas llegan a cero.
Del otro lado tampoco hay un borde. El rango de captura de la filmina, , da con este , y la primera fila de la tabla está tres veces más allá, con : engancha igual, después de 22.169 vueltas. Con un integrador que no pierde, el rango no tiene techo; tiene precio, y el precio es el cubo.
La otra mitad del compromiso se mide con el lazo ya enganchado, , y ruido complejo de varianza por muestra. Con potencia unitaria eso hace igual a en ciclos por muestra. Cuatro semillas por punto:
| Bn [ciclos/muestra] | σ² medida [rad²] | medida / N0Bn/Pin | Bn integrado / receta |
|---|---|---|---|
| 10⁻⁴ | 9,92·10⁻⁵ | 0,992 | 1,0002 |
| 3·10⁻⁴ | 3,00·10⁻⁴ | 1,000 | — |
| 10⁻³ | 1,02·10⁻³ | 1,018 | 1,0018 |
| 3·10⁻³ | 3,05·10⁻³ | 1,015 | — |
| 10⁻² | 1,02·10⁻² | 1,025 | 1,0181 |
| 3·10⁻² | 3,24·10⁻² | 1,082 | — |
| 10⁻¹ | 4,24 | da vueltas | 1,2176 |
De a —dos décadas, que cubren la tabla de tiempos entera— la varianza medida es dentro del 2,5 %, que es lo que el lazo discreto se aparta de la receta más el ruido de la propia medición. Exponente 1, sin régimen que lo rompa: a la varianza no le importa si antes hubo vueltas. A se despega un 8 %: una parte es el ancho de banda real del lazo discreto, que ya a es un 1,8 % mayor que el de la receta, y el resto es el seno del detector. A la fórmula pide 0,1 rad², el lazo discreto deja pasar un 22 % más, y con eso el ruido ya empuja al error a la vuelta siguiente: el promedio de las cuatro corridas sale 4,24 rad², que no es una varianza de nada.
El dos también tiene un borde, pero lejos. Con y subiendo el ruido, la varianza se aparta de la fórmula entre un 3,5 y un 7,5 % donde ésta pide 0,06 rad², y entre un 7 y un 11 % donde pide 0,1, porque el seno del detector deja de parecerse a una recta (cuatro semillas por punto). Donde pide 0,15, una de las cuatro corridas ya dio una vuelta por ruido; donde pide 0,2, las cuatro. Ahí la varianza deja de significar algo. Es un borde de la relación señal a ruido, no del ancho de banda: el que separa el ocho del dos está en la tabla de tiempos.
El widget arranca con , que es un ancho de banda razonable para un salto conocido: engancha en 78 ns, sin dar una vuelta, y la lectura de «duplicar» dice que la fórmula no está pasando. Bajá el ancho de banda de a un paso y mirá el contador de vueltas y esa lectura juntos. Arriba está lo que el integrador del PI aprendió de la frecuencia, en un eje de tiempo logarítmico para que los dos extremos entren; abajo, la fase en régimen con ruido, en una escala fija.
Bajando desde 1,6, la lectura de «duplicar» pasa por 2,3, se dispara al cruzar , cuando aparece la primera vuelta, y se queda en ocho de para abajo. La nube de abajo, en el mismo recorrido, se angosta a un ritmo parejo: la mitad de varianza por cada mitad de ancho de banda, en todo el deslizador. El ocho a dos de la filmina es verdad en la mitad izquierda, que es donde el lazo tarda cientos de microsegundos; en la mitad derecha, donde engancha en decenas de nanosegundos, el cambio es dos a dos.
La lectura ingenua de los dos exponentes es «agrandá : ganás velocidad mucho más rápido de lo que perdés precisión». Medido, eso vale mientras sea chico frente a , y ahí el lazo está en la peor zona posible: deslizando cientos de vueltas, con un tiempo que sube como el cubo de lo que se achique. Salir de esa zona es baratísimo, y por eso el ocho es un buen argumento para no diseñar ahí. Una vez afuera, cuando el ancho de banda ya alcanza para enganchar sin vueltas, cada factor dos de velocidad cuesta un factor dos de varianza, y el compromiso de la filmina es un compromiso de verdad.
El dato que decide en qué régimen se está no es solo, es el cociente . Con este el borde está en : si el salto de frecuencia más grande que el sistema tiene que tragar es menor que el ancho de banda, la fórmula de no describe nada y el tiempo de enganche es el del transitorio lineal, unas pocas veces .
El script completo, corrido en R2026a. Lo que figura como comentario es su salida. La función del final es el lazo: detector de producto, PI y NCO con una muestra de retardo, guardando el error en precisión simple para que el registro más largo, de 56 millones de muestras, entre en memoria.
%% 1. El lazo: el PI de la clase, con zeta y Bn como perillas fs = 16e9; % la del script de la clase df = 1e-3; % salto de frecuencia: 1e-3 ciclos/muestra = 16 MHz zeta = 1/sqrt(2); disenar = @(Bn, z) deal(2*z*(2*Bn/(z + 1/(4*z))), (2*Bn/(z + 1/(4*z)))^2); % [Kp, Ki], K_PD*K_V = 1 %% 2. Bn de la fórmula contra Bn integrado (sum h^2 / 2), con el NCO de una muestra de retardo z = tf('z', 1); for Bn = [1e-4 1e-3 1e-2 1e-1] [Kp, Ki] = disenar(Bn, zeta); F = feedback((Kp + Ki*z/(z-1)) * 1/(z-1), 1); [b, a] = tfdata(F, 'v'); h = filter(b, a, [1 zeros(1, 2e6)]); fprintf('Bn %.0e: integrado %.4e (%+.2f %%)\n', Bn, sum(h.^2)/2, 100*(sum(h.^2)/2/Bn - 1)); end % y el lazo de la clase, tal cual (Kp = 0,005, Ki = Kp/100, NCO z/(z-1)) Fc = feedback((0.005 + 5e-5*z/(z-1)) * z/(z-1), 1); [b, a] = tfdata(Fc, 'v'); h = filter(b, a, [1 zeros(1, 2e6)]); fprintf('clase: Bn formula %.4e, integrado %.4e ciclos/muestra = %.1f MHz\n', ... sqrt(5e-5)/2*(0.3536 + 1/(4*0.3536)), sum(h.^2)/2, sum(h.^2)/2*fs/1e6); % Bn 1e-04: integrado 1.0002e-04 (+0.02 %) % Bn 1e-03: integrado 1.0018e-03 (+0.18 %) % Bn 1e-02: integrado 1.0181e-02 (+1.81 %) % Bn 1e-01: integrado 1.2176e-01 (+21.76 %) % clase: Bn formula 3.7498e-03, integrado 3.7221e-03 ciclos/muestra = 59.6 MHz %% 3. Tiempo de enganche contra Bn, sin ruido r = 0.05 * 2.^(0:8); % Bn/df de 0,05 a 12,8 umb = [pi/2 pi 3*pi/2 1 0.3 0.1]; % las tres primeras: vueltas; las otras: rad T = zeros(numel(r), numel(umb)); vueltas = zeros(size(r)); for i = 1:numel(r) Bn = r(i)*df; N = ceil(1.5*4*df^2/Bn^3 + 400/Bn); [T(i,:), vueltas(i)] = pll_sim(Bn, zeta, df, N, 0, 1, umb); end fprintf('Bn/df vueltas T_FL(pi/2 pi 3pi/2) T_LOCK(1 0.3 0.1 rad) 4df^2/Bn^3 1.3/Bn\n'); for i = 1:numel(r) fprintf('%5.2f %7d %9d %9d %9d %9d %9d %9d %10.0f %7.0f\n', r(i), vueltas(i), T(i,:), ... 4*df^2/(r(i)*df)^3, 1.3/(r(i)*df)); end fprintf('duplicar Bn: veces mas rapido\n'); for i = 1:numel(r)-1 fprintf('%5.2f -> %5.2f: T_FL(pi) %6.2f T_LOCK(1) %6.2f (0.3) %6.2f (0.1) %6.2f\n', ... r(i), r(i+1), T(i,2)/T(i+1,2), T(i,4)/T(i+1,4), T(i,5)/T(i+1,5), T(i,6)/T(i+1,6)); end % Bn/df vueltas T_FL(pi/2 pi 3pi/2) T_LOCK(1 0.3 0.1 rad) 4df^2/Bn^3 1.3/Bn % 0.05 22169 33250890 33218702 33207808 33258994 33267581 33296984 32000000 26000 % 0.10 2757 4136525 4121852 4116150 4141456 4146091 4160006 4000000 13000 % 0.20 338 508878 506874 501385 509380 518639 520352 500000 6500 % 0.40 39 58720 57872 55781 62032 63744 64481 62500 3250 % 0.80 3 5744 3745 3058 6251 6802 8615 7812 1625 % 1.60 0 0 0 0 565 1053 1252 977 812 % 3.20 0 0 0 0 0 383 554 122 406 % 6.40 0 0 0 0 0 0 227 15 203 % 12.80 0 0 0 0 0 0 74 2 102 % duplicar Bn: veces mas rapido % 0.05 -> 0.10: T_FL(pi) 8.06 T_LOCK(1) 8.03 (0.3) 8.02 (0.1) 8.00 % 0.10 -> 0.20: T_FL(pi) 8.13 T_LOCK(1) 8.13 (0.3) 7.99 (0.1) 7.99 % 0.20 -> 0.40: T_FL(pi) 8.76 T_LOCK(1) 8.21 (0.3) 8.14 (0.1) 8.07 % 0.40 -> 0.80: T_FL(pi) 15.45 T_LOCK(1) 9.92 (0.3) 9.37 (0.1) 7.48 % 0.80 -> 1.60: T_FL(pi) Inf T_LOCK(1) 11.06 (0.3) 6.46 (0.1) 6.88 % 1.60 -> 3.20: T_FL(pi) NaN T_LOCK(1) Inf (0.3) 2.75 (0.1) 2.26 % 3.20 -> 6.40: T_FL(pi) NaN T_LOCK(1) NaN (0.3) Inf (0.1) 2.44 % 6.40 -> 12.80: T_FL(pi) NaN T_LOCK(1) NaN (0.3) NaN (0.1) 3.07 %% 4. El coeficiente 4 de la filmina es el de zeta = 0,707 for zz = [0.3536 1/sqrt(2) 1] c = zeros(1,3); k = 0; for rr = [0.05 0.1 0.2] Bn = rr*df; k = k + 1; Tz = pll_sim(Bn, zz, df, ceil(3*4*df^2/Bn^3), 0, 1, pi); c(k) = Tz * Bn^3 / df^2; end wn = @(Bn) 2*Bn/(zz + 1/(4*zz)); fprintf('zeta %.4f: T_FL*Bn^3/df^2 = %.2f %.2f %.2f (Gardner: %.2f)\n', zz, c, ... (2*pi)^2/(2*zz*(2/(zz + 1/(4*zz)))^3)); end % zeta 0.3536: T_FL*Bn^3/df^2 = 8.31 8.27 8.14 (Gardner: 8.33) % zeta 0.7071: T_FL*Bn^3/df^2 = 4.15 4.12 4.05 (Gardner: 4.16) % zeta 1.0000: T_FL*Bn^3/df^2 = 4.80 4.77 4.61 (Gardner: 4.82) %% 5. Dónde deja de dar vueltas rb = 0.80:0.02:1.20; nv = zeros(size(rb)); for i = 1:numel(rb), [~, nv(i)] = pll_sim(rb(i)*df, zeta, df, 2e5, 0, 1, pi); end fprintf('vueltas: '); fprintf('%.2f:%d ', [rb; nv]); fprintf('\n'); % vueltas: 0.80:3 0.82:3 0.84:2 0.86:2 0.88:2 0.90:2 0.92:2 0.94:1 0.96:1 0.98:1 1.00:1 1.02:1 1.04:1 1.06:1 1.08:0 1.10:0 1.12:0 1.14:0 1.16:0 1.18:0 1.20:0 %% 6. Varianza del error de fase en régimen (df = 0), sigma_w^2 = 1: N0*Bn/Pin = Bn for Bn = [1e-4 3e-4 1e-3 3e-3 1e-2 3e-2 1e-1] N = round(max(2e6, 2000/Bn)); s2 = zeros(1,4); for sem = 1:4 [~, ~, e] = pll_sim(Bn, zeta, 0, N, 1, sem, []); e = double(e(round(20/Bn):end)); s2(sem) = var(e); end fprintf('Bn %.0e: sigma2 %.4e +- %.1e razon a N0Bn/Pin %.3f\n', Bn, mean(s2), std(s2), mean(s2)/Bn); end % Bn 1e-04: sigma2 9.9168e-05 +- 1.9e-06 razon a N0Bn/Pin 0.992 % Bn 3e-04: sigma2 2.9992e-04 +- 3.4e-06 razon a N0Bn/Pin 1.000 % Bn 1e-03: sigma2 1.0179e-03 +- 2.7e-05 razon a N0Bn/Pin 1.018 % Bn 3e-03: sigma2 3.0459e-03 +- 4.0e-05 razon a N0Bn/Pin 1.015 % Bn 1e-02: sigma2 1.0249e-02 +- 5.4e-05 razon a N0Bn/Pin 1.025 % Bn 3e-02: sigma2 3.2449e-02 +- 1.3e-04 razon a N0Bn/Pin 1.082 % Bn 1e-01: sigma2 4.2371e+00 +- 4.9e+00 razon a N0Bn/Pin 42.371 %% 7. Con más ruido, la varianza deja de ser lineal (Bn = 1e-3) for sw2 = [10 30 60 100 150 200] s2 = zeros(1,4); nv = zeros(1,4); for sem = 1:4 [~, nv(sem), e] = pll_sim(1e-3, zeta, 0, 4e6, sqrt(sw2), sem, []); s2(sem) = mean(double(e(5e4:end)).^2); end fprintf('sw2 %3d: lineal %.3f medida %.4f %.4f %.4f %.4f vueltas %d %d %d %d\n', sw2, sw2*1e-3, s2, nv); end % sw2 10: lineal 0.010 medida 0.0103 0.0100 0.0101 0.0100 vueltas 0 0 0 0 % sw2 30: lineal 0.030 medida 0.0315 0.0304 0.0306 0.0305 vueltas 0 0 0 0 % sw2 60: lineal 0.060 medida 0.0645 0.0621 0.0626 0.0624 vueltas 0 0 0 0 % sw2 100: lineal 0.100 medida 0.1113 0.1069 0.1079 0.1075 vueltas 0 0 0 0 % sw2 150: lineal 0.150 medida 25.9284 0.1684 0.1702 0.1698 vueltas 1 0 0 0 % sw2 200: lineal 0.200 medida 59.1274 10.9160 38.5893 99.0805 vueltas 2 1 1 -2 %% 8. La métrica con ruido: Bn = 0,2 df, sigma_w^2 = 12,5 (sigma de fase 0,05 rad) Bn = 0.2*df; T0 = 4*df^2/Bn^3; for Nf = [1.5 3 6] Tn = pll_sim(Bn, zeta, df, ceil(Nf*T0), sqrt(12.5), 3, [pi 1 0.3 0.1]); fprintf('registro %.1f*T: T_FL(pi) %d T_LOCK(1) %d (0.3) %d (0.1) %d de %d\n', Nf, Tn, ceil(Nf*T0)); end Ts8 = zeros(1,8); for sem = 1:8, Ts8(sem) = pll_sim(Bn, zeta, df, ceil(1.5*T0), sqrt(12.5), sem, pi); end fprintf('T_FL con ruido, 8 semillas: '); fprintf('%d ', Ts8); fprintf('\n'); % registro 1.5*T: T_FL(pi) 480718 T_LOCK(1) 488959 (0.3) 492100 (0.1) 737275 de 750000 % registro 3.0*T: T_FL(pi) 480718 T_LOCK(1) 488959 (0.3) 492100 (0.1) 1495181 de 1500000 % registro 6.0*T: T_FL(pi) 480718 T_LOCK(1) 488959 (0.3) 492100 (0.1) 2998432 de 3000000 % T_FL con ruido, 8 semillas: 479653 556892 480718 518744 479577 490047 471454 547029 %% El PLL: detector sen (producto), PI, NCO con una muestra de retardo function [Tu, k, err] = pll_sim(Bn, zeta, df, N, sigw, sem, umb) wn = 2*Bn/(zeta + 1/(4*zeta)); Kp = 2*zeta*wn; Ki = wn^2; rng(sem); err = zeros(N, 1, 'single'); th = 0; I = 0; for n = 1:N eps_ = 2*pi*df*(n-1) - th; err(n) = eps_; e = sin(eps_); if sigw > 0, e = e + sigw/sqrt(2)*randn; end I = I + Ki*e; th = th + Kp*e + I; end k = round(double(err(end))/(2*pi)); w = abs(double(err) - 2*pi*k); Tu = zeros(1, numel(umb)); for j = 1:numel(umb) u = find(w > umb(j), 1, 'last'); if isempty(u), u = 0; end Tu(j) = u; end end