GNU Radio es un conjunto de archivos y aplicaciones que provee las librerías necesarias para el procesamiento digital en la manipulación de señales. Aunque no es una herramienta principalmente de simulación, GNU Radio complementa el desarrollo de algoritmos de procesamiento de señales a partir de datos previamente grabados o generados, evitando la necesidad de hardware de RF. Con mayor precisión, GNU Radio es una biblioteca de software, esto significa que puede ser usado en el desarrollo de aplicaciones completas para el campo de las radiocomunicaciones basadas en lógica programable, por lo que los bloques funcionales de los esquemas de radio que típicamente son implementados mediante hardware de propósitos específicos, ahora pueden ser tratados con esta lógica programable según las necesidades experimentadas.
Las aplicaciones de GNU Radio son escritas desde un principio utilizando el lenguaje de programación Python, mientras que el suministro de herramientas críticas de procesamiento de señales que requieren alto rendimiento son implementados en C++. De esta forma, el desarrollador es capaz de implementar, de manera simple, sistemas de radio de alto rendimiento funcionando a tiempo real aprovechando el ambiente de desarrollo de aplicaciones de manera inmediata [28].
De manera muy básica, GNU Radio puede interpretarse como un grafo, donde los nodos representan los bloques de procesado de una señal que se inicia en la fuente y termina en un sumidero y las interconexiones entre ellos determinarán el camino a seguir por la señal. Un ejemplo de grafo es mostrado en la figura 2.1, donde se dispone de una fuente de datos, un sumidero y 3 bloques que desempeñan diferentes funciones de procesamiento como amplificación, codificación/decodificación, mecanismo de corrección de errores, modulación, entre otras posibles funciones básicas.
Figura 2.1: Ejemplo funcional de una aplicación en GNU Radio.
En su concepción GNU Radio permite la programación directa de bloques funcionales como aditivo a un sistema. Para ello es útil poseer un previo conocimiento en la ingeniería de programación y la propia programación, principalmente en los lenguajes Python y C++.
Los bloques de procesado de señal, usualmente son implementados en C++. Por definición, un bloque procesa señales continuamente desde puertos de entrada hasta puertos de salida, por lo que el bloque se puede pensar como un flujo de un tipo de datos desde los puertos de entrada hasta los de salida, donde la cantidad de puertos puede variar, pudiendo ser simétricos con la misma cantidad de puertos de entrada que de salida o no, en coherencia según la función para la que fue diseñado el bloque. Idealmente, estos bloques desempeñan únicamente una función para facilitar la reconfiguración y flexibilidad del sistema SDR que es implementado con ayuda de GNU Radio. Los tipos de datos manejados son: “byte” (1 byte de datos), “short” (2 byte de datos), “int” (4 byte de datos), “float” (4 byte de datos para números en punto flotante) y “complex” (8 byte de datos, un float para cada componente).
En algunos casos los bloques poseen únicamente puertos de salida o puertos de entrada. Estos sirven como fuentes de datos para aquellos que solo poseen puertos de salida mientras que para los bloques que solo poseen puertos de entrada, los llamados sumideros, su función es mostrar un gráfico de la señal obtenida en el punto del progreso de procesado donde es colocado el bloque o para el caso de alguna comparación para establecer una razón de errores, en este último caso no son llamados sumideros.
El procesado de señal y en general todo el trabajo a bajo nivel está implementado en C++, mientras que se hace uso de Python para escribir la aplicación, ocupándose de interconectar los bloques a usar. Python es un lenguaje de programación orientado a la interpretación de objetos, lo que significa que no se compila, sino que el SO lo ejecuta directamente. Para que desde un lenguaje de script como es Python se pueda acceder a las funciones implementadas en C++, se utiliza la herramienta software: Simplified Wrapper and Interface Generator (SWIG). Resumiendo, los bloques de procesado de señal son implementados en C++ y portados a Python a partir del programa SWIG, es decir, para implementar los diseños se crearán los módulos en Python que a su vez se apoya en los bloques implementados en C++. En la figura 2.2 se muestran las interacciones entre los diferentes niveles de GNU_Radio [29, 30].
Figura 2.2: Escalones seguidos por una aplicación SDR desarrollada en GNU Radio [7].
Generalmente, en GNU Radio los bloques son implementados típicamente en cuatro tipos de archivos [6]:
• Archivos .xml: En ellos se definen los parámetros del bloque como el tipo de dato a utilizar, el número de puertos de entrada y de salida, las librerías etc.
(Requisito necesario para que el bloque esté disponible en GNU Radio Companion).
• Archivos .h: Son las bibliotecas de los bloques de procesado de señal • Archivos .cc: Son los archivos que contienen la función que
desempeñará el bloque de procesado de señal, se escriben en C++. • Archivos .i: Son los archivos encargados de la comunicación entre los
bloques de procesado de señal y la interfaz en Python.
Como previamente se había comentado, el proyecto GNU Radio es de código abierto, por lo que se permite realizar modificaciones en el proyecto, incluso se permite agregar módulos al proyecto existente. Los nuevos módulos que se deseen agregar no forman parte del núcleo de GNU Radio, sino que son instalados fuera del directorio raíz, por este motivo, estos tipos de módulos reciben el nombre de out-of-tree [6].
GNU Radio se encarga de realizar las operaciones en banda base. La configuración del dispositivo (USRP) la lleva a cabo GNU Radio, el cual a través de UHD (módulo que sirve de interfaz a la librería UHD para poder transmitir y recibir datos del USRP), modifica parámetros tales como la elección de la antena (si procede), de la frecuencia de RF deseada, ganancia y tasas de diezmado e interpolación. Esta información es conducida hacia una FPGA en la mayoría de los casos, que es la encargada de realizar el interpolado y diezmado a la señal y configurar los elementos de la cadena de RF tales como mixers (mezcladores), amplificadores variables y filtros. La figura 2.3 muestra cómo se relacionan los componentes descritos [6].
Figura 2.3: Relación entre componentes Hardware y Software [6].
De manera general, las funciones implementadas por la plataforma GNU Radio en la cadena tanto de transmisión como recepción son mostradas en la figura 2.4:
Figura 2.4: Funciones desarrolladas en GNU Radio [6].
Otra muestra más de la flexibilidad de la herramienta, es que permite la posibilidad de trabajar junto con otros programas como son GNU_Octave y/o MATLAB.