IT++ As A GNU Radio Out-Of

Anuncio
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, [email protected]
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, [email protected]
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).
Descargar