UDLA
Desarrollo de Software Radio TX/RX de FM
CAPTULO 2
El objetivo de este captulo es describir el funcionamiento del programa GNU Radio el cual es necesario para la transmisin y recepcin con el USRP, trataremos primeramente con la instalacin del programa y su relacin con el USRP, luego analizaremos al USRP que incluye convertidores, un procesador y la interfase as como las tarjetas secundarias. Por ultimo se dar una introduccin a la programacin en GNU Radio.
2. GNU Radio
GNU Radio es un conjunto de archivos y aplicaciones que proveen las libreras necesarias de procesado digital de seales para poder manipular seales de radio. GNU Radio corre sobre sistemas GNU\Linux como Ubuntu, el cual debe estar previamente instalado
El programador de GNU Radio necesita, para construir un sistema de radio, crear un grafo, donde los vrtices son bloques de procesado de seales, y los bordes representan el flujo de datos entre ellos. Los bloques de procesado de seal son implementados en C++. Conceptualmente un bloque procesa seales continuamente desde puertos de entrada hasta puertos de salida. Las partes de un bloque son el nmero de puerto de entrada, el nmero del puerto de salida, y el tipo de dato que fluir de uno al otro. Los tipos de datos ms comnmente utilizados son: short, float y complex.
17
UDLA
Desarrollo de Software Radio TX/RX de FM Algunos bloques tienen nicamente puertos de salida o puertos de entrada. stos
sirven como fuente de datos y seales en una grfica. Existen fuentes que leen datos de un archivo o del ADC, y seales que escriben datos a un archivo, al DAC o a un display grfico. GNU Radio cuenta con aproximadamente 100 de estos bloques.
Las grficas para GNU Radio corren y son construdas en Python[25].
Python es un lenguaje de programacin interpretado, interactivo y orientado a objetos, es habitualmente comparado a TCL, Perl, Scheme, Java y Ruby.
Actualmente, Python se desarrolla como un proyecto de cdigo abierto, administrado por la Python Software Foundation. Contiene mdulos, clases, tipos de datos de alto nivel y escritura dinmica. Tiene interfaces para diversos sistemas y libreras. Tambin puede utilizarse como un lenguaje de extensin para aplicaciones que necesitan una interfaz programable. Otra ventaja es su portabilidad, funcionando en sistemas Unix y derivados, Windows, Dos, Mac y otros.
Hay factores que distinguen a Python de otros lenguajes de programacin orientados a objetos: 1) No hay necesidad de compilar cdigo en Python antes de ejecutarlo, por lo que se convierte en un lenguaje de script. 2) El lenguaje busca tener un cdigo ms fcil de utilizar (y con reutilizable para otras aplicaciones).
18
UDLA
Desarrollo de Software Radio TX/RX de FM
2.1.
Instalacin
La instalacin de GNU Radio fue quizs el proceso ms exhaustivo de sta Tesis, pero la siguiente gua contiene toda la informacin necesaria para obtener una instalacin satisfactoria en Ubuntu.
Lo primero que hay que hacer es ubicar los paquetes (2.x tarball o CVS) de GNU Radio los cuales los podemos encontrar en [Link]/software/gnuradio (2.x tarball) o utilizando CVS (Concurrent Versions System), lo cual se realizar ms adelante, estos paquetes son los siguientes: gnuradio-core: el ncleo de las libreras. gnuradio-examples: ejemplos de GNU Radio, donde encontraremos los programas para TX y RX de FM. gr-audio-oss: soporte para tarjetas de sonido que utilizan OSS (Open Sound System). gr-audio-alsa: soporte para tarjetas de sonido que utilizan ALSA (Advanced Linux Sound Architecture). gr-usrp: libreras que unen a GNU Radio con el Universal Software Radio Peripheral. gr-wxgui: wxPython basado en herramientas GNU, incluye un oscilocopio y FFTs. gr-howto-write-a-block: incluye ejemplos de como escribir un bloque. usrp: soporte para la tarjeta USRP.
Ahora antes de instalar gnuradio-core es necesario tener algunos paquetes preinstalados, estos paquetes son los siguientes:
19
UDLA
Desarrollo de Software Radio TX/RX de FM
FFTW (Fastest Fourier Transform in the West): sta es una subrutina en C que es capaz de computar transformadas discretas de Fourier en una o ms dimensiones, el tamao de la entrada es arbitrario y maneja datos complejos y reales. FFTW es software libre por lo que se convierte en una librera de FFT para cualquier aplicacin. Lo podemos obtener de: [Link]
Cppunit: Es una unidad de prueba para checar bloques en C++. Lo podemos obtener de: [Link]
SWIG (Simplified Wrapper and Interface Generator): Son herramientas para el desarrollo de software que conectan programas escritos en C o C++ con una gran variedad de lenguajes de programacin de alto nivel. SWIG es utilizado con diferentes tipo se lenguaje como Python. Lo podemos obtener de: [Link]
Numarray y Numpy: Son dos mdulos de Python necesarios para el funcionamiento de GNU Radio. stos son utilizados para computo numrico y los podemos encontrar disponibles en: [Link]
wxPython: Son herramientas para el lenguaje de programacin Python, y permite crear programas con funciones e interfaces grficas de forma simple. sta implementado como un mdulo de Python. Lo podemos obtener de: [Link]
20
UDLA
Desarrollo de Software Radio TX/RX de FM La instalacin de los programa antes mencionados es ciertamente complicada ya
que stos tambin requieren algunos programas preinstalados, lo que vuelve al proceso bastante confuso. Para aportar claridad al proceso contamos con la ayuda del Synaptic Package Manager de Ubuntu (otra razn ms del porqu Ubuntu), el cual lo encontramos en: System Administration Synaptic Package Manager
Al haber dado de alta, en un principio, los repositorios donde se encuentran las libreras necesarias, ahora simplemente hay que instalarlas; para esto es necesario buscar la librera requerida con el botn de search, seleccionarla para instalacin y aplicar la instalacin con el botn apply.
Las libreras que debemos buscar e instalar son las siguientes: automake1.8 gcc-3.4 g++-3.4 Despus de instalar gcc y g++ debemos crear una liga simblica con los siguientes comandos ejecutados en una Terminal: # cd /usr/bin # sudo ln -s gcc-3.4 gcc # sudo ln -s g++-3.4 g++ python2.4 python2.4-dev libtool (1.5) wxpython2.5.3
21
UDLA
Desarrollo de Software Radio TX/RX de FM En caso de no ser encontrado wxpython por el Synaptic Package Manager es
necesario ejecutar en una Terminal los siguientes comandos: # apt-get update # apt-get install wxpython2.5.3
python2.3-numeric libasound2 para ALSA libasound2-dev para ALSA libusb-dev sdcc bjam libboost-dev libboost-python1.31.0 libboost-python-dev fftw3 fftw3-dev cppunit libcppunit-dev libcppunit-1.10-2 Las nicas libreras que no se encuentran en los repositorios son las de SWIG
por lo que es necesario instalarlo manualmente, para esto hay que descargarlo de [Link] donde podemos obtener la versin SWIG 1.3.24 la cual ya fue probada en este trabajo.
22
UDLA
Desarrollo de Software Radio TX/RX de FM El archivo descargado se encuentra en formato comprimido swig-*.[Link] por lo
que es necesario descomprimirlo, para esto es necesario utilizar una Terminal y movernos al directorio donde se encuentra el archivo comprimido. En la Terminal y ya en ese directorio debemos escribir el siguiente comando:
# tar zxvf [Link]
Con esto obtendremos una carpeta con los archivos necesarios de SWIG; en la misma terminal nos movemos a esta nueva carpeta y para realizar la instalacin es necesario ahora ejecutar los siguientes comandos esperando a que cada uno termine de ejecutarse antes de correr el siguiente: # ./configure # make # make check # make install
Ahora para obtener los paquetes de GNU Radio utilizaremos CVS que es una forma de descargar los paquetes en su ultima versin sin necesidad de hacerlo desde una pgina de Internet. Para esto debemos ejecutar los siguientes comandos en una Terminal:
# export CVS_RSH="ssh" # cvs -z3 -d:ext:anoncvs@[Link]:/cvsroot/gnuradio co -P gr-build
23
UDLA
Desarrollo de Software Radio TX/RX de FM Con estos comandos creamos una carpeta llamada gr-build con los archivos
necesarios para instalar los paquetes de GNU Radio como se muestra en la Figura 2.1:
Figura 2.1. Carpeta gr-build con los archivos necesarios para instalar GNU Radio Ahora debemos descargar los paquetes en esta carpeta que se cre, para esto nos movemos a esa carpeta y tecleamos lo siguiente en la lnea de comandos de la Terminal: # cvs -z3 -d:ext:anoncvs@[Link]:/cvsroot/gnuradio co -P gnuradio-core # cvs -z3 -d:ext:anoncvs@[Link]:/cvsroot/gnuradio co -P examples # cvs -z3 -d:ext:anoncvs@[Link]:/cvsroot/gnuradio co -P gr-audio-alsa # cvs -z3 -d:ext:anoncvs@[Link]:/cvsroot/gnuradio co -P gr-audio-oss # cvs -z3 -d:ext:anoncvs@[Link]:/cvsroot/gnuradio co -P gr-usrp # cvs -z3 -d:ext:anoncvs@[Link]:/cvsroot/gnuradio co -P gr-wxgui # cvs -z3 -d:ext:anoncvs@[Link]:/cvsroot/gnuradio co -P gr-howtowrite-a-block # cvs -z3 -d:ext:anoncvs@[Link]:/cvsroot/gnuradio co -P gr-gsm-frvocoder gnuradio-
24
UDLA
Desarrollo de Software Radio TX/RX de FM
# cvs -d:pserver:anonymous@[Link]:/cvsroot/opensdr login # cvs -z3 -d:pserver:anonymous@[Link]:/cvsroot/opensdr co -P usrp Ahora nuestra carpeta de gr-build se debe ver como en la Figura 2.2.
Figura 2.2. Carpeta gr-build luego de descargar los archivos de CVS
Para realizar la instalacin final hacemos lo siguiente en la Terminal en el directorio de gr-build: # ./checkout # ./for-all-dirs ../buildit 2>&1 | tee [Link]
El proceso debe durar algunos minutos y de acuerdo a lo hecho anteriormente no debe haber ningn error, en caso de existir alguno el sistema nos avisara si hace falta algn archivo o librera, de no ser as es necesario revisar el proceso nuevamente.
25
UDLA
Desarrollo de Software Radio TX/RX de FM Ahora debemos obtener las actualizaciones para el USRP, lo nico que debemos
hacer es descarga este archivo de [Link]/software/gnuradio, descomprimirlo como lo hicimos con SWIG: # tar zxvf usrp*.[Link] Y copiar los archivos que no se encuentren en nuestra carpeta de usrp en grbuild. Ahora para comprobar que todo el proceso se realiz correctamente correremos un programa de ejemplo que simula el tono que da una lnea telefnica, para esto, desde una Terminal nos ubicamos en la carpeta gr-build y hacemos lo siguiente: # killall esd (es necesario cada vez que iniciamos el sistema operativo, elimina el proceso de audio con el que cuenta la computadora.) # cd gnuradio-examples/pitn/audio/ #./dial_tone.py Si escuchamos un tono como el mencionado anteriormente significa que el ejemplo funciona, y que nuestro GNU Radio est instalado correctamente. En caso de no encontrar el archivo dial_tone.py lo podemos crear a travs de los siguientes pasos: Abrimos un Editor de Texto y copiamos el siguiente programa:
#!/usr/bin/env python from gnuradio import gr from gnuradio import audio def build_graph (): sampling_freq = 48000 ampl = 0.1 fg = gr.flow_graph () src0 = gr.sig_source_f (sampling_freq, gr.GR_SIN_WAVE, 350, ampl) src1 = gr.sig_source_f (sampling_freq, gr.GR_SIN_WAVE, 440, ampl) dst = [Link] (sampling_freq) [Link] ((src0, 0), (dst, 0)) [Link] ((src1, 0), (dst, 1))
26
UDLA
return fg if __name__ == '__main__': fg = build_graph () [Link] () raw_input ('Press Enter to quit: ') [Link] ()
Desarrollo de Software Radio TX/RX de FM
Ahora guardamos este archivo en /gr-buid/gnuradio-examples/python/audio/ con el nombre de dial_tone.py Para poder ejecutarlo desde una Terminal es necesario pulsar el botn derecho del mouse sobre el cono del archivo creado y en la pestaa de Permissions debemos dejar las opciones como se muestra en la Figura 2.3.
Figura 2.3 Propiedades del programa hello_world.py Con esto ya podemos volver a correr el ejemplo como se mostr anteriormente.
27
UDLA
Desarrollo de Software Radio TX/RX de FM
2.2.
Pre-requisitos
La seccin de prerrequisitos tiene la funcin de informar al lector sobre algunos tpicos que deben ser conocidos para poder continuar con el proceso de esta Tesis. ADCs: Un convertidor analgico a digital tiene tres caractersticas primarias: Sample Rate (Tasa de Muestreo) Dynamic Range (Rango Dinmico) Tiempo de conversin Sample Rate o Tasa de Muestreo es el nmero de veces por segundo que el ADC mide una seal analgica. Dynamic Range o Rango Dinmico se refiere a la diferencia entre la seal ms pequea y la ms grande que puede ser distinguida por el ADC, esta en funcin del nmero de bits de salida del ADC. Tiempo de conversin: Existe un tiempo de conversin Tc que necesita el ADC para sacar un nmero digital a partir de recibir un dato analgico con el fin de que al existir una variacin en la entrada no surja una confusin en la conversin. Teora de Nyquist: La teora de Nyquist determina que para evitar el efecto de aliasing cuando convertimos de analgico a digital, la frecuencia de muestreo del ADC debe ser de al menos dos veces el ancho de banda de la banda de inters. Frecuencia de inters Frecuencia de muestreo 0 a fmax 2 fmax
28
UDLA
Desarrollo de Software Radio TX/RX de FM RF front end: Un RF front end se encarga de trasladar el centro de un rango de
frecuencias a otro rango de frecuencias, por ejemplo: un mdem sintonizador de seales de cable (RF front end) tiene las siguientes caractersticas, traslada una parte de 6MHz del espectro centrada entre 50 y 800MHz hacia un rango de salida centrado en 5.75MHz. La frecuencia central del rango de salida se llama Frecuencia Intermedia o IF. [14]
2.3.
Tarjeta USRP
2.3.1. Qu es el USRP?
El Universal Software Radio Peripheral es un perifrico diseado para trabajar en conjunto con una computadora a travs de un FPGA y permite la realizacin de Software Radios. Este perifrico realiza las funciones de llevar la seal a banda base de RF a travs de la seccin de IF, y viceversa, para un sistema comn de radio comunicaciones, como se muestra en la Figura 2.4.
Antena
RF FrontEnd
Analog IF
A/D Conversin. D/A Conversin.
Procesamiento (Software)
Figura 2.4 Bloques principales en este sistema de comunicaciones de Software Radio
En el Apndice H se muestra una hoja tcnica del USRP con algunas caractersticas.
29
UDLA
Desarrollo de Software Radio TX/RX de FM
2.3.2. Caractersticas
El USRP cuenta con 2 niveles de tarjetas como se muestra en la Figura 2.5. El primero es la tarjeta base en donde se encuentra el FPGA, los convertidores ADCs y DACs, la alimentacin y la conexin va USB. El segundo nivel se compone de Daughterboards llamadas tarjetas secundarias. stas existen para transmisin y recepcin. Estas tarjetas son las que trabajan como RF front-end las cuales llevan nuestra seal hasta la banda de RF deseada.
Nivel 1 USRP Motherboard o Tarjeta Primaria
Nivel 2 USRP Daughterboards o Tarjetas Secundarias
Figura 2.5 Universal Software Radio Peripheral [5]
La Figura 2.6 muestra un diagrama a bloques del Universal Software Radio Peripheral, donde podemos ver la disposicin de los convertidores, el procesador y la interfase USB.
30
UDLA
Desarrollo de Software Radio TX/RX de FM
Figura 2.6 Diagrama a bloques del Universal Software Radio Peripheral [5]
[Link]
Primer nivel: convertidores, procesador e interfase.
Convertidores AD El USRP tiene 4 convertidores ADC de alta velocidad, cada uno a 12 bits por muestreo, y 64 millones de muestras por segundo con lo que podemos digitalizar una banda de 32MHz. Si muestreamos una seal a una IF (Intermediate Frecuency) de 32MHz introducimos el efecto de imagen al sistema con lo que la banda de inters se mapea a algn lugar entre -32 y 32MHz. El rango completo del ADC es de 2V pico a pico y tiene una entrada diferencial de 50, lo que significa 16dBm o 40mW. Existe un amplificador de potencia programable (PGA) antes del ADC para amplificar la seal de entrada y utilizar el rango completo en el caso que la seal sea dbil.
31
UDLA Convertidores DA
Desarrollo de Software Radio TX/RX de FM
El USRP tiene 4 convertidores DAC de alta velocidad para transmisin, cada uno a 14 bits por muestreo y 128 millones de muestras por segundo, por lo que la frecuencia de Nyquist es de 64MHz. Los DACs pueden suministrar 1V pico a pico a una carga diferencial de 50 esto es 10dBm o 10mW. Contamos tambin con un PGA conectado despus del DAC para aumentar la ganancia a 20dB o ms. Los PGA utilizados para transmisin y recepcin son programables.
Procesador e Interfases El procesador utilizado por el USRP es un FPGA Altera Cyclone EP1C12 (Apndice D). Comprender el funcionamiento del FPGA es parte importante para utilizar GNU Radio. Los ADC y DACs estn conectados al FPGA, la tarea de ste es realizar procesos matemticos de las seales en la banda que necesitamos, y reducir las tasas de muestreo de datos para enviar datos a travs de una interfase USB 2.0. EL FPGA se conecta a un chip de interfase USB 2.0, este chip es el Ciprs FX2. La configuracin estndar del FPGA incluye 4 convertidores digitales de bajada (DDC), esto permite 1, 2 o 4 canales independientes de recepcin, cada DDC tiene dos entradas I (en fase) y Q (en cuadratura). Cada ADC puede ser ruteado a cualquiera de las entradas I y Q de los 4 DDC. Para la transmisin tenemos convertidores digitales de subida (DUC) contenidos fuera del FPGA en el chip AD9862 CODEC (Apndice I).
32
UDLA
Desarrollo de Software Radio TX/RX de FM Los canales mltiples para la recepcin deben todos tener la misma tasa de
transmisin de datos (data rate), lo mismo para los canales de transmisin que deben tener el mismo data rate el cual debe ser distinto del de la recepcin.
La figuras 2.7 muestra un diagrama a bloques de la trayectoria de recepcin desde la antena hasta el DDC.
Figura 2.7 Multiplexor en el USRP, donde I es la seal en fase y Q la seal en cuadratura. [17]
El multiplexor (MUX) en la Figura 2.7 es un circuito seleccionador, que determina cual ADC es conectado a cada DDC. Podemos controlar este MUX utilizando el mtodo en Python llamado usrp.set_mux().
Por ejemplo, si suponemos el diseo de un receptor de FM, el ancho de banda de una estacin de FM es de 22kHz, podemos seleccionar un factor de decimacin de 250 con lo que la tasa de transmisin a travs del USB ser de 64MHz / 250 = 256kHz el cual satisface los 200kHz de ancho de banda sin perder informacin.
33
UDLA
Desarrollo de Software Radio TX/RX de FM Es posible seleccionar la frecuencia IF del DDC utilizando el mtodo en Python
de usrp.set_rx_frec(), y para seleccionar el factor de decimacin utilizamos usrp.set_decim_rate() el cual puede ir de 1 a 256.
Cuando tenemos mltiples canales (ms de cuatro), los canales son entrelazados. Por ejemplo, con cuatro canales, la secuencia enviada a travs del USB ser I0 Q0 I1 Q1 I2 Q2 I3 Q3 I0 Q0 I1 Q1, etc.
Finalmente las seales de I y Q entran a la computadora va USB y ahora todo es cuestin de Software. Para la transmisin todo sucede de forma similar, con la diferencia que el proceso es contrario. Enviamos una seal I y Q en banda base de la computadora al USRP. El convertidor digital de subida (DUC) interpola la seal convirtindola a una frecuencia superior para la banda de IF y por ltimo la enva a travs del DAC.[5]
[Link] de RF e IF).
Segundo nivel: tarjetas secundarias (antena, seccin
Tarjetas Secundarias: estas tarjetas se muestran en la Figura 9 y realizan la tarea de la antena, la seccin de RF y la seccin de IF en nuestro sistema de comunicacin. Se conectan al primer nivel que cuenta con 4 entradas, 2 para recepcin y 2 para transmisin. Para recepcin se utiliza la Tarjeta Secundaria llamada Basic RX y para transmisin la Basic TX.
34
UDLA
Desarrollo de Software Radio TX/RX de FM Existen 2 ranuras para tarjetas de transmisin etiquetadas como TXA y TXB y
sus dos correspondientes para recepcin etiquetadas tambin RXA y RXB. Cada ranura para tarjeta tiene acceso a 2 de los 4 convertidores de datos de alta velocidad (Salidas de DACs para TX y entras de ADC para RX). Esto permite a cada tarjeta tener dos secciones independientes de RF y dos antenas (4 para todo el sistema). Si utilizamos un muestreo en cuadratura (IQ) de la seal analgica, cada tarjeta puede soportar una sola seccin de RF, para un total de dos para el sistema completo. La entrada analgica del ADC tiene un ancho de banda por arriba de los 200MHz por lo que para frecuencias intermedias por arriba de este valor, la frecuencia debe ser seleccionada [5].
Figura 2.9 Imagen de las tarjetas secundarias Basic RX y Basic TX [5]
Podemos ver en la Figura 2.9 que cada tarjeta secundaria cuenta con dos conectores de tipo SMA, los cuales se utilizan para conectar seales de entrada o salida, as como para acoplar una antena.
35
UDLA Existen actualmente 3 tipos de tarjetas secundarias:
Desarrollo de Software Radio TX/RX de FM
Basic daughterboards: son las ms sencillas, existen para transmisin y recepcin, son utilizadas para conectar sintonizadores o generadores de seales. El rango de frecuencia para estas tarjetas es de hasta 64MHz [5]. Se pueden utilizar para transmisiones del tipo de AM en incluso FM con algunas limitantes.
TVRX daughterboards: son tarjetas nicamente para recepcin, el rango de frecuencias va desde 50 a 800MHz, con un ancho de banda para IF de 6MHz, son utilizadas para deteccin de seales de FM y TV.
DBSRX daughterboards: stas son tambin solo para recepcin, y su rango de frecuencia de RF va desde 800MHz hasta 2.4GHz.
Otras daughterboards estn siendo desarrolladas por Ettus Research LLC [5], especialmente para transmisin. Y estarn a la venta prximamente.
Para la realizacin de esta Tesis se cuenta con las Basic Daughterboards nicamente.
[Link]
Conexin mecnica y elctrica.
Conexin Mecnica El USRP incluye un equipo completo de pilares, pernos y tuercas para realizar una conexin mecnica adecuada. Tenemos 20 pilares (standoffs) M3x10mm M-F, de los cuales 4 son utilizados como patas para el USRP, ubicados en las cuatro esquinas de la tarjeta, los 16 pernos restantes, los pernos y las tuercas son utilizados para sostener
36
UDLA
Desarrollo de Software Radio TX/RX de FM
las cuatro tarjetas secundarias. En las Figuras 2.10 y 2.11 se muestra la conexin mecnica de los pilares, pernos y tuercas en el USRP:
Pilares
Figura 2.10 Pilares, Conexin Mecnica del USRP.
Pernos
Tuercas
Figura 2.11 Pernos y Tuercas, Conexin Mecnica del USRP. La posicin en el USRP de los pilares est diseada para prevenir accidentes o conexiones incorrectas de las tarjetas secundarias. El USRP no debe ser operado sin los pilares y las tarjetas secundarias no deben ser conectadas o desconectadas mientras el USRP est encendido.
37
UDLA
Desarrollo de Software Radio TX/RX de FM
Conexin Elctrica El USRP necesita un convertidor de 6V 4A el cual viene includo en el paquete al momento de la compra. El convertidor funciona con voltajes de corriente alterna de 90 a 260V, y opera a 50/60Hz, por lo que funciona en cualquier pas. El conector que va al USRP es de 2.1mm/5.5mm DC power conector. El USRP por s solo necesita de 5V y 2A, pero se seleccion una alimentacin de 6V para utilizar a futuro otras tarjetas secundarias.
El paquete tambin incluye el cable USB el cual debe ser conectado a una ranura de computadora capaz de soportar USB 2.0, por lo que en ranuras USB 1.1 el USRP no funciona. Al conectar el USRP, debemos ver un LED destellando de 3 a 4 veces por segundo, esto indica que el procesador est corriendo, y el dispositivo se encuentra en modo de ahorro de energa. Una vez que el soporte lgico es cargado al FPGA, el LED destellar a una velocidad menor. En caso de que el LED no muestre ninguna seal, es necesario revisar las conexiones elctricas, y revisar si hay continuidad en el fusible principal F501, el cual se encuentra cercano al conector de energa como se muestra en la Figura 2.12. Si este fusible requiere ser reemplazado las especificaciones son: Tamao 0603 Corriente 3A
38
UDLA
Desarrollo de Software Radio TX/RX de FM
Figura 2.12 Fusible, Conexin elctrica del USRP.
2.3.3. Instalacin del USRP
La instalacin del USRP es bastante sencilla, es necesario haber instalado GNU Radio, y hacer la conexin correcta de la tarjeta, por lo que solo necesitamos conectar el USRP a la corriente y con el cable USB a la computadora. Ahora abrimos una Terminal y corremos el siguiente comando: # tail -f /var/log/messages Con este comando podemos ver en la Terminal el estado de las conexiones USB por lo que al conectar el USRP debemos observar un mensaje como el siguiente: new high speed USB device using address 1 Ahora al desconectar el cable debemos obtener un mensaje correspondiente a haber retirado el conector de la ranura. En caso de que al conectarlo obtengamos un mensaje como el siguiente: new full speed USB device using address 1
39
UDLA
Desarrollo de Software Radio TX/RX de FM Significa que nuestra ranura de USB no soporta la versin 2.0 de ste.
Como la instalacin de GNU Radio fue hecha directamente desde CVS, hay un archivo ([Link]) que debemos extraer del paquete usrp-*.*.[Link] por lo que podemos seguir el siguiente procedimiento de comandos: # mkdir tmp # cd tmp (descargar el archive comprimido a esta carpeta) # tar xvvfz usrp-*.*.[Link] # cp usrp-*.*/fpga/rbf/usrp_fpga_rev2.rbf /usr/local/share/usrp/rev2/usrp_fpga.rbf # cd .. # rm -rf tmp
Con esto ya tenemos todos los archivos necesarios en el lugar adecuado y podemos comenzar a correr programas utilizando el USRP y GNU Radio.
En
una
Terminal
nos
movemos
al
directorio
de
gr-build/gnuradio-
examples/python/usrp/ y ejecutamos el siguiente comando: # ./usrp_oscope.py (Recordemos que si es el primer programa que ejecutamos desde que iniciamos la computadora, es necesari hacer # killall esd). Si todo ha sido instalado correctamente debemos ver una ventana similar a un Osciloscopio, ahora cambiamos el botn de POS a AUTO y debemos ver una figura como la 2.13:
40
UDLA
Desarrollo de Software Radio TX/RX de FM
Figura 2.13 Osciloscopio de recepcin en GNU Radio. Este programa que acabamos de ejecutar funciona como un osciloscopio y podemos conectarle seales para analizarlas, como se hace con los equipos que tenemos en el Laboratorio de Electrnica. Con esto dejamos las instalaciones atrs y tenemos al sistema completo funcionando. Ahora lo que sigue es solo cuestin de Software.
2.4.
Grafos, Bloques y Conexiones
Para iniciarnos en la programacin de Software Radio con GNU Radio es necesario conocer y saber como funcionan las estructuras de grafos, bloques y conexiones. Para realizar esta tarea comenzaremos con un programa bsico en Python, ste programa es dial_tone.py el cual se encuentra en la siguiente direccin gr-buidl\gnuradioexamples\python\audio.
ste programa generan dos seales senoidales de diferente frecuencia que simulan el de tono de llamada en un telfono local y los enva a la tarjeta de sonido de nuestra computadora por lo que el USRP no es necesario aqu.
41
UDLA
Desarrollo de Software Radio TX/RX de FM El cdigo de dial_tone.py es el siguiente y ser analizado lnea por lnea para
conocer su funcionamiento:
#!/usr/bin/env python # # Copyright 2004 Free Software Foundation, Inc. # This file is part of GNU Radio # # GNU Radio is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # GNU Radio is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU Radio; see the file COPYING. If not, write to # the Free Software Foundation, Inc., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. # from gnuradio import gr from gnuradio import audio def build_graph (): sampling_freq = 32000 ampl = 0.1 fg = gr.flow_graph () src0 = gr.sig_source_f (sampling_freq, gr.GR_SIN_WAVE, 350, ampl) src1 = gr.sig_source_f (sampling_freq, gr.GR_SIN_WAVE, 440, ampl) dst = [Link] (sampling_freq) [Link] (src0, (dst, 0)) [Link] (src1, (dst, 1)) return fg if __name__ == '__main__': fg = build_graph () [Link] () raw_input ('Press Enter to quit: ') [Link] ()
Las primeras lneas, que inician con #, son nicamente comentarios y no afectan la lgica del programa. Es necesario, para comprender las siguientes lneas, hablar sobre los Mdulos y Paquetes.
42
UDLA
Desarrollo de Software Radio TX/RX de FM Un Mdulo es un programa realizado en Python con un sufijo .py y contiene
un programa con alguna funcin especfica la cual est disponible como una variable global __name__, esta funcin puede ser importada dentro de otro modulo en cualquier nivel. Un Paquete es un conjunto de mdulos que realizan funciones similares. Para que Python maneje estas carpetas como paquetes es necesaria la funcin __init__.py, un paquete puede contener mdulos y sub-paquetes. La estructura dentro del programa para mdulos y paquetes es del tipo x.y donde y es un mdulo contenido en el paquete x, por lo que si en el programa tenemos gr.sig_source_f significa que el mdulo sig_source_f.py se encuentra en el paquete gr. Estos paquetes y mdulos se encuentran en: /usr/local/lib/python2.4/site-packages. Al inicio del programa, luego de los comentarios, importamos los siguientes mdulos:
from gnuradio import gr from gnuradio import audio
Con lo que importamos el paquete gr y el mdulo [Link] de la carpeta de gnuradio, como se muestra en la Figura 2.14.
Figura 2.14 Paquete gr y mdulo [Link] en la carpeta gnuradio
43
UDLA
Desarrollo de Software Radio TX/RX de FM
Ahora definimos una funcin sin argumentos para construir una grfica, de la siguiente forma:
def build_graph ():
La funcin que acabamos de definir funcionar como una variable global dentro del mdulo dial_tone.py, ahora dentro de esta definimos dos constantes:
def build_graph (): sampling_freq = 32000 ampl = 0.1
Como ya mencionamos sampling_freq es la frecuencia a la que se muestra la seal que entrar a la tarjeta de sonido, el valor de 32kHz es estndar para la mayora de estas tarjetas. La frecuencia de muestreo es un parmetro para la fuente de la seal gr.sig_source_f que veremos ms adelante. El otro parmetro es la amplitud de la seal senoidal el cual se define de 0.1 Volts para este ejemplo.
La siguiente parte del programa consiste en crear el grafo para generar las seales:
fg = gr.flow_graph ()
El mdulo flow_graph es una clase definida en gr.flow_graph.py, la cual llama a la funcin basic_flow_graph.py.1 Ahora creamos dos fuentes de datos:
src0 = gr.sig_source_f (sampling_freq, gr.GR_SIN_WAVE, 350, ampl) src1 = gr.sig_source_f (sampling_freq, gr.GR_SIN_WAVE, 440, ampl)
Como recordamos, un grafo esta compuesto por vrtices y bordes que conectan a stos, stos dos elementos estn definidos como clase endpoint y clase edge en el mdulo basic_flow_graph.py importado en un inicio del paquete gr.
44
UDLA
Desarrollo de Software Radio TX/RX de FM
La fuente de la seal pertenece a la categora de Bloques, los bloques estn implementados en C++, por lo que aqu es donde interviene SWIG quien provee la interfase entre Python y C++, el bloque utilizado en sta parte es gr.sig_source_f el cual se encuentra en gr-buld\gnuradio-core\src\lib\general. Con estas dos lneas generamos dos seales senoidales, una a 350Hz y otra a 440Hz con lo que creamos un tono compuesto por ambas senoidales.
El siguiente paso es generar la seal para el dispositivo de audio, es decir, la tarjeta de sonido de nuestra computadora, esto se logra con la siguiente lnea:
dst = [Link] (sampling_freq)
El mdulo [Link] se encuentra en /usr/local/lib/python2.4/site-packages/ gnuradio/[Link] el cual es importado desde el inicio. Este mdulo transforma las fuentes en seales para poder reproducirlas. Las funciones sink() y source()son definidas en ste mdulo y regresan una seal o una fuente de audio a partir de una clase. Ahora debemos realizar la Conexin entre los bloques que hemos definido anteriormente para completar el grafo:
[Link] (src0, (dst, 0)) [Link] (src1, (dst, 1))
Con esto creamos la conexin lgica del grafo uniendo los puertos de entrada y salida (src-fuente y dst-destino). Ahora la funcin global build_graph() regresa el flujo a travs del grafo creado en fg.
45
UDLA
Desarrollo de Software Radio TX/RX de FM
La ltima parte del programa consiste en hacer correr el flujo de datos a travs del grafo con las siguientes lneas:
if __name__ == '__main__': fg = build_graph () [Link] () raw_input ('Press Enter to quit: ') [Link] ()
La primera lnea sirve para correr el programa directamente, es decir, a travs de una Terminal con el comando ./dial_tone.py, en caso de que el mdulo que estamos creando sea llamado, la parte que se encuentra debajo de esta lnea ser ignorada y solamente se importar el contenido anterior a sta. Es decir, esta lnea sirve para hacer del cdigo un mdulo ejecutable o un sub-mdulo. La siguiente lnea es la que llama a la funcin que hemos definido y le asigna el flujo del grafo fg. Para correr el grafo utilizamos la lnea [Link](),y para terminarlo [Link](), los mtodos start() y stop() se encuentran definidos en la clase flow_graph. La funcin raw_input es similar a print en otros lenguajes de programacin y sirve para aadir texto a la pantalla.
Este archivo fue corrido para verificar la correcta instalacin de GNU Radio pero en ese momento no conocamos el cdigo, por lo que es importante correrlo de nueva cuenta y variar algunos parmetros, para observar el poder que tenemos sobre ste gracias a que esta implementado por Software.
En caso de correr el programa y obtener un mensaje como el siguiente: unable to support sampling rate 32000, card request 48000 instead como se muestra en la Figura 2.15.
46
UDLA
Desarrollo de Software Radio TX/RX de FM
Figura 2.15 Mensaje de respuesta al soportar 48k muestras por segundo y no 32k
Es necesario cambiar en el programa:
from gnuradio import audio from gnuradio import audio_oss as audio
from gnuradio import audio from gnuradio import audio_alsa as audio
El cambio se debe realizar cuando la frecuencia de muestreo de 32kHz no es aceptada por la tarjeta de sonido que utilizamos, ALSA y OSS son los dos tipos de datos que manejan las tarjetas de sonido. Al realizar el cambio debemos obtener algo como en la Figura 2.16, al correr el programa.
47
UDLA
Desarrollo de Software Radio TX/RX de FM
Figura 2.16 Ventana que muestra una corrida correcta del programa dial_tone.py
El archivo dial_tone.py es un mdulo bsico para trabajar con GNU Radio, de ah que es importante comenzar a programar con ste, ya que adems de darnos una clara introduccin de cmo se realizan los grafos, bloques y conexiones, nos introduce a la programacin de seales de audio.
48