Empowering Software Radio: IT++ As A GNU Radio Out-Of-Tree Implementation V. I. Rodríguez, Student Member, IEEE and J. Sánchez, Member, IEEE 1 Abstract— Software Radio is a revolutionary paradigm in communications design, allowing the development of hardware stages, like communication physical layers, as simple software stages reducing costs and times of new wireless communication implementations. A project who works with software radio is GNU Radio, where many digital signal processes are implemented in C++ and Python language programming. This article proposes a procedure to add the IT++ library into GNU Radio open source project, to be accessed as out-of-tree module; this way allowing GNU Radio to exploit functions performed by other open-source projects. Following this procedure, we deploy digital processing blocks allowing to use IT++ functions inside GNU Radio; additionally we developed two blocks with functions that GNU Radio does not consider originally. The main goal is to expand the GNU Radio functionality with other open source projects (in Python or C++ language programming) to cover the needs of different wireless PHY layer processes. Keywords— SDR, USRP, GNU Radio, ITPP. I. INTRODUCCIÓN C ON base en proyectos como [1] y [2], hoy en día es posible la implementación de diversas tecnologías de comunicación inalámbrica de última generación sobre plataformas de radio programables por medio de código para propósitos generales, que permiten la libre modificación y desarrollo de diversos estándares de comunicación en una sola plataforma. Esta versatilidad permite que áreas como la investigación y el desarrollo tecnológico puedan implementar nuevas técnicas y/o mejoras en los estándares de comunicación inalámbrica sin la implementación física del mismo, esto es, obtener una etapa completa de radio por medio de programación en lugar de su versión en hardware, a esto se le conoce como Radio Definido por Software (SDR – Software Defined Radio). El uso de herramientas de software libre (Open Source), como GNU Radio [3] en sistemas operativos Linux, permite al usuario tener acceso a bibliotecas compuestas de bloques de procesamiento para señales de comunicaciones, desarrolladas en lenguaje de programación Python, que permite más flexibilidad y mayor intuición al momento de programar; no obstante las operaciones de alta precisión o críticas son realizadas por bibliotecas escritas en lenguaje de programación C++, emulando así a un panel de control y otro de datos, donde el panel de control es realizado por Python y la manipulación de datos por C++. Aunque GNU Radio incluye diversas y variadas funciones para realizar proyectos de software radio programable (SDR), también permite al usuario incluir procesos no desarrollados o contemplados previamente en el proyecto mediante una serie de lineamientos bien establecidos. En la Fig. 1 se observa la manera como GNU Radio, siendo una biblioteca de lenguaje de programación Python, puede interactuar con bibliotecas de lenguaje C++ por medio de la herramienta de programación SWIG (Simplified Wrapper and Interface Generator - Envoltura Simplificada y Generador de Interfaz) [4], este programa funciona como un intérprete de lenguaje C++ a lenguaje Python, además a través de la herramienta CMAKE (Cross platform MAKE – Compilador multiplataforma) [5], que permite construir, probar y empaquetar códigos de programación, GNU Radio puede integrar y compilar bibliotecas para C++ no definidas previamente. 1 V. I. Rodríguez, Centro de Investigación Científica y Educación Superior de Ensenada, BC. (CICESE), Departamento de Electrónica y Telecomunicaciones, Ensenada, BC. México, abdala@cicese.edu.mx J. Sánchez, Centro de Investigación Científica y Educación Superior de Ensenada, BC. (CICESE), Departamento de Electrónica y Telecomunicaciones, Ensenada, BC. México, jasan@cicese.edu.mx Figura 1. Interacción GNU Radio con bibliotecas externas. De esta manera es posible integrar proyectos o bibliotecas Figura 2. Modulador digital en GNU Radio Companion (GRC). externas, desarrolladas tanto en lenguaje de programación Python como en lenguaje de programación C++ por medio de módulos externos que quedarán incluidos dentro de las bibliotecas de GNU Radio de manera transparente, a esto se le conoce como módulos “out-of-tree”. hasta llegar a complex. Además, un tipo de dato puede ser un vector de tipo byte, short, int, float o complex, aunque para GNU Radio, un flujo de datos regular es sólo un vector cuya longitud es el número total de información procesada. Las características de los tipos de datos son: II. DESARROLLO DE PROYECTOS EN GNU RADIO Una forma de desarrollar sistemas de radio definido por software en GNU Radio es por medio de la interfaz gráfica de usuario GNU Radio Companion (GRC), que permite utilizar de una forma visual las funciones y bibliotecas de GNU Radio. Esta herramienta gráfica permite al usuario la implementación de sistemas de procesamiento de señales para comunicaciones sin requerir conocimientos previos en Python, ya que interpreta los bloques y los convierte a código de lenguaje de programación Python [6], esta interfaz no es un compilador, solo es un intérprete. Un ejemplo de una aplicación de GNU Radio es el simulador de modulador digital mostrado en la Fig. 2. Este se compone de tres partes: etapa de transmisión, que incluye un generador aleatorio de bits, un convertidor binario a decimal y un modulador digital; un canal con ruido gaussiano y la etapa de recepción. Como herramientas de análisis se agrega un osciloscopio y el cálculo de tasa de error. Los bloques de procesamiento de señales se comunican entre ellos por medio de flujos de datos, donde cada uno de ellos es un tipo de dato en particular. GNU Radio realiza una verificación de datos muy estricta, esto es, los tipos de datos de entrada y de salida deben coincidir exactamente o la aplicación generará un error de ejecución. GNU Radio etiqueta los tipos de datos de acuerdo al tamaño o precisión que requiera el sistema a desarrollar, siendo desde el más básico, bytes, pasando por shorts, ints, floats 1. Byte. Se conforma de un byte de datos, esto es, 8 bits por elemento. 2. Short. Consiste en un entero conformado por 2 bytes. 3. Int. Este tipo de datos se conforma por un entero de 4 bytes. 4. Float. Permite el punto flotante por medio de 4 bytes. 5. Complex. Es un arreglo de 8 bytes, actualmente un par de tipo de dato float. Los bloques de procesamiento de datos se conforman de cuatro tipos de archivos principales: 1. Archivos xml: En ellos se definen los parámetros del bloque como el tipo de dato a utilizar (float, int, short, comlex), la biblioteca a la que pertenece, etc. 2. Archivos h: Son las bibliotecas de los bloques que se implementan. 3. Archivos cc: Donde se escribe el código de programación del proceso que realizará el bloque, el lenguaje de programación es C++. 4. Archivos i: También conocidos como archivos swig, permiten a la herramienta SWIG obtener los parámetros para la comunicación entre los archivos escritos de los bloques de C++ y la interfaz de Python. Para la personalización de bloques o implementación de bloques con procesos nuevos, GNU Radio incluye dentro del proyecto un ejemplo de desarrollo, compilación e implementación de bloques llamado “gr-howto-write-ablock”. La estructura de directorios del ejemplo “HOW TO” y por lo tanto de cualquier módulo externo al proyecto original es: 1. apps: Contiene las aplicaciones de prueba y ejemplos. 2. cmake: Contiene los diferentes archivos de configuración y no se modifican. 3. docs: Contiene los archivos de documentación del bloque que se generan de manera automática con Doxygen. 4. grc: Contiene los archivos (xml) de los bloques que se implementarán en GRC. 5. include: Contiene los archivos fuente de las librerías (h) de los bloques desarrollados. 6. lib: Contiene los archivos fuente (cc) de los bloques desarrollados. 7. python: Contiene los scripts escritos en Python. 8. swig: Contiene los archivos swig (i) con la configuración del intérprete de C++ y Phyton. Cada carpeta, incluyendo la raíz, contiene archivos “CmakeLists.txt” con los datos de configuración que utiliza el programa CMAKE para compilar los bloques de procesamiento de señales. Para agregar el módulo “gr-howto-write-a-block” se ejecuta una serie de comandos desde una terminal de comandos en Linux, dentro de la carpeta raíz del módulo a instalar, en este caso, la carpeta se llama “gr-howto-write-a-block” Entre los diferentes tipos de bloques contemplados dentro de GNU Radio estan: 1. 2. 3. 4. 5. 6. 7. 8. Sink: Bloque que sólo tiene entrada de datos. Source: Bloque que sólo genera datos. Sync: Bloque que tanto los elementos de entrada son iguales a los de salida, M=N. Decimator: Bloque que la relación de entrada y salida de datos es M/1. Interpolator: Bloque inverso de decimator, su relación es 1/N. General: La relación de entrada y salida de datos es M/N. Hiercpp: Bloque que conformado de un grupo de bloques de C++. Hierpython: Versión de hiercpp para Python. Un par de ejemplos del desarrollo de bloques en GNU Radio son los bloques de procesamiento digital llamados “Binary to Decimal” y “Decimal to Binary” mostrados en la Fig. 2, desarrollados para la manipulación de datos antes del modulador digital en el transmisor y después del demodulador digital en el receptor, ya que el modulador y demodulador requieren de valores decimales entre 0 y 15, para el caso de 16 QAM, para seleccionar el símbolo a transmitir o decodificar el símbolo recibido, tal como se muestra en la Fig. 3. $ mkdir build $ cd build $ cmake ../ $ make $ sudo make install $ sudo ldconfig Como resultado, al momento de ejecutar la interfaz de GRC, se puede observar en la lista de módulos uno nuevo llamado “HOWTO”. Para facilitar el desarrollo de la estructura de módulos de proyectos propios existen archivos de ordenes (script) tales como gr-modtool.py, que es un archivo escrito en lenguaje de programación Python, que por medio de una interfaz sencilla permite al usuario final crear, modificar o eliminar módulos y bloques de los proyectos personalizados [7]. Para crear el esqueleto del módulo, que consiste en la estructura de directorios del módulo out-of-tree, se ejecuta el comando desde una terminal de comandos en linux: $ python gr_modtool.py create Así mismo, para agregar los diferentes bloques que formarán parte del módulo se ejecuta el siguiente comando: $ python gr_modtool.py add Figura 3. Modulador 16-QAM en GRC. Los bloques que realizan la función de convertidor binario a decimal y viceversa no están contemplados dentro del proyecto de GNU Radio, pero con el método de “out-oftree” se puede implementar estos bloques en GRC, sólo se requiere crear una función escrita en C++ que convertirá un flujo de datos compuesto de unos y ceros en números decimales y viceversa, de esta forma se puede compartir los bloques de procesamiento de señales personalizados y adicionalmente integrar al proyecto de GNU Radio de cualquier usuario. Figura 4. Codificador convolucional y decodificador de IT++ en GNU Radio Companion (GRC). El procedimiento para convertir un número entero decimal a su equivalente binario, consiste en dividir el número decimal entre el número 2, y el residuo obtenido es el bit menos significante. El cociente resultante es divido nuevamente por el número 2, el nuevo residuo será el bit menos significante siguiente. Este proceso se repite hasta que el cociente resultante sea igual a 0. La conversión de binario a decimal se realiza aplicando el inverso de este procedimiento, esto es, los bits del número binario son utilizados uno por uno en una suma de potencias de base 2, empezando por el bit más significativo. Considere un vector de n bits ( bn− 1 , bn− 2 ,... , b1 , b0 ), el procedimiento empieza calculando el valor de la serie de n− 1 n− 2 1 0 potencias base 2 ( 2 ,2 ,... , 2 ,2 ), para los bits b j iguales a 1, y sumando todos los valores decimales obtenidos se consigue el equivalente decimal del vector de n bits. Este resultado se envía a la salida del bloque de procesamiento de señal de GRC. Los pasos para implementar un bloque personalizado se pueden resumir en los siguientes pasos: 1. 2. 3. 4. 5. Generación de estructura de archivos para integrar el bloque. Modificar el archivo xml para su correcto funcionamiento dentro de GRC (indicar variables de entrada y tipos de datos). Modificar el archivo h para declarar variables globales en caso de ser requeridos. Modificar el archivo cc donde se realizará el procesamiento de datos. Compilar los archivos generados en la carpeta raíz del módulo a integrar. Además, dentro de GNU Radio existen variables de entorno que facilitan la programación de los diferentes procesos, tales como: 1. noutput_items. Es la cantidad de elementos que maneja el bloque. 2. in[i]. Son los valores de entrada al bloque, es un arreglo con índice i. 3. out[i]. Es la variable de salida del bloque, en ella se guardan los resultados del proceso realizado en el bloque. Para una explicación a detalle de la implementación del convertidor binario a decimal puede revisar el apéndice A. III. IT++ y GNU RADIO IT++ es una biblioteca de C++ con clases y funciones matemáticas, de procesamiento de señales y de comunicaciones. Su uso principal es apoyar la investigación mediante la simulación, evaluando el desempeño de sistemas de comunicación en el área de telecomunicaciones. El kernel de la biblioteca de IT++ se conforma de clases de vectores y matrices genéricos, y un conjunto de rutinas. La biblioteca IT++ fue desarrollada por el departamento de Teoría de la Información en Chalmers University of Technology, Gothenburg, Suecia. Bajo los términos de licencia GPL (GNU General Public License). IT++ es comúnmente utilizada por investigadores y desarrolladores del área de telecomunicaciones, tanto en la industria como en las universidades. En 2005, 2006 y 2007, IT++ fue desarrollado como parte de NEWCOM (European Network of Excellence in Wireless Communications). IT++ hace un uso extensivo de bibliotecas de código abierto (open-source) y comerciales para incrementar funcionalidad, velocidad y precisión. En particular las bibliotecas BLAS, LAPACK y FFTW así como bibliotecas optimizadas para una plataforma específica, tales como: • ATLAS (Automatically Tuned Linear Algebra Software) – incluye rutinas optimizadas de BLAS y un conjunto limitado de LAPACK • MKL (Intel Math Kernel Library) – incluye todas las rutinas de BLAS, LAPACK y FFT (No requiere de FFTW). • ACML (AMD Core Math Library) - incluye rutinas de BLAS, LAPACK y FFT (No requiere de FFTW). Es posible compilar y utilizar IT++ sin las bibliotecas listadas anteriormente, pero el desempeño de las funciones se ve disminuido [8]. Para que GNU Radio pueda interactuar con bibliotecas externas desarrolladas para C++ estas se deben incluir durante el desarrollo de los bloques de procesamiento de señales de los módulos out-of-tree. Para incluir bibliotecas externas se debe agregar un módulo de búsqueda en CMAKE, el cuál determinará la ruta de ubicación de las bibliotecas y modificará las banderas para la ruta de instalación de las bibliotecas en C++. De acuerdo a [9], es posible indicar a CMAKE la ubicación de bibliotecas externas para la integración de proyectos dentro de GNU Radio, esto se puede resumir en los siguientes pasos: 1. Indicar a CMAKE la ubicación de la biblioteca de C++ a integrar. 2. Indicar a SWIG la existencia de la biblioteca externa para su posterior compilación. 3. Una vez integrado, dentro del código y biblioteca del bloque de procesamiento de señales de GNU Radio se invoca la biblioteca externa a través de la instrucción #include<bibliotecaC++>. 4. La declaración de variables se tienen que hacer de la forma bibliotecaexterna::objeto. Para una descripción más a detalle de la integración de bibliotecas externas se puede revisar el apéndice B, donde se muestra un código de programación funcional de un codificador convolucional desarrollado con bibliotecas de IT++. El bloque del codificador convolucional y del decodificador integrado a un sistema de comunicación se puede observar en la Fig. 4. Este tipo de procedimientos permite expandir las funciones y alcances de GNU Radio que no estén consideradas por el proyecto original. IV. USRP y GNU RADIO El uso de tarjetas universales de software radio programable, tales como USRP, permiten a GNU Radio el envío y recepción de información a través de hardware por medio de un bloque de procesamiento, las tarjetas USRP v1 son tarjetas con una interfaz USB 2.0 por lo que la tasa de transmisión está restringida a la velocidad de bus del estándar. Actualmente, las tarjetas USRP v1 pueden transmitir a una tasa de 32 MBps, todas las muestras enviadas por USB son enteros de 16-bits con signo en formato IQ, esto quiere decir, 16 bits para los datos en fase y 16 bits para los datos en cuadratura, por lo que el tamaño de datos es de 4 bytes por muestra compleja. Esto resulta en una tasa de 8 MMps a través de USB obtenido de 32 MBps / 4 Bytes. De acuerdo al criterio de Nyquist el máximo ancho de banda efectivo en el espectro es de 8 MHz [10]. Las tarjetas USRP requieren de un host (computadora) que realice el procesamiento de las señales, esto es, GNU Radio manipula la información y realiza las operaciones de la capa física, tanto del transmisor como del receptor, y envía a las tarjetas USRP por medio del puerto USB la señal o símbolos a transmitir por el canal inalámbrico, interpretando los datos recibidos (digitales USB) convirtiéndolos en una señal modulada en una portadora a la frecuencia especificada por GNU Radio. Por ejemplo, si se realiza un modulador OFDM, las etapas de FFT y prefijo cíclico son realizadas por GNU Radio en la computadora y el USRP acondiciona el símbolo OFDM para su envío en el canal inalámbrico. Para el desarrollo de estándares donde la velocidad de transmisión es alta es necesario considerar que las tarjetas USRP v1 no podrán alcanzar esas tasas, por lo que se recomienda realizar los ajustes para diezmar o ajustar al ancho de banda efectivo del USRP. V. CONCLUSIONES En el presente artículo se muestra una opción de cómo fortalecer una herramienta open source de Software-Defined Radio, como GNU Radio, por medio de bibliotecas externas de C++, aunque Python es un lenguaje de programación muy versátil que permite al usuario desarrollar aplicaciones con un código sencillo, la programación orientada a bloques de GNU Radio puede no ser tan clara al momento de analizar el código. El incluir funciones especiales en este tipo de entornos puede llegar a ser bastante complejo e incluso requerir de un nivel de programación alto. Otras bibliotecas escritas en lenguaje de programación C++ pueden permitir ampliar las funciones predeterminadas de GNU Radio, en este caso, IT++ es una biblioteca de C++ orientada a las telecomunicaciones, cuyas funciones permiten realizar procesamiento de señales por medio de vectores y matrices, lo que facilita en gran medida la forma de manipular los datos en ambientes de C++. La inclusión de bloques de procesamiento personalizados no considerados originalmente por el proyecto, como la conversión decimal a binario y viceversa, permite aumentar el poder de procesamiento y manipulación de datos de proyectos dentro de GNU Radio, esto incluye ser compatibles y distribuibles entre diferentes versiones de usuario. Los bloques del codificador convolucional y decodificador de Viterbi, tampoco considerados dentro de GNU Radio, muestran que procesos y funciones desarrollados por proyectos externos pueden aumentar la eficiencia y disminuir los tiempos de desarrollo de sistemas de comunicación a través de SDR. El método propuesto para agregar bibliotecas externas muestra la versatilidad y flexibilidad de open source para adaptarse e incorporar nuevos proyectos a un trabajo previamente desarrollado; en casos como el del codificador convolucional, permite desarrollar en una sola línea de programa lo que podría representar varias líneas de código que implican múltiples operaciones complejas, con un desempeño menor al de una biblioteca externa con pruebas de calidad y operación comprobadas. Esta manera de agregar bibliotecas externas a GNU Radio no solo se aplica a la biblioteca de IT++, sino a cualquier biblioteca de C++ e incluso de Python, aunque en el caso de Python, GRC ya incluye un bloque para agregar bibliotecas externas. APÉNDICE Apéndice A: Instalación de un bloque de procesamiento personalizado. Dentro de las características previas del bloque de procesamiento en el transmisor se considerará lo siguiente: 1. Los tipos de datos tanto para la entrada y salida del bloque será float. 2. La relación de elementos de entrada y de salida tendrá un factor N/1, donde N es la cantidad de elementos de entrada por cada elemento de salida y será representada por la variable chunk y capturada por la variable vec_size dentro del archivo xml. Esto determinará cada cuantos bits se agruparán para calcular el número decimal. El tipo de bloque que cumple con las características que se requieren para el diseño es el “decimator”, ya que el número de elementos de entrada será mayor al número de elementos en su salida, esto es, si se requiere obtener el número decimal de cada 4 bits, a la salida del bloque se obtendrá un solo elemento que representa el valor decimal de la entrada de bits. Dentro del script se debe indicar el tipo de bloque “decimator” y el parámetro “int vec_size” como la variable para captura de N. En el código del archivo xml se agrega la variable vec_size y se indica el tipo de dato de entrada y salida del bloque de procesamiento de la siguiente manera: 7 <make>TuModulo.TuBloque($vec_size)</make> … 13 <param> 14 <name>Vector Size</name> 15 <key>vec_size</key> 16 <type>int</type> 17 </param> … 24 <sink> 25 <name>in</name> 26 <type>float</type> 27 </sink> … 34 <source> 35 <name>out</name> 36 <type>float</type> 37 </source> Esto permite indicar a GRC que el bloque de procesamiento requiere de un parámetro de entrada llamado vec_size; que el tipo de datos de entrada del bloque es float y así mismo el tipo de datos de la salida. El uso del $ antes del nombre de la variable vec_size permite utilizarlo por otros códigos fuera del archivo xml. Dentro del archivo de cabecera h se declara la variable chunk, que permitirá utilizar esta variable de forma privada dentro del bloque. 36 class TUMODULO_API TuModulo_TuBloque : public gr_sync_decimator 37 { 38 friend TUMODULO_API TuModulo_TuBloque_sptr TuModulo_make_TuBloque (int vec_size); 39 40 TuModulo_TuBloque (int vec_size); 41 int chunk; En el archivo con extensión cc se escribe el código que realiza el procesamiento de la señal, este código es escrito en lenguaje de programación C++. La biblioteca requerida para realizar la conversión de decimal a binario, tales como operaciones de cálculo de potencia son definidos por la biblioteca de C++ llamada math.h, esta es añadida en la siguiente línea dentro del archivo cc: 27 #include <math.h> Además se debe indicar dentro de la inicialización de la variable gr_make_io_signature los máximos y mínimos de flujos de datos presentes tanto en la entrada como en la salida del bloque de procesamiento, que los flujos contienen un tipo de datos float y el diezmado será definida por la variable vec_size del archivo xml. Así mismo se define la variable chunk que contiene la cantidad de bits para la conversión: 37 TuModulo_TuBloque::TuModulo_TuBloque (int vec_size) 38 : gr_sync_decimator (“Tu Bloque”, 39 gr_make_io_signature (1, 1, sizeof (float)), 40 gr_make_io_signature (1, 1, sizeof (float)),vec_size) 41 { 42 chunk=vec_size; 43 } El código final para el convertidor de binario a decimal dentro del archivo cc quedaría como se muestra a continuación: 51 int 52 TuModulo_TuBloque::work (int noutput_items, 53 gr_vector_const_void_star &input_items, 54 gr_vector_void_star &output_items) 55 { 56 const float *in = (const float *) input_items[0]; 57 float *out = (float *) output_items[0]; 58 int j=0,a=0; 59 60 for (int i = 0; i < noutput_items*chunk; i=i+chunk){ 61 out[j]=0; 62 a=chunk-1; 63 for (int k=0;k < chunk; k++){ 64 out[j] = out[j] + (in[i+k] * pow (2,a)); 65 a=a-1; 66 } 67 j++; 68 } 69 70 // Tell runtime system how many output items we produced. 71 return noutput_items; 72 } Apéndice B: Instalación de IT++ en entorno de GRC. La búsqueda de las bibliotecas de IT++ se realiza a través de un archivo llamado FindITPP.cmake con el siguiente código: 1 INCLUDE(FindPkgConfig) 2 PKG_CHECK_MODULES(PC_ITPP QUIET gnuradio-core) 3 FIND_PATH( 4 ITPP_INCLUDE_DIRS 5 NAMES itpp/itbase.h 6 HINTS $ENV{ITPP_DIR}/include 7 ${PC_ITPP_INCLUDE_DIR} 8 PATHS /usr/local/include 9 /usr/include 10 /usr/pkgs64/include 11 ) 12 FIND_LIBRARY( 13 ITPP_LIBRARIES 14 NAMES itpp 15 HINTS $ENV{ITPP_DIR}/lib 16 ${PC_ITPP_LIBDIR} 17 PATHS /usr/local/lib 18 /usr/local/lib64 19 /usr/lib 20 /usr/lib64 21 /usr/pkgs64/lib 22 ) 23 INCLUDE(FindPackageHandleStandardArgs) 24 FIND_PACKAGE_HANDLE_STANDARD_ARGS (ITPP 25 DEFAULT_MSG ITPP_LIBRARIES ITPP_INCLUDE_DIRS) 26 MARK_AS_ADVANCED(ITPP_LIBRARIES ITPP_INCLUDE_DIRS) Además se requiere modificar el archivo CmakeLists.txt del directorio raíz del módulo out-of-tree, para que al momento de generar los archivos de build se incluya la busqueda de IT++. En la línea 86 dentro de la sección de # Find gnuradio build dependencies se escribe la instrucción. 86 find_package(ITPP) Además hay que agregar un aviso en caso de que no se encuentre la biblioteca de IT++, esta se puede realizar en la línea 97 97 if(NOT ITPP_FOUND) 98 message(FATAL_ERROR “IT++ Core required to compile project”) 99 endif() En la sección de # Setup the include and linker paths se indica a CMAKE las rutas encontradas por FindITPP.cmake con la ubicación de las bibliotecas de IT++. Dentro de la función include_directories, en la línea 109 aproximadamente se modifica con la siguiente instrucción. 109 ${ITPP_INCLUDE_DIRS} Así también en la función de link_directories se agrega en la línea 116 la instrucción 116 ${ITPP_LIBRARY_DIRS} En el archivo CmakeLists.txt dentro del folder lib se señalan las bibliotecas de IT++ para su correcto funcionamiento. En la línea 25, dentro de la sección de # Setup library, en la función target_link_libraries se agrega: 25 ${ITPP_LIBRARIES} Así también se indica la biblioteca de IT++ en los archivos swig para su posterior compilación, esto se realiza en el archivo CmakeLists.txt del folder swig dentro del proyecto. Dentro de la sección # Setup swig generation se agrega en la línea 42 42 foreach(incdir ${ITPP_INCLUDE_DIRS}) 43 list(APPEND GR_SWIG_INCLUDE_DIRS ${incdir}/itpp/swig) 44 endforeach(incdir) Para invocar código con funciones de la biblioteca de IT++ en los bloques de GNU Radio, sólo se agrega la instrucción #include <itpp/itcomm.h> al principio de los archivos cc y h y las funciones de IT++ se invocan de la siguiente manera, para declarar una variable: itpp::bvec tempbin, un objeto: itpp::Convolutional_Code code. Un ejemplo de la implementación del codificador convolucional de IT++ en GNU Radio quedaría como sigue: 51 int 52 TuModulo_TuBloque::work (int noutput_items, 53 gr_vector_const_void_star &input_items, 54 gr_vector_void_star &output_items) 55 { 56 const float *in = (const float *) input_items[0]; 57 float *out = (float *) output_items[0]; 58 itpp::bvec tempin (pz*sizeof(float)); 59 itpp::bvec tempout (pz*polsize*sizeof(float)); 60 for (int j = 0; j < pz*sizeof(float);j++){ 61 tempin[j] = in[j]; 62 } 63 code.encode_tailbite(tempin, tempout) 64 for (int k = 0;k<(pz * polsize * sizeof(float)); k++){ 65 out[k] = tempout[k]; 66 } 67 // Tell runtime system how many output items we produced. 68 return noutput_items; 69 } REFERENCIAS [1] Kan Zheng; Lin Huang; Gang Li; Hanwen Cao; Wenbo Wang; Dohler, M.; , “Beyond 3G Evolution”, Vehicular Technology Magazine, IEEE, vol.3, no.2, pp.30-36, Junio 2008. [2] Mandke, K.; Soon-Hyeok Choi; Gibeom Kim; Grant, R.; Daniels, R.C.; Wonsoo Kim; Heath, R.W.; Nettles, S.M.; , "Early Results on Hydra: A Flexible MAC/PHY Multihop Testbed", Vehicular Technology Conference, 2007. VTC2007-Spring. IEEE 65th, vol., no., pp.1896-1900, 22-25 Abril 2007. [3] Luiz Garcia Reis, A.; Barros, A.F.; Gusso Lenzi, K.; Pedroso Meloni, L.G.; Barbin, S.E., "Introduction to the Software-defined Radio Approach," Latin America Transactions, IEEE (Revista IEEE America Latina) , vol.10, no.1, pp.1156,1161, Enero. 2012. [4] Beazley, David M., et al. SWIG: An easy to use tool for integrating scripting languages with C and C++. En Proceedings of the 4th USENIX Tcl/Tk workshop. 1996. p. 129-139. [5] Schroeder, W. J., Ibáñez, L., & Martin, K. M. Software process: the key to developing robust, reusable and maintainable open-source software. En Biomedical Imaging: Nano to Macro, 2004. IEEE International Symposium on (pp. 648-651). [6] http://www.joshknows.com/grc. [7] http://www.cgran.org/wiki/devtools. [8] http://itpp.sourceforge.net/4.3.0/. [9] http://mys.utia.cas.cz:1800/trac/bdm [10] http://www.ettus.com. Víktor Iván Rodríguez-Abdalá. Maestro en ciencias en electrónica y telecomunicaciones, graduado en el Centro de Investigación Científica y de Educación Superior de Ensenada, Baja California (CICESE), en 2005. Desde 2011, es estudiante de doctorado del Departamento de Electrónica y Telecomunicaciones de la División de Física Aplicada del CICESE, trabajando en líneas de investigación de comunicaciones inalámbricas, Software Defined Radio (SDR) y procesamiento de señales para sistemas MIMO. Jaime Sánchez-García. Realizó estudios de doctorado en ingeniería eléctrica con especialidad en comunicaciones en la Escuela de Ingeniería y Ciencias Aplicadas (SEAS), en The George Washington University, USA (2001). Es maestro en ciencias en electrónica y telecomunicaciones en el CICESE (1979), e ingeniero en comunicaciones y electrónica en la ESIMEIPN (1976). Es investigador titular “C” en el Departamento de Electrónica y Telecomunicaciones (DET) del CICESE, asimismo realiza investigación y docencia en el área de comunicaciones. Ha publicado varios artículos en revistas y congresos internacionales. Sus áreas de investigación incluyen redes de comunicaciones inalámbricas, técnicas MIMO-OFDM, codificación espacio-tiempo-frecuencia, técnicas de capa física para redes de 4a generación. Obtuvo el 1er lugar en el III Premio Anual Ericsson de Telecomunicaciones en 1988. Ha realizado estancias de investigación en Telefónica de España, Madrid (1989), en la Universidad de Arizona en Tucson (1997) y en la Universidad de Texas en Austin (2008).