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:

jueves, 5 de enero de 2017

Entendiendo a las señales analíticas (muestras I/Q)

Las muestras I/Q son una representación matemática discreta de una señal de radiofrecuencia cuya característica más útil es tener un espectro de frecuencia negativa nulo (un espectro compacto y asimétrico). Dado que el procedimiento de obtención de estas muestras involucra una reducción de frecuencia, su uso esta muy extendido en en las aplicaciones de radio definido por software y comunicaciones digitales en general. Las dos características anteriores nos dan dos ventajas: la primera elimina la redundancia en el espectro y la segunda permite reducir en el ancho de banda.

¿Cómo se obtiene una representación compleja de una señal real? Para el caso continuo el proceso es el siguiente:
 Simplemente se multiplica a la señal de radiofrecuencia por un sinusoide complejo y se aplica un filtro pasa-bajas para eliminar la redundancia en el espectro. Esto es lo que se conoce como señal analítica. Este procedimiento se vuelve más claro en el dominio de la frecuencia:
Recordemos que una multiplicación en el dominio del tiempo se manifiesta como una convolución en el dominio de la frecuencia. La convolución entre el espectro asimétrico de un sinuosoide complejo produce un corrimiento en frecuencia, el cual está dado por la frecuencia del sinusoide complejo (que lleva la etiqueta de LO por Local Oscillator) .

Ahora bien, el proceso anterior es puramente matemático. ¿Cómo se hace en el mundo real? El problema se resuelve implementando un modulador en cuadratura como se muestra en el siguiente diagrama:
 Tomando en cuenta a la identidad de Euler, una multiplicación por un sinusoide complejo se emula como la multiplicación y filtrado separado de dos sinusoides reales en cuadratura (heterodino en cuadratura). Posteriormente, al digitalizar independientemente a cada una de las componentes, se consideran a las muestras del ADC en cuadratura como la parte imaginaria multiplica por -1. La I viene de In-phase y la Q de Quadrature. Prácticamente todos los dongles SDR que pueden conseguirse fácilmente en el mercado como los RTL's y el FunCube funcionan de esta manera. En la siguiente entrada haremos un ejemplo con GNU Radio para clarificar aún más las cosas.

Referencias:
"RTL-SDR: Inexpensive Software Defined Radio", EE123 University of California Berkeley
"I/Q Data for Dummies", Mikael Q Kuisma
"Complex Sinusoids", PDS Related

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

domingo, 23 de octubre de 2016

Repositorio de tesis abierto de la PUCP

La Pontificia Universidad Católica de Peru (PUCP) es una de las 20 mejores universidades de Latinoamérica. Recientemente me entero que tienen un enorme repositorio de tesis de acceso público que van desde nivel bachillerato hasta doctorado en un amplio número de áreas como Ciencias Sociales, Filosofía e Ingeniería y Ciencias Exactas. Me ha ayudado bastante a informarme sobre el estado del arte y para citar trabajos en mi tesis de licenciatura. Definitivamente un gran aporte al conocimiento para el mundo hispanohablante.

viernes, 21 de octubre de 2016

Small Ku Band Radio Telescope (1m)

Earlier this year I started to build a small radio telescope for my undergraduate thesis.The idea came to me as a smaller and open (without Radio Eyes) version of the Robert Arrowsmith's SDR radio telescope. In order to make a contribution to other students and educators all over the world, the main goals of the project are the following:
  • Create an open hardware and affordable altazimuth mount  
  • Create Python modules for control and coordinate conversions
  • Start a complete open hardware/software astronomical platform for educational proposes in long term.  
This week I've already finished the mount and I began to test the movement of the antenna. I'm using a Raspberry Pi as main control unit. The digital controllers for the motors are implemented in a microcontroller board called Miuva with a Pololu Qik 2s12v10 dual motor driver:
 And this is how the finished system looks like:

Once the mount is calibrated after add a magnetometer and an IMU, I will take some data using a FunCube and a RSA306B USB Spectrum Analyzer (which is not mine, sadly, but my adviser is letting me use it).

This post is only a brief teaser, but I promise I will release everything as soon as I get my degree!

martes, 6 de septiembre de 2016

Morelia Vol. 2

Yo aparentando saber de lo que hablo.
A principios de agosto regresé a Morelia para presentar lo que en esos días era mi propuesta de proyecto de tesis (un radiotelescopio de un plato de un metro del que escribiré pronto). Lo que más me tenía preocupado era tener algún episodio de pánico escénico de los cuales había creído erradicados hasta un pequeño insistente a mediados de junio, una semana después de la escuela de verano. Me tomé muy enserio el no repetirlo y estuve ensayando bastante mi corta presentación de 10 minutos. Me da mucho gusto contar que logré hacerlo bien esta vez. Toda la semana del pequeño congreso en Morelia recibí muy buenas criticas, incluida la de un investigador de del IRyA, Stan, que admiro bastante y a quien había invitado a mi charla. Creo que bastaba decir que mi charla me ayudó a ligar (o más bien que ligaran) en la fiesta de despedida. Disfrute mucho este viaje. Me reencontré con varios amigos e hice algunos nuevos más. Fue muy curioso que uno de mis compañeros de cuarto fue el amigo de N. de la UNAM al que había conocido un mes antes en CDMX. Conocí a una chica norteña que era asistente de verano de Stan por el programa Delfín y esta trabajando con SRT del Haystak. Estudiaba física y me sorprendió que supiera tanto de electrónica e instrumentación. Me dijo que le gustaba mucho esa área, me pidió algunos consejos pero después de darme cuenta lo mucho que sabía no fue tanto el extra que pude recomendarle estudiar. Hubo un día que perdí el autobús que nos llevaba del instituto al hotel por ayudarle con un problema en la comunicación serial con el analizador de espectros que estaban utilizando pero fue muy amable en ayudarme a regresar a Morelia. Ese día en el camino de regreso le contaba que a mi jamás me habían aceptado en el programa Delfín por no tener el promedio suficiente, o al menos que mi universidad no había respondido a mis solicitud de excepción. Le pareció gracioso e injusto porque yo le había dado la impresión de conocer bastante. El último día tuve que cambiar los planes de pasar unos días en Guanajuato para visitar a un amigo por no encontrar corridas de autobuses para allá después de las 4 pm y tuve que ir a la CDMX con un amigo en coche. Llegamos muy tarde a la ciudad por perdernos en Santa Fe. El carro en el íbamos de una amiga de mi amigo y nos dejaron en Taxqueña (nos habían dejado en una parada del trolebús pero nunca pasó y tuvo que regresar a rescatarnos). Era tan tarde que no alcanzamos boletos para el último autobús para Puebla, así que nos arriesgamos a cruzar media ciudad en metro para llegar a la TAPO. Al final lo logramos y llegamos en la madrugada. A mi amigo lo había conocido en la escuela de verano de junio. Me la pasé hablandole de lo mucho que sigo pensando en N.

miércoles, 31 de agosto de 2016

Identificación de la función de transferencia de un motor de Lego Mindstorms NXT

Utilizando la App de System Identification Toolbox de Matlab es muy sencillo estimar experimentalmente la función de transferencia de un sistema dinámico. Básicamente, existen 3 formas de identificar la planta de un sistema dinámico: el modelo de caja negra, el modelo de caja blanca y el modelo de caja gris. En el modelo de caja blanca se obtiene la función de transferencia a partir de los principios físicos conocidos sobre el sistema (que es lo que suele hacerse en un primer curso de sistemas de control al obtener la planta de un sistema masa-resorte-amortiguador). Sin embargo, cuando se trata de sistemas reales esto o suele ser muy complicado. El método de modelado por caja negra se encarga de estimar la función de transferencia con herramientas estadísticas utilizando únicamente una función de entrada de prueba y la función de respuesta de la planta ante dicha función:
Para la que la identificación sea certera es un requisito que u(t) tengo un ancho de banda muy amplio. Esto le permite al algoritmo de estimación tener más información disponible para la estimación del modelo. Idealmente la función que cumple con ancho de banda infinito es la delta de Dirac, sin embargo, al ser imposible de generar físicamente se opta en la practica por usar secuencias pseudoaleatorias binarias (PRBS's). Estas secuencias pueden generarse con un registro de corrimiento de retroalimentación lineal (LFSR) y tienen características espectrales de ruido blanco lo que las hace ideales para ser usadas como señales de prueba. La descripción de los generadores de PRBS's es todo un tema aparte del que espero escribir a detalle más adelante, pero pueden darse muy buena idea de como funcinan con este documento.

Para esta práctica se requiere tener instalar el paquete de soporte de  Lego Mindstorms para Simulink. Pueden instalarlo ejecutando el comando supportPackageInstaller en la ventana de comandos de Matlab y buscando Lego Mindstorms NXT. El modelo implementado en el NXT es el siguiente:
 








Este diagrama nos permite adquirir los datos tanto de la función de entrada como la de salida y los envía al workspace. Para poder hacer la adquisición a la PC debe ejecutarse en modo external. [Aquí pueden ver un video tutorial para hacer esto]. Los datos obtenidos son los siguentes:
Estas dos señales son las que utilizaremos en al app para realizar la identificación. Esta aplicación tiene una interfaz gráfica muy sencilla de utilizar.[Aquí hay un videotutorial en español para aprender a usarla]. Después de experimentar con varias combinaciones de polos y ceros, el modelo preliminar que logró un acierto del 96.12 % fue el siguiente:
Este aún es el modelo crudo encontrado por el identificador y es necesario ajustarlo. Lo primero que salta a la vista el el termino 5,434e-11 que es despreciable y eliminaremos en el modelo final. Lo que resta es hacer un ajuste de ganancia. Para ello requerimos la respuesta experimental en lazo cerrado del motor ante un escalón unitario. Ejecutamos entonces el siguiente diagrama a bloques para poder obtenerlo:
Teniendo los datos de la respuesta experimental, debemos ahora compararlo con la respuesta teórica de nuestro modelo ajustando la ganancia hasta observar resultados favorables (debe haber algún procedimiento analítico para esto, pero lo he realizado de forma empírica). El diagrama del modelo teórico, junto con el modelo de caja blanca realizado por la Universidad  Politécnica de Madrid[1] como segunda referencia, es el siguiente:


 Las respuestas fueron las siguientes:

   Con esto queda verificado que la función de transferencia final de posición angular (en grados) contra potencia (%) nos queda:
 La ventaja de este proceso es que puede repetirse para caracterizar la función de transferencia de los motores con carga como puede ser un brazo robótico o un robot móvil, algo que representaría un proceso tedioso con el enfoque de caja blanca. Adelantantome a la petición de los archivos:

jueves, 11 de agosto de 2016

domingo, 7 de agosto de 2016

Tonantzintla

Epicuro afirmaba que lo único que hace verdaderamente feliz al ser humano es vivir y trabajar en comunidad con sus amigos. Creo que cualquiera que haya pasado una escuela, taller o verano de investigación con buena compañía le puede dar la razón. Lo único malo, como le oí decir a alguien durante la última semana del taller, es el "síndrome de abstinencia post-escuela". El forjado de experiencias de vida es una de las cosas más personalmente enriquecedores que puede ofrecernos la ciencia. No podría dedicarme a otra cosa.

Debo admitir que cuando mandé mi solicitud estaba seguro con toda mi arrogancia que iba quedar admitido. Si bien no me equivoqué, me di cuenta al investigar a mis compañeros que no era precisamente el mejor candidato de latinomérica, algo que en realidad me animó mucho. Por primera vez me tocó un evento con una selección impecable. Si alguien ha seguido esta serie de escritos ya habrá leído alguna que otra desventura. Pero esta es, desde aquel TCJ 2007, fue una de las mejores escuelas de verano en las que he estado. Había comentado alguna vez que no parece apetecerme mucho escribir cuando las cosas andan muy bien. Creo que ha sido el caso estos últimos días, pero vale la pena contar estas anécdotas en este rincón perdido del internet.

Después de S. llegué a pensar que sería muy difícil sentir algo por alguien con la misma fuerza. Hubo otros affairs breves el año pasado, pero siendo sincero y sintiendo algo de culpa, sólo fueron para mi una salida para sacármela de la mente. Este año no tenía ningún plan no académico. Hasta que sin esperarlo conocí a una de las mujeres más perfectas que podría encontrar en la Tierra. A primera vista me pareció muy guapa, pero eso es algo que jamás me llevado a sentir nada más que atracción. Supongo que fue a la mitad de la primer semana cuando me di cuanta de que estaba perdido por ella. Traté de evitarlo lo más que pude. Una extranjera que difícilmente volvería a ver con la frecuencia que quisiera. Pero terminé completamente loco por ella, como no me hacia sentido en años. ¿Por qué? Simplemente puedo decir que era una curiosa conjugación de todas las mujeres que me habían gustado hasta el momento presente y mucho más. Un chica extrovertida, sin ser fastidiosa, inteligente y más lógica de lo que había visto antes. Apasionada y comprometida con su carrera y la ciencia. El tipo de mujer que te convence de que la perfección en las personas se puede lograr. ¿Cómo iba a poder resistirme? Su nombre es N.

La segunda semana del taller consistió en trabajar con un proyecto individual. Fue muy interesante y ha sido lo más cercano a lo que he estado a la investigación real. Trabajé con datos de Herschel y GTM Aprendí bastante sobre el WCS y sobre como convertir entre indicies y coordenadas ecuatoriales. Aquella semana vi muy poco a N. Todos estuvimos muy ocupados con nuestro proyectos en las oficinas de nuestros asesores o en la sala común. A diferencia de Morelia, nadie se quejaba por la carga de trabajo. Fue todo lo contrario, como la Legión Extranjera, eramos casi los primeros en llegar y los últimos en irnos del instituto. Just the way I like it. Hice muy buenos amigos de los que espero ser colegas en un futuro no muy lejano. La escuela me levantó mucho el animo en muchos sentidos, algo que después de mis crisis de ansiedad clínica me cayó muy bien. Y pensar que estuve a punto de no aplicar en aquellos días de abril por estar sumido en el desden de la baja dopamina.

La escuela terminó un viernes, y el sábado todo el mundo partió del instituto. N. regresaba a su país el lunes y aún tenía planes de dar la vuelta por la CDMX. Yo no tenía más que unos 200 pesos en la cuenta, pero sin pensarlo dos veces, acepté dar un curso en la capital dos días antes. Era mi última oportunidad de verla de nuevo en mucho tiempo. La vi el domingo junto con uno de sus amigos, que me cayó muy bien y terminó siendo mi compañero de cuarto en otro viaje del que regresé hace unos días y del que escribiré en otra entrada (espero). La tarde se pasó muy rápido para mi. No pude decirle todo lo que me hubiera gustado... Sin embargo, mientras regresaba, solo y suspirando en el metro me decidí a despedirme y declararme en el aeropuerto con en las películas. Y así fue. Después de hacer cálculos y revisar el mapa de la ciudad, ahí estaba yo a las 5:00 am en metro Universidad, en el primer tren del día. Casi una hora y media después me encontraba corriendo en la Av. FAM hacia la terminal 2. Por la hora ya había dado por perdido mi cometido pero no me detuve hasta llegar. Para mi sorpresa, ¡aún seguía ahí!, estaba dormida en las bancas. Tome algunos minutos para recobrar el aliento, ordenar mi mente y esperar a que despertara. Cuando lo hizo, me acerque a saludarla. Me hizo la pregunta que estaba esperando, "¿qué hace aquí?". Todo el discurso que tenía para responderla se me borró por completo. Supongo que notó mi sonrisa estúpida, parado sin palabras por 10 segundos, y agregó sonriendo "vino a despedirse, ¿verdad? Vamos a sentarnos, aún tengo tiempo". Unos 20 minutos después la acompañe a la entrada de la sala de abordar. Tan pronto la vi cruzar la puerta hacia la aduana sentí un extraño nudo en la garganta. Sentía como si la mujer que siempre había buscado se iba de mi vida, En ese momento le escribí un mensaje dónde le contaba discretamente lo que sentía. Hasta ahora sigo preguntándome si leyó, pues hubo un problema con su vuelo y ese mensaje pudo haberlo pasado por alto en medio del apuro. Sólo he llorado 3 veces en un aeropuerto. Ver partir a alguien que me hizo sentir algo en tan poco tiempo fue motivo de esa tercera.

miércoles, 20 de julio de 2016

Concepto de frecuecia en tiempo discreto

Este es un tema que si no se entiende bien al principio de un curso de procesamiento digital de señales puede acarrear muchos problemas al ir avanzando en temas más complicados. En esta entrada trataré de explicar lo más claro posible lo que es la frecuencia de una señal discreta. Primero, comencemos describiendo a una función cosenoidal en tiempo continuo con la notación del Proakis [1]:
El subindice a se utiliza para denotar que x_a(t) es una señal analógica y no confundirla con su contraparte discreta x[n]. Ahora, tomemos esta misma señal discreta y multipliquémosla por tren de pulsos unitarios con un periodo de muestreo Ts (proceso conocido como muestreo).  Gráficamente, el resulto obtenido es el siguiente:



























Tenemos ahora una nueva función que depende de una variable entera n multiplicada por el periodo de muestreo Ts. Es este escalamiento por Ts lo que permite que la señal discreta x[n] coincida en el tiempo con la señal x_a(t). x[n] es una nueva señal que está definida en función de una secuencia de números enteros que representan una posición en un arreglo de datos (estas posiciones pueden tomar valores negativos si se toman con respecto a un origen arbitrario en el arreglo):
Como consecuencia del teorema de muestreo de Nyquist-Shannon, sólo es posible obtener información sobre una señal o componente a una frecuencia dada sin riesgo de ambigüedades (conflictos con sus alias) mientras su frecuencia sea menor o igual a la mitad de la frecuencia de muestreo (que es simplemente el inverso de su periodo de muestreo Fs = 1/Ts). Por lo tanto, la frecuencia relativa (también llamada frecuencia normalizada) esta limitada al intervalo:
Si se grafica un ejemplo numérico, resulta bastante intuitivo visualizar que cuando un coseno discreto tiene una frecuencia relativa de pi radianes por muestra se alcanza el periodo mínimo distinguible para una función periódica discreta. Los sinusoides en tiempo discreto muestran periodicidad en frecuencia. Esto significa que los sinusoides discretos que guarden una diferencia en frecuencia de 2*pi son idénticos. Esto puede verse más claramente en esta animación que hice en Matlab:
Naturalmente, lo que nos interesan son los parámetros físicos a los que las señales en tiempo discreto hacen referencia. El periodo de muestreo Ts es el puente clave para darle significado en tiempo continuo a estas señales. Resumiendo las transformaciones de frecuencia:
 Referencias:
Sec. 1.3 "Concepto de frecuencia en señales continuas y discretas en el tiempo",  "Tratamiento Digital de Señales", John G. Proakis
Teorema del Muestreo, L. Javier Morales Mendoza, UGto