Unidad 5 · El receptor de mínima distancia · la regla, sus regiones de decisión, la SER y los slicers de clase
El slicer es el último bloque del receptor. Le llega un número complejo por símbolo, la salida del filtro adaptado ya diezmada, y devuelve un punto de la constelación. La regla es una sola: el punto más cercano. De ahí sale todo lo demás: que los umbrales caigan en el medio entre niveles, que una QAM cuadrada se pueda decidir eje por eje, que los símbolos del borde se equivoquen menos que los de adentro, y que la constelación tenga que llegar con la escala y la fase con que se la dibujó.
La filmina de la Unidad 5 llega al slicer reduciendo el criterio de mínima distancia: «la decisión de mínima distancia es entonces el símbolo más cercano a la correlación cruzada. El bloque que realiza esta operación es el Slicer». Escrita para la muestra :
Acá es el alfabeto y la muestra a la entrada del slicer, ya en la escala de la constelación: es el de la filmina. En los scripts de la clase esa escala es la de qammod sin normalizar, con niveles y vecinos a distancia 2. Que el término de energía no se puede tirar, ni siquiera cuando parece que sí, está en la nota de la mínima distancia.
Dos cosas se leen directo de la fórmula. El slicer no tiene memoria: decide cada muestra sin mirar las vecinas. Y es una función constante a trozos: a una entrada continua le devuelve uno de valores, así que tira todo lo que la muestra decía además de en qué trozo cayó (sección 08).
La mínima distancia no es una regla elegida por comodidad: es la que minimiza la probabilidad de error, bajo condiciones que conviene tener escritas.
Paso 1: la regla óptima es la MAP. Para equivocarse lo menos posible hay que elegir, entre todos los símbolos, el más probable dado lo que llegó. Por Bayes, , y el denominador es el mismo para todos los candidatos.
Paso 2: con ruido gaussiano, la verosimilitud es una distancia. Si , con gaussiano de media nula, desvío en cada eje e independiente entre ejes:
Maximizar es minimizar menos su logaritmo, y multiplicando por , que es positivo:
Paso 3: con símbolos equiprobables, el segundo término se va. Si para todos, el logaritmo es la misma constante en cada candidato y queda la mínima distancia. Dicho al revés: la mínima distancia es siempre la regla de máxima verosimilitud sobre ruido gaussiano blanco, y es además la de mínima probabilidad de error cuando los símbolos son equiprobables.
De ahí salen las tres condiciones. Ruido gaussiano, con el mismo desvío en I y en Q y sin correlación entre ejes: si no, la verosimilitud no es una distancia euclídea. Símbolos equiprobables: si no, el término corre las fronteras, y para qué lado lo hace es justamente lo que se espera mal (el umbral no está en el medio). Y cada muestra depende de un solo símbolo, que es el modelo de un solo pulso de la unidad: con ISI la mínima distancia bien planteada es sobre la secuencia, y lo que cuesta decidir muestra por muestra está en el slicer tira información que está ahí.
El slicer no calcula distancias en cada muestra: parte el plano una sola vez y después sólo pregunta en qué pedazo cayó. El pedazo del símbolo es su región de decisión:
Paso 1: en una dimensión, el umbral cae en el punto medio. Entre dos niveles vecinos , la muestra está más cerca del primero cuando
El está a los dos lados y se cancela. Dividiendo por , que es positivo y no da vuelta la desigualdad, y factorizando la diferencia de cuadrados:
El umbral es el punto medio, y sólo cuentan los dos niveles que rodean a la muestra: cualquier otro está más lejos que alguno de esos dos. Con los niveles impares de la clase, una -PAM tiene umbrales en los pares, : son las comparaciones de slicer_pam4.m (-2, 0, 2) y de slicer_pam8.m (de -6 a 6). El ejemplo de la filmina, el alfabeto , da umbrales en .
Paso 2: en el plano, la frontera es la mediatriz. Desarrollando igual que antes, el se cancela y queda
que es una recta: la perpendicular a que pasa por el punto medio . La región de es la intersección de los semiplanos que le tocan contra cada vecino, así que es un polígono convexo: una celda de Voronoi. En una QAM cuadrada son cuadrados; en las constelaciones hexagonales de la filmina, hexágonos («con regiones de decisión que le dan nombre»).
Paso 3: las celdas del borde son abiertas. Un símbolo exterior no tiene vecino del lado de afuera, así que su celda sigue hasta el infinito: en PAM los extremos se quedan con una semirrecta, en QAM los lados con una franja y las esquinas con un cuadrante entero. El ruido que empuja un punto exterior hacia afuera no produce ningún error.
Con los umbrales en el medio y vecinos a distancia 2, el margen de cada nivel es 1 hacia cada lado que tenga vecino. Un nivel interior se equivoca si el ruido lo corre más de 1 para cualquiera de los dos lados; uno extremo, sólo hacia adentro. Con , la cola de la gaussiana más allá del umbral:
Ésa es la SER exacta de la -PAM: el promedio sobre los niveles equiprobables, con los dos extremos pagando la mitad. En una QAM cuadrada un símbolo se decide bien cuando sus dos coordenadas se deciden bien, y como el ruido de I y el de Q son independientes, las probabilidades se multiplican. Hay entonces tres clases de punto: interior, con dos vecinas por eje; lado, con una sola en uno de los ejes; y esquina, con una sola en los dos:
Medido en 16-QAM a dB, que con los niveles de la clase es por eje, sobre dos millones de símbolos decididos con my_slicer.m:
| clase | puntos | cerrada | medida | errores |
|---|---|---|---|---|
| interior | 4 | 4,8710 · 10⁻² | 4,9135 · 10⁻² | 24 532 |
| lado | 8 | 3,6685 · 10⁻² | 3,6641 · 10⁻² | 36 628 |
| esquina | 4 | 2,4507 · 10⁻² | 2,4471 · 10⁻² | 12 262 |
Una esquina se equivoca la mitad que un punto interior —1,988 veces menos, en cerrado— porque tiene la mitad de vecinas. Las diferencias entre lo medido y lo cerrado son del orden de la raíz del número de errores, que es lo que se espera de una tirada. Y el promedio de las tres clases, pesadas por cuántos puntos tiene cada una, es la SER de la QAM:
La distancia al cuadrado se parte en dos sumandos, uno por eje:
Si el alfabeto es un producto —toda combinación de un nivel de I con un nivel de Q es un símbolo—, cada sumando se minimiza por su cuenta y el mínimo de la suma es la suma de los mínimos. El slicer de la QAM cuadrada son entonces dos slicers de -PAM, uno por eje, y las regiones son la grilla de rectas en los pares. Es exactamente lo que hace la cátedra, de dos maneras. my_slicer.m (Unidad 4) redondea cada eje al impar más cercano, round((x + (√M−1))/2), y satura los que se pasan del último nivel. slicer_qam16.m (Unidad 6) es slicer_pam4(real(x)) + 1j*slicer_pam4(imag(x)), con la cadena de if contra los umbrales. Redondeo o umbrales, es la misma partición: sobre las mismas cien mil muestras de 4, 16 y 64-QAM ninguna de las dos decide distinto que la mínima distancia contra los puntos, en ningún símbolo (sección 10).
Y el argumento dice también cuándo no vale: cuando el alfabeto no es un producto. La filmina muestra las constelaciones en cruz, «para agrupaciones impares de bits por símbolo». La 32-QAM de qammod es una: niveles en cada eje, pero sin las cuatro esquinas . Un slicer por ejes puede contestar una de esas esquinas, que no es ningún símbolo. Las regiones verdaderas parten cada esquina vacía por la diagonal, entre y , y una diagonal no la arma ningún par de umbrales por eje. A 10 dB, sobre cuatro millones de símbolos, la mínima distancia exacta deja una SER de 4,0794·10⁻² y la decisión por ejes 4,3825·10⁻², con 12 490 respuestas fuera del alfabeto. La decisión por ejes sí tiene forma cerrada, porque sus celdas son rectángulos, y da 4,3876·10⁻²; la exacta no, por la diagonal. Los dos slicers de la cátedra ni lo intentan: my_slicer corta con un error y slicer.m con assert(0). qamdemod, que decide por mínima distancia, coincide con la exacta en los cuatro millones.
Los umbrales del slicer son números fijos: 0, ±2, ±4. Están bien puestos sólo si la constelación llega con la escala con que se la dibujó, vecinos a distancia 2, y con los ejes derechos. Si llega , los centros de las nubes se mueven y los umbrales no. Pasado cierto punto, un símbolo decide mal sin una sola muestra de ruido.
La escala. El nivel extremo cruza el último umbral cuando baja de , y el penúltimo cruza hacia afuera cuando pasa . La ventana sale de −3,52 a +6,02 dB en 16-QAM y de −1,34 a +1,58 dB en 64-QAM; en QPSK no hay ventana, porque decide por signo. La cuenta entera, y quién pone esa escala en la cadena de la Unidad 6, está en el control automático de ganancia. La 32-QAM en cruz, medida por bisección, aguanta de −1,94 a +2,50 dB.
La fase. Al girar la constelación, el punto que primero sale de su celda es una esquina. La esquina es ; girada , su parte real vale , que baja con y tiene que quedar por encima del último umbral, . Despejando:
Da 45° en QPSK, 16,87° en 16-QAM y 7,69° en 64-QAM. La bisección sobre los puntos con la mínima distancia exacta da lo mismo a cuatro decimales, 16,8745° y 7,6926°: la esquina es de verdad la primera en caer. La 32-QAM en cruz aguanta 10,90°. Corregir la fase es trabajo de la recuperación de portadora, y la filmina de la unidad muestra los dos casos que la rompen: el error de fase constante, que deja la constelación girada, y el de frecuencia, que la hace girar.
Con ruido no hace falta llegar al borde de la ventana para pagar. A 8 dB, 16-QAM con 10° de fase —menos que los 16,87° que aguanta sin ruido— pasa de una SER de 3,6647·10⁻² a 1,3949·10⁻¹, 3,8 veces más: las esquinas giradas quedaron a 0,43 del umbral en vez de a 1. Medido sobre cuatro millones de símbolos, 1,3940·10⁻¹.
En 16-QAM, sin ruido, se puede llevar la fase hasta 16,5° y no cambia nada: las esquinas se acercan a su umbral pero no lo cruzan, y el contador sigue en cero. En 17° caen las cuatro esquinas juntas, sin una sola muestra de ruido. Con 64-QAM pasa lo mismo antes de los 8°. Con ruido el efecto aparece mucho antes del borde: con y la fase en 10°, los errores de cada esquina se juntan del lado que el giro acercó al umbral, y la SER pasa de 3,9·10⁻² a 1,4·10⁻¹. Con la escala pasa lo mismo, pero repartido: achicar la constelación aprieta todos los niveles contra los umbrales de adentro, y agrandarla saca a los penúltimos de su celda. Y las tres lecturas de la SER cuentan la sección 04: con dB y , las esquinas fallan la mitad que los puntos interiores.
La 32-QAM en cruz es la única donde el interruptor cambia algo. Con la mínima distancia, las esquinas vacías quedan partidas por la diagonal. Decidiendo cada eje por separado, esas esquinas pasan a ser la celda de un símbolo que no existe, y toda muestra que cae ahí es un error aunque haya caído más cerca de un punto válido que de cualquier otro. En las tres cuadradas la grilla por ejes y la de mínima distancia son la misma, y las lecturas no se mueven.
Las fórmulas de la sección 04 están en función de , el desvío por eje en las unidades de la constelación. Para pasarlas a alcanza con , con , y la energía media de los niveles impares: en -PAM y en -QAM. Queda:
y en QAM . Ninguna de las dos aproxima nada; son exactas. Contra la simulación, cuatro millones de símbolos por fila, cada fila con su semilla, decididos con my_slicer.m y en 4-PAM con slicer_pam4.m:
| constelación | Eb/N0 | cerrada | medida | errores |
|---|---|---|---|---|
| 4-PAM | 8 dB | 1,8494 · 10⁻² | 1,8439 · 10⁻² | 73 757 |
| 4-PAM | 12 dB | 2,7732 · 10⁻⁴ | 2,8850 · 10⁻⁴ | 1154 |
| QPSK | 6 dB | 4,7709 · 10⁻³ | 4,7880 · 10⁻³ | 19 152 |
| QPSK | 8 dB | 3,8178 · 10⁻⁴ | 3,8475 · 10⁻⁴ | 1539 |
| 16-QAM | 8 dB | 3,6647 · 10⁻² | 3,6848 · 10⁻² | 147 393 |
| 16-QAM | 12 dB | 5,5456 · 10⁻⁴ | 5,3075 · 10⁻⁴ | 2123 |
| 64-QAM | 12 dB | 5,7493 · 10⁻² | 5,7476 · 10⁻² | 229 905 |
| 64-QAM | 16 dB | 1,3026 · 10⁻³ | 1,2535 · 10⁻³ | 5014 |
Seis de las ocho filas caen dentro de lo que una tirada mueve, que es del orden de la raíz del número de errores. Dos quedan abajo por más: 16-QAM a 12 dB por 2,0 de esas raíces y 64-QAM a 16 dB por 2,7. El control es volver a tirar: con diez semillas más, cuarenta millones de símbolos, 16-QAM a 12 dB da 5,5635·10⁻⁴ contra 5,5456·10⁻⁴ y 64-QAM a 16 dB da 1,3071·10⁻³ contra 1,3026·10⁻³: las dos por arriba de la cerrada, a 0,5 y 0,8 raíces. Lo de la tabla era la tirada, no la fórmula. berawgn devuelve esta misma SER como segunda salida, [ber, ser] = berawgn(EbNo, 'qam', M); eso no la verifica, porque es la misma fórmula, pero ahorra escribirla. Por qué la BER no es la SER dividida por está en BER y SER no son la misma curva.
El slicer entrega una decisión dura: un punto de la constelación y nada más. Una muestra a 0,05 del umbral y otra a 2,5 salen iguales, y la diferencia entre las dos —cuánto confiar en cada decisión— se pierde ahí. En PAM-2 con niveles lo que se tira se puede escribir: el logaritmo del cociente de verosimilitudes es
Su signo es la decisión del slicer; su módulo, la confianza. Una decisión blanda entrega entero. Si después del slicer no viene nada, da igual: hay que decidir de todos modos. Si viene un decodificador de canal o un detector de secuencias, que combinan varias muestras para decidir, la confianza vale, y tirarla cuesta. Cuánto cuesta cuando hay interferencia entre símbolos, con el mismo canal y el mismo ruido, está en el slicer tira información que está ahí. Del lado de MATLAB, qamdemod puede devolver logaritmos de verosimilitud en vez de símbolos, con la opción 'OutputType'.
En los transceptores de la Unidad 6 el slicer no está sólo al final: está adentro del lazo del ecualizador. El error que adapta los taps es Ek = slicer_out - yfilt, la salida del slicer menos su entrada. En modo dirigido por decisiones el slicer pone la referencia: cuando decide bien, el lazo hace lo mismo que con entrenamiento; cuando se equivoca, el error salta hacia el vecino que eligió, a distancia 2 o más. Por eso es el lugar donde se ve todo lo de la sección 06. La escala de la salida del ecualizador tiene que ser la del slicer, y si arranca corta, las decisiones de adentro son coherentes con una constelación achicada y el lazo se queda ahí. Cómo pasa, y cuánto entrenamiento hace falta para que no pase, está en entrenamiento y modo dirigido por decisiones. Es también la razón de que las funciones de la Unidad 6 sean escalares: el lazo las llama de a un símbolo por vez.
Los slicers de la cátedra sobre la misma nube, contra la mínima distancia exacta y contra qamdemod; la SER contra la cerrada; los bordes; la escala y la fase; y la cruz. Supone las carpetas de scripts de la Unidad 4 y de la Unidad 6 al lado, para el addpath. Lo que figura como comentario es la salida real de correrlo en R2026a.
%% 0. Los slicers de clase addpath('Unidad 4 - Sistemas PAM vs QAM/Scripts de clase') % my_slicer.m addpath('Unidad 6 - Ecualizadores Adaptativos/Scripts de clase') % slicer.m y familia Q = @(x) 0.5*erfc(x/sqrt(2)); %% 1. La misma nube, cinco decisores for M = [4 16 64] rng(1) A = qammod(0:M-1, M).'; % niveles impares, sin normalizar k = log2(M); Es = mean(abs(A).^2); % 2(M-1)/3 EbN0_dB = 2*log2(M); % 4, 8 y 12 dB s = sqrt(Es/(2*k*10^(EbN0_dB/10))); % desvío por eje N = 1e5; a = A(randi(M, N, 1)); y = a + s*(randn(N,1) + 1j*randn(N,1)); [~, i] = min(abs(y - A.'), [], 2); % mínima distancia contra los M puntos d0 = A(i); d1 = my_slicer(y, M); % Unidad 4: redondeo y saturación d2 = zeros(N,1); % Unidad 6: if por if, de a un símbolo for n = 1:N, d2(n) = slicer(y(n), M); end d3 = qammod(qamdemod(y, M), M); % Communications Toolbox d4 = slicer(y, M); % la de Unidad 6 con un vector entero fprintf('M=%2d %2d dB SER %.4f | distintas de la exacta: my_slicer %d, slicer %d, qamdemod %d | slicer(vector): %d valor(es)\n', ... M, EbN0_dB, mean(d0 ~= a), sum(d1 ~= d0), sum(d2 ~= d0), sum(d3 ~= d0), numel(d4)); end % M= 4 4 dB SER 0.0251 | distintas de la exacta: my_slicer 0, slicer 0, qamdemod 0 | slicer(vector): 1 valor(es) % M=16 8 dB SER 0.0367 | distintas de la exacta: my_slicer 0, slicer 0, qamdemod 0 | slicer(vector): 1 valor(es) % M=64 12 dB SER 0.0574 | distintas de la exacta: my_slicer 0, slicer 0, qamdemod 0 | slicer(vector): 1 valor(es) %% 2. Los empates: todos van para arriba t = [-2 0 2]; [TI, TQ] = meshgrid(t, t); yt = TI(:) + 1j*TQ(:); fprintf('empates 16-QAM: my_slicer=slicer %d, my_slicer=qamdemod %d (de %d)\n', ... sum(my_slicer(yt,16) == arrayfun(@(v) slicer(v,16), yt)), ... sum(my_slicer(yt,16) == qammod(qamdemod(yt,16),16)), numel(yt)) fprintf('my_slicer(0,16) = %s slicer(0,16) = %s my_slicer(0,2) = %g\n', ... num2str(my_slicer(0,16)), num2str(slicer(0,16)), my_slicer(0,2)) % empates 16-QAM: my_slicer=slicer 9, my_slicer=qamdemod 9 (de 9) % my_slicer(0,16) = 1+1i slicer(0,16) = 1+1i my_slicer(0,2) = 0 %% 3. SER cerrada contra medida fprintf('\n M Eb/N0 cerrada medida errores\n') casos = [4 6; 4 8; 16 8; 16 12; 64 12; 64 16]; % QAM: [M, Eb/N0] for c = 1:size(casos,1) M = casos(c,1); EbN0_dB = casos(c,2); L = sqrt(M); k = log2(M); rng(10 + c) A = qammod(0:M-1, M).'; s = sqrt(2*(M-1)/3/(2*k*10^(EbN0_dB/10))); a = A(randi(M, 4e6, 1)); y = a + s*(randn(4e6,1) + 1j*randn(4e6,1)); e = sum(my_slicer(y, M) ~= a); PL = 2*(1 - 1/L)*Q(1/s); % la PAM de cada eje fprintf('QAM %2d %2d dB %.4e %.4e %6d\n', M, EbN0_dB, 2*PL - PL^2, e/4e6, e) end for c = 1:2 % 4-PAM, con slicer_pam4 de clase EbN0_dB = 4*c + 4; rng(20 + c) lv = [-3 -1 1 3]; s = sqrt(5/(2*2*10^(EbN0_dB/10))); a = lv(randi(4, 4e6, 1)).'; y = a + s*randn(4e6, 1); e = sum(arrayfun(@slicer_pam4, y) ~= a); fprintf('PAM 4 %2d dB %.4e %.4e %6d\n', EbN0_dB, 2*(1 - 1/4)*Q(1/s), e/4e6, e) end % M Eb/N0 cerrada medida errores % QAM 4 6 dB 4.7709e-03 4.7880e-03 19152 % QAM 4 8 dB 3.8178e-04 3.8475e-04 1539 % QAM 16 8 dB 3.6647e-02 3.6848e-02 147393 % QAM 16 12 dB 5.5456e-04 5.3075e-04 2123 % QAM 64 12 dB 5.7493e-02 5.7476e-02 229905 % QAM 64 16 dB 1.3026e-03 1.2535e-03 5014 % PAM 4 8 dB 1.8494e-02 1.8439e-02 73757 % PAM 4 12 dB 2.7732e-04 2.8850e-04 1154 %% 4. Los bordes: interior, lado y esquina en 16-QAM rng(2); M = 16; A = qammod(0:M-1, M).'; s = sqrt(10/(2*4*10^(8/10))); a = A(randi(M, 2e6, 1)); y = a + s*(randn(2e6,1) + 1j*randn(2e6,1)); err = my_slicer(y, M) ~= a; clase = (abs(real(a)) == 3) + (abs(imag(a)) == 3); % 0, 1 o 2 coordenadas de borde q = Q(1/s); cerr = [1-(1-2*q)^2, 1-(1-2*q)*(1-q), 1-(1-q)^2]; nombre = {'interior', 'lado', 'esquina'}; for c = 0:2 fprintf('%-8s cerrada %.4e medida %.4e (%d errores)\n', nombre{c+1}, cerr(c+1), mean(err(clase==c)), sum(err(clase==c))) end % interior cerrada 4.8710e-02 medida 4.9135e-02 (24532 errores) % lado cerrada 3.6685e-02 medida 3.6641e-02 (36628 errores) % esquina cerrada 2.4507e-02 medida 2.4471e-02 (12262 errores) %% 5. Sin ruido: cuánta fase y cuánta escala aguanta for M = [4 16 64 32] A = qammod(0:M-1, M).'; bien = @(g) all(minimadist(g*A, A) == A); th = biseccion(@(t) bien(exp(1j*t)), 0, pi/4 - 1e-12); gb = 1/biseccion(@(t) bien(1/t), 1, 100); ga = biseccion(@(t) bien(t), 1, 100); fprintf('M=%2d fase %.4f grados escala de %+.2f a %+.2f dB\n', M, th*180/pi, 20*log10(gb), 20*log10(ga)) end L = [4 8]; fprintf('cerrada: %.4f %.4f grados\n', acosd((L-2)./(sqrt(2)*(L-1))) - 45) % M= 4 fase 45.0000 grados escala de -40.00 a +40.00 dB % M=16 fase 16.8745 grados escala de -3.52 a +6.02 dB % M=64 fase 7.6926 grados escala de -1.34 a +1.58 dB % M=32 fase 10.9042 grados escala de -1.94 a +2.50 dB % cerrada: 16.8745 7.6926 grados %% 6. Con ruido, una fase que sola no rompía nada rng(3); M = 16; A = qammod(0:M-1, M).'; s = sqrt(10/(2*4*10^(8/10))); a = A(randi(M, 4e6, 1)); n = s*(randn(4e6,1) + 1j*randn(4e6,1)); for th = [0 10] c = A*exp(1j*th*pi/180); % los centros girados pc = celda(real(c), real(A), s) .* celda(imag(c), imag(A), s); fprintf('16-QAM 8 dB, fase %2d grados: SER cerrada %.4e, medida %.4e\n', ... th, 1 - mean(pc), mean(my_slicer(a*exp(1j*th*pi/180) + n, M) ~= a)) end % 16-QAM 8 dB, fase 0 grados: SER cerrada 3.6647e-02, medida 3.6635e-02 % 16-QAM 8 dB, fase 10 grados: SER cerrada 1.3949e-01, medida 1.3940e-01 %% 7. La cruz: 32-QAM no es un producto de dos PAM A = qammod(0:31, 32).'; try, my_slicer(A(1), 32); catch err, disp(err.message), end try, slicer(A(1), 32); catch err, disp(err.message), end porEje = @(v) min(max(2*round((v-1)/2)+1, -5), 5); % niveles ±1, ±3, ±5 por eje rng(5); s = sqrt(20/(2*5*10^(10/10))); a = A(randi(32, 4e6, 1)); y = a + s*(randn(4e6,1) + 1j*randn(4e6,1)); d0 = minimadist(y, A); d1 = porEje(real(y)) + 1j*porEje(imag(y)); d3 = qammod(qamdemod(y, 32), 32); fprintf('32-QAM 10 dB: SER exacta %.4e, por ejes %.4e (%d fuera del alfabeto), qamdemod distinta de la exacta: %d\n', ... mean(d0 ~= a), mean(d1 ~= a), sum(~ismember(d1, A)), sum(d3 ~= d0)) % The modulation levels must be M=2^k with even k (or k=1) % Assertion failed. % 32-QAM 10 dB: SER exacta 4.0794e-02, por ejes 4.3825e-02 (12490 fuera del alfabeto), qamdemod distinta de la exacta: 0 function d = minimadist(y, A) % mínima distancia, de a bloques d = zeros(size(y)); for p = 1:2e4:numel(y) r = p:min(p+2e4-1, numel(y)); [~, i] = min(abs(y(r) - A.'), [], 2); d(r) = A(i); end end function p = celda(c, a, s) % P(nivel a decidido bien | centro c), umbrales 0 y ±2 lo = a - 1; hi = a + 1; lo(a == -3) = -Inf; hi(a == 3) = Inf; p = 0.5*erfc((lo - c)/(s*sqrt(2))) - 0.5*erfc((hi - c)/(s*sqrt(2))); end function x = biseccion(f, a, b) % f(a) verdadero; el último verdadero if f(b), x = b; return, end for it = 1:60, c = (a+b)/2; if f(c), a = c; else, b = c; end, end x = a; end
Lo que dice la salida, y los detalles que muerden:
my_slicer redondea y slicer_pam4 compara, y sobre las mismas muestras coinciden con la mínima distancia exacta y con qamdemod en el cien por ciento, en las tres constelaciones cuadradas (bloque 1). La equivalencia no es casual: round((x + √M − 1)/2) cambia de valor justo en los pares, que son los umbrales.slicer(y, M) con un vector de cien mil muestras devuelve un solo valor y ningún error: el if de MATLAB con un vector pregunta si se cumple para todos los elementos. Dentro del for del ecualizador andan bien; para decidir un vector entero, my_slicer.my_slicer, con slicer y con qamdemod, en los nueve cruces de umbrales de 16-QAM (bloque 2). Con ruido continuo pasa con probabilidad cero, pero no con señales cuantizadas.my_slicer en PAM-2. my_slicer(0, 2) da 0, que no es un símbolo: esa rama copia la parte real y pisa sólo los valores positivos y los negativos. Las ramas de QAM no tienen el problema: my_slicer(0, 16) da 1+1i.my_slicer, sólo o con par; slicer.m, sólo 4, 16 y 64. slicer_qam.m sólo anda con : con otro valor corta con Unrecognized function or variable 'yr', porque arma la salida afuera del if. Ningún script de la Unidad 6 la llama. Para la cruz, qamdemod.qammod sin opciones. Una constelación generada con 'UnitAveragePower', true llega 10 dB más chica en 16-QAM, muy afuera de la ventana de −3,52 dB, y los dos slicers de la cátedra la deciden mal sin ruido. qamdemod no la salva sola: hay que pasarle la misma opción.qamdemod).my_slicer redondea, slicer_pam4 compara: deciden igual. Los de la Unidad 6 son escalares; my_slicer(0, 2) da 0.