UDLA Desarrollo de Software Radio TX/RX de FM CAPÍTULO 2 El objetivo de este capítulo es describir el funcionamiento del programa GNU Radio el cual es necesario para la transmisión y recepción con el USRP, trataremos primeramente con la instalación del programa y su relación 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 introducción a la programación en GNU Radio. 2. GNU Radio GNU Radio es un conjunto de archivos y aplicaciones que proveen las librerías necesarias de procesado digital de señales para poder manipular señales 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 vértices son bloques de procesado de señales, y los bordes representan el flujo de datos entre ellos. Los bloques de procesado de señal son implementados en C++. Conceptualmente un bloque procesa señales continuamente desde puertos de entrada hasta puertos de salida. Las partes de un bloque son el número de puerto de entrada, el número del puerto de salida, y el tipo de dato que fluirá de uno al otro. Los tipos de datos más comúnmente 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 señales en una gráfica. Existen fuentes que leen datos de un archivo o del ADC, y señales que escriben datos a un archivo, al DAC o a un display gráfico. GNU Radio cuenta con aproximadamente 100 de estos bloques. Las gráficas para GNU Radio corren y son construídas en Python[25]. Python es un lenguaje de programación interpretado, interactivo y orientado a objetos, es habitualmente comparado a TCL, Perl, Scheme, Java y Ruby. Actualmente, Python se desarrolla como un proyecto de código abierto, administrado por la Python Software Foundation. Contiene módulos, clases, tipos de datos de alto nivel y escritura dinámica. Tiene interfaces para diversos sistemas y librerías. También puede utilizarse como un lenguaje de extensión 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 programación orientados a objetos: 1) No hay necesidad de compilar código en Python antes de ejecutarlo, por lo que se convierte en un lenguaje de script. 2) El lenguaje busca tener un código más fácil de utilizar (y con reutilizable para otras aplicaciones). 18 UDLA Desarrollo de Software Radio TX/RX de FM 2.1. Instalación La instalación de GNU Radio fue quizás el proceso más exhaustivo de ésta Tesis, pero la siguiente guía contiene toda la información necesaria para obtener una instalación 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 www.gnu.org/software/gnuradio (2.x tarball) o utilizando CVS (Concurrent Versions System), lo cual se realizará más adelante, estos paquetes son los siguientes: • gnuradio-core: el núcleo de las librerías. • 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: librerías que unen a GNU Radio con el Universal Software Radio Peripheral. • gr-wxgui: wxPython basado en herramientas GNU, incluye un oscilocopio y FFT´s. • 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 más dimensiones, el tamaño de la entrada es arbitrario y maneja datos complejos y reales. FFTW es software libre por lo que se convierte en una librería de FFT para cualquier aplicación. Lo podemos obtener de: http://www.fftw.org/download.html Cppunit: Es una unidad de prueba para checar bloques en C++. Lo podemos obtener de: https://sourceforge.net/project/showfiles.php?group_id=11795 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 programación de alto nivel. SWIG es utilizado con diferentes tipo se lenguaje como Python. Lo podemos obtener de: http://sourceforge.net/projects/swig/ Numarray y Numpy: Son dos módulos de Python necesarios para el funcionamiento de GNU Radio. Éstos son utilizados para computo numérico y los podemos encontrar disponibles en: http://sourceforge.net/projects/numpy wxPython: Son herramientas para el lenguaje de programación Python, y permite crear programas con funciones e interfaces gráficas de forma simple. Ésta implementado como un módulo de Python. Lo podemos obtener de: https://sourceforge.net/project/showfiles.php?group_id=10718 20 UDLA Desarrollo de Software Radio TX/RX de FM La instalación de los programa antes mencionados es ciertamente complicada ya que éstos también 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 razón más 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 librerías necesarias, ahora simplemente hay que instalarlas; para esto es necesario buscar la librería requerida con el botón de “search”, seleccionarla para instalación y aplicar la instalación con el botón “apply”. Las librerías que debemos buscar e instalar son las siguientes: • automake1.8 • gcc-3.4 • g++-3.4 Después de instalar gcc y g++ debemos crear una liga simbólica 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 librerías que no se encuentran en los repositorios son las de SWIG por lo que es necesario instalarlo manualmente, para esto hay que descargarlo de “http://sourceforge.net/projects/swig/” donde podemos obtener la versión 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-*.tar.gz 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 swig-1.3.24.tar.gz 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 instalación 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 versión sin necesidad de hacerlo desde una página de Internet. Para esto debemos ejecutar los siguientes comandos en una Terminal: # export CVS_RSH="ssh" # cvs -z3 -d:ext:anoncvs@savannah.gnu.org:/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 línea de comandos de la Terminal: # cvs -z3 -d:ext:anoncvs@savannah.gnu.org:/cvsroot/gnuradio co -P gnuradio-core # cvs -z3 -d:ext:anoncvs@savannah.gnu.org:/cvsroot/gnuradio co -P gnuradio- examples # cvs -z3 -d:ext:anoncvs@savannah.gnu.org:/cvsroot/gnuradio co -P gr-audio-alsa # cvs -z3 -d:ext:anoncvs@savannah.gnu.org:/cvsroot/gnuradio co -P gr-audio-oss # cvs -z3 -d:ext:anoncvs@savannah.gnu.org:/cvsroot/gnuradio co -P gr-usrp # cvs -z3 -d:ext:anoncvs@savannah.gnu.org:/cvsroot/gnuradio co -P gr-wxgui # cvs -z3 -d:ext:anoncvs@savannah.gnu.org:/cvsroot/gnuradio co -P gr-howtowrite-a-block # cvs -z3 -d:ext:anoncvs@savannah.gnu.org:/cvsroot/gnuradio co -P gr-gsm-frvocoder 24 UDLA Desarrollo de Software Radio TX/RX de FM # cvs -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/opensdr login # cvs -z3 -d:pserver:anonymous@cvs.sourceforge.net:/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 instalación final hacemos lo siguiente en la Terminal en el directorio de gr-build: # ./checkout # ./for-all-dirs ../buildit 2>&1 | tee make.log El proceso debe durar algunos minutos y de acuerdo a lo hecho anteriormente no debe haber ningún error, en caso de existir alguno el sistema nos avisara si hace falta algún archivo o librería, 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 www.gnu.org/software/gnuradio, descomprimirlo como lo hicimos con SWIG: # tar zxvf usrp*.tar.gz 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 línea telefónica, 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/pitón/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 través 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 = audio.sink (sampling_freq) fg.connect ((src0, 0), (dst, 0)) fg.connect ((src1, 0), (dst, 1)) 26 UDLA Desarrollo de Software Radio TX/RX de FM return fg if __name__ == '__main__': fg = build_graph () fg.start () raw_input ('Press Enter to quit: ') fg.stop () 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 botón derecho del mouse sobre el ícono del archivo creado y en la pestaña 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 sección de prerrequisitos tiene la función de informar al lector sobre algunos tópicos que deben ser conocidos para poder continuar con el proceso de esta Tesis. ADCs: Un convertidor analógico a digital tiene tres características primarias: • Sample Rate (Tasa de Muestreo) • Dynamic Range (Rango Dinámico) • Tiempo de conversión Sample Rate o Tasa de Muestreo es el número de veces por segundo que el ADC mide una señal analógica. Dynamic Range o Rango Dinámico se refiere a la diferencia entre la señal más pequeña y la más grande que puede ser distinguida por el ADC, esta en función del número de bits de salida del ADC. Tiempo de conversión: Existe un tiempo de conversión Tc que necesita el ADC para sacar un número digital a partir de recibir un dato analógico con el fin de que al existir una variación en la entrada no surja una confusión en la conversión. Teoría de Nyquist: La teoría de Nyquist determina que para evitar el efecto de aliasing cuando convertimos de analógico a digital, la frecuencia de muestreo del ADC debe ser de al menos dos veces el ancho de banda de la banda de interés. Frecuencia de interés Æ 0 a fmax Frecuencia de muestreo Æ 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 módem sintonizador de señales de cable (RF front end) tiene las siguientes características, 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 periférico diseñado para trabajar en conjunto con una computadora a través de un FPGA y permite la realización de Software Radios. Este periférico realiza las funciones de llevar la señal a banda base de RF a través de la sección de IF, y viceversa, para un sistema común de radio comunicaciones, como se muestra en la Figura 2.4. Antena RF FrontEnd Analog IF A/D Conversión. Procesamiento (Software) D/A Conversión. Figura 2.4 Bloques principales en este sistema de comunicaciones de Software Radio En el Apéndice H se muestra una hoja técnica del USRP con algunas características. 29 UDLA Desarrollo de Software Radio TX/RX de FM 2.3.2. Características 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 ADC´s y DAC´s, la alimentación y la conexión vía USB. El segundo nivel se compone de Daughterboards llamadas tarjetas secundarias. Éstas existen para transmisión y recepción. Estas tarjetas son las que trabajan como RF front-end las cuales llevan nuestra señal 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 disposición 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] 2.3.2.1 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 señal a una IF (Intermediate Frecuency) de 32MHz introducimos el efecto de imagen al sistema con lo que la banda de interés se mapea a algún 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 señal de entrada y utilizar el rango completo en el caso que la señal sea débil. 31 UDLA Desarrollo de Software Radio TX/RX de FM Convertidores DA El USRP tiene 4 convertidores DAC de alta velocidad para transmisión, 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 DAC´s pueden suministrar 1V pico a pico a una carga diferencial de 50Ω esto es 10dBm o 10mW. Contamos también con un PGA conectado después del DAC para aumentar la ganancia a 20dB o más. Los PGA utilizados para transmisión y recepción son programables. Procesador e Interfases El procesador utilizado por el USRP es un FPGA Altera Cyclone EP1C12 (Apéndice D). Comprender el funcionamiento del FPGA es parte importante para utilizar GNU Radio. Los ADC y DAC´s están conectados al FPGA, la tarea de éste es realizar procesos matemáticos de las señales en la banda que necesitamos, y reducir las tasas de muestreo de datos para enviar datos a través de una interfase USB 2.0. EL FPGA se conecta a un chip de interfase USB 2.0, este chip es el Ciprés FX2. La configuración estándar del FPGA incluye 4 convertidores digitales de bajada (DDC), esto permite 1, 2 o 4 canales independientes de recepción, 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 transmisión tenemos convertidores digitales de subida (DUC) contenidos fuera del FPGA en el chip AD9862 CODEC (Apéndice I). 32 UDLA Desarrollo de Software Radio TX/RX de FM Los canales múltiples para la recepción deben todos tener la misma tasa de transmisión de datos (data rate), lo mismo para los canales de transmisión que deben tener el mismo “data rate” el cual debe ser distinto del de la recepción. La figuras 2.7 muestra un diagrama a bloques de la trayectoria de recepción desde la antena hasta el DDC. Figura 2.7 Multiplexor en el USRP, donde I es la señal en fase y Q la señal 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 método en Python llamado usrp.set_mux(). Por ejemplo, si suponemos el diseño de un receptor de FM, el ancho de banda de una estación de FM es de 22kHz, podemos seleccionar un factor de decimación de 250 con lo que la tasa de transmisión a través del USB será de 64MHz / 250 = 256kHz el cual satisface los 200kHz de ancho de banda sin perder información. 33 UDLA Desarrollo de Software Radio TX/RX de FM Es posible seleccionar la frecuencia IF del DDC utilizando el método en Python de usrp.set_rx_frec(), y para seleccionar el factor de decimación utilizamos usrp.set_decim_rate() el cual puede ir de 1 a 256. Cuando tenemos múltiples canales (más de cuatro), los canales son entrelazados. Por ejemplo, con cuatro canales, la secuencia enviada a través del USB será I0 Q0 I1 Q1 I2 Q2 I3 Q3 I0 Q0 I1 Q1, etc. Finalmente las señales de I y Q entran a la computadora vía USB y ahora todo es cuestión de Software. Para la transmisión todo sucede de forma similar, con la diferencia que el proceso es contrario. Enviamos una señal I y Q en banda base de la computadora al USRP. El convertidor digital de subida (DUC) interpola la señal convirtiéndola a una frecuencia superior para la banda de IF y por último la envía a través del DAC.[5] 2.3.2.2 de RF e IF). Segundo nivel: tarjetas secundarias (antena, sección Tarjetas Secundarias: estas tarjetas se muestran en la Figura 9 y realizan la tarea de la antena, la sección de RF y la sección de IF en nuestro sistema de comunicación. Se conectan al primer nivel que cuenta con 4 entradas, 2 para recepción y 2 para transmisión. Para recepción se utiliza la Tarjeta Secundaria llamada Basic RX y para transmisión la Basic TX. 34 UDLA Desarrollo de Software Radio TX/RX de FM Existen 2 ranuras para tarjetas de transmisión etiquetadas como TXA y TXB y sus dos correspondientes para recepción etiquetadas también 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 señal analógica, cada tarjeta puede soportar una sola sección de RF, para un total de dos para el sistema completo. La entrada analógica 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 señales de entrada o salida, así como para acoplar una antena. 35 UDLA Desarrollo de Software Radio TX/RX de FM Existen actualmente 3 tipos de tarjetas secundarias: • Basic daughterboards: son las más sencillas, existen para transmisión y recepción, son utilizadas para conectar sintonizadores o generadores de señales. 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 recepción, el rango de frecuencias va desde 50 a 800MHz, con un ancho de banda para IF de 6MHz, son utilizadas para detección de señales de FM y TV. • DBSRX daughterboards: éstas son también solo para recepción, y su rango de frecuencia de RF va desde 800MHz hasta 2.4GHz. Otras daughterboards están siendo desarrolladas por Ettus Research LLC [5], especialmente para transmisión. Y estarán a la venta próximamente. Para la realización de esta Tesis se cuenta con las “Basic Daughterboards” únicamente. 2.3.2.3 Conexión mecánica y eléctrica. Conexión Mecánica El USRP incluye un equipo completo de pilares, pernos y tuercas para realizar una conexión mecánica 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 conexión mecánica de los pilares, pernos y tuercas en el USRP: Pilares Figura 2.10 Pilares, Conexión Mecánica del USRP. Pernos Tuercas Figura 2.11 Pernos y Tuercas, Conexión Mecánica del USRP. La posición en el USRP de los pilares está diseñada 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 Conexión Eléctrica El USRP necesita un convertidor de 6V 4A el cual viene incluído 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 país. 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 alimentación de 6V para utilizar a futuro otras tarjetas secundarias. El paquete también 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 energía. Una vez que el soporte lógico es cargado al FPGA, el LED destellará a una velocidad menor. En caso de que el LED no muestre ninguna señal, es necesario revisar las conexiones eléctricas, y revisar si hay continuidad en el fusible principal F501, el cual se encuentra cercano al conector de energía como se muestra en la Figura 2.12. Si este fusible requiere ser reemplazado las especificaciones son: Tamaño 0603 Corriente 3A 38 UDLA Desarrollo de Software Radio TX/RX de FM Figura 2.12 Fusible, Conexión eléctrica del USRP. 2.3.3. Instalación del USRP La instalación del USRP es bastante sencilla, es necesario haber instalado GNU Radio, y hacer la conexión 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 versión 2.0 de éste. Como la instalación de GNU Radio fue hecha directamente desde CVS, hay un archivo (usrp.fpga.rbf) que debemos extraer del paquete usrp-*.*.tar.gz por lo que podemos seguir el siguiente procedimiento de comandos: # mkdir tmp # cd tmp (descargar el archive comprimido a esta carpeta) # tar xvvfz usrp-*.*.tar.gz # 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 botón 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 recepción en GNU Radio. Este programa que acabamos de ejecutar funciona como un osciloscopio y podemos conectarle señales para analizarlas, como se hace con los equipos que tenemos en el Laboratorio de Electrónica. Con esto dejamos las instalaciones atrás y tenemos al sistema completo funcionando. Ahora lo que sigue es solo cuestión de Software. 2.4. Grafos, Bloques y Conexiones Para iniciarnos en la programación 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 básico en Python, éste programa es dial_tone.py el cual se encuentra en la siguiente dirección “gr-buidl\gnuradioexamples\python\audio”. Éste programa generan dos señales senoidales de diferente frecuencia que simulan el de tono de llamada en un teléfono local y los envía 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 código de dial_tone.py es el siguiente y será analizado línea por línea 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 = audio.sink (sampling_freq) fg.connect (src0, (dst, 0)) fg.connect (src1, (dst, 1)) return fg if __name__ == '__main__': fg = build_graph () fg.start () raw_input ('Press Enter to quit: ') fg.stop () Las primeras líneas, que inician con #, son únicamente comentarios y no afectan la lógica del programa. Es necesario, para comprender las siguientes líneas, hablar sobre los Módulos y Paquetes. 42 UDLA Desarrollo de Software Radio TX/RX de FM Un Módulo es un programa realizado en Python con un sufijo “.py” y contiene un programa con alguna función específica la cual está disponible como una variable global “__name__”, esta función puede ser importada dentro de otro modulo en cualquier nivel. Un Paquete es un conjunto de módulos que realizan funciones similares. Para que Python maneje estas carpetas como paquetes es necesaria la función “__init__.py”, un paquete puede contener módulos y sub-paquetes. La estructura dentro del programa para módulos y paquetes es del tipo x.y donde y es un módulo contenido en el paquete x, por lo que si en el programa tenemos “gr.sig_source_f” significa que el módulo sig_source_f.py se encuentra en el paquete gr. Estos paquetes y módulos se encuentran en: “/usr/local/lib/python2.4/site-packages”. Al inicio del programa, luego de los comentarios, importamos los siguientes módulos: from gnuradio import gr from gnuradio import audio Con lo que importamos el paquete gr y el módulo audio.py de la carpeta de gnuradio, como se muestra en la Figura 2.14. Figura 2.14 Paquete gr y módulo audio.py en la carpeta gnuradio 43 UDLA Desarrollo de Software Radio TX/RX de FM Ahora definimos una función sin argumentos para construir una gráfica, de la siguiente forma: def build_graph (): La función que acabamos de definir funcionará como una variable global dentro del módulo 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 muestréa la señal que entrará a la tarjeta de sonido, el valor de 32kHz es estándar para la mayoría de estas tarjetas. La frecuencia de muestreo es un parámetro para la fuente de la señal gr.sig_source_f que veremos más adelante. El otro parámetro es la amplitud de la señal 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 señales: fg = gr.flow_graph () El módulo flow_graph es una clase definida en gr.flow_graph.py, la cual llama a la función 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) 1 Como recordamos, un grafo esta compuesto por vértices y bordes que conectan a éstos, éstos dos elementos están definidos como clase “endpoint” y clase “edge” en el módulo 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 señal pertenece a la categoría de Bloques, los bloques están 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 líneas generamos dos señales senoidales, una a 350Hz y otra a 440Hz con lo que creamos un tono compuesto por ambas senoidales. El siguiente paso es generar la señal para el dispositivo de audio, es decir, la tarjeta de sonido de nuestra computadora, esto se logra con la siguiente línea: dst = audio.sink (sampling_freq) El módulo audio.py se encuentra en “/usr/local/lib/python2.4/site-packages/ gnuradio/audio.py” el cual es importado desde el inicio. Este módulo transforma las fuentes en señales para poder reproducirlas. Las funciones “sink()” y “source()”son definidas en éste módulo y regresan una señal o una fuente de audio a partir de una clase. Ahora debemos realizar la Conexión entre los bloques que hemos definido anteriormente para completar el grafo: fg.connect (src0, (dst, 0)) fg.connect (src1, (dst, 1)) Con esto creamos la conexión lógica del grafo uniendo los puertos de entrada y salida (src-fuente y dst-destino). Ahora la función global build_graph() regresa el flujo a través 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 través del grafo con las siguientes líneas: if __name__ == '__main__': fg = build_graph () fg.start () raw_input ('Press Enter to quit: ') fg.stop () La primera línea sirve para correr el programa directamente, es decir, a través de una Terminal con el comando ./dial_tone.py, en caso de que el módulo que estamos creando sea llamado, la parte que se encuentra debajo de esta línea será ignorada y solamente se importará el contenido anterior a ésta. Es decir, esta línea sirve para hacer del código un módulo ejecutable o un sub-módulo. La siguiente línea es la que llama a la función que hemos definido y le asigna el flujo del grafo fg. Para correr el grafo utilizamos la línea fg.start(),y para terminarlo fg.stop(), los métodos “start()” y “stop()” se encuentran definidos en la clase flow_graph. La función raw_input es similar a “print” en otros lenguajes de programación y sirve para añadir texto a la pantalla. Este archivo fue corrido para verificar la correcta instalación de GNU Radio pero en ese momento no conocíamos el código, por lo que es importante correrlo de nueva cuenta y variar algunos parámetros, 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 módulo básico para trabajar con GNU Radio, de ahí que es importante comenzar a programar con éste, ya que además de darnos una clara introducción de cómo se realizan los grafos, bloques y conexiones, nos introduce a la programación de señales de audio. 48