Unidad 6 · Ecualizadores adaptativos · la cadena de punta a punta, qué señal hay en cada punto, dónde entra el ruido y cuánto cuesta
Un receptor que ecualiza adaptativamente es un filtro FIR delante del slicer, con un lazo que lo corrige símbolo a símbolo usando el error de la decisión. El filtro no sabe nada del canal: arranca con un solo tap distinto de cero y aprende. Todo lo demás de la cadena está para que ese lazo funcione. El AGC fija la escala del paso, el sobremuestreo por 2 hace que no importe en qué fase se muestrea, la referencia —símbolos de entrenamiento o las propias decisiones— le dice hacia dónde ir, y la BER se cuenta recién cuando los taps dejaron de moverse. Es la cadena de la guía del TP6 y de los scripts B_FSE_equalizer.m y basic_transceiver_DD_equalizer.m de la clase.
Con la notación de la filmina: son los símbolos, la entrada del ecualizador a dos muestras por símbolo, su salida, la salida diezmada a tasa de símbolo y la decisión. El lazo azul es lo único que separa este receptor de uno fijo: el error sale del slicer a tasa de símbolo y vuelve a corregir los taps de . El sumador punteado marca el otro lugar donde puede entrar el ruido, antes del canal, y la sección 05 cuenta por qué eso cambia todo.
qammod. Acá 16-QAM: niveles y por eje, . La constelación está en la modulación QAM.upsample por y una raíz de coseno realzado de rolloff 0,2 (rcosdesign), dividida por su suma. Las dos muestras por símbolo emulan lo analógico. Por qué la raíz y no el coseno realzado entero está en la ISI y el pulse shaping.fir1(10, fc/BR): 11 coeficientes, ganancia 1 en continua y corte en , porque fir1 normaliza a . La señal ocupa hasta , así que un corte más abajo le come banda. Es un FIR transversal, igual que el ecualizador.var(yup) en el script):
y la varianza total del ruido complejo es . El está porque el ruido se reparte en de banda: el ruido que inyectás no es el que ve el decisor.std, con objetivo 0,3 en la filmina y en el script CMA y 0,1 en el script DD. Acá 0,3. Qué hace un AGC de verdad está en el control automático de ganancia.tap_leak_gain, ). El error se calcula a tasa pero tiene muestras a : es el del diagrama de la filmina.finddelay y se cuenta sólo en la parte donde los taps ya no se mueven.El ecualizador de esta cadena es lineal. Invertir el canal a secas es el zero forcing, y sacar la ISI con decisiones pasadas en lugar de filtrar es el DFE; el LMS no elige entre ellos: persigue el MSE, y la sección 04 muestra cómo se reconoce a dónde llegó.
Las mediciones de esta nota usan la cadena de arriba con 16-QAM, 31 taps, , el tap central inicial en para que la salida arranque con la escala de la constelación, y entrenamiento. Con una QAM densa, arrancar en modo dirigido por decisiones no engancha: el script DD de la clase, tal como viene, con 64-QAM, termina con la SER en 0,94 (sección 08).
A la entrada del ecualizador, las muestras de los instantes de símbolo no son la constelación. Las ensucian dos cosas: la ISI del canal y la del propio pulso, porque llega la raíz del coseno realzado sin la otra mitad, y la raíz sola no es de Nyquist. Con el ecualizador sin entrenar —un solo tap, que deja pasar la muestra central escalada— eso es lo que ve el slicer. A la salida, después de converger, las nubes se separan. Medido en MATLAB con , dB y ruido después del canal, congelando los taps después del entrenamiento y midiendo sobre los 20 000 símbolos siguientes:
| símbolos de entrenamiento | SER | SNR en el slicer |
|---|---|---|
| 0 (un solo tap) | 0,269 | 9,88 dB |
| 300 | 0,107 | 12,56 dB |
| 1000 | 0,034 | 14,46 dB |
| 3000 | 0,012 | 15,72 dB |
| 10 000 | 3,4·10⁻³ | 16,78 dB |
La SNR en el slicer es , ISI y ruido juntos. Sin ecualizar, uno de cada cuatro símbolos sale mal: es el ojo cerrado. Con 10 000 símbolos de entrenamiento la SER baja a 3,4·10⁻³ (68 errores en 20 000) y la SNR queda a 0,45 dB de la del ecualizador de Wiener de 31 taps, que es 17,23 dB. Lo que falta hasta el techo de dB no es culpa del LMS: el óptimo tampoco lo alcanza. Es lo que cuesta este canal con el ruido sumado después, y la sección 05 dice por qué.
Lo que ven los símbolos de punta a punta es el pulso total : transmisor, canal y ecualizador en cascada, a . Se mira de dos formas.
En el tiempo, muestreado cada alrededor de su pico. Sin ISI es un único valor, el cursor, y ceros en los demás instantes. Se leen dos números: el cursor y la ISI residual, la energía de los otros instantes relativa a la del cursor.
En frecuencia, entre y , que es lo que dibuja la figura 100 de B_FSE_equalizer.m. Como el ecualizador es fraccionario, lo que tiene que ser plano no es sino su espectro plegado, porque el diezmado suma las réplicas corridas en . Si el total es real, simétrico y no pasa de , el plegado evaluado en el borde da una cuenta exacta:
O sea, −6,02 dB en : el total de un ecualizador que no deja ISI tiene forma de coseno realzado, no de rectángulo. Por eso el script dibuja las líneas en .
Cómo se reconoce el criterio. El LMS siempre minimiza lo mismo, el MSE. Lo que cambia con el ruido es si esa solución se distingue del zero forcing. Con poco ruido coinciden, y el total tiene las tres firmas del ZF: cursor 1, ISI residual nula y −6 dB en el borde. Con mucho ruido, el MMSE acepta algo de ISI para no levantar ruido donde el canal hundió la señal: el total se hunde por debajo de −6 dB en el borde y el cursor queda por debajo de 1. Ese sesgo tiene forma cerrada: para el MMSE el cursor vale , así que cursor y SNR son el mismo dato. Medido con ruido después del canal y , el LMS después de 30 000 símbolos de entrenamiento (taps promediados sobre los últimos 2000) y la solución de Wiener calculada aparte, armando la matriz de autocorrelación:
| Eb/N0 | cursor, LMS · Wiener | ISI residual, LMS · Wiener | |T| en BR/2, LMS · Wiener |
|---|---|---|---|
| 30 dB | 0,989 · 0,999 | −36,5 · −51,4 dB | −6,63 · −6,12 dB |
| 16 dB | 0,971 · 0,981 | −28,8 · −32,4 dB | −7,41 · −6,98 dB |
| 8 dB | 0,890 · 0,902 | −18,2 · −19,6 dB | −11,24 · −10,20 dB |
A 30 dB el Wiener es un zero forcing con otro nombre: cursor 0,999 y el borde a 0,1 dB de −6,02. A 8 dB es un MMSE que se nota: cursor 0,902, borde cuatro decibeles más abajo. El cruce entre las columnas es una verificación de verdad, porque son dos caminos distintos —una adaptación ruidosa y un sistema lineal resuelto—: cursor y borde caen a poco más de un decibel como mucho. La ISI residual no: la del LMS queda siempre más alta, 3,6 dB a 16 dB y 15 dB a 30 dB, donde no baja de −36,5 dB. El temblor de los taps alrededor del óptimo y la fuga le ponen un piso que el Wiener no tiene. Y el sesgo cierra la cuenta: es , y dB es exactamente la SNR de Wiener a 8 dB.
El canal puede actuar antes o después de que entre el ruido. La señal llega al ecualizador igual en los dos casos, con . El ruido no: si entra después del canal llega blanco, ; si entra antes, pasa por y llega con . Lo que decide es el cociente frecuencia por frecuencia:
Con el ruido después, donde es chico la señal bajó y el ruido no. Para sacar la ISI el ecualizador tiene que levantar esas frecuencias, y levanta el ruido con ellas: es la amplificación de ruido del zero forcing. El MMSE no levanta del todo y deja ISI —el hundimiento de la sección anterior—, pero igual paga. Con el ruido antes, se cancela del cociente: el canal bajó señal y ruido juntos, e invertirlo devuelve los dos como estaban. Ecualizar sale gratis. El que cuesta es el filtro que actúa antes de que entre el ruido; el que filtra un ruido que ya entró se deshace sin pérdida, salvo donde tiene ceros exactos.
En el punto de la sección 03, con 10 000 símbolos de entrenamiento:
| SNR en el slicer, LMS | Wiener, 31 taps | SER | |
|---|---|---|---|
| ruido después del canal | 16,78 dB | 17,23 dB | 3,4·10⁻³ |
| ruido antes del canal | 21,74 dB | 22,05 dB | 0 en 20 000 |
| techo: Es/N0 | 22,02 dB | ||
El mismo canal y el mismo dejan casi 5 dB de diferencia según dónde se sume el ruido, y el Wiener dice que no es un defecto del algoritmo: con el ruido antes el óptimo llega al techo, con el ruido después se queda 4,8 dB abajo. Los 0,03 dB en que el Wiener pasa el techo son de la cuenta de , que la simulación mide con var y el cálculo cerrado toma de la energía del pulso. Si la amplificación de ruido es el problema, la otra salida es sacar el ruido del lazo con un DFE.
Sin entrenar, la constelación de salida es la de entrada: dieciséis manchas que se tocan. Al subir los símbolos de entrenamiento se separan, el cursor sube hacia 1, la ISI residual baja, y abajo el total pasa de copiar la caída del canal a tener la forma de coseno realzado, con el borde cerca de −6 dB. Las lecturas no se mueven igual de rápido: la SNR llega cerca de su piso en unos miles de símbolos, y el borde de la banda es lo último que se acomoda. Después hay tres cosas para probar. Pasar el ruido antes del canal, y ver la SNR saltar al techo. Bajar a 8 dB con el ruido después, y ver el total hundirse en el borde: el MMSE separándose del ZF. Y cerrar el canal a , y ver cuánto más cuesta todo lo anterior.
La penalidad de SNR es la distancia horizontal, a una BER fijada, entre la curva medida y la teórica de berawgn. Para 16-QAM, berawgn da BER en 10,52 dB. Medida barriendo de a 1 dB, con 10 000 símbolos de entrenamiento y después modo dirigido por decisiones, contando la BER sobre los 60 000 símbolos siguientes —240 000 bits, unos 240 errores cerca de — e interpolando en :
| fc/BR | ruido después del canal | ruido antes del canal |
|---|---|---|
| 0,60 | 0,69 dB | 0,26 dB |
| 0,45 | 3,21 dB | 0,25 dB |
| 0,35 | 8,32 dB | 0,54 dB |
| 0,30 | 13,61 dB | 2,37 dB |
Con el ruido después, la penalidad crece rápido en cuanto el corte entra en la banda de la señal, que llega a : es la sección anterior, medida en BER. Con el ruido antes se queda casi quieta. Lo que tiene de piso es el desajuste del LMS: con , y , la fórmula de entrada blanca da 0,19 dB de exceso de MSE.
Los 2,37 dB de la última fila no son física: el Wiener, con ese canal y el ruido antes, a dB, da 19,07 dB contra un techo de 19,02. Es el LMS que no terminó. Las frecuencias donde el canal dejó poca señal son las direcciones de menor autovalor, las que el gradiente recorre más despacio, y además la fuga tira de esos taps hacia cero. Medido: con 10 000 símbolos de entrenamiento y fuga la SNR en el slicer queda en 15,65 dB; con 100 000 y sin fuga, en 18,81 dB. Y todas las cifras de la tabla son a BER : a otra BER la penalidad es otra, porque la penalidad de ISI no es un corrimiento.
Con el AGC fijando , el paso tiene una escala natural, el paso óptimo del LMS, y una constante de tiempo esperable, las dos para entrada blanca:
Con 31 taps y , . Barrido el paso con 30 000 símbolos de entrenamiento, ruido después, y 16 dB, con la SNR medida sobre los 20 000 símbolos siguientes y el tiempo hasta que la curva de aprendizaje, promediada de a 500 símbolos, entra a 1 dB de su piso:
| β | β/βopt | SNR final | llega a 1 dB del piso | τ de entrada blanca |
|---|---|---|---|---|
| 0,01 | 0,028 | 16,80 dB | 4450 símbolos | 556 |
| 0,03 | 0,084 | 17,10 dB | 3300 símbolos | 185 |
| 0,1 | 0,279 | 16,85 dB | 1500 símbolos | 56 |
| 0,3 | 0,837 | 15,81 dB | 800 símbolos | 19 |
El compromiso es el de siempre: paso grande, llega antes y se queda más arriba. Con pierde 1,4 dB contra el Wiener (17,23 dB) por desajuste. Con el paso más chico todavía no terminó en 30 000 símbolos. Y la constante de tiempo de la fórmula se queda corta por un factor de 8 a 40: la entrada del FSE no es blanca, está sobremuestreada y filtrada, y los modos lentos —el borde de la banda y lo que está fuera de ella— tardan mucho más que el promedio. El transitorio que hay que tirar antes de contar errores se mide mirando la curva, no con .
Para los taps, el paso se escaló con para mantener fijo en 0,084 —si cambia tiene que cambiar el paso, dice la filmina—, y al lado va el Wiener del mismo largo:
| NT | β | SNR, LMS | SNR, Wiener |
|---|---|---|---|
| 7 | 0,133 | 14,68 dB | 14,83 dB |
| 11 | 0,085 | 16,01 dB | 16,12 dB |
| 21 | 0,044 | 16,88 dB | 16,99 dB |
| 31 | 0,030 | 17,10 dB | 17,23 dB |
| 61 | 0,015 | 16,99 dB | 17,29 dB |
El Wiener deja de ganar pasados los 31 taps: de 31 a 61 suma 0,06 dB. Lo que hace falta es cubrir la respuesta que hay que deshacer, y transmisor más canal miden 31 muestras, 15,5 símbolos. Con 61 taps el LMS da menos que con 31, porque con el paso escalado converge más lento. Pocos taps es un piso que ningún paso arregla; muchos taps es más desajuste y más espera por nada.
B_FSE_equalizer.m, el script de la clase que la guía del TP6 toma como esqueleto, corrido entero y sin tocar, seguido de las líneas que miden lo que el script calcula y no imprime. Es QPSK a dB, canal fir1(10, 0.4), ruido sumado después del canal, 101 taps y modo dirigido por decisiones desde el arranque. Lo que figura como comentario es la salida real de correrlo en R2026a.
rng(1); B_FSE_equalizer % el script de la clase, entero y sin tocar close all %% Lo que el script calculó y no imprime ak_hat = sign(real(out_eq_down)) + 1j*sign(imag(out_eq_down)); % slicer QPSK d = finddelay(x, ak_hat); % retardo total, en símbolos k0 = L/2; k1 = L - 100; % sólo la segunda mitad: ya convergió xk = out_eq_down(k0:k1); ak = x(k0-d:k1-d); errores_bit = sum(sign(real(xk)) ~= real(ak)) + sum(sign(imag(xk)) ~= imag(ak)); fprintf('retardo %d símbolos, errores de bit %d en %d bits\n', d, errores_bit, 2*numel(ak)) % retardo 40 símbolos, errores de bit 0 en 29802 bits fprintf('SNR en el slicer %.2f dB (Es/N0 = %.2f dB)\n', 10*log10(2/mean(abs(xk - ak).^2)), EbNo + 10*log10(k)) % SNR en el slicer 13.04 dB (Es/N0 = 18.01 dB) t = conv(conv(g, b), W); % pulso total: Tx, canal, ecualizador [~, c] = max(abs(t)); ts = t(mod(c-1,2)+1:2:end); cs = (c + 1 - mod(c-1,2)) / 2; isi = sum(abs(ts).^2) - abs(ts(cs))^2; fprintf('cursor %.3f, ISI residual %.1f dB\n', abs(ts(cs)), 10*log10(isi/abs(ts(cs))^2)) % cursor 0.951, ISI residual -23.9 dB T = @(f) abs(sum(t .* exp(-2j*pi*f/fs*(0:numel(t)-1)))); fprintf('|T| en BR/2: %.2f dB respecto de continua\n', 20*log10(T(BR/2)/T(0))) % |T| en BR/2: -8.32 dB respecto de continua
Converge, y se lee con lo de arriba: cursor 0,951 y el borde a −8,32 dB, más abajo que los −6,02 del zero forcing. Es un MMSE con el ruido sumado después del canal, que pierde 5 dB contra . Tarda 36 segundos, casi todos en redibujar la figura 100 cada 1000 muestras. Los detalles que muerden:
Pt = var(yup)) y se suma después. Es el caso caro de la sección 05; para el otro hay que sumarlo antes de filter(b,1,·).basic_transceiver_DD_equalizer.m, corrido tal como viene con rng(1), 64-QAM a 21 dB, termina con ber_aprox = 0.1564 —una SER de 0,94— contra ber_teorico = 5.8465e-10. El módulo medio de la salida queda en 1,09 cuando el de los símbolos es 6,09: el lazo se clavó en una ganancia donde sus propias decisiones, casi todas del anillo interno, son coherentes consigo mismas. basic_transceiver_CMA_equalizer.m, que arranca con el CMA y pasa a DD, sí converge: ber_aprox = 0.0083 a 13 dB, donde la BER teórica de 64-QAM es 4,9·10⁻³.ber_aprox no es la BER: es la SER dividida por , que supone un bit errado por símbolo errado. El propio script lo avisa..', no '. C.'*buffer transpone; C'*buffer además conjuga, y el filtro pasa a ser otro. B_FSE_equalizer.m lo esquiva guardando W como fila.