sábado, 20 de mayo de 2017

Experimentando con autómatas celulares

Encontré por accidente el libro The New Kind of Science de Stephen Wolfram mientras buscaba libros de estadística en la biblioteca de la FCFM de la BUAP. Después de leer los primeros capítulos no pude evitar probar en Python algunos autómatas celulares. Es increíble el como con reglas tan simples se puede generar tanta complejidad. Sólo observen, tomemos una una linea de n casillas de largo. Cada casilla puede contener un '1' o un '0'. Supongamos que inicialmente la linea contiene solo '0' exceptuando la casilla n/2 que inicializamos con '1'. Nuestro pequeño autómata se encargará de generar una nueva linea de n casillas debajo de la inicial rellenando las casillas de la nueva linea de acuerdo a una función booleana cuyas entradas son casillas de la linea anterior. El autómata tiene un tamaño de 3 casillas y va rellenado las casillas de la nueva linea moviéndose una casilla a la vez hasta terminar todo el array. Un ejemplo para un autómata sería:

 dónde las casillas blancas representan '0' y las negras '1'. Consideremos un autómata un poco más complicado definido por el siguiente conjunto de reglas:

 Podemos expresar la regla anterior como una función booleana de la siguiente forma:
la cual podemos reducir mediante factorización a la forma:
El código en Python para este autómata celular queda:

import numpy as np
import matplotlib.pyplot as plt

n = 500
iline = np.zeros(n)
iline[n/2] = 1;
lines= [iline]

def rule(A,B,C):
    X = A and not(C) or not(A) and C
    return X

for i in range(0,n):
    line = lines[i]
    nline = np.zeros(n)
    for j in range(0,n-2):
        if rule(line[j],line[j+1],line[j+2]) :
            nline[j+1] = 1
    lines.append(nline)
   
lines = np.array(lines)

plt.imshow(lines, cmap = 'gray')


Y el espectacular resultado graficado es:
La figura resultante es un fractal conocido como Triángulo de Sierpinski y el autómata que lo genera se conoce como Regla 90.

viernes, 14 de abril de 2017

Listas de interes

Hoy en el foro de soporte de Facebook confirmé mis sospechas: eliminaron las listas de interés desde noviembre del año pasado. Por suerte había guardado los enlaces a mis listas por lo que aún puedo verlas, pero ya no se tiene la opción de crear más. Ok, sé que no era de las opciones más populares y de no ser por las protestas en el foro seguiría creyendo que era el único que las utilizaba, pero eran una herramienta muy útil para organizar los likes y también para evitar cerrarse en nuestras burbujas de gustos (gracias al machine learning que le da prioridad de aparición a lo que más se ajusta a nuestros gustos). Una de mis listas más útiles recopila más de 80 fanpages de centros culturales en la ciudad de Puebla (si no la borran en el futuro, pueden verla aquí). Mi lista favorita, y arma secreta para cazar convocatorias de escuelas de verano, estancias de investigación, etc, tiene más de 100 fanpages de centros de investigación, universidades y programas de vinculación en México y unos cuantos en el extranjero. Si no la eliminan, lo que espero jamás pase, pueden seguirla aquí. Es una lastima que hayan quitado una de la herramientas que más me han servido para vivir el arte y la ciencia en el mundo real.

viernes, 24 de marzo de 2017

Spoon - Kill The Moonlight (2002)


Este es sin dudas un disco que podría recomendarle a cualquier persona con un sello de garantia y, considerando mis gustos, esto no es algo que podría decir de cualquier otro. Llevo ya algunas semanas escuchándolo. Me parece que tiene un sonido muy accesible y al mismo tiempo una calidad que bien podría ponerse a un lado de un Yankee Hotel Foxtrot o un The Moon & Antartica. Me costó bastante encontrarlo pero la ardua búsqueda entre enlaces muertos valió mucho la pena. Era justo ponerlo al alcance de todos por aquí.

sábado, 18 de marzo de 2017

Monterrey Vol. 2

Monterrey me pareció mucho más bonito en esta segunda visita. Sospecho que en aquella primera ocasión había un bias emocional que me hacía ver todo triste y polvoriento. Esta vez también fue más cómodo al tener apoyo de hospedaje en el hotel que está a dos estaciones de metro de la UANL. Vine, como en la primera vez, a presentar un trabajo al TASP. Mi poster de esto año trató sobre los resultados de las pruebas de la montura para mi radiotelescopio. Aunque casi no estuve en mi poster a la hora de las presentaciones, discutí mi trabajo con bastantes personas en los pasillos y en las comidas. Tuve muy buenos comentarios y salieron varias ofertas de trabajo. Esto fue algo muy reconfortante después de las interminables asoleadas y vueltas al taller para el maquinado de las piezas. Aprendí bastante sobre el trabajo de investigación que se realiza en México en materia de clima espacial. Me enteré de proyectos como TLALOCNet y RICE. Me doy cuenta que hace falta mucha más vinculación de ingenieros en el área de instrumentación geofísica pues parece estar creciendo rápido en el país. Pienso que sería buena idea ir comenzando a hacer divulgación aquí en la facultad de electrónica de la BUAP (antes de que me vaya). Como siempre, conocí a gente muy interesante, geofísicos y biólogos muy apasionados con su trabajo. Además de distraerme un rato (una semana entera), fue un viaje bien aprovechado.

domingo, 12 de marzo de 2017

Convertir coordenadas ecuatoriales a altazimutales (horizontales) con astropy

Algunos meses después de entender la geometría y hacer un programa para convertir entre estas coordenadas descubrí que las conversiones podían hacerse con el módulo de astropy. No fue tiempo perdido pues entendí bastante bien el proceso. Para una conversión de muy buena precisión recomendaría usar astropy aunque sus funciones tienen el inconveniente de ser relativamente lentas (promedian una ejecución de 3 ms).

# -*- coding: utf-8 -*-
"""
Created on Sun Mar 12 20:28:24 2017

@author: rodolfo
"""
from datetime import datetime
import astropy.units as u
from astropy.time import Time
from astropy.coordinates import SkyCoord, EarthLocation, AltAz, Angle

#Locación
Puebla = EarthLocation(lat=Angle('19d02m36s'), 
                       lon=Angle('-98d21m6.94s'), 
                       height=2152*u.m)
#Fecha y hora
utc_time = Time(datetimeutcnow(), scale='utc')
time = utc_time 

#Ecuatoriales
Sirio = SkyCoord(Angle('101d17m18.7469s'), 
                 Angle('-16d42m47.3141s'), 
                 frame='icrs')
#Horizontales
Sirio = Sirio.transform_to(AltAz(obstime=time,location=Puebla))

print "Altura: ", Sirio.alt.degree
print "Azimut; ", Sirio.az.degree

jueves, 26 de enero de 2017

Días comunes

A principios de diciembre compré en la librería universitaria, en su semana remate, un libro de la editorial Tusquets (la de cuadritos) que tomé al azar. "Lo que queda por vivir" de John Updike (en $30, por cierto). Me está gustando bastante. Es un libro de cuentos con un estilo que me recuerda a Chejov, una narrativa donde no ocurre nada extraordinario y sin embargo es difícil detener su lectura. Estas últimas noches he leído a ambos escritores en paralelo y me ha parecido curioso que de todos estos relatos de lo "ordinario" me haya llegado una revelación tan obvia y al mismo tiempo tan extraordinaria: cada uno de nosotros está viviendo su propia historia, y es un historia sin pausas. Creemos saberlo, creemos que es obvio pero si lo piensan con cuidado, realmente no lo habíamos entendido. Tenemos la idea de que lo que llamamos "nuestra historia" es únicamente un conjunto de "milestones" (logros académicos, un nacimiento, un accidente...) y un conjunto de "snapshots" (viajes memorables, borracheras con buenos amigos, un noviazgo que nos marcó, una despedida en una estación/aeropuerto...). Estos elementos son verdaderamente claves en nuestra vida, pero pienso que el hecho de reducir el continuo de nuestra existencia en ellos nos da la falsa sensación de que todo lo ocurrido entre esas memorias es mero espacio vacío. No solemos darnos cuenta de que el más ordinario de nuestros días es también digno de un relato. Deberíamos empezar a ver esa normalidad también como un género literario de la vida, porque así, con todo y su brevedad, nos daríamos cuenta de que tiene más páginas de las que pensábamos.

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