You are on page 1of 15

MODULACIÓN

OBJETIVO:
- El objetivo de este laboratorio es aprender sobre la modulación digital e
implementar un transmisor inalámbrico para un enlace USRP a
USRP. Concretamente estaremos implementando el filtro de formación de pulso
(raíz del coseno elevado) y el modulador (BPSK, QPSK).

- Nota: la mayoría del tráfico de control (especialmente el manejo de errores) de


los VIs ha sido realizado para usted.

1 FUNDAMENTOS

(1) Modulación

La modulación es el proceso de variar una señal basada en un flujo de bits. En este caso,
modulamos los componentes en fase y en cuadratura de una sinusoide para representar
la información que deseamos enviar. Utilizaremos una técnica llamada Phase Shift
Keying (PSK). En PSK, el transmisor no varía la amplitud o la frecuencia de la
sinusoide transmitida. En cambio, varía la fase según la secuencia de bits de entrada.

(2) Binary Phase Shift Keying (BPSK)

Por ejemplo, BPSK representa cada bit como un símbolo, es decir, transmite una de dos
fases posibles correspondientes al valor del bit. Para esta asignación, el binario 0 es
asignado a un desplazamiento de fase de π / 2, es decir, 1j en notación compleja. El
binario 1 está mapeado a un desplazamiento de fase de 3π / 2, es decir, −1j en notación
compleja. Este mapeo de símbolos se muestra en la figura 1.

En este esquema, representamos matemáticamente la señal modulada para un bit como:


𝑠𝑏 (𝑡) = cos(2𝜋𝑓𝑚 𝑡 + 𝜙𝑏 )
Figura 1 – BPSK Mapa de símbolos

Donde 𝜙𝑏 es el desplazamiento de fase que representa al bit b = 0 o 1 y 𝑓𝑚 es la


frecuencia de la modulación en banda base. En general, elegimos 𝑓𝑚 tal que un período
completo de la sinusoide es igual al símbolo de tiempo. Para nuestra implementación,
𝜋 3𝜋
𝜙0 = y 𝜙1 = . Utilizando la notación de I-Q equivalente, podemos expresar nuestra
2 2
señal modulada 𝑠𝑏 (𝑡) como:

0 cos(2𝜋𝑓𝑚 𝑡) + 𝑗 sin(2𝜋𝑓𝑚 𝑡) ; 𝑠𝑖 𝑏 = 0
𝑠𝑏 (𝑡) = {
0 cos(2𝜋𝑓𝑚 𝑡) − 𝑗 sin(2𝜋𝑓𝑚 𝑡) ; 𝑠𝑖 𝑏 = 1

¿Puede ver cómo esta notación encaja con el mapa de símbolos BPSK que se muestra
arriba?
Si quisiéramos enviar el binario '101' utilizando la asignación especificada
anteriormente, y el tiempo de símbolo para cada bit es igual a un período completo de
una sinusoide, la señal asociada es la que se muestra en la figura 2.
Figura 2 – Flujo de bits en BPSK

Asegúrese de estar cómodo con esta idea antes de continuar. Usted podría intentar
generar un breve flujo BPSK utilizando Matlab.

(3) Quadrature Phase Shift Keying (QPSK)

De manera similar, en QPSK, cada par de 2 bits se asigna a un desplazamiento de


fase. Por lo tanto, hay cuatro fases posibles que tomará un transmisor QPSK. En esta
𝜋 3𝜋 5𝜋 7𝜋
tarea, nosotros elegiremos las fases , , , . En notación I-Q, estos puntos son
4 4 4 4
0.707 + 0.707𝑖, −0.707 + 0.707𝑖, 0.707 − 0.707𝑖, −0.707 − 0.707𝑖,
respectivamente. Este mapa de símbolos se muestra en la figura 3 . Para especificar
completamente el mapeo debemos definir una codificación, esto es, qué secuencia de 2
bits corresponde a qué fase de modulación.

Por mucho, el enfoque más común para esto es la Codificación Gray.


La motivación para usar la Codificación Gray es evidente. Observe el diagrama que
muestra el mapa de símbolo de QPSK en la figura 3. Note que los símbolos que se
encuentran diagonales entre sí, están más separados que los símbolos que están
directamente arriba / abajo o uno al lado del otro. A través del canal de comunicación
con ruido, tarde o temprano el receptor cometerá un error al decidir qué símbolo se
envió. Para la modulación QPSK, es posible que podamos elegir un símbolo en el que
ambos bits se estimen incorrectamente, que es el doble de perjudicial que estimar solo
1 bit incorrectamente. En la Codificación Gray, mapeamos los bits de tal forma que los
símbolos vecinos más cercanos difieren solo en un bit. Por lo tanto, para las
estimaciones incorrectas más probables del símbolo transmitido, cometeremos un error
de un solo un bit para esta asignación, en lugar de dos. Nuestro mapeo del Código Gray
es el siguiente

• 00 se encuentra en 0.707 + 0.707i


• 01 se encuentra en 0.707 - 0.707i
• 10 se encuentra en −0.707 + 0.707i
• 11 se encuentra en −0.707 - 0.707i

Este mapeo de símbolos se muestra en la figura 3.


Figura 3 – Modulación QPSK

(4) Filtrado

En primer lugar, recuerde que en un sistema de comunicación deseamos transmitir y


recibir señales de banda limitada, debido a que nuestra comunicación tiene lugar en un
espectro de frecuencias finito. Además, tenga en cuenta de la figura 2, que un flujo
modulado BPSK en general tendría "bordes" pronunciados debido a los repentinos
cambios de fase, los cuales generan componentes armónicos de mayor frecuencia. Para
evitar el esparcimiento fuera del ancho de banda deseado, los símbolos a ser
transmitidos generalmente se "filtran" para suavizar las transiciones en el dominio del
tiempo y minimizar las componentes armónicas en el dominio de la frecuencia. Un buen
filtro para tales propósitos es el "Filtro de la Raíz del Coseno Elevado".

Recuerde de clases anteriores, que pasar una señal a través de un canal era equivalente
a convolucionar la señal con la "Respuesta de Impulso" del canal. Del mismo modo, el
pasar una señal a través de un filtro es equivalente a convolucionar la señal con la
representación en dominio del tiempo del filtro. Sin embargo, a diferencia del canal,
aquí los coeficientes de los taps (denotado por h[n]) están bajo nuestro control. Estos
coeficientes son elegidos para restringir las componentes de frecuencia de la señal a una
banda especificada. Los coeficientes de los taps para un filtro de la "Raíz del Coseno
Elevado" se ven como en la figura 4. Este filtro del lado del transmisor también puede
ser referido como un “Filtro de Formación de Pulso” o “Filtro Formador de pulso”
porque le da una forma particular a la representación en el dominio del tiempo de la
señal que transmitimos.

Figura 4 – Respuesta en el dominio del tiempo del filtro de raíz de coseno alzado

2. INTRODUCCIÓN

Abra TX.vi, que consiste en el código del transmisor básico. La estructura básica del
código está en su lugar, su trabajo es completar los componentes
faltantes. Esencialmente, el flujo del código es el siguiente:

1. Aceptar los parámetros de transmisión (TX) del usuario a través del panel
frontal. Estas entradas incluyen el tipo de modulación (BPSK o QPSK), el número de
muestras por símbolo, y los parámetros del filtro de la raíz cuadrada del coseno elevado.
2. Basado en los parámetros de entrada de TX, el subVI "Generate System Parameters"
genera el mapa de símbolos que se utilizará para mapear el flujo de bits de entrada a los
símbolos modulados a ser transmitidos. Esto genera a la salida un clúster llamado "PSK
system parameters" que tiene 2 entradas:

* Una numérica "Muestras por símbolo"


* Un arreglo de valores complejos "Mapa de símbolos"

3. "PSK system parameters" y "filter parameters" son pasados al subVI "continuous


PSK generation" como entradas. Este subVI forma un arreglo de bits generados
aleatoriamente y lo modula usando el mapa de símbolos generado en el paso (2) y luego
pasa la señal modulada resultante a través del filtro de formación de pulso.

Tenga en cuenta que, en este subVI, solo se genera un arreglo finito de bits aleatorios
y, por lo tanto, la "forma de onda compleja de salida" solo consiste en un arreglo finito
de números complejos, este tipo de arreglo es conocido como “trama”. Esta trama es
repetida una y otra vez durante las transmisiones por el canal inalámbrico como puede
ser visto en el lazo while en TX.vi. Note aquí que el subVI "niUSRP Write Tx data.vi"
(que se usa dentro del lazo while) es parte de la librería de LabVIEW que se usa para
controlar el USRP y éste es el que interconecta las muestras generadas en nuestro
ordenador con el USRP.

4. El panel frontal de TX.vi consta de los siguientes controladores e indicadores:

• "Devices names" es la dirección IP del USRP. Se debe establecer en el segmento de


red de predeterminado de "192.168.10.X" o el que se le indique en clases.

• "Filter Parameters" es un controlador a través del cual se puede especificar los


parámetros del filtro de formación pulsos. El "TX Filter" que usaremos es el de Raíz
del Coseno Elevado. "Alfa" es un parámetro del filtro denominado factor de roll off
(roll off factor). "Filter Length" define la longitud del filtro en términos del número de
símbolos. Los valores predeterminados de 0.5 para "Alfa" y 6 para "Filter Length"
deben funcionar bien para nuestros propósitos.

• Recuerde que una "trama" es un arreglo finito de muestras complejas a ser


transmitidas, que se repiten una y otra vez. El número de muestras por "trama" se
calcula y se muestra en el panel frontal como el indicador "Frame Size [samples]”.

• "Choose a PSK format" es un controlador mediante el cual puede especificar la


modulación a utilizar en el transmisor. Las opciones disponibles son QPSK y
BPSK. Una vez elegida la modulación, también puede elegir el número de muestras por
símbolo “Samples per symbol” que desea transmitir. Este es el factor de sobremuestreo
que veremos más adelante.

• "TX Parameters:" Este es un controlador que establece los parámetros del USRP.

a) "TX IQ Sampling Rate" es el número de muestras por segundo que son


transmitidas por el USRP. Asegúrese de que esta se establezca en el valor
predeterminado de 200k (muy importante).

b) "TX Frequency" es la frecuencia central a la cual el transmisor transmite, la


portadora. Asegúrese de utilizar el valor de 433.92MHz.

c) "TX Gain" le da un control sobre la potencia a la que transmitir. Normalmente,


para la comunicación a distancias cercanas, el valor predeterminado de 0 dB
funciona bien.

d) "TX antenna" es la antena que se utiliza para la transmisión. Asegurarse de que


esto se establece en "TX/RX".

• Tenga en cuenta que habiendo especificado la frecuencia de muestreo de “TX IQ


Sampling Rate” (muestras transmitidas por segundo) y las muestras por símbolo
“Samples per symbol”, su relación automáticamente define la velocidad de transmisión
de símbolo “Symbol Rate [símbolos / s]" que se calcula y se muestra como un indicador
en el panel frontal.

Tarea 1: Generar mapa de símbolos

Primero abra el subVI "generate system parameters. Aparte del manejo de errores, este
subVI llama a otro subVI "generate PSK symbol map”. Este bloque solo necesita
formar los parámetros del sistema PSK, el cluster “PSK system parameters” tal como
se describe en la Introducción.

Finalice el bloque para generar el mapa de símbolos PSK “generate PSK symbol
map” formando el mapa de símbolos de acuerdo al valor de M-PSK, es decir,
dependiendo de si necesitamos el mapa de símbolos para BPSK o QPSK. Los mapas de
símbolos de estas dos constelaciones han sido descritos anteriormente.

• Entradas para generar el mapa de símbolos PSK “generate PSK symbol map”
- "M-PSK", que es un número entero que corresponde al número de puntos en el
mapa de símbolos. Por lo tanto, "M-PSK" sería 2 para BPSK y 4 para QPSK.

• Salidas para "generate PSK symbol map"

- "bits per symbol", que sería 1 para BPSK y 2 para QPSK.

- El arreglo de números complejos "Symbol Map" que contiene el diagrama de la


constelación ya mencionada. El formato exacto que utiliza en este arreglo, esto
es el ordenamiento utilizado, se deja a su criterio con tal que lo pueda interpretar
del mismo modo más adelante en el proceso de mapeo y generación de símbolos
en el transmisor.

Tarea 2: Generación continua de PSK

La siguiente tarea es completar el subVI "Continuous PSK generation". Abra este


SubVI para echarle un vistazo. Como se describe en la Introducción, este subVI genera
un arreglo de bits generados aleatoriamente y los modula usando el mapa de símbolos
generado arriba y eventualmente aplica el filtro de formación de pulso. Recuerde
también que "Output Complex Waveform" solo consiste en un arreglo finito de
muestras complejas de transmisión, que se conoce como una "trama".

Esta trama se repite una y otra vez por el canal inalámbrico. Digamos que consiste de
1000 símbolos la trama que queremos. Se ha realizado un cálculo para evaluar la
cantidad de bits que deseamos transmitir al utilizar una trama de 1000 símbolos. Este
cálculo se explicará en parte más adelante pero no es esencial para comprender el flujo
general del código.

Habiendo calculado el número de bits que necesitamos generar aleatoriamente, este


valor es pasado al subVI "random bit generator". Simultáneamente, el subVI "validate
and generate filter" genera los coeficientes del filtro para un filtro Raíz de Coseno
Elevado. Eventualmente, los coeficientes del filtro y el flujo de bits aleatorio se
introducen en el subVI "Modulate PSK" que realiza la asignación de símbolos según
los bits que recibe y aplica el filtro.

Descripción de los cálculos realizados en "continuous PSK generation”:


Como se mencionó anteriormente, supongamos que queremos que la trama conste de
1000 símbolos. Esto implica que la cantidad de bits que necesitamos generar sería 1000
x (bits por símbolo) donde "bits por símbolo" es 1 para BPSK y 2 para
QPSK. Recordemos que estaríamos finalmente filtrando esta señal y como se describe
al principio, el filtrado es equivalente a la convolución. Hemos visto en clase y en lab2,
que si la respuesta al impulso tiene k coeficientes, entonces las primeras k muestras de
salida del canal no se conocen incluso si las muestras de entrada correspondientes son
conocidas, debido a la "ISI" producida por los símbolos anteriores.

• Para tener en cuenta esta inicialización del filtro, generamos (1000 +


longitud_filtro) x (bits por símbolo) bits de entrada.
• Después del mapeo de símbolos, obtendríamos (1000 + longitud del filtro)
símbolos.
• Después del filtrado, obtendríamos (1000 + longitud_filtro) x (muestras por
símbolo – factor de sobremuestreo –) muestras filtradas.
• Luego podemos eliminar la primera (longitud_filtro) x (muestras_por_símbolo)
muestras filtradas para lidiar con el ISI de muestras desconocidas anteriores.

Note aquí que el número de muestras eliminadas es el mismo que el número de


coeficientes del filtro.

(1) Generador de bits aleatorios

El subVI "random bit generator" genera un arreglo de n bits aleatorios. La longitud del
arreglo se introduce en el subVI como entrada. Implemente la generación de bits
aleatoria en "random bit generator.vi". Asegúrese de generar un bit 0 y un bit 1con
casi la misma probabilidad.

Entradas para "random bit generator"

- "total bits" es el número de bits aleatorios que deseamos generar.

Salidas para "generador de bits aleatorios

- “output bit stream” debe ser un arreglo de longitud "total bits" que consiste en 1s
/ 0s que representa el flujo de bits aleatorio generado.

(2) Generar filtro

El subVI "validate and generate filter" primero verifica si las entradas tienen o no
sentido. Posteriormente, genera los coeficientes para el filtro raíz de coseno
elevado. No es necesario que modifique este subVI. Sin embargo, puede ver su salida
y confirmar que se parece a la figura 4. Aquí, el arreglo de salida de coeficientes del
filtro formador de pulsos “pulse shaping filter coefficients” es un arreglo con los valores
de h[n] correspondientes a los coeficientes del filtro de la raíz del coseno elevado.

(3) Modular PSK

Abra "modulate PSK" y échale un vistazo. Esto tiene 2 subVIs principales. El primero
es "PSK Map symbols". En este subVI, al arreglo de bits entrantes se asigna a símbolos
como se describe en el manual usando el mapa de símbolos generado en "generate
system parameters ", esta etapa se llama mapeo de símbolos. Implemente este mapeo
en el subVI "PSK map symbols".

Es decir, si por ejemplo, estamos usando una modulación QPSK y tenemos una
secuencia binaria de entrada de100 bits. Elija los primeros 2 bits y forme el "símbolo"
complejo según el mapa símbolos que usted ha armado. Repita este procedimiento hasta
que genere 50 símbolos de los 100 bits. Tenga cuidado con los casos en que puede
terminar con un número impar de bits (ignore el último bit en este caso).

Entradas para símbolos del mapa PSK “PSK map symbols”

- "Symbol Map" es el mismo arreglo que se genera en "generate PSK symbol


map".
- "Input Bit Stream" es el mismo arreglo de bits que se genera en "random bit
generator"

Salidas para "PSK map symbols"

- "Symbols" es un arreglo de números complejos que representan el flujo de


símbolos resultante del mapeo de los bits entrantes.

(4) Filtrar símbolos PSK

Eventualmente, estos símbolos se filtran en el subVI "filter PSK symbols". Abra este
SubVI y eche un vistazo. Hay mucho control de tráfico relacionado a lo que se quiere
cuando se "reinicia" el USRP. Todo esto se ha hecho para usted. Adicional a eso,
también la mayoría de los componentes de este subVI son "Upsampling.vi" y "perform
convolution.vi". Tenga en cuenta que los coeficientes del filtro generados en "validate
and generate filter” se pasan a este subVI como una entrada llamada "Pulse Shaping
Filter Coefficients" y el flujo de símbolos generado en "PSK map symbols.vi" se pasa
a este subVI como una entrada llamada "Symbols".
Recuerde que la entrada "Symbols" es un arreglo de todos los símbolos después del
mapeo. Sin embargo, deseamos transmitir múltiples muestras por símbolo y luego el
receptor decodifica el símbolo de estas múltiples muestras. Recordemos que en clase y
en lab2, si (muestras por símbolo) se pusieran a 4, repetiríamos el símbolo 4 veces, es
decir, si deseamos transmitir el flujo de bits 101, transmitiríamos 4 muestras de 5
Voltios cada uno para denotar el primer bit 1, luego transmitir 4 muestras de 0 Voltios
cada uno para denotar el segundo bit 0 y finalmente transmite 4 muestras de 5 Voltios
cada una para denotar el último bit 1.

Aquí vamos a hacer algo diferente. Primero vamos a "sobremuestrear" los símbolos, lo
que significa que insertamos (“muestras por símbolo” - 1) ceros entre cada dos símbolos
en la secuencia de símbolos. Por ejemplo, para el flujo de bits 101, el flujo de símbolos
sería '5volts 0volts 5volts' y el flujo muestreado con (muestras por símbolo) establecido
en 4 sería '5'000'0'000'5'000 donde las muestras entre comillas son los símbolos reales.
Lleve a cabo este sobremuestreo en el subVI "upsampling.vi"

• Entradas para "upsampling.vi"

- "x" es un arreglo de muestras complejas que representan el flujo que necesita


ser muestreado.
- "L" es la cantidad de sobremuestreo a realizar, es decir, debe insertar L-1 ceros
a cada símbolo que entra.

• Salidas para "upsampling.vi"

- "y" debe ser un arreglo de muestras complejas que representa la muestra “x”
sobremuestreada.

Después de sobremuestrear, se realiza la convolución con los coeficientes del


filtro. Para esto abra el subVI realizar convolución “perform convolution.vi". Tenga en
cuenta que los coeficientes del filtro se proporcionan como la entrada "Pulse Shaping
Filter Coefficients", que es un arreglo cuyo primer elemento es h[0] y así en adelante.

La secuencia de muestras sobremuestreada que necesita ser filtrada es la entrada


"Sample stream". Implemente esta convolución en el subVI “perform convolution.vi"

Entradas para "perform convolution.vi"


- "Sample stream" es un arreglo de números complejos que representan el arreglo
de entrada que necesita ser filtrado.
- "Pulse Shaping Filter Coefficients" es un arreglo de números complejos que
representan los valores de los coeficientes del filtro.
• Salidas para "perform convolution.vi"
- "Filtered samples" debe ser un arreglo de números complejos que representan
el flujo filtrado de muestras, es decir, debe ser la convolución de "Sample
stream "y " Pulse Shaping Filter Coefficients".

Nota: En los bloques de sobremuestreo y convolución, tenga en cuenta que está tratando
con números complejos y por lo tanto asegúrese que todas las constantes y variables
que se introducen se definan como complejas. Puede cambiar la "Representación" de
una constante / variable haciendo clic derecho sobre ella.

(5) Probando el código

Comprobará el funcionamiento del código con un receptor y verá si el receptor


decodifica el código constelación. Las figuras 5 y 6 son capturas de pantalla de los
paneles frontales de TX y RX cuando el código está trabajando.
Figura 5: Captura de pantalla de un código de trabajo (TX)
Figura 6: Captura de pantalla de un código de trabajo (RX)