Apuntando a una función en Matlab (Punteros)

Matlab Tips and Tricks.

Esta es una sección donde se explicaran algunos conceptos sobre programación que me han sido útiles para aplicar algoritmos en Matlab. Muchos de estos pequeños tutoriales pueden ser aplicados a diversos lenguajes de programación, donde cada uno maneja un concepto es similar, sin embargo otros serán exclusivos de la forma en la que trabaja Matlab, sobre todo aquellos orientados a la indexación y manejo de matrices.

La intensión de esta información no es proporcionar un estudio o definición formal de estos conceptos, y puede que los nombres aquí asignados varíen con los oficiales en la documentación. En todo tiempo trataré de proporcionar un link directo a documentación oficial que los respalde.

Apuntando a una función (Punteros).

Para quienes tienen conocimiento de lenguaje C, o similares, la palabra puntero no es nueva en su vocabulario. Los punteros son referencias a espacios en memoria, que pueden ser variables o funciones, o cualquier espacio de memoria donde la interpretación de contenido tiene que hacerse explícitamente. Para este tipo de lenguajes el uso de punteros es algo común, usualmente se utiliza para pasar variables a las funciones en forma de referencia, veremos un poco más a detalle sobre qué significa esto en un momento.

In computer science, a pointer is a programming language object, whose value refers to (or “points to”) another value stored elsewhere in the computer memory using its memory address.
Wikipedia: Pointer (computer programming)

En Matlab no existe tal concepto de punteros para pasar variables por referencia, al menos no de la forma clásica. Existe una forma de realizar esto mediante una transformación de tipo de variable C-like que puede encontrarse en este link, o también en la definición de objetos que heredan el comportamiento de Handle, un tema que trataremos en otra ocasión.

Sin embargo existe una forma útil de hacer referencia a un espacio de memoria, que permite pasar funciones como referencia a otras funciones. Para tener en claro el concepto haremos uso de un ejemplo práctico. Suponemos que tenemos que realizar una función grafique cualquier función trigonométrica en un rango de 0 a 2Pi. Llamaremos a esta función graficaTrig y tomara un solo argumento func el cual indica la función trigonométrica que quiere ser graficada.

Podríamos resolver este requerimiento de múltiples formas, en este caso vamos a analizar dos de ellas. Si definimos que el argumento será una cadena (String) con el nombre de la función (Coseno, Seno, etc), entonces la función tendrá que comparar entre un conjunto de fórmulas conocidas.

function graficaTrig(func)
 x = [0:0.01:2*pi]
 if func == 'Coseno'
  plot(x,cos(x))
 end
 if func == 'Seno'
  plot(x,sin(x))
 end
 … %others
end 

Para este caso tenemos que tener conocimiento de todas las posibles Funciones Trigonométricas de antemano, y comparar la cadena con el nombre de cada una, y aplicar la función de Matlab que corresponde a tal función.

La segunda opción que analizaremos, y el propósito de este escrito, es hacer uso de un manejador (handle) de la función trigonométrica, para pasarlo como argumento de la función y evaluarlo directamente. Para esto haremos uso del operador @, que además de otorgarnos un puntero una función puede ser utilizado para definir funciones anónimas (tema que quizá veremos en el futuro). El siguiente código ejemplifica el su forma de uso:

cos(0)
newCos = @cos
newCos(0)

Como se puede observar la función cos devuelve el valor del coseno del número que pasamos como argumento, podemos apuntar a esta función utilizando @ y almacenando dicho puntero a una nueva variable, la cual funcionara como si fuera la misma función. Haciendo uso de este método podemos resolver nuestro problema ejemplo de forma sencilla.

function graficaTrig(func)
 x = [0:0.01:2*pi]
 plot(x,func(x))
end

Donde para obtener la gráfica de la función coseno utilizamos: graficaTrig(@cos). En este caso la función cos es pasada como argumento, tomando un nuevo nombre de variable (func). Por lo que para hacer uso de dicha función solo se manda a llamar de la forma func(x).

En Matlab para ejecutar una función no es necesario hacer uso de los paréntesis (a diferencia de la mayoría de lenguajes) por lo que rand y rand() producen el mismo resultado. Sin embargo en lenguajes como Javascript o Python, hacer uso del nombre de la función sin paréntesis devuelve el handle (dirección de memoria) de dicha función.

En el área de algoritmos metaheurísticos es común que estos algoritmos sean probados en un conjunto de funciones llamadas funciones de prueba (benchmark). Estas funciones contienen ecuaciones matemáticas multidimensionales sobre las cuales se pretende buscar los valores máximos o mínimos. A diferencia de nuestro ejemplo práctico sencillo, no se conocen de antemano todas las posibles funciones que podríamos requerir o utilizar, ya que nuevas funciones pueden irse agregando a nuestro conjunto.

Para el autodenominado toolbox expuesto en Una Clase Para Gobernarlos A Todos, se explica que hacer uso de una clase general sobre la cual desarrollar los múltiples algoritmos metaheurísticos tiene sus ventajas. Y para ello en la clase tenemos una propiedad que contiene la función de costo (función de prueba (fitnessFunction)) que pretende optimizarse. Para ello hacemos uso de un puntero a alguna de estas funciones, y en la parte de la evaluación de la población simplemente utilizamos dicha propiedad de la siguiente forma:

fit(i) = obj.fitnessFunction(population(i,:));

De esta manera podemos hacer pruebas de distintas funciones de manera sencilla. Del repositorio en GitHub se puede observar el script de prueba que hace uso del toolbox.

clear, clc
AISearch = DE(@Rastrigin,30);
AISearch.sizePopulation = 500;
AISearch.maxNoIterations = 1000;
AISearch.start()

La explicación formal de este concepto puede encontrarse en: https://www.mathworks.com/help/matlab/matlab_prog/creating-a-function-handle.html
Si tienes algún problema haciendo uso de punteros a funciones o requieres alguna explicación adicional no dudes en comentar en la sección de abajo. Te responderemos a la brevedad.

Apuntando a una función en Matlab (Punteros)

Canales Inalámbricos: Teoría y Simulación (Parte 1)

Las comunicaciones inalámbricas se llevan a cabo mediante la transformación de señales (información) que requieren ser transmitidas de forma que puedan ser llevadas a travéz de un medio físico hasta el receptor, quien puede transformarlas de nuevo y conseguir el contenido de dicha comunicación.

Actualmente existe un gran interés por desarrollar formas novedosas de comunicación inalámbrica que permitan mejorar las prestaciones actuales que han sido logradas por estos medios, ademas de dar abasto a un constante incremento en la demanda de dispositivos con múltiples capacidades de comunicación inalámbricas.

Toda comunicación es llevada por un medio físico, y esté tipo de comunicación sin cables no es la excepción. El medio por el cual se propaga la señal es el espacio, a diferencia del sonido que se propaga con el aire, por lo que la señal viaja a la velocidad de la luz (3e8). Este tipo de señales se llaman señales electromagnéticas, y son una composición compleja que se trasmiten en forma de ondas a una cierta frecuencia de transmisión. Todas estas frecuencias están contenidas en el espectro de frecuencias radio eléctrico, el cual es un recurso finito aunque inagotable.

Conocer las propiedades físicas del medio y los efectos que esté causa a la señal propagada, es de vital importancia para hacer un mejor uso del mismo. De esta forma se puede mejorar las características de las transmisión, obteniendo mayores velocidades de datos, una menor probabilidad de error y dar servicio a mas dispositivos simultáneamente.

Los modelos matemáticos son representaciones en forma de ecuaciones que permiten abstraer el comportamiento de un proceso físico, o de cualquier naturaleza. Estos modelos, si bien limitados a ambientes controlados, permiten construir simulaciones computacionales que permiten a su vez un sistema de experimentación rápida y accesible para el desarrollo de nuevas tecnologías.

Con esto en mente presentamos esta serie de entradas pretende ser una introducción al tema, de forma que se den a conocer las características físicas que intervienen en el proceso de comunicación por un medio inalaámbrico, y simular dichos comportamientos y sistemas, para experimentación.

Modelo Físico de los Canales Inalámbricos

Un aspecto característico de los canales inalámbricos móviles es la variación de la fuerza de la señal sobre el tiempo y sobre la frecuencia. Esta variación puede es categorizada en dos tipos:

  • Desvanecimiento a gran escala. (lento)
    Debido a perdidas por el recorrido de la señal, estas pérdidas están en función de la distancia y el sombreo por objetos grandes. Este desvanecimiento cambia con forme el movimiento del receptor y es usualmente independiente de la frecuencia.
  • Desvanecimiento a pequeña escala. (rápido)
    Debido a las interferencias constructivas o destructivas de los múltiples recorridos que ocurren de la señal entre el transmisor y el receptor. Este desvanecimiento permanece en constante cambio, aun cuando el receptor se encuentre estacionario, y es usualmente dependiente de la frecuencia.

Los canales inalámbricos operan mediante la radiación de ondas electromagnéticas desde el transmisor hasta el receptor. La porción de espectro utilizado en la comunicación celular es legislada por entidades establecidas en cada estado, usualmente se utiliza las bandas cerca de 0.9Ghz, 1.9GHz, y 5.8GHz.

La longitud de onda de estas frecuencias está dentro del rango de fracción de un metro, lo que complica resolver las ecuaciones de campo electromagnético (Maxwell), por lo que modelos más sencillos que capturen características esenciales de su comportamiento son importantes. Por ejemplo algunos aspectos importantes para planeación de celdas y de los sistemas de trasmisión y modulación de la señal, es conocer los efectos físicos que afectan la señal y como la afectan.

Comencemos con algunos ejemplos sobre-simplificados. Si consideramos que el transmisor y el receptor se encuentran en un espacio abierto, entonces en respuesta de una señal sinusoidal el campo eléctrico a una cierta distancia para un tiempo \( t \) es:

$$ E(f,t,u)= \frac{\alpha_s(u) cos(2 \pi f (t-r / c))}{r} $$

En donde u es el vector de posición relativa al trasmisor en donde se mide la energía del campo electromagnético, \( \alpha_s(u) \) es la ganancia de la antena que depende de la dirección, si consideramos una antena ideal omnidireccional, podemos omitir esta ganancia. La variable \( r \) representa la distancia entre el transmisor y el punto \(u\), y finalmente \(cos(2 \pi f (t-r / c)) \) representa la señal que está siendo transmitida. Es importante notar que la fase de la señal varía en proporción \( f r / c \) donde \(c\) es la velocidad de la luz, que es la velocidad a la que viaja la señal, esta propiedad será importante cuando consideremos el desvanecimiento a pequeña escala.

Para este modelo sencillo puede observarse que la energía de la señal transmitida decrece con forme la distancia, por lo que la potencia por metro cuadrado en el espacio libre decrece de forma cuadrática \(r^{-2}\).

Si consideramos este modelo de transmisión entonces podemos calcular de manera sencilla la relación señal-ruido (SNR) de un canal de comunicación inalámbrico.

$$SNR=P_{señal}/P_{ruido}$$

Esta relación entre la potencia percibida de la señal dividida entre la potencia del ruido de fondo (ruido piso), que usualmente es conocida o medible, permite que podamos calcular la capacidad máxima teórica de transmisión de datos. Para esto hacemos uso de la función de capacidad propuesta por Shannon en su trabajo de la Teoría de la Comunicación.

$$Capacidad=AnchoDeBanda \cdot log_2⁡(1+SNR)$$

Si sustituimos el modelo de canal en espacio libre en la formula entonces obtenemos la siguiente expresión matemática.

$$Capacidad=AnchoDeBanda \cdot log_2⁡(1+(P_{transmitida} r^{-2})/P_{ruido} )$$

Este modelo es muy limitado, ya que toma demasiadas consideraciones que no son posibles en de implementar en la realidad, aunque puede ser considerado para transmisiones cortas en espacios interiores. Sin embargo de esté podemos expresar de forma matemática algo que puede ser fácilmente observable mediante experimentación, que la potencia de la señal decrece con forme te alejas de la fuente. Por esta razón se le llama desvanecimiento a gran escala, ya que afecta significativamente la fuerza de la señal, y varia con forme la distancia, por lo que usualmente representa variaciones relativamente lentas en la potencia, si consideramos las altas frecuencias de trasmisión.

Simulación en Matlab

Dado este sencillo modelo de un canal inalámbrico podemos hacer uso de estas ecuaciones para generar gráficas de comportamiento. Para ello damos valores numéricos a las variables que intervienen, y dando un rango de valores a aquellas variables sobre las cuales queremos observar el comportamiento del sistema.

Una implementación de este modelo en Matlab puede ejecutarse con el siguiente codigo:

f = 0.9e6;
c = 3e8;
waveL = c/f;
T = 1/f;
r = 50:waveL;
recordAt50 = [];
for t = 0:T/100:T*3
    E = cos(2*pi*f*(t-r/c))./r.^2;
    recordAt50(end+1) = cos(2*pi*f*(t-50/c))./50.^2;
    figure(1)
    plot(r,E)
    ylim([-0.0004 0.0004])
    figure(2)
    plot(recordAt50)
    pause(0.01)
end

De este script se obtienen dos gráficas, la primera muestra la señal percibida de acuerdo a la distancia, en cada instante de tiempo. De esta gráfica se puede observar el como la señal transmitida, para cada instante de tiempo, se encuentra desfasada dependiendo de la distancia por la que viaja de forma \( f r / c \) y disminuye rápidamente. Cuando la distancia es igual a la longitud de onda \( c / f \) la señal se encuentra en fase con la señal emitida en el transmisor. El conocimiento de la fase con referencia a la emitida permite luego considerar la interferencia generada por múltiples caminos, un tema que desarrollaremos mas adelante. La segunda gráfica representa la señal recibida por un receptor a una distancia fija de 50m. Esta señal es una versión disminuida y desfasada de la original emitida en el transmisor.

Señal percibida por el receptor, donde el eje X representa la distancia recorrida de la señal, y Y la energía percibida.

wave50m

Señal recibida por el receptor a una distancia de 50m, se puede observar el desface al principio de la señal.

Teniendo conocimiento del desvanecimiento de la energia con forme a la distancia recorrida por la señal, podemos hacer el calculo del SNR y la capacidad del canal. Consideremos una potencia de 1 watt, y la capacidad en bits por símbolo transmitido, y una densidad de ruido espectral de 1e-8. Para ello podemos utilizar el siguiente codigo:

%1 watt * path loss / noise
SNR = 1 * r.^-2 / 1e-8; 
capacity = log2(1+SNR);
figure(3)
plot(r, capacity)

capacitywave

Capacidad del canal para transmitir en bits por símbolo. Sin considerar el Ancho de Banda. Eje X representa la distancia y Y la capacidad.

El ancho de banda de un canal digital determina la velocidad de symbolos por segundo que pueden ser transmitidos, ya que determina la frecuencia de la modulación de la señal. Más adelante estudiaremos que según la modulación utilizada podemos transmitir múltiples bits en cada símbolo, y cada una conlleva a una probabilidad de error por bit propia. Aunque aumentar el ancho de banda de una comunicación incrementa la velocidad, también incrementa el ruido del canal, entre otros factores, por lo que en cierto punto, incluso grandes aumentos de ancho de banda logran muy poco incremento la capacidad del canal. El siguiente código gráfica las lineas de este comportamiento a distintas distancias, considerando el modelo de canal inalámbrico expuesto antes.

bandwitdh = 1e3:5e3:1e6;
for i = 50:50:200
    SNR = 1 * (i)^-2 ./ (1e-8 * bandwitdh); %1 watt * path loss / noise
    capacity = bandwitdh .* log2(1+SNR);
    figure(4)
    plot(bandwitdh, capacity)
    hold on
end

bandwidth

Lineas de comportamiento en capacidad del canal (Mbps) con forme aumenta el ancho de banda (Hz)

Resumen:

Los canales inalámbricos propagan una señal electromagnética a través del espacio. Esta señal sufre un desface y un desvanecimiento con forme a la distancia del recorrido de la señal, desde el transmisor hasta el receptor. Conociendo el desvanecimiento de la energía, podemos hacer el calculo de la relación señal-ruido del canal, y obtener la capacidad de transmisión máxima teórica del canal, que se ve afectada por el cuadrado de la distancia. Ademas conocemos que el ancho de banda incrementa el numero de símbolos transmitidos en un segundo, pero también el ruido involucrado en el canal, por lo que aumentarlo solo es conveniente hasta cierto punto.

El modelo de canal de espacio abierto es muy simple y no considera muchos otros efectos físicos que ocurren a la señal transmitida. Otros modelos con mayores consideraciones serán presentados a la brevedad posible, en las siguientes partes de estas entradas.

Canales Inalámbricos: Teoría y Simulación (Parte 1)