Unidad 4 · Transmisión en banda base y banda pasante · el alfabeto, el mapper, la energía, el espectro y cómo se genera en MATLAB
La PAM manda la información en la altura de un pulso. El mapper agrupa los bits de a y le asigna a cada grupo uno de niveles; el filtro de transmisión pone una copia del pulso por símbolo, escalada por ese nivel. Todo lo demás sale de ahí: cuántos bits por segundo, cuánta energía por símbolo, qué tan juntos quedan los niveles y cuánto espectro se ocupa.
El bloque transmisor de la filmina 2 tiene dos piezas: el mapper, que convierte los bits en símbolos , y el filtro de transmisión, cuya respuesta al impulso es la forma de pulso . Sale un símbolo cada segundos, y la señal es la suma de sus pulsos:
En PAM los símbolos son reales y salen de un alfabeto de niveles equiespaciados y simétricos alrededor de cero. El de la filmina 3 es , y en general:
La filmina 2 y los scripts PSD_PAM2.m y PSD_PAM4.m usan el mismo alfabeto dividido por , para que el pico sea 1 V: PAM-4 queda en y . Es la misma constelación con otra escala. Lo único que la escala cambia es la energía, y la comparación honesta entre constelaciones se hace a energía fija (sección 04).
Con niveles, cada símbolo lleva
donde es la tasa de símbolos, en baudios. Es la tabla de la filmina: a 1 Gbaudio, PAM-2, PAM-4, PAM-8 y PAM-16 dan 1, 2, 3 y 4 Gb/s. La fórmula supone que los símbolos son equiprobables e independientes y que el mapper no agrega redundancia. PAM-5, la del script PSD_PAM5.m y la de 1000BASE-T, no tiene una cantidad entera de bits: .
El mapper es una tabla: toma bits y devuelve un nivel. Con niveles y bits equiprobables no gana ni pierde información. Lo que sí decide es qué palabra queda al lado de qué palabra sobre la recta, y eso importa en el receptor: con ruido gaussiano, casi todos los errores confunden un nivel con el de al lado. La tabla de la filmina para PAM-4, de abajo hacia arriba:
| nivel | natural | Gray |
|---|---|---|
| −1 | 11 | 10 |
| −0,33 | 10 | 11 |
| 0,33 | 01 | 01 |
| 1 | 00 | 00 |
En el orden natural, confundir 0,33 con −0,33 rompe los dos bits: 01 contra 10. En Gray la misma confusión es 01 contra 11, y rompe uno solo. Ésa es toda la definición: dos niveles vecinos difieren en un bit. Para cualquier se construye igual. Si cuenta la posición desde el nivel más alto, con , el nivel es y su etiqueta es
el o exclusivo bit a bit de con él mismo corrido un lugar a la derecha. Pasar de a da vuelta los bits de abajo de hasta el primer cero, y el corrimiento hace que todos esos cambios se cancelen de a pares salvo uno.
Sin Gray el costo del error al vecino no es fijo: depende del par. El peor es el del medio, entre 01…1 y 10…0, que difieren en los bits. Promediado sobre los pares de vecinos, el orden natural cuesta
que da 1,333 con , 1,571 con 8 y 1,733 con 16, y tiende a 2. Gray lo deja en 1 para todo . No cambia cuántos símbolos se deciden mal: cambia cuántos bits cuesta cada uno. De ahí sale la regla , que es una aproximación y tarda en cumplirse cuando la constelación es grande.
Con los niveles equiprobables, la energía media por símbolo es el promedio de los cuadrados. Como el alfabeto es simétrico, alcanza con sumar la mitad positiva y duplicarla:
Paso 1: es una suma de cuadrados impares. Desarrollando el cuadrado quedan tres sumas conocidas, , y :
Con da , y la fórmula da .
Paso 2: poner . Entonces , y la suma vale .
Paso 3: multiplicar por . El se cancela:
Con los niveles a una distancia cualquiera en vez de 2, todo se escala por :
El alfabeto de la cátedra tiene , así que la segunda forma da la primera. Para PAM-2, 4, 8 y 16 son 1, 5, 21 y 85. La segunda vale también para impar: los niveles de PSD_PAM5.m van de −1 a 1 cada 0,5, y con y da 0,5. Y la escala de pico 1 V de la filmina 2, , deja PAM-4 en . Medida sobre símbolos sorteados, la energía cae a menos de dos errores estándar de la fórmula (sección 07).
La forma cerrada dice lo que la tabla sugiere: la energía crece como . Los niveles nuevos no se meten en el medio: se cuelgan de las puntas, y en un promedio de cuadrados las puntas pesan más. Cuánto pesa eso sobre el espectro, y por qué no lo ensancha, es la nota de los niveles y el espectro.
La distancia mínima es la menor separación entre dos niveles, y es la que decide cuánto ruido aguanta el enlace: el receptor se equivoca cuando el ruido empuja la muestra más allá de la mitad del camino al vecino. En el alfabeto de la cátedra vale para todo , pero eso no es una comparación: PAM-16 la consigue gastando 85 veces la energía de PAM-2.
La comparación honesta es a energía fija por bit, , que es lo que cuesta mandar la misma información. La cifra que no depende de la escala es cuánta distancia al cuadrado se compra con cada unidad de energía por bit:
| M | bits por símbolo | Es | d²min/Eb | energía extra por bit |
|---|---|---|---|---|
| 2 | 1 | 1 | 4 | 0 dB |
| 4 | 2 | 5 | 1,6 | 3,98 dB |
| 8 | 3 | 21 | 0,5714 | 8,45 dB |
| 16 | 4 | 85 | 0,1882 | 13,27 dB |
La última columna es cuánta más energía por bit necesita cada constelación para tener la misma distancia mínima que PAM-2: . Todo es forma cerrada. Cada bit agregado cuesta 3,98, 4,47 y 4,82 dB, y el costo tiende a 6,02 dB: duplicar multiplica casi por cuatro, y el del denominador crece de a uno.
Ése es el compromiso entre tasa, ancho de banda y robustez de la filmina 3. Hay dos maneras de subir . Achicar choca con el ancho de banda: el espectro escala con . Agrandar choca con la potencia y el ruido: la tabla de arriba. Leído al revés, con la tasa de bits fija, PAM- manda símbolos veces más largos y ocupa veces menos banda que PAM-2, a cambio de esos decibeles. Con el canal limitado en banda, la filmina tacha la primera opción y queda sólo la segunda.
Al pasar de PAM-2 a PAM-16 los 24 bits se reagrupan en 24, 12, 8 y 6 símbolos. Con la misma tasa de bits cada símbolo dura veces más, y la señal cambia de nivel veces menos seguido: ésa es la banda que se ahorra. Con la misma tasa de símbolos la señal termina antes: en el mismo tiempo cabrían veces más bits. En los dos casos, a la misma energía por bit los niveles se aprietan, y la distancia mínima al cuadrado cae de 4 a 0,19. Sacando el Gray, el salto del medio de la constelación pasa a costar los bits.
Si los símbolos tienen media nula y no están correlacionados, la densidad espectral de potencia de tiene forma cerrada. La cuenta sale de ver al transmisor como un filtro excitado por el tren de impulsos : con símbolos blancos ese tren tiene PSD plana, , y el filtro la multiplica por :
La constelación entra por un solo número, , que multiplica a toda la curva. La forma del espectro, dónde cae y dónde termina, la pone el pulso. Por eso, a potencia fija, el espectro de PAM-2 y el de PAM-8 son el mismo: el espectro no mira cuántos niveles hay. Integrando sale la potencia, , con la energía del pulso: la energía media de un símbolo, gastada una vez por período. Si los símbolos no tuvieran media nula aparecerían además deltas en los múltiplos de : potencia que no lleva información. Por eso el alfabeto es simétrico.
La eficiencia espectral es cuántos bits por segundo se mandan por cada hertz, . Con un pulso de coseno realzado de rolloff , el espectro termina en , y la filmina 3 escribe:
El se cancela: la eficiencia no depende de la tasa, sólo de los bits por símbolo y del exceso de banda. Se maximiza con , el sinc, que no se puede realizar, y vale . Con da 1,538, 3,077, 4,615 y 6,154 b/s/Hz para PAM-2, 4, 8 y 16: proporcional a , sin descuento, porque no mira los niveles. El número depende de qué se llame ancho de banda. Éste es el borde del espectro de un solo lado; con el ancho ocupado al 99 %, medido de los dos lados, los números son otros y la proporcionalidad es la misma.
Una computadora no tiene continuo. Lo imita con una grilla veces más fina que la de los símbolos, : es el OVR = 8 de los scripts de la clase y el N = 4 de B_basic_tx.m. El tren de impulsos pasa a ser la secuencia de símbolos con ceros intercalados, que es lo que hace upsample:
Intercalar ceros comprime el espectro de los símbolos veces: entre y aparecen copias, y todas tienen la misma altura que la original: las imágenes son la copia exacta. El filtro de transmisión, con el pulso muestreado cada , se queda con una sola y rellena los ceros con la forma del pulso:
Es la definición de la sección 01 muestreada en . Los ceros de no suman nada en la convolución, así que cada símbolo pone exactamente una copia del pulso. Con el rectángulo ones(1, OVR) de PSD_PAM4.m sale la señal escalonada de la filmina; con la raíz de coseno realzado de B_basic_tx.m, una curva suave que ocupa menos banda. Cómo se elige ese pulso para que los símbolos vecinos no se pisen es el pulse shaping; acá el pulso sólo se usa.
Dos detalles de la implementación. filter es causal, así que el pulso sale atrasado muestras, y el script de la cátedra las descarta. Y la amplitud depende de cómo esté normalizado el pulso: las funciones de la cátedra lo normalizan a suma 1, y por eso el script multiplica por al sobremuestrear; rcosdesign lo normaliza a energía 1, y su suma da cerca de .
El transmisor completo con PAM-4, en la forma de B_basic_tx.m: bits, mapper, upsample y filtro. Lo que figura como comentario es la salida real de correrlo en R2026a.
%% 1. Parámetros M = 4; b = log2(M); % niveles y bits por símbolo L = 1e5; % símbolos N = 4; % muestras por símbolo rolloff = 0.3; span = 10; % raíz de coseno realzado de 10 símbolos rng(1) %% 2. Los bits, de a b por símbolo bits = randi([0 1], L*b, 1); k = bit2int(bits, b); % cada grupo de b bits, como entero (MSB primero) %% 3. El mapper a mano: la tabla Gray de la filmina, 00 arriba p = (0:M-1).'; % posición contando desde el nivel más alto etiqueta = bitxor(p, bitshift(p, -1)); % Gray: e = p xor (p >> 1) nivel = zeros(M, 1); nivel(etiqueta + 1) = (M-1) - 2*p; % +3, +1, -1, -3 a = nivel(k + 1); disp([nivel(etiqueta+1), etiqueta]) % 3 0 % 1 1 % -1 3 % -3 2 %% 4. El mismo mapper con pammod ap = pammod(k, M, 0, 'gray'); fprintf('pammod == a: %d pammod == -a: %d\n', isequal(ap, a), isequal(ap, -a)) % pammod == a: 0 pammod == -a: 1 %% 5. Energía media y distancia mínima fprintf('Es medida = %.4f (M^2-1)/3 = %.4f\n', mean(a.^2), (M^2-1)/3) fprintf('dmin = %g\n', min(diff(unique(a)))) % Es medida = 4.9862 (M^2-1)/3 = 5.0000 % dmin = 2 %% 6. Gray: los vecinos difieren en un bit [~, orden] = sort(nivel); vecinos = bitxor(orden(1:end-1) - 1, orden(2:end) - 1); disp(sum(dec2bin(vecinos, b) == '1', 2).') % 1 1 1 %% 7. Sobremuestrear y filtrar con el pulso g = rcosdesign(rolloff, span, N, 'sqrt'); % span*N + 1 = 41 coeficientes x = upsample(a, N); % N-1 ceros entre símbolos s = filter(g, 1, x); % s(t) = sum a_m g(t - mT), muestreada fprintf('taps = %d sum(g.^2) = %.4f sum(g) = %.4f retardo = %d muestras\n', ... numel(g), sum(g.^2), sum(g), (numel(g)-1)/2) % taps = 41 sum(g.^2) = 1.0000 sum(g) = 1.9907 retardo = 20 muestras %% 8. La potencia: Es * energía del pulso / N fprintf('potencia medida / fórmula = %.4f\n', mean(s.^2) / ((M^2-1)/3 * sum(g.^2) / N)) % potencia medida / fórmula = 0.9973 %% 9. La PSD contra sigma_a^2 |G(f)|^2 / T (T = 1, fs = N) [S, f] = pwelch(s, hann(1024), 512, 1024, N, 'centered'); G = freqz(g, 1, 2*pi*f/N); % f es un vector: no hay escalar que muerda Steo = (M^2-1)/3 * abs(G).^2 / N^2; banda = abs(f) < (1 - rolloff)/2; fprintf('PSD medida / fórmula en la banda plana = %.4f\n', mean(S(banda) ./ Steo(banda))) % PSD medida / fórmula en la banda plana = 0.9959 figure plot(f, 10*log10(S), f, 10*log10(Steo), '--'); grid on xlabel('f \cdot T'); ylabel('PSD [dB]'); legend('pwelch', '\sigma_a^2 |G(f)|^2 / T') %% 10. La forma de onda: los símbolos y la señal, sin el retardo del filtro d = (numel(g) - 1)/2; figure subplot(211); stem(0:39, a(1:40)); grid on; ylabel('a_m') subplot(212); plot((0:40*N-1)/N, s(d+1:d+40*N)); grid on xlabel('t / T'); ylabel('s(t)') %% 11. La energía media para cada M, medida contra la forma cerrada for M = [2 4 8 16] rng(1) a = 2*randi([0 M-1], L, 1) - (M-1); % niveles ±1, ±3, ..., ±(M-1) fprintf('M = %2d Es medida = %8.4f (M^2-1)/3 = %3d\n', M, mean(a.^2), (M^2-1)/3) end % M = 2 Es medida = 1.0000 (M^2-1)/3 = 1 % M = 4 Es medida = 5.0219 (M^2-1)/3 = 5 % M = 8 Es medida = 21.1109 (M^2-1)/3 = 21 % M = 16 Es medida = 85.3874 (M^2-1)/3 = 85
Los números medidos se leen contra su dispersión. Con símbolos, el error estándar de la media de es 0,25 % de para PAM-4, 0,28 % para PAM-8 y 0,28 % para PAM-16, y las cuatro mediciones caen a menos de dos. El 1,0000 exacto de PAM-2 no verifica nada: ahí siempre. La potencia del bloque 8 queda 0,27 % abajo por la misma razón, porque hereda la energía sorteada del bloque 5; la PSD del bloque 9 es un estimador de Welch y queda 0,41 % abajo.
Cuatro detalles que muerden:
pammod es el espejo del de la filmina. Las dos tablas son Gray, pero pammod le da la etiqueta 0 al nivel más bajo y la filmina al más alto. El bloque 4 lo muestra: el resultado es exactamente -a. Para contar errores de bit alcanza con que el transmisor y el receptor usen la misma; para comparar contra la tabla de la clase, no. Y pammod devuelve complejos con parte imaginaria nula.bit2int lee el primer bit como el más significativo, que es como se escribe la tabla. bi2de, la función vieja, por omisión lee al revés: bi2de([1 0]) da 1 y bit2int([1; 0], 2) da 2.randi(..., L, 1) da una columna, y upsample la respeta. Si después se concatenan ceros para vaciar la cola del filtro, van como columna: [x; zeros(d, 1)].pwelch sin 'centered' o 'twosided' devuelve la PSD de un solo lado, con el doble de altura, y la comparación contra da 2 en vez de 1: con los mismos parámetros del script, 2,0016 de un lado y 1,0021 con 'twosided'. Y freqz con un escalar como tercer argumento lo lee como cantidad de puntos: acá se le pasa el vector f.pammod(..., 'gray') da la tabla espejada.randi → mapper → upsample(a, N) → filter(g, 1, x), y descartar muestras de retardo.