Bitácora · DCSS · Concepto

El coseno realzado

Unidad 4 · Transmisión en banda base y banda pasante · el espectro por tramos, el pulso que sale de él, por qué cumple Nyquist, sus colas, su truncado y la cadena que lo tiene que dar entero

El coseno realzado es el pulso que la cátedra usa para que los símbolos no se pisen. Se dice que «evita la ISI cuando el canal es lineal», y la frase tiene dos partes que conviene separar. La ISI que evita es una sola: la que dejan las colas de los pulsos vecinos en el instante en que se muestrea cada símbolo. La evita porque sus colas pasan por cero justo en esos instantes, que es el criterio de Nyquist. Y eso vale para el pulso que el receptor muestrea, no para el que el transmisor manda: vale sólo si la cadena entera —filtro de transmisión, canal y filtro de recepción— da un coseno realzado. La linealidad es lo que permite hablar de esa cadena como un único pulso.

01 · Qué ISI evita

Con filtro de transmisión g, canal b y filtro de recepción f, la muestra del símbolo k es, en la notación de la filmina,

y(kT)=akp(0)+∑m≠kamp((k−m)T)+n′(kT),p=g∗b∗f

La suma del medio es la ISI: lo que aportan las colas de los otros pulsos en el instante del símbolo k. Su definición, por qué no baja con más potencia y cómo se mide su peor caso D están en la ISI y el pulse shaping. El coseno realzado anula esa suma término a término, porque cumple p(kT)=0 para todo k≠0. No toca los otros dos términos: el ruido sigue ahí, y la ISI de muestrear corrido también, porque los ceros están en kT y no al lado (es el reloj corrido).

Y la condición cae sobre p, el pulso de punta a punta. Si p es un coseno realzado, no hay ISI. Si el que es coseno realzado es otro —el que se diseñó para el transmisor, por ejemplo—, la frase no dice nada. Las secciones 02 a 08 son el pulso; la 09, la cadena.

02 · El espectro, por tramos

La filmina lo define por su espectro, con rolloff 0≤α≤1 (en los scripts, rolloff; en rcosdesign, beta):

G(f)={T|f|≤1−α2TTcos2[πT2α(|f|−1−α2T)]1−α2T<|f|≤1+α2T0|f|>1+α2T

Tres tramos, y cada uno dice algo.

En los bordes del flanco el cos2 llega con pendiente cero, tanto al tramo plano como al cero. Ese detalle, que parece de terminación, es el que decide las colas del pulso (sección 06).

03 · El pulso, paso a paso

El pulso es la antitransformada, g(t)=∫G(f)ej2πftdf. Integrar el cos2 del flanco a lo bruto funciona, pero hay un camino más corto que además explica todo lo que viene: ver el espectro como un rectángulo suavizado.

Paso 1: el espectro es un rectángulo convolucionado con medio coseno. Sean el rectángulo del sinc y un núcleo de ancho α/T con forma de medio coseno:

R(f)=Tsi |f|<12T,K(f)=πT2αcosπTfαsi |f|≤α2T

los dos en cero afuera. El núcleo tiene área 1: ∫K=12[sen(πTf/α)]−α/2Tα/2T=1. La convolución (R∗K)(f) es T por la parte del área del núcleo, centrado en f, que cae adentro del rectángulo. Si el núcleo entero cae adentro, vale T: es el tramo plano. Si cae entero afuera, vale 0. En el flanco, con f=12T−x y |x|≤α/(2T), queda adentro la parte del núcleo con u>−x:

(R∗K)(12T−x)=T∫−xα/2TK(u)du=T2(1+senπTxα)

Y es el cos2 de la filmina: con |f|=12T−x el argumento vale θ=π4−πTx2α, y cos2θ=12(1+cos2θ)=12(1+sen(πTx/α)). Así que G=R∗K, exacto.

Paso 2: la antitransformada del rectángulo es la de siempre:

∫−1/2T1/2TTej2πftdf=sen(πt/T)πt/T

Paso 3: la antitransformada del medio coseno. K es par, así que la exponencial se reduce a su coseno y la integral a la mitad positiva. Con a=πT/α, b=2πt y F=α/(2T), y el producto de cosenos pasado a suma:

k˘(t)=πTα∫0Fcos(af)cos(bf)df=πT2α[sen(a−b)Fa−b+sen(a+b)Fa+b]

Como aF=π/2, los dos senos son sen(π/2∓bF)=cos(bF), con bF=παt/T. Sale como factor común, el corchete queda 2a/(a2−b2), y sacando a2 del denominador:

k˘(t)=πT2α·2a·cos(παt/T)1−b2/a2=cos(παt/T)1−(2αt/T)2

porque πT2α·2a=1 y b/a=2αt/T. Es la ventana de la filmina, y vale 1 en t=0 porque el núcleo tiene área 1.

Paso 4: convolución en frecuencia es producto en el tiempo. Como G=R∗K, el pulso es el producto de las dos antitransformadas:

g(t)=(sen(πt/T)πt/T)⏟sinc(cos(απt/T)1−(2αt/T)2)⏟ventana

La lectura que deja este camino: el sinc viene del rectángulo, y es el que pone los ceros; la ventana viene del suavizado del borde, y es la que apaga las colas. Suavizar el espectro en frecuencia es enventanar el pulso en el tiempo. Para comprobar que el par está bien, se toma el pulso del lado del tiempo —rcosdesign(0.5, 400, 32, 'normal'), 12 801 muestras— y se le hace la FFT: contra los tres tramos de la filmina, la mayor diferencia es 1,5·10⁻⁶ de T, lo que cuesta haberlo cortado a 400 símbolos.

04 · Los puntos singulares

La ventana tiene denominador 1−(2αt/T)2, que se anula en t=±T/(2α). Ahí también se anula el numerador, así que es 0/0. Con u=2αt/T la ventana es cos(πu/2)/(1−u2), y en u→1 L'Hôpital deriva arriba y abajo:

límu→1cos(πu/2)1−u2=límu→1−(π/2)sen(πu/2)−2u=π4

El sinc, en cambio, es regular ahí. El pulso vale su producto:

g(±T2α)=π4sinc(12α),sinc(x)=sen(πx)πx

Tres casos para tener a la vista. Con α=1/(2m) —0,5, 0,25— el punto singular cae en mT, donde el sinc ya es cero, y vale 0. Con α=1 cae en T/2 y vale π4·2π=12. Y con α=0,4 cae en 1,25T, que con cuatro muestras por símbolo es justo la quinta muestra desde el centro: vale π4·−2/21,25π=−210=−0,1414213562.

Medido en MATLAB en esa muestra: rcosdesign da −0,1414213562, el límite exacto. La fórmula escrita tal cual da -Inf: el denominador sale 0 exacto y el coseno 6,1·10⁻¹⁷, que no es cero en coma flotante. Y el truco de raised_cosine.m y my_rcosine.m, sumarle 10⁻⁴ al rolloff para que ninguna muestra caiga en el punto, da −0,1414036771: esquiva el infinito a cambio de 1,8·10⁻⁵ de error, y de estar usando un rolloff un poco distinto en todas las demás muestras. Las dos cosas son despreciables al lado de truncar el pulso (sección 07), pero conviene saber de dónde salen.

05 · Por qué cumple Nyquist con cualquier α

El criterio pide que las réplicas del espectro separadas 1/T sumen una constante, ∑mG(f−m/T)=T; de dónde sale y por qué equivale a g(kT)=δk está en la nota de la ISI. Con el paso 1 la demostración es una línea: plegar conmuta con convolucionar.

∑mG(f−mT)=([∑mR(·−mT)]∗K)(f)=(T∗K)(f)=T∫K=T

El corchete es una fila de rectángulos de ancho 1/T puestos uno al lado del otro: tapa el eje entero a altura T. Convolucionar una constante con un núcleo de área 1 la deja igual. En ningún paso se usó el valor de α, ni siquiera la forma del núcleo: cualquier núcleo de área 1 da un pulso de Nyquist. Con un núcleo rectangular sale el espectro trapezoidal de la filmina de «otras formas de onda que también satisfacen el criterio»; con el medio coseno, el coseno realzado. El α≤1 sólo asegura que en cada frecuencia se solapen a lo sumo dos réplicas.

Del lado del tiempo es el mismo hecho: el pulso es sinc×k˘, el sinc pone ceros en todos los kT con k≠0, y la ventana los respeta porque es finita en todos lados —eso es lo que dejó la sección 04— y vale k˘(0)=∫K=1 en el origen.

Y la simetría vestigial es lo mismo mirado en el flanco. Del paso 1, a distancia x de 1/(2T) para cada lado:

G(12T∓x)=T2(1±senπTxα)⟹G(12T−x)+G(12T+x)=T

El flanco es T/2 más una función impar alrededor de 1/(2T), y la parte impar se cancela con la de la réplica que baja del otro lado. Pasado el flanco (x>α/(2T)) la cuenta es T+0. Sobre la FFT del pulso largo de la sección 03, G(1/2T) da 0,5000 T y la suma de las dos mitades se aparta de T en 2,1·10⁻⁸ como máximo, sobre 1001 valores de x entre 0 y 1/(2T).

06 · Las colas: 1/t³ contra 1/t

El sinc cae como 1/t. La ventana, lejos del origen, es un coseno sobre (2αt/T)2: cae como 1/t2. El producto queda acotado por |g|≤1/(4πα2|t/T|3). Medido: el mayor |g| sobre un símbolo, lejos del centro, con la fórmula continua en 20 001 puntos por intervalo:

pulsoentre 10 y 11 Tentre 100 y 101 Tentre 1000 y 1001 Tpor década
sinc, α = 03,033·10⁻²3,167·10⁻³3,182·10⁻⁴20,0 dB
RC, α = 0,254,795·10⁻⁴1,166·10⁻⁶1,181·10⁻⁹59,9 dB
RC, α = 0,52,210·10⁻⁴2,422·10⁻⁷2,447·10⁻¹⁰59,9 dB
RC, α = 13,708·10⁻⁵3,949·10⁻⁸3,976·10⁻¹¹59,9 dB
RRC, α = 0,51,596·10⁻³1,592·10⁻⁵1,592·10⁻⁷40,0 dB

La columna de la derecha es la de 100 a 1000. Veinte decibeles por década es 1/t; sesenta es 1/t3. Con α=0,25 la primera década da sólo 52,3 dB: a diez símbolos 2αt/T vale 5, y el 1 del denominador de la ventana todavía pesa. A mil símbolos, |g|(t/T)3 da 1,18, 0,245 y 0,0398 contra la cota de 1,27, 0,318 y 0,0796: la cota es buena en el orden y floja en la constante, porque el seno y el coseno no llegan a su pico a la vez. Con α=1 el producto es 12sen(2πt/T) y la constante exacta es 1/(8π)=0,0398.

La última fila explica el exponente. Una regla de la transformada de Fourier: si el espectro y sus derivadas hasta la (n−1) son continuas y la n-ésima salta, el pulso cae como 1/tn+1. El rectángulo del sinc salta él mismo: n=0, 1/t. El cos2 llega a los dos bordes del flanco con pendiente cero, así que lo primero que salta es la derivada segunda: 1/t3. La raíz es un cos sin el cuadrado, que llega al cero con pendiente: salta la primera derivada y cae como 1/t2, cuarenta decibeles por década. El filtro que de verdad se construye —la raíz— tiene colas más largas que el pulso que promete.

07 · Truncar: el span de rcosdesign

Un pulso de colas infinitas se implementa como un FIR, y hay que cortarlo. rcosdesign(beta, span, sps) pide el largo en símbolos, span, y devuelve span*sps + 1 coeficientes; los 101 de la cátedra son span = 25 con N=4. Cortar cuesta dos cosas distintas, y al coseno realzado y a su raíz les cuesta distinto. Con α=0,5 y N=4:

spantapsISI del RCenergía fuera de banda, RCídem, RRCISI de RRC∗RRCdónde
4170−38,0 dB−33,4 dB−53,7 dBk = ±3
6250−52,3 dB−37,8 dB−38,8 dBk = ±3
8330−54,5 dB−42,2 dB−60,4 dBk = ±4
12490−63,6 dB−47,3 dB−64,3 dBk = ±6
16650−70,0 dB−51,0 dB−67,9 dBk = ±8
251010−81,2 dB−56,5 dB−72,7 dBk = ±13
502010−96,0 dB−65,8 dB−75,2 dBk = ±25
1004010−110,2 dB−74,8 dB−95,9 dBk = ±50

La ISI es el mayor instante de símbolo distinto del propio, relativo a él. La energía fuera de banda es la fracción de |G|2 que cae en |f|>(1+α)/(2T), donde el pulso ideal no tiene nada; es una integral, y por eso no depende de la grilla: con span 25 la raíz da −56,74, −56,52, −56,46 y −56,45 dB con FFT de 4096 a 262 144 puntos. Se eligió en vez del pico del primer lóbulo fuera de banda, que se mueve 5 dB según dónde se empiece a buscar.

Truncar el coseno realzado no rompe Nyquist. La tercera columna es cero en todas las filas: las muestras en kT que quedan valían cero, y las que se tiraron no se leen. Lo que rompe es la banda: el pulso cortado ya no es limitado en banda, y la energía que se escapa baja unos 15 dB cada vez que se duplica el span (−81,2 → −96,0 → −110,2). La raíz pierde en los dos frentes. Deja salir más energía y la achica más despacio, 9 dB por duplicación (−56,5 → −65,8 → −74,8). Son los exponentes de la sección 06: con colas 1/tp, la energía que queda más allá del corte S va como S−(2p−1), y 10log1025=15,05 dB, 10log1023=9,03 dB. Y el par de raíces cortadas ya no es exactamente un coseno realzado, así que deja ISI: −72,7 dB con los 101 taps de la cátedra.

Esa ISI residual tiene dos rasgos. Vive en el borde del corte, no al lado del pulso: la columna «dónde» sigue al span. Y no baja pareja: con span 6 es peor que con span 4, porque lo que se tira depende de en qué fase de su oscilación queda cortada la cola. Que no se deba a la raíz sola —que por sí misma deja un 9,335 % en el vecino, cualquiera sea el largo— está en el pulso que llega.

08 · La normalización de rcosdesign

rcosdesign no deja el pico en 1: deja la energía en 1, sum(h.^2) = 1. El pico que resulta tiene forma cerrada, y sale de Parseval. La energía del coseno realzado continuo, con pico 1, es la de su espectro: el tramo plano aporta T2·(1−α)/T, y los dos flancos, de ancho α/T entre los dos, un cos4 que promedia 3/8:

∫g2dt=∫G2df=T(1−α)+34αT=T(1−α4)

Muestreado cada T/N, la suma de cuadrados es esa integral por N/T —vale porque el pulso ocupa menos que la mitad de la tasa de muestreo—. Normalizar a energía 1 es dividir por su raíz. Para la raíz la cuenta es más corta: ∫GRRC2=T∫GRC=TgRC(0)=T, y su pico, sin normalizar, es el 1−α+4α/π de root_raised_cosine.m. Queda:

gRC[0]=1N(1−α/4),gRRC[0]=1−α+4α/πN
αpico RC, medidoforma cerradapico RRC, medidoforma cerrada
0,250,51640,51640,53420,5342
0,50,53450,53450,56830,5683
0,750,55470,55470,60250,6025
10,57740,57740,63660,6366

Con N=4 y span 25. El pico va como 1/N: el coseno realzado de rolloff 0,5 da 0,7559, 0,5345, 0,3780 y 0,2673 con N=2, 4, 8 y 16, las cuatro iguales a la fórmula en el cuarto decimal.

¿Por qué energía y no pico? Porque rcosdesign está pensada para el par. El pulso total conv(r, r) vale, en su centro, sum(r.^2): la energía de la raíz. Con energía 1, el par da pico 1 exacto —medido: 1,0000— y los niveles del ojo a la salida del receptor son los símbolos. La trampa es la otra: el coseno realzado con 'normal', energía 1, da pico 0,5345 y un ojo en ±0,53; y olvidarse el cuarto argumento da la raíz, porque la forma por omisión es 'sqrt' (la consecuencia está medida en la nota de la ISI).

Las funciones de la cátedra normalizan a suma 1, ganancia 1 en continua. Con eso el pico del coseno realzado queda en 0,2500 y el de la raíz en 0,2842, o sea 1/N y (1−α+4α/π)/N, y el par de raíces da pico 0,2500. Por eso E_folded_spectrum.m multiplica por N al diezmar el pulso total: h_tot_dw = N*h_tot(1:N:end) devuelve el pico a 1.

09 · La cadena entera tiene que dar el coseno realzado

Ésta es la parte de la frase que confundía. El receptor no muestrea el pulso del transmisor: muestrea el que sale de tres filtros en cascada. Que esa cascada sea un pulso, uno solo, es lo que compra la linealidad. Si cada bloque es lineal e invariante en el tiempo, la salida para una fila de símbolos es la suma de copias corridas de la respuesta a uno solo, y esa respuesta es la convolución de las tres:

p=g∗b∗f⟺P(f)=G(f)B(f)F(f)

Es la filmina 13: para que el criterio siga valiendo, el que tiene que cumplir ∑mP(f−m/T)=T es P. Hay cuatro situaciones, y las cuatro se miden con la cadena de la cátedra: N=4, α=0,5, raíces de 101 taps en transmisor y receptor.

(a) Canal plano. Con B=1 y la raíz repartida, P=GRRC·GRRC=GRC y no hay ISI. El coseno realzado de rcosdesign, mirado solo, da ISI 0. El par de raíces da −72,7 dB, que es el piso por truncar (sección 07), no ISI del diseño.

(b) La linealidad es lo que permite multiplicar. Sin ella no habría un P al que pedirle nada: no existiría «el pulso total», sólo una salida que depende de toda la secuencia.

(c) Un canal lineal pero no plano mete su B(f) en el producto, y P deja de ser el coseno realzado. «Plano» quiere decir plano donde hay espectro: un pasabajos que corta más allá de (1+α)/(2T) multiplica por 1 todo lo que importa. Con el pasabajos que usa E_folded_spectrum.m, un fir1 de ventana Hamming, en cadena RRC → canal → RRC, bajando el corte:

canalcorteISI máximapeor caso D
coseno realzado solo—00
plano, RRC∗RRC—−72,7 dB0,0015
fir1(66, 0.5)1/T−72,7 dB0,0024
fir1(66, 0.375)0,75/T−70,3 dB0,0051
fir1(66, 0.35)0,7/T−53,4 dB0,0198
fir1(66, 0.3)0,6/T−34,6 dB0,1153
fir1(66, 0.25)0,5/T−20,6 dB0,4474
fir1(66, 0.2)0,4/T−11,8 dB1,1235

fir1 normaliza el corte a fs/2=2/T, así que 0,3 es 0,6/T, adentro del flanco, que va de 0,25 a 0,75/T. Mientras el corte no entra al flanco la ISI se queda en el piso; en cuanto entra, sube 36 dB en un décimo de 1/T. Lo que pasa es la sección 05 al revés: el canal le recorta a la réplica de un lado lo que tenía que devolverle a la del otro, la suma deja de ser constante y el plegado se hunde en 1/(2T). Con el corte en 0,4/T el peor caso pasa de 1 y el ojo de PAM-2 se cierra sin ruido. La tabla mide en el pico, que para estos canales simétricos es el mejor instante; en la última fila correr el muestreo 0,04 T deja el mismo peor caso con el vecino mayor en −10,5 dB, que es lo que lee el widget.

Con el canal fijo en 0,6/T el rolloff grande es el que más pierde, porque su flanco llega más lejos: −52,3 dB con α=0,1 (que es su propio piso de truncado: su banda termina en 0,55/T), −49,1 con 0,25, −34,6 con 0,5, −29,8 con 0,75 y −27,7 con 1.

Dos avisos sobre este número. El script de la clase escribe fir1(67, 0.3), y el primer argumento de fir1 es el orden: salen 68 coeficientes, el canal retarda media muestra y la misma cadena da −16,6 dB, casi todo de reloj corrido y no de canal. Y la cátedra adapta el receptor a transmisor más canal, no sólo al transmisor; con ese receptor el mismo pasabajos deja −31,2 dB. Las dos cosas, y por qué ese receptor no puede arreglarlo, están en el filtro adaptado.

Simulación El pulso total, con el canal en el medio — la cadena RRC → canal → RRC con 101 taps y cuatro muestras por símbolo. Arriba, en frecuencia: en gris las tres réplicas de |P| separadas 1/T, punteado el módulo del canal, en azul el plegado (la suma de las réplicas en complejo), que tiene que ser plano en 1. Abajo, el pulso total en el tiempo, con el coseno realzado ideal punteado y los instantes de símbolo marcados. Arranca con el canal plano, donde no hay ISI.
instante de muestreo — ISI máxima — peor caso D — ojo de PAM-2 —

Con el canal plano no pasa nada al mover α: el plegado se queda en 1 y los instantes de símbolo en el eje. Elegí el pasabajos: arranca cortando en 1/T, más allá de la señal, y todavía no pasa nada aunque el canal no sea plano. Bajalo hasta que la línea punteada entre en el flanco de las réplicas grises: ahí el plegado se hunde en ±1/(2T) y abajo los instantes de los vecinos se despegan del eje. Después probá el pasatodo, que es el caso que enseña más: las réplicas grises no se mueven un píxel, porque el canal no toca ningún módulo, y el plegado azul igual se arruga. Con a=0,3 la arruga casi no se ve y las lecturas ya la cuentan; con 0,6 se ve.

10 · Fase no lineal, no linealidad, y quién lo arregla

Un canal de módulo plano no alcanza. El pasatodo B(z)=(−a+z−1)/(1−az−1), a la tasa de muestreo, tiene |B|=1 en todas las frecuencias: el |P| de la cadena difiere del de la cadena sin canal en 1,8·10⁻¹⁵. Pero su retardo de grupo cambia con la frecuencia, cada réplica llega girada distinto, y la suma compleja del plegado deja de cancelar. Muestreando en el mejor instante —el que hace mínimo el peor caso, buscado cada T/256 dentro de medio símbolo alrededor del pico—:

aISI máximapeor caso Den la muestra más alta
0,1−65,1 dB0,0042−26,9 dB
0,2−58,2 dB0,0077−19,2 dB
0,3−49,2 dB0,0151−26,8 dB
0,4−41,6 dB0,0302−27,0 dB
0,5−32,2 dB0,0660−16,1 dB
0,6−24,6 dB0,1526−20,3 dB

La última columna es la trampa de medirlo mal: si se muestrea en la muestra más alta de la grilla de cuatro por símbolo, los números saltan sin orden, porque el retardo del pasatodo no es un número entero de muestras y la grilla cae corrida del centro del pulso en una cantidad que cambia con a. Eso es reloj, no canal. Con el mejor instante la ISI crece pareja con a, y ésa es la del canal.

(d) Un canal no lineal no tiene pulso total. Se mete, entre el transmisor y el receptor, un amplificador que satura, y=Atanh(x/A) con A=0,6, sobre una señal PAM-2 que llega a 0,738 de pico. Se mide la respuesta a un símbolo aislado y se predice la salida para 4000 símbolos al azar sumando copias corridas de ella, que es lo que el pulso total significa. La predicción erra por 9,2 % del pico en el peor instante; sin el amplificador, la misma cuenta erra por 1,6·10⁻¹⁵. El pulso aislado casi no tiene ISI —peor caso 0,0160, que predice un ojo de apertura 1,968— y el ojo medido con los datos se abre sólo 1,808. Sin amplificador, predicho y medido dan 1,9971 y 1,9974. Con A=1 el error es 4,2 %, y con A=0,4, 15,0 %. No hay criterio de Nyquist que aplicar, porque no hay un p del que pedir ceros: la interferencia depende de los vecinos de una manera que ninguna suma de pulsos describe.

Quién arregla el caso (c). El transmisor no conoce el canal, así que no puede mandar la raíz de algo que, multiplicado por B, dé el coseno realzado. Lo que se hace es agregar otro filtro lineal en el receptor, el ecualizador, elegido para que la cascada entera vuelva a pasar por cero en los instantes de símbolo: el zero forcing lo pide exacto invirtiendo el canal, y el transceptor adaptativo lo aprende con los datos cuando el canal no se conoce. Funciona por la misma razón que el coseno realzado: porque todo es lineal y un filtro más es un factor más en el producto. En el caso (d) esa herramienta tampoco alcanza.

11 · El análisis en MATLAB

Las dos formas de rcosdesign, los ceros en kT, el punto singular, la simetría vestigial y la cadena con el canal. Lo que figura como comentario es la salida real de correrlo en R2026a.

%% 1. Las dos formas de rcosdesign: alfa = 0.5, 25 símbolos, N = 4
N = 4;  alfa = 0.5;  span = 25;
g = rcosdesign(alfa, span, N, 'normal');   % el coseno realzado
r = rcosdesign(alfa, span, N);             % sin cuarto argumento: la raíz
c = (numel(g) + 1)/2;                      % la muestra de t = 0
fprintf('RC:  energía %.4f, pico %.4f, 1/sqrt(N(1-a/4)) = %.4f\n', ...
    sum(g.^2), g(c), 1/sqrt(N*(1 - alfa/4)))
fprintf('RRC: energía %.4f, pico %.4f, (1-a+4a/pi)/sqrt(N) = %.4f\n', ...
    sum(r.^2), r(c), (1 - alfa + 4*alfa/pi)/sqrt(N))
p = conv(r, r);
fprintf('pico de RRC*RRC = %.4f\n', p((numel(p) + 1)/2))
% RC:  energía 1.0000, pico 0.5345, 1/sqrt(N(1-a/4)) = 0.5345
% RRC: energía 1.0000, pico 0.5683, (1-a+4a/pi)/sqrt(N) = 0.5683
% pico de RRC*RRC = 1.0000

%% 2. Los ceros en kT, para cualquier rolloff
for a = [0 0.25 0.5 1]
    ga = rcosdesign(a, span, N, 'normal');
    fprintf('alfa = %.2f: max |g(kT)|/g(0) = %.1e\n', a, ...
        max(abs(ga(c + N*[-12:-1, 1:12])))/ga(c))
end
% alfa = 0.00: max |g(kT)|/g(0) = 0.0e+00
% alfa = 0.25: max |g(kT)|/g(0) = 0.0e+00
% alfa = 0.50: max |g(kT)|/g(0) = 0.0e+00
% alfa = 1.00: max |g(kT)|/g(0) = 0.0e+00

%% 3. El punto singular: con alfa = 0.4, t = T/(2 alfa) = 1.25 T es la muestra 5
a = 0.4;  t = 1.25;
ga = rcosdesign(a, span, N, 'normal');  ga = ga/ga(c);
rc = @(t, a) sinc(t) .* cos(pi*a*t) ./ (1 - (2*a*t).^2);
fprintf('rcosdesign %.10f | (pi/4)sinc(1/2a) %.10f | fórmula %g | con a + 1e-4 %.10f\n', ...
    ga(c + 5), pi/4*sinc(1/(2*a)), rc(t, a), rc(t, a + 1e-4))
% rcosdesign -0.1414213562 | (pi/4)sinc(1/2a) -0.1414213562 | fórmula -Inf | con a + 1e-4 -0.1414036771

%% 4. El espectro por tramos y la simetría vestigial, sobre la FFT de un pulso largo
Nf = 32;  gl = rcosdesign(alfa, 400, Nf, 'normal');   % 12 801 muestras
cl = (numel(gl) + 1)/2;  gl = gl/gl(cl);              % pico 1, o sea G(0) = T = 1
NFFT = 2^18;  x = zeros(1, NFFT);
x(mod((1:numel(gl)) - cl, NFFT) + 1) = gl;            % t = 0 en la primera muestra
G = real(fft(x))/Nf;                                  % G(f), con f en unidades de 1/T
f = (0:NFFT-1)/NFFT*Nf;  f(f >= Nf/2) = f(f >= Nf/2) - Nf;
f1 = (1 - alfa)/2;  f2 = (1 + alfa)/2;  af = abs(f);
Gt = (af <= f1) + (af > f1 & af <= f2) .* cos(pi/(2*alfa)*(af - f1)).^2;
xs = linspace(0, 0.5, 1001);
sv = interp1(f, G, 0.5 - xs) + interp1(f, G, 0.5 + xs);
fprintf('max |G_fft - G_tramos| = %.1e, G(1/2T) = %.4f, max |G(1/2T-x) + G(1/2T+x) - 1| = %.1e\n', ...
    max(abs(G - Gt)), interp1(f, G, 0.5), max(abs(sv - 1)))
% max |G_fft - G_tramos| = 1.5e-06, G(1/2T) = 0.5000, max |G(1/2T-x) + G(1/2T+x) - 1| = 2.1e-08

%% 5. La cadena RRC -> canal -> RRC, medida en los instantes de símbolo
[m, D] = isi(g);
fprintf('%-24s ISI %.1e, D = %.1e\n', 'RC ideal', m, D)
canales = {1, 'plano'; fir1(66, 0.5), 'fir1(66, 0.5)'; fir1(66, 0.375), 'fir1(66, 0.375)'; ...
           fir1(66, 0.3), 'fir1(66, 0.3)'; fir1(66, 0.2), 'fir1(66, 0.2)'; ...
           fir1(67, 0.3), 'fir1(67, 0.3), 68 taps'};
for i = 1:size(canales, 1)
    [m, D] = isi(conv(conv(r, canales{i, 1}), r));
    fprintf('%-24s ISI %6.1f dB, D = %.4f\n', canales{i, 2}, 20*log10(m), D)
end
% RC ideal                 ISI 0.0e+00, D = 0.0e+00
% plano                    ISI  -72.7 dB, D = 0.0015
% fir1(66, 0.5)            ISI  -72.7 dB, D = 0.0024
% fir1(66, 0.375)          ISI  -70.3 dB, D = 0.0051
% fir1(66, 0.3)            ISI  -34.6 dB, D = 0.1153
% fir1(66, 0.2)            ISI  -11.8 dB, D = 1.1235
% fir1(67, 0.3), 68 taps   ISI  -16.6 dB, D = 0.3545

function [m, D] = isi(p)
    N = 4;
    [~, i0] = max(abs(p));                     % el instante del símbolo: el pico
    k = [i0-N:-N:1, i0+N:N:numel(p)];          % los de los vecinos
    v = abs(p(k))/abs(p(i0));
    m = max(v);  D = sum(v);                   % el mayor, y el peor caso
end

Lo que muerde:

Para tener a mano

  1. La ISI que evita es la de las colas de los vecinos en kT. La evita el pulso total p=g∗b∗f si es un coseno realzado; que el del transmisor lo sea no alcanza.
  2. Espectro: plano hasta (1−α)/2T, flanco cos2 de ancho α/T, cero desde (1+α)/2T. Siempre G(1/2T)=T/2.
  3. El espectro es un rectángulo convolucionado con medio coseno de área 1; por eso el pulso es sinc por ventana, cos(απt/T)/(1−(2αt/T)2).
  4. En t=±T/2α vale (π/4)sinc(1/2α), por L'Hôpital: −√2/10 con α=0,4, 1/2 con α=1, 0 con α=1/2m.
  5. Cumple Nyquist con cualquier α porque plegar conmuta con convolucionar: las réplicas de un rectángulo suman T, y convolucionar con área 1 no lo cambia. En el flanco, G(1/2T−x)+G(1/2T+x)=T.
  6. Colas: 60 dB por década el coseno realzado (1/t3), 40 la raíz (1/t2), 20 el sinc (1/t). Lo decide la primera derivada del espectro que salta.
  7. Truncar el coseno realzado no rompe Nyquist, rompe la banda: −81,2 dB fuera de banda con span 25, 15 dB menos por cada duplicación. La raíz: −56,5 dB y 9 dB por duplicación, y el par deja −72,7 dB de ISI en el símbolo del corte.
  8. rcosdesign normaliza a energía 1: pico 1/N(1−α/4) para el coseno realzado, par de raíces con pico 1 exacto. Sin cuarto argumento devuelve la raíz.
  9. Canal plano donde hay señal: ISI en el piso. Pasabajos fir1(66, 0.3), corte 0,6/T: −34,6 dB; corte 0,4/T: ojo de PAM-2 cerrado. Un pasatodo, con el módulo intacto, también la trae de vuelta.
  10. Lo de un canal lineal lo arregla otro filtro lineal, el ecualizador. Un canal no lineal no tiene pulso total, y el criterio no aplica.
← Anterior Siguiente → Inicio
Relacionados La ISI y el pulse shaping La modulación PAM El ecualizador zero forcing El transceptor adaptativo El reloj corrido La raíz sola El filtro adaptado y el canal