Unidad 6 · Ecualizadores adaptativos · la referencia del error: secuencia conocida, decisión del slicer, el pasaje de una a otra y el script de clase
El LMS corrige los taps con el error entre la salida del ecualizador y el símbolo que se mandó. El receptor no sabe qué símbolo se mandó: si lo supiera, no haría falta el receptor. Hay tres maneras de conseguir esa referencia. Mandar símbolos que el receptor ya conoce (entrenamiento), usar la propia decisión del slicer como si fuera el símbolo (modo dirigido por decisiones, DD) o cambiar de criterio por uno que no necesite los símbolos (el CMA, a ciegas). En la cadena canal → AGC → ecualizador → slicer las tres ocupan el mismo lugar: el sumador que arma el error que vuelve a los taps.
La filmina de algoritmos MSEG define el error entre la entrada del slicer y su salida:
con la salida del ecualizador, la decisión, el contenido del buffer y el paso. De dónde sale el LMS está en su nota; acá importa una sola pieza, el término que se resta. Y agrega una aclaración que decide todo lo que sigue: en la etapa de entrenamiento, el símbolo transmitido reemplaza a la decisión, y en el análisis se supone que no hay errores de decisión, así que da lo mismo usar uno u otro.
Con un retardo en el medio. Un ecualizador causal no puede entregar el símbolo de ahora: lo que sale en el instante estima el símbolo , mandado símbolos antes. La referencia tiene, entonces, dos formas:
El resto del lazo no cambia. En el script de clase es una sola línea, Ek = slicer_out - yfilt, y pasar a entrenamiento es cambiar slicer_out por el símbolo conocido. La filmina lo dibuja como un conmutador entre la salida del detector y un bloque «modo de entrenamiento».
La filmina de ecualización adaptativa lo cuenta así: durante la adaptación el ecualizador todavía no sigue al canal y el slicer se equivoca mucho, por eso se usa una señal de entrenamiento, una secuencia de símbolos que el receptor conoce. Al principio de la transmisión se manda esa secuencia; después se la reemplaza por las decisiones del detector y empiezan los datos.
Con la referencia verdadera, el LMS minimiza el MSE de verdad, sobre la superficie cuadrática de Wiener, que tiene un solo mínimo. No importa de dónde arranquen los taps ni cuán cerrado esté el ojo: converge. Lo que cuesta es otra cosa.
Cuesta tasa. Los símbolos de entrenamiento ocupan el canal y no llevan información del usuario. Si se entrena con símbolos cada , la fracción útil es
y para mantener la tasa de información hay que subir la de símbolos en , la misma cuenta que con el overhead del FEC. Cuesta, además, coordinación: el receptor tiene que saber cuándo empieza la secuencia y alinearla con su salida, que es elegir (sección 06).
Cuántos símbolos. Los que tarde el LMS en abrir el ojo lo suficiente para que la DD pueda seguir sola. Eso lo pone el paso, no el canal solo: es el tiempo de convergencia del LMS. En la cadena del script de clase, con su paso de 2e-3, entrenar todo el tiempo baja la tasa de errores de decisión, en bloques de 10 000 símbolos, así: 0,958 · 0,919 · 0,838 · 0,711 · 0,522 · 0,334 · 0,180 · 0,084 · 0,035. Hacen falta del orden de 70 000 símbolos, unos 2,2 µs a 32 GBd. Con un paso 25 veces más grande, 5e-2, el primer bloque de 10 000 promedia 0,186 y el segundo, cero. Cuánto hace falta exactamente para conmutar sin perderse está medido en las secciones 04 y 07.
La idea es la del slicer: si el ojo está abierto, la decisión es el símbolo que se mandó. Entonces se la puede usar de referencia, y el ecualizador sigue adaptándose con los datos del usuario sin gastar un símbolo. Por qué funciona, en dos pasos.
Paso 1: cuando la decisión acierta, el error es el mismo. Si , entonces exacto, y la actualización de los taps es idéntica. No es una aproximación: es el mismo número.
Paso 2: la diferencia vive sólo en los errores de decisión. Con una tasa de errores de decisión , una fracción de las actualizaciones usa una referencia equivocada, y en esas el error es
El término de más es un salto entre dos puntos de la constelación, de largo 2 o más, y apunta hacia el vecino que el slicer eligió. Con el ojo abierto, es chico, los saltos son raros y el paso chico del LMS los promedia. Medido con 16-QAM por un canal suave (el modelo de abajo, ), en 200 corridas de 6000 símbolos, MSE en los últimos mil:
| ruido σ | MSE de Wiener | entrenado | DD | errores de decisión |
|---|---|---|---|---|
| 0,1 | 0,0191 | 0,02135 | 0,02135 | 0 |
| 0,3 | 0,1695 | 0,1893 | 0,1897 | 2,0·10⁻³ |
| 0,4 | 0,2974 | 0,3321 | 0,3387 | 2,7·10⁻² |
Sin errores de decisión los dos modos dan el mismo MSE a todas las cifras, como dice el paso 1. Con un 0,2 % de decisiones erradas difieren en un 0,2 %; con un 2,7 %, en un 2 %. Lo que sobra respecto de Wiener es el desajuste del LMS y es el mismo en los dos modos. Con el ojo abierto, DD es entrenamiento.
Con el ojo cerrado el paso 2 se da vuelta: la mayoría de las referencias están mal, y los saltos ya no se promedian: tienen dirección. El error apunta hacia donde el slicer decidió, no hacia donde estaba el símbolo, y el ecualizador aprende a reproducir sus propias equivocaciones. Puede quedar en un equilibrio falso, donde las decisiones erradas son consistentes consigo mismas y el error promedio se anula lejos de Wiener.
El modelo. Para medirlo sin nada más en el medio: símbolos a un símbolo por muestra por el canal , ruido de desvío por componente (la semidistancia entre niveles es 1), ecualizador de taps con el central en 1, , paso con el de la filmina, y 3000 símbolos por corrida. El canal se eligió porque
nunca se anula: es ecualizable para cualquier , y lo único que mueve es cuán cerrado llega el ojo. Sin ecualizar, la decisión sobre un nivel ve de ISI, que en el peor caso vale con niveles por eje. El ojo se cierra cuando eso llega a la semidistancia:
La tasa de errores de decisión al arrancar tiene forma cerrada: con el tap central en 1, cada eje decide más ruido, y se promedia sobre las combinaciones. Contra 1000 × 2000 decisiones simuladas difiere en menos de 0,001. DD desde el primer símbolo, 1000 corridas por fila:
| constelación | ρ | errores al arrancar | converge | otro retardo o giro | no converge |
|---|---|---|---|---|---|
| QPSK | 0,45 | 0,078 | 100 % | 0 % | 0 % |
| QPSK | 0,50 | 0,234 | 99,9 % | 0 % | 0,1 % |
| QPSK | 0,60 | 0,429 | 51 % | 18 % | 31 % |
| QPSK | 0,70 | 0,438 | 15,8 % | 24,2 % | 60 % |
| 16-QAM | 0,15 | 0,030 | 100 % | 0 % | 0 % |
| 16-QAM | 0,25 | 0,340 | 99,9 % | 0 % | 0,1 % |
| 16-QAM | 0,30 | 0,477 | 93,9 % | 0 % | 6,1 % |
| 16-QAM | 0,40 | 0,493 | 62,1 % | 0 % | 37,9 % |
| 16-QAM | 0,50 | 0,666 | 26,1 % | 0 % | 73,9 % |
| 16-QAM | 0,60 | 0,803 | 3,9 % | 0 % | 96,1 % |
| 64-QAM | 0,05 | 0,0001 | 100 % | 0 % | 0 % |
| 64-QAM | 0,10 | 0,233 | 100 % | 0 % | 0 % |
| 64-QAM | 0,15 | 0,500 | 68,6 % | 0 % | 31,4 % |
| 64-QAM | 0,20 | 0,653 | 22,7 % | 0 % | 77,3 % |
| 64-QAM | 0,30 | 0,816 | 0,1 % | 0 % | 99,9 % |
«Converge» es que las últimas mil decisiones acierten el 99 % contra . «Otro retardo o giro» es que acierten ese 99 % contra el mismo símbolo corrido hasta tres lugares o girado un múltiplo de 90°: el ojo quedó abierto, pero en otro lugar. Las tres cosas que se leen:
El umbral. Lo que importa no es el canal sino cuán abierto está el ojo en el instante en que la DD toma el mando. Se lo mide así: entrenar símbolos, con de 0 a 400 de a 10 y 200 corridas cada uno, congelar los taps en el instante de conmutar, medir con ellos la tasa de errores de decisión sobre 2000 símbolos nuevos, y agrupar las corridas por esa tasa:
| errores al conmutar | QPSK, ρ = 0,7 | 16-QAM, ρ = 0,5 | 64-QAM, ρ = 0,3 |
|---|---|---|---|
| menos de 0,10 | 100 % (7604) | 100 % (6985) | 100 % (6662) |
| 0,10 a 0,30 | 100 % (236) | 100 % (358) | 100 % (345) |
| 0,30 a 0,40 | 89,5 % (133) | 100 % (186) | 99,4 % (156) |
| 0,40 a 0,45 | 23,8 % (210) | 98,7 % (79) | 93,3 % (90) |
| 0,45 a 0,50 | — | 86,2 % (87) | 86,1 % (72) |
| 0,50 a 0,60 | — | 69,3 % (283) | 64,5 % (203) |
| 0,60 o más | — | 27,0 % (222) | 10,3 % (672) |
Entre paréntesis, cuántas corridas cayeron en cada franja; la QPSK de este canal no pasa de 0,4375 de errores, que es su valor sin ecualizar. Hasta 0,4 de decisiones erradas la DD converge casi siempre; de ahí en adelante la probabilidad se cae, y pasado 0,6 se pierde casi siempre. En este modelo el umbral está entre 0,4 y 0,6. En la cadena del script de clase, con la misma cuenta, está entre 0,17 y 0,25 (sección 07). Godard, en el extra 6.1, da la cifra de la literatura de módems: la DD «no converge cuando la probabilidad de error es del orden de 0,1», salvo con modulación de fase pura. No hay un número universal: depende de la cadena, del paso y de hacia dónde están equivocadas las decisiones. La misma tasa puede salvarse o no, como se ve en la sección 06 con la escala. Lo universal es la dirección: DD hereda el ojo con que arranca.
Cuántos símbolos de entrenamiento alcanzan. Con los mismos tres canales, 1000 corridas por celda; entre paréntesis, la mediana de los errores de decisión al conmutar:
| entrenamiento | QPSK, ρ = 0,7 | 16-QAM, ρ = 0,5 | 64-QAM, ρ = 0,3 |
|---|---|---|---|
| 0 | 14,8 % (0,438) | 25,4 % (0,666) | 0,1 % (0,816) |
| 25 | 100 % (0,089) | 94,2 % (0,444) | 34,1 % (0,632) |
| 50 | 100 % (0,0005) | 100 % (0,151) | 96,1 % (0,355) |
| 75 | 100 % (0) | 100 % (0,0083) | 100 % (0,073) |
Con 100 símbolos convergen las tres en las mil corridas. El entrenamiento no tiene que terminar el trabajo: alcanza con que deje el ojo lo bastante abierto para que la DD lo termine. Con 50 símbolos la 16-QAM conmuta con un 15 % de decisiones erradas y converge siempre. Sin entrenar, la QPSK además termina en otro retardo o giro en el 22,3 % de las corridas.
Con 16-QAM y el ojo arranca apenas abierto y la DD sola alcanza: las marcas rojas se apagan en unos cientos de símbolos y las dos curvas de error bajan juntas hasta el piso de Wiener. Llevá a 0,5. La mayoría de las corridas ya no convergen: la franja roja sigue hasta el final, la constelación se achica hacia el centro y el error que ve el LMS queda por debajo del verdadero, porque el slicer siempre elige el punto más cercano y la DD mide contra ese. El receptor no ve el error verdadero, así que no tiene cómo saber que se perdió. Subí ahora el entrenamiento: con 50 símbolos ya convergen todas las corridas probadas en MATLAB, y la marca que separa la franja celeste del resto es el instante en que la DD toma un ojo que ya está abierto. Con QPSK y alto, probá varias semillas: muchas terminan en «otro retardo o giro».
La receta de la filmina es la del widget: entrenar al principio para adquirir y pasar a DD para seguir. La DD no sólo evita gastar tasa después del arranque; es lo que deja al ecualizador acompañar un canal que cambia. La filmina lo pone como condición: la decisión del slicer como referencia es efectiva «cuando las variaciones de la respuesta del canal son relativamente lentas».
Medido con 16-QAM y 20 000 símbolos, 100 corridas por fila, con el canal que cambia de dos maneras: una rampa lenta de a 0,5 a lo largo de toda la corrida, y un salto de 0,1 a 0,5 en la mitad. Tasa de errores de decisión en los últimos 2000 símbolos:
| receptor | rampa lenta | salto |
|---|---|---|
| 300 de entrenamiento y taps congelados | 0,493 | 0,511 |
| 300 de entrenamiento y DD | 0 | 0,204 (se pierde en el 22 %) |
| DD desde el primer símbolo | 0 | 0,204 (se pierde en el 22 %) |
Tres lecturas. Un ecualizador entrenado y congelado queda afinado para el canal de cuando se entrenó; al final de la rampa decide mal la mitad de las veces. La DD sigue la rampa sin un solo error, porque en cada instante el ojo está abierto para el canal de ese instante: nunca arranca con el ojo cerrado, lo mantiene abierto. Y en esta rampa no hacía falta entrenar: con al principio, la DD sola arranca. Las dos últimas filas coinciden a todas las cifras, y no por casualidad: con el ojo abierto desde el primer símbolo ninguna decisión del arranque falla, y por el paso 1 de la sección 03 las dos actualizaciones son el mismo número, símbolo por símbolo. El salto es otra cosa. Los taps de puestos de golpe frente a un canal de 0,5 dejan el ojo cerrado, y en una de cada cinco corridas la DD no lo recupera. Ahí el receptor tiene que volver a entrenar, y por eso los sistemas que atraviesan desvanecimientos intercalan símbolos conocidos a lo largo de la trama, no sólo al principio.
El tap central en 1. Un ecualizador con un solo tap distinto de cero es un cable: deja pasar la señal tal como llega, atrasada. Es la mejor apuesta cuando no se sabe nada del canal, y fija dos cosas a la vez, la escala de arranque y el retardo. Con entrenamiento la escala no importa, porque el error se mide contra el símbolo verdadero y el LMS aprende la ganancia que falte. Con DD importan las dos, porque el error se mide contra lo que el slicer decidió con esa escala y ese retardo.
La escala. Sin ISI () y con el tap central en en vez de 1, DD desde el arranque, 200 corridas por celda:
| tap inicial g | 16-QAM: errores al arrancar | converge | 64-QAM: errores al arrancar | converge |
|---|---|---|---|---|
| 0,25 | 0,750 | 0 % | 0,938 | 0 % |
| 0,5 | 0,750 | 0 % | 0,938 | 0 % |
| 0,75 | 0,0004 | 100 % | 0,750 | 0 % |
| 1 | 0 | 100 % | 0 | 100 % |
| 1,5 | 0,0004 | 100 % | 0,750 | 100 % |
| 2 | 0,438 | 100 % | 0,859 | 100 % |
Con QPSK convergen las seis filas: el signo no depende de la escala. Con las QAM densas la tabla es asimétrica, y eso muestra por qué la tasa de errores sola no decide. y dan, con 64-QAM, la misma tasa de errores al arrancar, 0,750, y terminan al revés. Con la escala corta, todos los puntos caen en las celdas de decisión de adentro; esas decisiones son coherentes con una salida chica, y el error empuja a achicarla más. El equilibrio falso es una constelación reducida: la salida termina en 0,40 veces el tamaño correcto con 16-QAM y en 0,20 con 64-QAM y . Con la escala larga, los puntos de afuera se deciden en el nivel extremo, que está más adentro que ellos, y el error tira la ganancia hacia abajo, hacia la correcta.
Por eso el script de clase no arranca en 1 sino en 16. El AGC deja la entrada en 0,1 de valor eficaz y la 64-QAM de qammod tiene valor eficaz . El tap de 16 arranca la salida en 1,6: la escala corta de la tabla. Pero arrancar en 65, la escala justa, tampoco alcanza (sección 07): el ojo sigue cerrado por la ISI.
El retardo. Con entrenamiento, se elige: es el corrimiento entre la secuencia de referencia y la salida. Cada tiene su propio mínimo de Wiener, y el LMS converge al del que se le dio, bueno o malo. Con 16-QAM y , entrenando 6000 símbolos, 50 corridas:
| Δ | MSE de Wiener | LMS entrenado | errores de decisión |
|---|---|---|---|
| 1 | 1,433 | 1,596 | 0,498 |
| 2 | 0,257 | 0,286 | 0,0010 |
| 3 | 0,0558 | 0,0626 | 0 |
| 4 | 0,0213 | 0,0238 | 0 |
| 5 | 0,0154 | 0,0172 | 0 |
| 6 | 0,0145 | 0,0162 | 0 |
| 7 | 0,0154 | 0,0172 | 0 |
| 8 | 0,0213 | 0,0238 | 0 |
| 9 | 0,0558 | 0,0621 | 0 |
| 10 | 0,257 | 0,286 | 0,0010 |
El mejor es : el retardo del tap central (5 símbolos) más el del tap principal del canal (1). Así el pico del símbolo buscado cae en el medio del buffer y quedan taps de los dos lados para la ISI de antes y de después. Con el LMS converge igual, a una curva de aprendizaje que se ve estable, y deja la mitad de las decisiones mal. Un retardo mal elegido no da error de ejecución: da un MSE malo. La regla es Δ = posición del tap central + retardo del pico del canal, y en una cadena con filtros se suman sus retardos de grupo, como en la sección 07.
Con DD, en cambio, no se elige: lo fijan el tap central y el canal, porque el ecualizador empieza como un cable con ese retardo y la DD ajusta alrededor. Si el ojo arranca cerrado puede terminar en otro, como las QPSK de la tabla de la sección 04. Una QAM cuadrada tiene además la ambigüedad de 90°: la constelación girada es la misma constelación, y la DD converge perfecta con todas las decisiones mal. Con símbolos conocidos las dos ambigüedades se resuelven, porque la referencia dice cuál era el símbolo y cuándo. Sin ellos, la nota del CMA cuenta cómo se arranca a ciegas y qué queda sin resolver.
El script de clase tal cual. basic_transceiver_DD_equalizer.m es el experimento que la filmina deja planteado —«investigar qué ocurre con modulaciones de mayor orden»—: 64-QAM a 32 GBd, pulso raíz de coseno realzado sólo en el transmisor, dB, canal ch = 1, AGC a 0,1 y un ecualizador fraccionario de 63 taps que se adapta sólo en DD desde el tap central en 16. Corre sin tocar nada (con slicer.m y sus funciones en la misma carpeta), tarda 7 segundos, y con rng(1) antes de llamarlo da ber_aprox = 0.1564 contra ber_teorico = 5.8465e-10: la SER es 0,9382. No converge. La salida termina con valor eficaz 1,17 cuando los símbolos tienen 6,48: es la constelación achicada de la sección 06. No es un error de código: es la respuesta a la pregunta de la filmina.
El mismo lazo, con entrenamiento. El script de abajo es el de clase con una sola línea cambiada: durante los primeros Kent símbolos, la referencia es el símbolo conocido ak(kk-D) en vez de slicer_out. Todo lo demás —filtros, ruido, AGC, paso, fuga de taps, tap inicial— es el script de clase, y con Kent = 0 y rng(1) reproduce su SER a las cuatro cifras. Lo que figura como comentario es la salida real de correrlo en R2026a.
%% El transceptor de basic_transceiver_DD_equalizer.m con un conmutador %% entrenamiento -> DD. Lo demás es el script de clase: 64-QAM, FSE de 63 %% taps a T/2, step = 2e-3, tap central en 16, AGC a 0.1. function entrenamiento_dd set(0, 'DefaultFigureVisible', 'off'); %% 1. Sin entrenamiento es el script de clase: con rng(1) da lo mismo r = transceptor(64, 16, 0, 1); fprintf('Kent = 0: SER = %.4f, rms salida = %.2f\n', r.SER, r.rms); % Kent = 0: SER = 0.9382, rms salida = 1.17 %% 2. La escala del tap inicial r = transceptor(4, 16, 0, 1); fprintf('QPSK, tap 16: SER = %.4f\n', r.SER); % QPSK, tap 16: SER = 0.0000 r = transceptor(64, 65, 0, 1); fprintf('64-QAM, tap 65: SER al arrancar = %.3f, SER final = %.4f\n', r.SERini, r.SER); % 64-QAM, tap 65: SER al arrancar = 0.843, SER final = 0.9021 %% 3. Barrido del largo del entrenamiento for Kent = [20000 40000 60000 65000 70000 75000 80000 100000] for semilla = 1:3 r = transceptor(64, 16, Kent, semilla); fprintf('Kent = %6d, semilla %d: SER al conmutar = %.3f, SER final = %.4f\n', ... Kent, semilla, r.SERsw, r.SER); end end % Kent = 20000, semilla 1: SER al conmutar = 0.894, SER final = 0.9462 % Kent = 20000, semilla 2: SER al conmutar = 0.897, SER final = 0.9460 % Kent = 20000, semilla 3: SER al conmutar = 0.895, SER final = 0.9447 % Kent = 40000, semilla 1: SER al conmutar = 0.646, SER final = 0.8846 % Kent = 40000, semilla 2: SER al conmutar = 0.641, SER final = 0.8875 % Kent = 40000, semilla 3: SER al conmutar = 0.618, SER final = 0.8851 % Kent = 60000, semilla 1: SER al conmutar = 0.245, SER final = 0.6570 % Kent = 60000, semilla 2: SER al conmutar = 0.270, SER final = 0.6865 % Kent = 60000, semilla 3: SER al conmutar = 0.274, SER final = 0.6552 % Kent = 65000, semilla 1: SER al conmutar = 0.156, SER final = 0.0072 % Kent = 65000, semilla 2: SER al conmutar = 0.169, SER final = 0.0154 % Kent = 65000, semilla 3: SER al conmutar = 0.170, SER final = 0.0105 % Kent = 70000, semilla 1: SER al conmutar = 0.117, SER final = 0.0013 % Kent = 70000, semilla 2: SER al conmutar = 0.130, SER final = 0.0022 % Kent = 70000, semilla 3: SER al conmutar = 0.114, SER final = 0.0016 % Kent = 75000, semilla 1: SER al conmutar = 0.104, SER final = 0.0007 % Kent = 75000, semilla 2: SER al conmutar = 0.080, SER final = 0.0011 % Kent = 75000, semilla 3: SER al conmutar = 0.088, SER final = 0.0008 % Kent = 80000, semilla 1: SER al conmutar = 0.071, SER final = 0.0005 % Kent = 80000, semilla 2: SER al conmutar = 0.077, SER final = 0.0007 % Kent = 80000, semilla 3: SER al conmutar = 0.051, SER final = 0.0005 % Kent = 100000, semilla 1: SER al conmutar = 0.009, SER final = 0.0004 % Kent = 100000, semilla 2: SER al conmutar = 0.018, SER final = 0.0004 % Kent = 100000, semilla 3: SER al conmutar = 0.013, SER final = 0.0004 end function r = transceptor(M, tap0, Kent, semilla) rng(semilla); BR = 32e9; L = 250000; N = 2; fs = N*BR; EbNo = 21; k = log2(M); ak = qammod(randi([0 M-1], L, 1), M); h = rcosdesign(0.1, 10, fs/BR, "sqrt"); h = h./sum(h); ych = filter(h, 1, upsample(ak, N)); % canal ch = 1 SNR = 10^((EbNo - 10*log10(N) + 10*log10(k))/10); sigma = sqrt(var(ych)/SNR/2); y = filter(fir1(3, 0.45), 1, ych + sigma*(randn(size(ych)) + 1j*randn(size(ych)))); yn = y*(0.1/std(y)); % AGC NTAPS = 63; step = 2e-3; leak = 1e-3; D = 21; % retardo en símbolos: RRC 10 + AAF 1,5 + tap central 31 = 42,5 muestras C = zeros(NTAPS, 1); C((NTAPS+1)/2) = tap0; buffer = zeros(NTAPS, 1); xk = zeros(L, 1); acierto = zeros(L, 1); for m = 1:N*L buffer(2:end) = buffer(1:end-1); buffer(1) = yn(m); yfilt = C.'*buffer; if mod(m, N) == 0 kk = m/N; slicer_out = decidir(yfilt, M); % = slicer.m, sin los if if kk > D, acierto(kk) = slicer_out == ak(kk-D); end if kk <= Kent && kk > D Ek = ak(kk-D) - yfilt; % entrenamiento: el símbolo conocido else Ek = slicer_out - yfilt; % DD: la decisión del slicer end C = C*(1 - step*leak) + step.*Ek.*conj(buffer); xk(kk) = yfilt; end end T0 = L/2; % se cuenta en la segunda mitad r.SER = 1 - mean(acierto(T0+D:end)); r.SERsw = 1 - mean(acierto(max(D+1, Kent-999):max(D+1, Kent))); r.SERini = 1 - mean(acierto(D+1:D+1000)); r.rms = rms(xk(T0:end)); end function y = decidir(x, M) % El slicer de clase por componente: umbrales en los pares, niveles impares. Lv = sqrt(M); f = @(v) min(max(2*floor(v/2) + 1, -(Lv-1)), Lv-1); y = f(real(x)) + 1j*f(imag(x)); end
Lo que dice la salida, bloque por bloque. El 1 es el script de clase, con la misma SER y la salida achicada. En el 2, QPSK converge con el mismo tap de 16, como anuncia la filmina; y 64-QAM con el tap en 65, la escala justa, arranca con el 84,3 % de decisiones erradas y tampoco converge: el problema del script no es sólo la escala. El receptor no tiene filtro adaptado y el ecualizador lo tiene que aprender; hasta que lo aprende, el ojo está cerrado por la ISI del propio pulso. El 3 es el barrido: con 60 000 símbolos de entrenamiento la DD recibe un ojo con un cuarto de decisiones erradas y se pierde; con 65 000 recibe un sexto y converge, todavía asentándose cuando se empieza a contar; con 80 000 o más llega al piso de 0,0004–0,0007. En esta cadena el umbral está entre 0,17 y 0,25, y hacen falta unos 65 000 a 80 000 símbolos con el paso de clase. Son el 26 % a 32 % de los 250 000 de la simulación, que es lo que la sección 02 llama costo en tasa.
Cinco detalles que muerden si no se los conoce:
D = 21 sale de sumar retardos de grupo: 10 muestras del RRC de 21 taps, 1,5 del AAF de 4 taps y 31 del tap central, 42,5 muestras a T/2, que son 21 símbolos en los instantes pares. finddelay(ak, ak_hat) también da 21, incluso cuando el ecualizador no convergió: sirve para alinear el conteo, no para diagnosticar. Con D = 20 o 22 el entrenamiento también converge, porque 63 taps dan margen, pero más lento: a los 70 000 símbolos la tasa de errores de decisión es 0,329 y 0,368 contra 0,180 con 21.slicer.m es lento. El comentario del script lo dice («este slicer es lentoooo»). El decidir de arriba da exactamente lo mismo —isequal sobre 20 000 puntos al azar— y la corrida baja de 7,2 a 2,3 segundos, que es lo que hace barato el barrido.ber_aprox no es la BER. Divide la SER por , que supone un bit errado por símbolo errado. Con SER 0,94 eso no vale; el comentario del script lo avisa: «Uds. calculen el BER como debe ser».2e-3 del script es 800 veces más chico. Por eso el entrenamiento tarda decenas de miles de símbolos. La filmina propone un objetivo de AGC de 0,3, que multiplica por nueve; el paso que se elija tiene que ir con el objetivo que se elija.