15. Formador de Pulso

Este cap铆tulo cubre la conformaci贸n de pulsos, la interferencia entre s铆mbolos, el filtrado coincidente y los filtros de coseno elevado. Al final usamos Python para agregar configuraci贸n de pulso a los s铆mbolos BPSK. Puede considerar esta secci贸n, Parte II del cap铆tulo Filtros, donde profundizamos en la configuraci贸n del pulso.

Interferencia entre simbolos (ISI)

En el capitulo Filtros aprendimos que los s铆mbolos/pulsos en forma de bloques utilizan una cantidad excesiva de espectro, y podemos reducir en gran medida la cantidad de espectro utilizado 鈥渄ando forma鈥 a nuestros pulsos. Sin embargo, no puedes usar cualquier filtro de paso bajo o podr铆as obtener interferencia entre s铆mbolos (ISI), donde los s铆mbolos se fusionan e interfieren entre s铆.

Cuando transmitimos s铆mbolos digitales, los transmitimos uno tras otro (en lugar de esperar un tiempo entre ellos). Cuando se aplica un filtro de configuraci贸n de pulso, se alarga el pulso en el dominio del tiempo (para condensarlo en frecuencia), lo que hace que los s铆mbolos adyacentes se superpongan entre s铆. La superposici贸n est谩 bien, siempre y cuando su filtro de configuraci贸n de pulsos cumpla con este criterio: todos los pulsos deben sumar cero en cada m煤ltiplo de nuestro per铆odo de s铆mbolo. T, excepto uno de los pulsos. La idea se comprende mejor a trav茅s de la siguiente visualizaci贸n:

A pulse train of sinc pulses

Como puedes ver en cada intervalo de T, hay un pico de pulso mientras que el resto de los pulsos est谩n en 0 (cruzan el eje x). Cuando el receptor muestrea la se帽al, lo hace en el momento perfecto (en el pico de los pulsos), lo que significa que ese es el 煤nico momento que importa. Generalmente hay un bloque de sincronizaci贸n de s铆mbolos en el receptor que garantiza que los s铆mbolos se muestreen en los picos.

Filtro acoplado

Un truco que utilizamos en las comunicaciones inal谩mbricas se llama filtrado coincidente. Para comprender el filtrado coincidente, primero debe comprender estos dos puntos:

  1. Los pulsos que comentamos anteriormente s贸lo tienen que estar perfectamente alineados en el receptor antes del muestreo. Hasta ese momento, realmente no importa si hay ISI, es decir, las se帽ales pueden volar por el aire con ISI y est谩 bien.

  2. Queremos un filtro paso bajo en nuestro transmisor para reducir la cantidad de espectro que utiliza nuestra se帽al. Pero el receptor tambi茅n necesita un filtro de paso bajo para eliminar la mayor cantidad posible de ruido/interferencia junto a la se帽al. Como resultado, tenemos un filtro paso bajo en el transmisor (Tx) y otro en el receptor (Rx), luego el muestreo ocurre despu茅s de ambos filtros (y los efectos del canal inal谩mbrico).

Lo que hacemos en las comunicaciones modernas es dividir el filtro formador de pulsos en partes iguales entre Tx y Rx. No tienen que ser filtros id茅nticos, pero, te贸ricamente, el filtro lineal 贸ptimo para maximizar la SNR en presencia de AWGN es usar el mismo filtro tanto en Tx como en Rx. Esta estrategia se denomina como el concepto del 鈥渇iltro acoplado鈥.

Otra forma de pensar en los filtros acoplados es que el receptor correlaciona la se帽al recibida con la se帽al plantilla conocida. La se帽al de plantilla son esencialmente los pulsos que env铆a el transmisor, independientemente de los cambios de fase/amplitud que se les apliquen. Recuerde que el filtrado se realiza mediante convoluci贸n, que es b谩sicamente correlaci贸n (de hecho, son matem谩ticamente iguales cuando la plantilla es sim茅trica). Este proceso de correlacionar la se帽al recibida con la plantilla nos brinda la mejor oportunidad de recuperar lo que se envi贸 y es por eso que es te贸ricamente 贸ptimo. Como analog铆a, piense en un sistema de reconocimiento de im谩genes que busca caras utilizando una plantilla de cara y una correlaci贸n 2D:

../_images/face_template.png

Dividir un filtro por la mitad

驴C贸mo dividimos realmente un filtro por la mitad? La convoluci贸n es asociativa, lo que significa:

(f * g) * h = f * (g * h)

Imaginemos f como nuestra se帽al de entrada, y g y h son filtros. Filtrar f con g, y luego h es lo mismo que filtrar con un filtro igual a g * h.

Adem谩s, recuerde que la convoluci贸n en el dominio del tiempo es una multiplicaci贸n en el dominio de la frecuencia:

g(t) * h(t) \leftrightarrow G(f)H(f)

Para dividir un filtro por la mitad, puedes tomar la ra铆z cuadrada de la respuesta de frecuencia.

X(f) = X_H(f) X_H(f) \quad \mathrm{where} \quad X_H(f) = \sqrt{X(f)}

A continuaci贸n se muestra un diagrama simplificado de una cadena de transmisi贸n y recepci贸n, con un filtro de coseno elevado (RC) dividido en dos filtros de coseno elevado (RRC); el del lado de transmisi贸n es el filtro formador de pulsos y el del lado de recepci贸n es el filtro acoplado. Juntos, hacen que los pulsos en el demodulador parezcan como si hubieran sido moldeados con un solo filtro RRC.

A diagram of a transmit and receive chain, with a Raised Cosine (RC) filter being split into two Root Raised Cosine (RRC) filters

Filtros Formadores de Pulso Espec铆ficos

Sabemos que queremos:

  1. Dise帽e un filtro que reduzca el ancho de banda de nuestra se帽al (para usar menos espectro) y todos los pulsos excepto uno deben sumar cero en cada intervalo de s铆mbolo.

  2. Divida el filtro por la mitad, poniendo una mitad en el Tx y la otra en el Rx.

Veamos algunos filtros espec铆ficos que se usan com煤nmente para dar forma al pulso.

Filtro de Coseno-Elevado

El filtro formador de pulsos m谩s popular parece ser el filtro de 鈥渃oseno elevado鈥. Es un buen filtro paso bajo para limitar el ancho de banda que ocupar谩 nuestra se帽al, y adem谩s tiene la propiedad de sumar cero en intervalos de T:

The raised cosine filter in the time domain with a variety of roll-off values

Tenga en cuenta que el gr谩fico anterior est谩 en el dominio del tiempo. Representa la respuesta al impulso del filtro. El par谩metro \beta es el 煤nico par谩metro para el filtro de coseno elevado y determina qu茅 tan r谩pido el filtro disminuye en el dominio del tiempo, que ser谩 inversamente proporcional a la rapidez con la que disminuye en frecuencia:

The raised cosine filter in the frequency domain with a variety of roll-off values

La raz贸n por la que se llama filtro de coseno elevado es porque el dominio de la frecuencia cuando \beta = 1 es medio ciclo de la onda coseno, elevada para sentarse en el eje x.

La ecuaci贸n que define la respuesta impulsiva del filtro de coseno elevado es:

h(t) = \frac{1}{T} \mathrm{sinc}\left( \frac{t}{T} \right) \frac{\cos\left(\frac{\pi\beta t}{T}\right)}{1 - \left( \frac{2 \beta t}{T}   \right)^2}

M谩s informaci贸n sobre la funci贸n \mathrm{sinc}() puedes encontrarla aqui.

Recuerde: dividimos este filtro entre Tx y Rx por igual. 隆Iniciemos con el filtro ra铆z de coseno elevado (RRC)!

Filtro de la ra铆z del coseno elevado

El filtro ra铆z de coseno elevado (RRC) es lo que realmente implementamos en nuestros Tx y Rx. Combinados forman un filtro de coseno elevado normal, como comentamos. Debido a que dividir un filtro por la mitad implica una ra铆z cuadrada en el dominio de la frecuencia, la respuesta al impulso se vuelve un poco confusa:

../_images/rrc_filter.png

Afortunadamente, es un filtro muy utilizado y existen muchas implementaciones, incluidas en Python.

Otros filtros formadores de pulsos

Otros filtros incluyen el filtro gaussiano, que tiene una respuesta de impulso que se asemeja a una funci贸n gaussiana. Tambi茅n hay un filtro sinc, que es equivalente al filtro de coseno elevado cuando \beta = 0. El filtro sinc es m谩s bien un filtro ideal, lo que significa que elimina las frecuencias necesarias sin mucha regi贸n de transici贸n.

Factor de Roll-Off

Analicemos el par谩metro \beta. Es un n煤mero entre 0 y 1 y se denomina factor de 鈥渞oll-off鈥 o, a veces, 鈥渆xceso de ancho de banda鈥. Determina qu茅 tan r谩pido, en el dominio del tiempo, el filtro llega a cero. Recuerde que, para usarse como filtro, la respuesta al impulso debe decaer a cero en ambos lados:

Plot of the raised cosine roll-off parameter

Se requieren m谩s taps del filtro, cuanto m谩s bajo sea \beta. Cuando \beta = 0 la respuesta al impulso nunca llega completamente a cero, por lo que intentamos que \beta sea lo m谩s bajo posible sin causar otros problemas. Cuanto menor sea la ca铆da, m谩s compacta en frecuencia podremos crear nuestra se帽al para una velocidad de s铆mbolo determinada, lo cual siempre es importante.

Una ecuaci贸n com煤n utilizada para aproximar el ancho de banda, en Hz, para una velocidad de s铆mbolo y un factor de ca铆da determinados es:

\mathrm{BW} = R_S(\beta + 1)

R_S es la velocidad de s铆mbolo en Hz. Para las comunicaciones inal谩mbricas normalmente nos gusta una ca铆da entre 0,2 y 0,5. Como regla general, una se帽al digital que utiliza velocidad de s铆mbolo R_S ocupar谩 un poco m谩s que R_S de espectro, incluidas las porciones positivas y negativas del espectro. Una vez que convertimos y transmitimos nuestra se帽al, ambas partes ciertamente importan. Si transmitimos QPSK a 1 mill贸n de s铆mbolos por segundo (MSps), ocupar谩 alrededor de 1,3 MHz. La velocidad de datos ser谩 de 2 Mbps (recuerde que QPSK usa 2 bits por s铆mbolo), incluida cualquier sobrecarga como codificaci贸n de canal y encabezados de trama.

Ejercicio en Python

Como ejercicio de Python, filtremos y demos forma a algunos pulsos. Usaremos s铆mbolos BPSK para que sea m谩s f谩cil de visualizar; antes del paso de configuraci贸n del pulso, BPSK implica transmitir 1 o -1 con la porci贸n 鈥淨鈥 igual a cero. Con Q igual a cero podemos trazar s贸lo la porci贸n I, y es m谩s f谩cil de observar.

En esta simulaci贸n usaremos 8 muestras por s铆mbolo, y en lugar de usar una se帽al de onda cuadrada de 1 y -1, usamos un tren de impulsos. Cuando pasas un impulso a trav茅s de un filtro, la salida es la respuesta al impulso (de ah铆 el nombre). Por lo tanto, si desea una serie de pulsos, deber谩 utilizar impulsos con ceros entre ellos para evitar pulsos cuadrados.

import numpy as np
import matplotlib.pyplot as plt
from scipy import signal

num_symbols = 10
sps = 8

bits = np.random.randint(0, 2, num_symbols) # Our data to be transmitted, 1's and 0's

x = np.array([])
for bit in bits:
    pulse = np.zeros(sps)
    pulse[0] = bit*2-1 # set the first value to either a 1 or -1
    x = np.concatenate((x, pulse)) # add the 8 samples to the signal
plt.figure(0)
plt.plot(x, '.-')
plt.grid(True)
plt.show()
A pulse train of impulses in the time domain simulated in Python

En este punto nuestros s铆mbolos siguen siendo 1 y -1. No se deje atrapar por el hecho de que usamos impulsos. De hecho, podr铆a ser m谩s f谩cil no visualizar la respuesta de los impulsos, sino pensar en ella como una matriz:

bits: [0, 1, 1, 1, 1, 0, 0, 0, 1, 1]
BPSK symbols: [-1, 1, 1, 1, 1, -1, -1, -1, 1, 1]
Applying 8 samples per symbol: [-1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, ...]

Crearemos un filtro de coseno elevado usando un \beta de 0.35, y lo haremos de 101 taps de largo para darle a la se帽al suficiente tiempo para decaer a cero. Si bien la ecuaci贸n del coseno elevado solicita nuestro per铆odo de s铆mbolo y un vector de tiempo t, podemos asumir un per铆odo de muestra de 1 segundo para 鈥渘ormalizar鈥 nuestra simulaci贸n. Significa que nuestro per铆odo de s铆mbolo Ts es 8 porque tenemos 8 muestras por s铆mbolo. Nuestro vector de tiempo ser谩 entonces una lista de n煤meros enteros. Dada la forma en que funciona la ecuaci贸n del coseno elevado, queremos que t=0 est茅 en el centro. Generaremos el vector de tiempo de 101 longitudes comenzando en -51 y terminando en +51.

# Create our raised-cosine filter
num_taps = 101
beta = 0.35
Ts = sps # Assume sample rate is 1 Hz, so sample period is 1, so *symbol* period is 8
t = np.arange(num_taps) - (num_taps-1)//2
h = np.sinc(t/Ts) * np.cos(np.pi*beta*t/Ts) / (1 - (2*beta*t/Ts)**2)
plt.figure(1)
plt.plot(t, h, '.')
plt.grid(True)
plt.show()
../_images/pulse_shaping_python2.png

Observe c贸mo la salida definitivamente decae a cero. El hecho de que estemos usando 8 muestras por s铆mbolo determina qu茅 tan estrecho aparece este filtro y qu茅 tan r谩pido decae hasta cero. La respuesta de impulso anterior parece un filtro paso bajo t铆pico, y realmente no hay forma de que sepamos si es un filtro formador de pulsos especifico versus cualquier otro filtro paso bajo.

Por 煤ltimo, podemos filtrar nuestra se帽al x y examinar el resultado. No se concentre demasiado en la introducci贸n de un bucle for en el c贸digo proporcionado. Discutiremos por qu茅 est谩 ah铆 despu茅s del bloque de c贸digo.

# Filter our signal, in order to apply the pulse shaping
x_shaped = np.convolve(x, h)
plt.figure(2)
plt.plot(x_shaped, '.-')
for i in range(num_symbols):
    plt.plot([i*sps+num_taps//2,i*sps+num_taps//2], [0, x_shaped[i*sps+num_taps//2]])
plt.grid(True)
plt.show()
../_images/pulse_shaping_python3.svg

Esta se帽al resultante se suma a muchas de nuestras respuestas impulsivas, y aproximadamente la mitad de ellas se multiplica primero por -1. Puede parecer complicado, pero lo superaremos juntos.

En primer lugar, hay muestras transitorias antes y despu茅s de los datos debido al filtro y a la forma en que funciona la convoluci贸n. Estas muestras adicionales se incluyen en nuestra transmisi贸n pero en realidad no contienen 鈥減icos鈥.

En segundo lugar, las l铆neas verticales se crearon en el bucle for por motivos de visualizaci贸n. Est谩n destinados a demostrar d贸nde ocurren los intervalos de Ts. Estos intervalos representan d贸nde el receptor muestrear谩 esta se帽al. Observe que para intervalos de Ts la curva tiene el valor de exactamente 1,0 o -1,0, lo que los convierte en los puntos ideales en el tiempo para muestrear.

Si tuvi茅ramos que convertir y transmitir esta se帽al, el receptor tendr铆a que determinar cu谩ndo est谩n los l铆mites de Ts, por ejemplo, usando un algoritmo de sincronizaci贸n de s铆mbolos. De esa manera, el receptor sabe exactamente cu谩ndo tomar muestras para obtener los datos correctos. Si el receptor toma muestras demasiado pronto o demasiado tarde, ver谩 valores que est谩n ligeramente sesgados debido al ISI, y si est谩 muy alejado, obtendr谩 un mont贸n de n煤meros extra帽os.

Aqu铆 hay un ejemplo, creado con GNU Radio, que ilustra c贸mo se ve el gr谩fico IQ (tambi茅n conocido como constelaci贸n) cuando tomamos muestras en los momentos correctos e incorrectos. Los pulsos originales tienen sus valores de bits anotados.

../_images/symbol_sync1.png

El siguiente gr谩fico representa la posici贸n ideal en el tiempo para tomar la muestra, junto con el gr谩fico de IQ:

GNU Radio simulation showing perfect sampling as far as timing

Compare eso con el peor momento para tomar muestras. Observe los tres grupos de la constelaci贸n. Estamos probando directamente entre cada s铆mbolo; nuestras muestras van a estar muy alejadas.

GNU Radio simulation showing imperfect sampling as far as timing

Aqu铆 hay otro ejemplo de un tiempo de muestra deficiente, en alg煤n lugar entre nuestro caso ideal y el peor. Presta atenci贸n a los cuatro grupos. Con una SNR alta podr铆amos salirnos con la nuestra con este intervalo de tiempo de muestreo, aunque no es aconsejable.

../_images/symbol_sync4.png

Recuerde que nuestros valores de Q no se muestran en el gr谩fico del dominio del tiempo porque son aproximadamente cero, lo que permite que los gr谩ficos de IQ se extiendan solo horizontalmente.