Unidad 4 · Transmisión en banda base y banda pasante · el criterio de Nyquist, el sinc, el coseno realzado, su raíz y el diagrama de ojo
Cada símbolo sale del transmisor como una copia del pulso , y el pulso dura más que un símbolo. Cuando el receptor mira el símbolo , las colas de los demás todavía están ahí: eso es la interferencia intersimbólica. El pulse shaping es elegir para que esas colas pasen por cero justo cuando se las mira, gastando el menor ancho de banda posible y sin quedar a merced de un reloj que nunca es perfecto.
La señal PAM es una fila de pulsos, uno cada , cada uno escalado por su símbolo:
Se muestrea en el instante del símbolo y se separa el término de del resto, como en la filmina:
La ISI es el segundo término: lo que aportan, en el instante del símbolo , las colas de los pulsos de todos los otros. Con canal , filtro de recepción y ruido, la cuenta es la misma con el pulso total en lugar de :
Dos cosas la separan del ruido. Es determinística: depende de qué símbolos se mandaron, no del azar. Y es proporcional a la señal: si se duplica la amplitud se duplican los , y la ISI con ellos. Subir la potencia no la achica. Su tamaño se mide con el peor patrón de vecinos, el que hace que cada término reste todo lo que puede:
En PAM-2, con , la muestra que debía valer puede bajar hasta sin una gota de ruido. Con cruza el umbral sola. Con más niveles el mismo pesa veces más, y por eso la misma ISI que a QPSK le cuesta un decibel a 64-QAM le cierra el ojo: está medido en la nota de la penalidad de ISI.
¿Qué tiene que cumplir para que para cualquier secuencia de símbolos? La respuesta de la filmina:
Paso 1: es necesario. Si tiene que valer para toda secuencia, vale para la que tiene y todos los demás en cero. Con esa, , y lo pedido, , es 1 en y 0 en el resto: es .
Paso 2: es suficiente. Si , el término deseado vale y cada término de la ISI tiene con , que es cero.
Un pulso así se llama pulso de Nyquist. No hace falta que se apague después de : alcanza con que pase por cero en los instantes en que se lee a los demás. Entre esos instantes puede hacer lo que quiera. El rectángulo de un símbolo cumple sin cruzar el cero nunca, porque ya terminó; el sinc cumple cruzándolo una vez por símbolo, para siempre.
El canal y los filtros se describen en frecuencia, y el ancho de banda es lo que se paga. La traducción es ésta:
Paso 1: la antitransformada, evaluada en los instantes de símbolo.
Paso 2: partir el eje en tramos de ancho . El tramo va de a , y cambiando todos se traen al del origen:
Paso 3: la exponencial no ve el corrimiento. para y enteros, así que sale de la suma y la suma entra a la integral:
Paso 4: la ida. Si el corchete vale en todo el tramo, queda . Para es ; para la exponencial da vueltas enteras en el tramo y su integral es cero. Es .
Paso 5: la vuelta. El corchete es periódico en con período , y el paso 3 dice que son exactamente sus coeficientes de Fourier. Una función periódica queda determinada por sus coeficientes: si son , hay uno solo y el corchete es la constante . Dividiendo por sale el criterio.
Al corchete dividido por se le dice espectro plegado: es el espectro de la secuencia , el pulso muestreado a la tasa de símbolo, y es lo que dibuja E_folded_spectrum.m diezmando el pulso total por . Plano si y sólo si no hay ISI. Es el aliasing de la Unidad 2 usado a favor: lo que antes había que evitar, acá tiene que sumar justo. Dos trampas de ese cálculo —plegar módulos en vez del espectro complejo, y olvidarse de que el plegado depende del instante de muestreo— están medidas en la nota del reloj corrido.
Las réplicas están separadas y cada una mide . Si , entre dos réplicas vecinas queda un hueco donde la suma vale cero, y el criterio no se puede cumplir con ningún pulso. Ése es el piso: para mandar símbolos por segundo sin ISI hacen falta al menos hertz, o dicho al revés, como máximo.
Con justo, las réplicas se tocan borde con borde sin solaparse, así que cada una tiene que ser plana por su cuenta: un rectángulo de altura . Hay un único pulso de Nyquist con el ancho de banda mínimo, y es su antitransformada:
En el papel es perfecto. No se usa por dos razones, y la segunda es la que importa. La primera: dura infinito para los dos lados, así que hay que truncarlo, y truncar una pared vertical en frecuencia trae el rizado de Gibbs. La segunda es el reloj. Si el receptor muestrea en , con , el vecino que está a símbolos ya no cae en un cero:
Y el peor caso, sumando los vecinos más cercanos de cada lado, tiene forma cerrada:
Es la serie armónica, y no converge. Con el reloj corrido un décimo de símbolo, medido en MATLAB: 0,5882 con 10 vecinos por lado, 1,0399 con 100, 1,4995 con 1000 y 1,9599 con 10 000. Cada década suma, en el límite, ; las diferencias medidas son 0,4517, 0,4596 y 0,4604. En PAM-2 el ojo se cierra cuando llega a 1, y eso pasa al contar 82 vecinos de cada lado; con el reloj corrido la mitad, , hacen falta 12 330. Ningún error de reloj es lo bastante chico: con suficientes símbolos atrás, el sinc junta la basura de todos. Es el Problema 5-5 del Barry–Lee: la apertura horizontal del ojo del sinc es cero.
La salida es gastar un poco más que el mínimo. Con ancho de banda por encima de las réplicas se solapan, y alcanza con que lo que le falta a una en el flanco se lo ponga la vecina. La familia que usa la cátedra, con rolloff :
Paso 1: los ceros son los del sinc. El primer factor se anula en todo con . El segundo vale 1 en el origen y es finito en todos lados: su denominador se anula en , pero ahí se anula también el coseno, el límite del factor es y el pulso vale . Así que para cualquier . Es de Nyquist por el tiempo.
Paso 2: lo mismo, por la frecuencia. Con sólo se tocan dos réplicas vecinas, y basta mirar el flanco. Se escribe con ; la réplica corrida está en . Metidas en el tramo del medio, los argumentos del coseno salen con , y
porque los ángulos son complementarios. La suma de las dos réplicas es en todo el flanco: el flanco es simétrico respecto de , y lo que baja uno lo sube el otro. De ahí el nombre: describe el espectro, un medio coseno «levantado» sobre el eje, no el pulso.
Paso 3: las colas. El sinc decae como . La ventana, para grande, decae como . El producto queda acotado por
A diez símbolos del centro la envolvente del sinc vale ; con , noventa y nueve veces menos, . Con colas la suma del peor caso va como , que converge: el reloj corrido sigue costando, pero cuesta una cantidad finita, que ya no depende de cuántos símbolos hayan pasado. El precio está en la otra columna: crece de a al ir de a : un exceso de % sobre el mínimo. A los 32 GBd de los scripts, ocupa 24 GHz de cada lado en vez de 16.
De dónde sale la forma en el tiempo a partir de ese espectro, por qué cumple Nyquist con cualquier rolloff y qué pasa cuando el canal no es plano está en la nota del coseno realzado.
El rolloff no cambia nada con el reloj en su lugar: todos los cosenos realzados dan ISI cero en . Lo que compra es tolerancia al error de muestreo. Medido en MATLAB sobre la fórmula continua, con 1000 vecinos de cada lado, el peor caso para tres corrimientos y el ancho del ojo de PAM-2 —el intervalo de instantes en el que —:
| α | W · T | D, τ = 0,05 T | D, τ = 0,1 T | D, τ = 0,25 T | ancho del ojo |
|---|---|---|---|---|---|
| 0 (sinc) | 0,5 | 0,7488 | 1,4995 | 3,7825 | 0,1335 T |
| 0,1 | 0,55 | 0,2586 | 0,5192 | 1,3325 | 0,3803 T |
| 0,25 | 0,625 | 0,1672 | 0,3366 | 0,8798 | 0,5605 T |
| 0,5 | 0,75 | 0,0987 | 0,2004 | 0,5486 | 0,7842 T |
| 0,75 | 0,875 | 0,0603 | 0,1244 | 0,3667 | 0,9138 T |
| 1 | 1 | 0,0390 | 0,0806 | 0,2500 | 1 T |
En rojo, donde el ojo ya está cerrado. La fila del sinc va en gris porque no es un número: con 1000 vecinos da esto, con más da más, y el ancho del ojo sigue bajando —0,337 T con 10 vecinos, 0,192 T con 100, 0,134 T con 1000, 0,102 T con 10 000— hacia cero. Las demás filas sí son propiedades del pulso: con el ancho del ojo da 0,7855 T con 10 vecinos y 0,7842 T con 100 y con 1000. La última fila tiene forma cerrada: con el pulso tiene ceros además en y vale en , así que a medio símbolo el vecino iguala al propio y el ojo se cierra justo ahí: ancho .
Dos lecturas. La primera: el rolloff se paga lineal en banda y rinde mucho al principio. De 0 a 0,25 el ancho del ojo pasa de tender a cero a más de medio símbolo, con un 25 % más de banda. La segunda: con un cuarto de símbolo de error ya cierra el ojo de PAM-2, y con no. Los sistemas reales andan entre 0,1 y 0,5; los scripts de la cátedra usan 0,5. En y el símbolo propio baja a 0,8872 y el vecino más grande queda a −10,58 dB de él, los mismos números que da el coseno realzado con el reloj corrido una muestra.
Con filtro de recepción, lo que tiene que ser de Nyquist es el pulso total, no el del transmisor. En la notación de la filmina:
El receptor quiere, además, la mayor relación señal a ruido en el instante de decisión, y eso lo da el filtro adaptado, para un pulso real. Con canal ideal, , el producto en frecuencia es un módulo al cuadrado:
Si el total tiene que ser un coseno realzado, al transmisor no le queda otra que mandar su raíz, y el receptor pone la otra mitad. En el tiempo, la raíz de coseno realzado que arma root_raised_cosine.m:
El que cumple Nyquist es el producto, no cada factor. La raíz sola deja un 9,335 % de interferencia en el vecino a , y no es un resto de truncar: por qué, y por qué el ojo a la salida del transmisor sale cerrado a propósito, está en la nota del pulso que llega. El par, con los 101 taps de la cátedra, baja a , que es lo que cuesta cortar las colas. Y en cuanto el canal deja de ser un impulso el filtro adaptado se adapta a , el producto pasa a ser , y nada obliga a eso a ser de Nyquist: es la nota del filtro adaptado.
Se corta la señal a la salida del filtro de recepción en tramos de dos símbolos, sincronizados con el reloj de símbolo, y se dibujan todos encima. Es lo que muestra un osciloscopio disparado con ese reloj. Cada traza es un patrón distinto de vecinos; si el pulso es de Nyquist, en el instante de muestreo todas pasan por los niveles exactos y el ojo queda abierto. La filmina lee tres cosas: la apertura vertical (a), inmunidad al ruido; la horizontal (b), inmunidad al error de fase del reloj; y la pendiente de las trazas (c), sensibilidad al jitter.
Las tres salen de una cuenta. Paso 1: muestreando corrido , la muestra es
Paso 2: en PAM-2, con , la traza más baja es la de los vecinos que restan todo lo que pueden, . Paso 3: con es la misma cuenta con el signo cambiado. La distancia entre las dos es la apertura vertical:
(a) es esta cuenta en ; (b) es el ancho del intervalo de donde es positiva, la última columna de la tabla; (c) es su pendiente. Un detalle que el dibujo esconde: las trazas de un ojo simulado salen de datos al azar, y el peor patrón de vecinos aparece con probabilidad . Con colas cortas no importa, porque los vecinos lejanos no pesan. Con el sinc es justo al revés: el ojo dibujado parece abierto y el de peor caso no existe.
Con el reloj en su lugar no hay nada que ver: el ojo está abierto entero para cualquier rolloff, y la curva de abajo toca 2 en el centro. Al correr el instante, el ojo empieza a pagar, y cuánto paga lo decide . Lo que conviene probar es bajar el rolloff a 0 con el reloj corrido y comparar las dos lecturas de peor caso: con cualquier contar 10 vecinos o 1000 da casi lo mismo, y con el sinc no. La curva de abajo se angosta hasta una espina, mientras las trazas de arriba, que salen de datos al azar, siguen pareciendo un ojo.
La cátedra arma los pulsos con sus funciones, raised_cosine.m y root_raised_cosine.m. MATLAB trae rcosdesign, que hace lo mismo con otra convención, y conviene saber pasar de una a otra. El análisis completo, con los parámetros de B_basic_tx.m; lo que figura como comentario es la salida real de correrlo en R2026a, con los scripts de la clase en el path.
%% 1. El coseno realzado con rcosdesign: alfa = 0.5, 25 símbolos, N = 4 BR = 32e9; N = 4; fs = N*BR; % los parámetros de B_basic_tx.m alfa = 0.5; span = 25; % span en SÍMBOLOS, no en taps g = rcosdesign(alfa, span, N, 'normal'); % span*N + 1 = 101 taps c = (numel(g) + 1)/2; % el centro, t = 0 fprintf('%d taps, energia %.4f, pico %.4f\n', numel(g), sum(g.^2), g(c)) % 101 taps, energia 1.0000, pico 0.5345 %% 2. Los ceros en los múltiplos de T: cada N muestras desde el centro k = [-12:-1, 1:12]; fprintf('max |g(kT)| / g(0) = %.1e\n', max(abs(g(c + N*k))) / g(c)) % max |g(kT)| / g(0) = 0.0e+00 %% 3. Contra la función de la cátedra (normaliza a suma 1, no a energía 1) h = raised_cosine(BR/2, fs, alfa, 101, 0); fprintf('max |g/g(0) - h/h(0)| = %.1e\n', max(abs(g/g(c) - h/h(c)))) % max |g/g(0) - h/h(0)| = 3.0e-05 %% 4. ISI con el instante corrido: N = 20 para poder correr de a T/20 N20 = 20; g20 = rcosdesign(alfa, 40, N20, 'normal'); c20 = (numel(g20) + 1)/2; for d = [0 1 2 5] % corrimiento de d muestras: tau = d*T/20 m = c20 + d; % la muestra que lee el símbolo i = mod(m-1, N20)+1 : N20 : numel(g20); % todas las del mismo peine... v = g20(i(i ~= m)); % ...menos la propia, por índice fprintf('tau = %.2f T: g = %.4f, mayor vecino %6.2f dB, peor caso %.4f\n', ... d/N20, g20(m)/g20(c20), 20*log10(max(abs(v))/g20(m)), sum(abs(v))/g20(m)) end % tau = 0.00 T: g = 1.0000, mayor vecino -Inf dB, peor caso 0.0000 % tau = 0.05 T: g = 0.9953, mayor vecino -27.46 dB, peor caso 0.0986 % tau = 0.10 T: g = 0.9813, mayor vecino -20.75 dB, peor caso 0.2003 % tau = 0.25 T: g = 0.8872, mayor vecino -10.58 dB, peor caso 0.5482 %% 5. El sinc (alfa = 0): más largo, peor for sp = [40 400] s = rcosdesign(0, sp, N20, 'normal'); cs = (numel(s) + 1)/2; m = cs + 2; % tau = 0.1 T i = mod(m-1, N20)+1 : N20 : numel(s); v = s(i(i ~= m)); fprintf('sinc, span %3d: peor caso con tau = 0.1 T: %.4f\n', sp, sum(abs(v))/s(m)) end % sinc, span 40: peor caso con tau = 0.1 T: 0.7170 % sinc, span 400: peor caso con tau = 0.1 T: 1.1775 %% 6. La raíz repartida: RRC en el Tx y RRC en el Rx r = rcosdesign(alfa, span, N, 'sqrt'); fprintf('sin cuarto argumento da la raiz: %d\n', isequal(rcosdesign(alfa, span, N), r)) p = conv(r, r); cp = (numel(p) + 1)/2; fprintf('RRC sola: ISI %.3f %%\n', 100*max(abs(r(c + N*k)))/r(c)) fprintf('RRC * RRC: ISI %.1e\n', max(abs(p(cp + N*[-25:-1, 1:25])))/p(cp)) % sin cuarto argumento da la raiz: 1 % RRC sola: ISI 9.335 % % RRC * RRC: ISI 2.3e-04 %% 7. El ojo, como en B_basic_tx.m rng(1); a = 2*randi([0 1], 2000, 1) - 1; % PAM-2 y = upfirdn(a, g, N); % sobremuestrea y filtra de una vez retardo = span*N/2; % 50 muestras: el pico del símbolo 1 eyediagram(y(retardo + 1 + N*100 + (0:4000)), 2*N, 2, N)
Los bloques 4 y 5 son las dos columnas de la sección 06 medidas con el filtro que se implementa: con , 40 símbolos de filtro ya dan el peor caso de la fórmula continua con 1000 vecinos a una unidad de la cuarta cifra (0,2003 contra 0,2004). Con el sinc, alargar el filtro de 40 a 400 símbolos sube la ISI de 0,717 a 1,178: un filtro más largo es una aproximación mejor a un pulso peor. Lo que muerde:
rcosdesign devuelve la raíz. El valor por omisión de la forma es 'sqrt', no 'normal': el bloque 6 lo comprueba con isequal. Olvidarlo en el bloque 4 da, con el reloj en su lugar, un vecino a −20,60 dB, que es el 9,335 % de la raíz sola, y parece un defecto del coseno realzado.span es en símbolos. El filtro sale de span*N + 1 taps, y span*N tiene que ser par: rcosdesign(0.5, 5, 3) tira error. Con span = 25 y salen los 101 taps de la cátedra.rcosdesign deja energía 1, así que el pico del coseno realzado vale 0,5345 y los niveles del ojo son , no . Las funciones de la cátedra normalizan a suma 1. Para comparar formas hay que dividir por el pico, como el bloque 3.+ 0.0001 de la cátedra. raised_cosine.m le suma al rolloff para que ninguna muestra caiga en el de ; rcosdesign pone el límite exacto. La diferencia de forma, , es ese corrimiento y nada más. Y raised_cosine recibe BR/2, no BR.mod(m-1, N)+1 : N : end, y la del símbolo se saca por su posición. Sacarla por valor falla con un pulso que tiene dos muestras iguales al pico, que es el peor pulso posible.eyediagram es del Communications Toolbox. El segundo argumento son las muestras por traza, 2*N para dos símbolos; el tercero, el período del eje; el cuarto corre las trazas: con el vector arrancando en un instante de símbolo, N lo deja en el centro. Las primeras muestras son transitorio del filtro, y por eso se arranca cien símbolos adentro, igual que el yup(500:5000) de la clase.rcosdesign(beta, span, sps, forma): span en símbolos, span*sps par, energía 1, y la forma por omisión es 'sqrt'.