Mostrando entradas con la etiqueta GNU Radio. Mostrar todas las entradas
Mostrando entradas con la etiqueta GNU Radio. Mostrar todas las entradas

viernes, 6 de enero de 2017

Muestras I/Q: Un ejemplo con GNU Radio

En la entrada anterior resumía todo lo relevante sobre las señales analíticas (I/Q). Esta vez haremos un ejemplo que nos ayudará a visualizarlas mejor y hacernos de una intuición sobre su naturaleza. El ejemplo consiste en obtener las componentes I/Q de la siguiente señal:
Al ser una señal real, esperamos que tenga un espectro simétrico tal como podemos observar en el sink de frecuencia:
Para obtener las componentes I/Q de esta señal requerimos implementar un modulador en cuadratura con un filtro pasabajas para cada componente y posteriormente usar un bloque de conversión Float to Complex. No hará falta agregar simular un ADC ya que la señal generada ya es discreta. Si aún no están familiarizados con GNU Radio tengo un entrada introductoria [Asumo también cierto conocimiento en filtros digitales, aunque los bloques de estos son fáciles de usar y pueden consultar su documentación aquí] y tampoco estará de más tener muy claro el concepto de frecuencia en tiempo discreto. El flowgraph nos queda de la siguiente manera:
Click para agrandar
He agregado un slider gráfico que nos permite cambiar de forma interactiva la frecuencia de los generadores de señal que representan al oscilador local en cuadratura. Esto me parece un recurso didáctico muy bueno porque ayuda visualizar la relación que existe entre la frecuencia del oscilador local y la frecuencia que vemos en el centro (0 Hz) del espectro de la señal analítica. Basta asignar una frecuencia de 14.5 KHz para sintonizar a la componente de esa misma frecuencia que existe en nuestra señal de prueba:

lunes, 26 de diciembre de 2016

Iniciando con GNU Radio

GNU Radio es un proyecto que provee módulos de Python (escritos en C++) y herramientas de software para el procesamiento de señales en aplicaciones de radio definido por software (SDR). Puede ser instalado en Windows aunque aún no lo he probado ahí. Instalarlo en Debían y Fedora es muy sencillo. Para este tutorial voy a asumir que se ha tomado un curso básico de procesamiento digital de señales (pero tanto para aprender como repasar se puede recurrir a la vieja confiable serie Schaum's).

Hay dos maneras de utilizar GNU Radio: En modo gráfico creando diagramas a bloque con GNU Radio Companion (GRC) o creando scripts de Python desde cero. La ventaja de usar GRC es que permite desarrollar aplicaciones muy rápidamente y con un entorno amigable. Sin embargo, para aplicaciones más complejas, escribir scrips provee una flexibilidad más adecuada. Naturalmente iniciaremos usando GRC.

GRC es visualmente similar a Simulink o LabVIEW. Sin embargo trabaja de la siguiente manera: GRC crea un script de python (cuyo nombre por defecto es top_block.py)  a partir del diagrama a bloques creado. Este programa se encarga de ejecutar los bloques en el orden correcto y llamar a la librería gráfica para visualizar interactivamente los datos si es el caso. Gracias al GNU Block API, cada bloque se ejecuta en un thread lo da muy buen desempeño si tienes un procesador multinúcleo.

Bien, al abrir GRC (buscadolo en el menú o desde terminal ejecutando "gnuradio-companion") aparecerá el espacio de trabajo, la ventana de bloques a la derecha y una ventana de mensajes en la parte inferior:
 En todo nuevo proyecto nos aparecerán dos bloques por efecto en el espacio de trabajo: el bloque "Options" y un bloque de variable samp_rate. El bloque "Options" nos permite cambiar al nombre del script principal (del que hablaba más arriba), agregar autor, descripción, elegir la librería gráfica entre otras opciones. Las variables son muy útiles para facilitar el desarrollo de cualquier programa. La tasa de muestreo es tan importante en procesamiento digital de señales que es muy útil agregarla al espacio de trabajo por defecto.

Para nuestro primer ejemplo generaremos una señal cosenoidal de 10 KHz con una amplitud unitaria más ruido gaussiano de amplitud 0.1 y la visualizaremos con un instrumento virtual. Usaremos los siguientes bloques:
  • Waveform Generators > Signal Source
  • Wavefoem Generator > Noise Source
  • Math Operators > Add
  • Misc > Throttle
  • Instrumentation > QT > QT GUI Sink
 y los conectaremos de la siguiente manera (la conexión se hace dando click en la salida del primer bloque y después en la entrada del segundo bloque):
Se notará que el color de los puertos será azul por defecto. Este color denota el tipo de dato (el azul representa a los complejos flotantes). El código de colores completo se puede ver yendo al menú superior en help > types. En este ejemplo debemos cambiar a tipo float en la configuración de todos los bloques (naranja).

El bloque "Throttle" se encarga de reducir la carga de trabajo del procesador limitando el flujo de datos a través del bloque de manera que no haya retrasos o congelamientos en la visualización gráfica de los datos. Es muy importante aclarar que este bloque sólo debe usarse para visualizar datos y nunca para trabajar con salidas físicas como audio o instrumentos USRP.

Finalmente, lo que queda es configurar los bloques "Signal Source" y "Noise Source" para que nos den los valores de salida deseados. Damos click en "Execute flow graph":
 Veremos ejecutarse la interfaz gráfica del instrumento virtual QT que incluye displays en dominio de la frecuencia y del tiempo así como un espectrograma y un diagrama de constelación:
 Referencias
 "Core concepts of GNU Radio", GNURadio.org