Bitácora · DCSS · Concepto

El slicer

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ó.

01 · La definición

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 k:

a^k=arg mina∈𝒜|yk−a|2

Acá 𝒜 es el alfabeto y yk la muestra a la entrada del slicer, ya en la escala de la constelación: es el y/Eh de la filmina. En los scripts de la clase esa escala es la de qammod sin normalizar, con niveles ±1,±3,… y vecinos a distancia 2. Que el término de energía |a|2 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 M valores, así que tira todo lo que la muestra decía además de en qué trozo cayó (sección 08).

02 · Por qué decide así

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, P(a∣y)=p(a)f(y∣a)/f(y), y el denominador es el mismo para todos los candidatos.

Paso 2: con ruido gaussiano, la verosimilitud es una distancia. Si y=a+n, con n gaussiano de media nula, desvío σ en cada eje e independiente entre ejes:

f(y∣a)=12πσ2e−|y−a|2/(2σ2)

Maximizar p(a)f(y∣a) es minimizar menos su logaritmo, y multiplicando por 2σ2, que es positivo:

a^MAP=arg mina∈𝒜[|y−a|2−2σ2lnp(a)]

Paso 3: con símbolos equiprobables, el segundo término se va. Si p(a)=1/M 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 −2σ2lnp(a) 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í.

03 · Las regiones de decisión

El slicer no calcula M 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 a es su región de decisión:

Da={z:|z−a|≤|z−a′|∀a′∈𝒜}

Paso 1: en una dimensión, el umbral cae en el punto medio. Entre dos niveles vecinos ai<ai+1, la muestra está más cerca del primero cuando

(y−ai)2<(y−ai+1)2⟺2y(ai+1−ai)<ai+12−ai2

El y2 está a los dos lados y se cancela. Dividiendo por 2(ai+1−ai), que es positivo y no da vuelta la desigualdad, y factorizando la diferencia de cuadrados:

y<ai+ai+12

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 L-PAM tiene L−1 umbrales en los pares, 0,±2,…,±(L−2): 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 {−1,0,1}, da umbrales en ±1/2.

Paso 2: en el plano, la frontera es la mediatriz. Desarrollando |z−a|2=|z−a′|2 igual que antes, el |z|2 se cancela y queda

Re{z(a′−a)∗}=|a′|2−|a|22

que es una recta: la perpendicular a a′−a que pasa por el punto medio (a+a′)/2. La región de a 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.

04 · Los bordes: una sola vecina

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 q=Q(1/σ), la cola de la gaussiana más allá del umbral:

Pinterior=2q,Pextremo=q,PL=(L−2)2q+2qL=2(1−1L)Q(1/σ)

Ésa es la SER exacta de la L-PAM: el promedio sobre los L 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:

Pinterior=1−(1−2q)2,Plado=1−(1−2q)(1−q),Pesquina=1−(1−q)2

Medido en 16-QAM a Eb/N0=8 dB, que con los niveles de la clase es σ=0,4451 por eje, sobre dos millones de símbolos decididos con my_slicer.m:

clasepuntoscerradamedidaerrores
interior44,8710 · 10⁻²4,9135 · 10⁻²24 532
lado83,6685 · 10⁻²3,6641 · 10⁻²36 628
esquina42,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:

Ps=1−(1−PL)2=2PL−PL2,L=M

05 · El slicer por ejes

La distancia al cuadrado se parte en dos sumandos, uno por eje:

|y−a|2=(yI−aI)2+(yQ−aQ)2

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 L-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 M 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 ±1,±3,±5 en cada eje, pero sin las cuatro esquinas (±5,±5). 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 (5,3) y (3,5), 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.

06 · La escala y la fase

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 y=gejθa+n, 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 g(L−1) cruza el último umbral cuando g baja de (L−2)/(L−1), y el penúltimo cruza hacia afuera cuando g pasa (L−2)/(L−3). 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 (L−1)(1+j) es (L−1)2ejπ/4; girada θ, su parte real vale (L−1)2cos(θ+π/4), que baja con θ y tiene que quedar por encima del último umbral, L−2. Despejando:

θmáx=arccosL−22(L−1)−π4

Da 45° en QPSK, 16,87° en 16-QAM y 7,69° en 64-QAM. La bisección sobre los M 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⁻¹.

Simulación Las celdas fijas y la constelación que llega — el plano de la muestra que decide el slicer, con los niveles de la clase: vecinos a distancia 2, σ por eje en esas mismas unidades. Las líneas son las fronteras de mínima distancia; las cruces, los puntos de la constelación; los puntos azules, adónde llegan con la escala y la fase que elijas. La nube son 2500 símbolos con ruido, en gris los bien decididos y en rojo los mal decididos; las lecturas cuentan cuarenta mil. Arranca sin ruido, con la escala y la fase justas: no falla ninguno. Girala.
mal decididos sin ruido — SER medida — SER cerrada — interior · lado · esquina — Eb/N0 — aguanta sin ruido — fuera del alfabeto —

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 σ=0,45 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 g=0 dB y θ=0, 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.

07 · La SER, cerrada contra la simulación

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 Eb/N0 alcanza con N0=2σ2, Eb=Es/k con k=log2M, y la energía media de los niveles impares: (L2−1)/3 en L-PAM y 2(M−1)/3 en M-QAM. Queda:

Ps|PAM=2(1−1L)Q(6kL2−1EbN0),PL|QAM=2(1−1M)Q(3kM−1EbN0)

y en QAM Ps=2PL−PL2. 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ónEb/N0cerradamedidaerrores
4-PAM8 dB1,8494 · 10⁻²1,8439 · 10⁻²73 757
4-PAM12 dB2,7732 · 10⁻⁴2,8850 · 10⁻⁴1154
QPSK6 dB4,7709 · 10⁻³4,7880 · 10⁻³19 152
QPSK8 dB3,8178 · 10⁻⁴3,8475 · 10⁻⁴1539
16-QAM8 dB3,6647 · 10⁻²3,6848 · 10⁻²147 393
16-QAM12 dB5,5456 · 10⁻⁴5,3075 · 10⁻⁴2123
64-QAM12 dB5,7493 · 10⁻²5,7476 · 10⁻²229 905
64-QAM16 dB1,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 k está en BER y SER no son la misma curva.

08 · Lo que el slicer tira

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 ±1 lo que se tira se puede escribir: el logaritmo del cociente de verosimilitudes es

Λ(y)=lnf(y∣+1)f(y∣−1)=2yσ2

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'.

09 · El slicer dentro del lazo

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.

10 · El análisis en MATLAB

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:

Para tener a mano

  1. El slicer decide a^k=arg min|yk−a|2, muestra por muestra y sin memoria, sobre yk ya en la escala de la constelación.
  2. Es la regla ML sobre ruido gaussiano blanco y circular, y la de mínima probabilidad de error si además los símbolos son equiprobables. Con priors distintos, las fronteras se corren.
  3. Las regiones son celdas de Voronoi: fronteras en las mediatrices, umbrales en los puntos medios. Con los niveles de la clase, en los pares: 0,±2,…
  4. Los símbolos del borde tienen celdas abiertas y se equivocan menos: PL=2(1−1/L)Q(1/σ) en PAM y Ps=2PL−PL2 en QAM cuadrada, las dos exactas.
  5. La QAM cuadrada se decide eje por eje porque el alfabeto es un producto. La cruz no lo es: ahí hace falta la mínima distancia de verdad (qamdemod).
  6. Los umbrales son fijos: escala de −3,52 a +6,02 dB en 16-QAM y de −1,34 a +1,58 dB en 64-QAM; fase hasta arccos[(L−2)/(2(L−1))]−45°: 16,87° y 7,69°. Sin ruido; con ruido se paga antes.
  7. my_slicer redondea, slicer_pam4 compara: deciden igual. Los de la Unidad 6 son escalares; my_slicer(0, 2) da 0.
← Anterior Siguiente → Inicio
Relacionados El mapper y el demapper La modulación QAM El control automático de ganancia Entrenamiento y modo dirigido por decisiones Mínima distancia no es máxima correlación El slicer tira información que está ahí El umbral no está en el medio