Buscar en este blog....

Mostrando entradas con la etiqueta Electronica. Mostrar todas las entradas
Mostrando entradas con la etiqueta Electronica. Mostrar todas las entradas

viernes, 7 de enero de 2011

¿Convolución? ¡Pero si es muy fácil! (Parte 3/3)

Buenas. Hoy voy a terminar con la última parte que había comentado sobre el tema de convolución. Básicamente voy a presentar un pequeño código que hice en C, y que muestra dos formas de realizar la convolución. En la primera de ellas, llamada (Input Side Algorithm) y denominada como input_side_conv() en el código, se puede observar que se obtiene la convolución de una forma muy simple: se recorren todos los puntos de la señal x[n] y h[n], y en base a esto se calcula el y[n] correspondiente.

La segunda función, llamada output_side_conv(), obtiene la convolución con el Output Side Algorithm, la cual varía de la anterior en un punto muy importante. Antes de ver cual es la diferencia importante, veamos el código, ya que es muy simple de entender:


#include <stdio.h>
#include <stdlib.h>

#define PUNTOS_X (6)
#define PUNTOS_H (4)
#define PUNTOS_Y ((PUNTOS_X) + (PUNTOS_H) - 1)

/* Los metodos tienen la misma interfaz:
x, h ---> son las señales de entrada
y ---> es la señal de salida */
void input_side_conv(int *x, int *h, int *y)
{
int i,j;
for(i=0;i<PUNTOS_X; i++)
for(j=0;j<PUNTOS_H;j++)
y[i+j]=y[i+j]+x[i]*h[j];
}

void output_side_conv(int *x, int *h, int *y)
{
int i,j;

for(i=0;i<PUNTOS_Y; i++) {
y[i]=0;
for(j=0;j<PUNTOS_H;j++) {
if(i-j<0 || i-j>=PUNTOS_X) continue;
y[i] = y[i]+h[j]*x[i-j];
}
}
}

int main()
{
int x[PUNTOS_X] = {0,-1,-1,2,1,1};
int h[PUNTOS_H] = {1,0,-1,1};
int y1[PUNTOS_Y] = {0,0,0,0,0,0,0,0,0};
int y2[PUNTOS_Y] = {0,0,0,0,0,0,0,0,0};

int i;

//calculamos la convolucion por el primer metodo
input_side_conv(x, h, y1);
//calculamos la convolucion por el otro metodo
output_side_conv(x, h, y2);

//mostramos las dos respuestas
printf("Input Side Output Side\n");
for(i=0;i<PUNTOS_Y;i++)
printf("[%2d] [%d]\n", y1[i], y2[i]);

return 0;
}


Vemos que he definido 3 constantes simbólicas con #define. Las mismas son PUNTOS_X, PUNTOS_H y PUNTOS_Y. Cada uno denota la cantidad de puntos que tiene cada señal involucrada. En el caso de PUNTOS_Y se puede obtener con la operación que puse, según la fórmula que expliqué en la primera parte de esta serie de artículos.

Luego siguen las definiciones de las funciones que calculan la convolución. Ambas dan el mismo resultado, pero cada una lo calcula de forma distinta.

Finalmente, tenemos un main() que lo unico que hace es fijar valores para x[n] y h[n] y luego realiza la convolución de las mismas en dos señales de salida, y1[n] e y2[n] y muestra en forma "de tabla" el resultado de ambas para simplificar la comparación y ver que dan el mismo resultado.

La diferencia importante de la que hablé recién, es la siguiente: si observamos con detalle cómo se calcula cada convolución, podemos notar que la segunda forma, output_side_conv() tiene una ventaja importante, y ésta es que permite calcular un valor específico de y[n] sin que sea necesario conocer todos los puntos de x[n], sino solo los necesarios. En cambio, en la otra función necestiamos conocer todos los puntos de x[n] de antemano, ya que los recorremos uno a uno, y en base a esto vamos calculando cada valor de y[n]. ¿Por qué esto es tan importante? Porque generalmente, no contamos con todos los puntos de x[n] ya que muchas veces se necesita obtener la convolución a medida que se va obteniendo la señal x[n], es decir, obtener y[n] en tiempo real.

Acá les dejo el código en C para que no tengan que copiarlo a mano: bajar código en C .

Bueno, con esto doy por finalizados los artículos de convolución, espero que les haya resultado interesante, divertido.. o al menos práctico!

sábado, 25 de diciembre de 2010

¿Convolución? ¡Pero si es muy fácil! (Parte 2/3)

Método "Semi-Gráfico" Simple de convolución.


Buenas! En mi post anterior, hablé un poco de lo que era la convolución, y medio que me obligué a mostrar en esta entrega un método para resolver convoluciones a mano. Le he llamado "semi-gráfico" porque no es gráfico, pero se me ocurrió a partir de las gráficas de las señalesa convolucionar, aquellas que llamábamos x[n] y h[n] . Mediante este método, obtendremos el y[n]. Pero demás está decir que las señales pueden ser cualquiera, asique de forma genérica las llamaremos a[n] y b[n].

Bueno, aqui dejo el video con la explicación del método. Espero que sea últil! ;)



Saludos!

Parte 3

miércoles, 8 de diciembre de 2010

¿Convolución? ¡Pero si es muy fácil! (Parte 1/3)

Bueno, les comento que para el título del post, saqué la idea de un libro muy viejo que tenía mi abuelo, el cual se titulaba: "¿La Radio? ¡Pero si es muy fácil!", y como me pareció muy simpático para un libro, me quedó grabado muchos años.. ahora lo adapté para usarlo en mi blog :)
Pasando al tema que me toca. La convolución es un tema al que cuesta agarrarle la mano en un principio, tanto en el concepto como el cálculo de la misma. Mientras aprendía este tema, se me ocurrió una forma muy simple de calcular convoluciones a mano, y por eso me decidí a realizar el post. Advierto que no soy un experto en el tema, pero comprendo muy bien el concepto, y voy a tratar de explicarlo de la forma más sencilla posible; además del método de resolución que mencioné y un programa en algún lenguaje que la resuelva, como para terminar esto bien bonito. En la imagen que no se ve, pueden hacer click para agrandarla.
¿Qué es la convolución?
Para comenzar, la convolución se trata de una operación matemática que combina dos señales para producir una tecer señal. En el campo de las señales digitales es muy importante, ya que permite obtener la señal de salida de un sistema a partir de la señal de entrada y la respuesta al impulso. Es decir, podemos predecir la salida, conociendo la entrada y la respuesta al impulso.

convolucion.JPG

Conceptos previos.

Bien, primero que nada, es necesario tener algunas cosas claras antes de explicar la convolución. Comencemos por describir qué es el impulso unitario o función delta (es lo mismo). No es nada más que una simple función matemática que vale 1 en n = 0 y vale 0 en cualquier otro punto. Es decir:

convolucion2.JPG

Podemos desplazar y escalar esta función delta, ¿cierto? Por ejemplo, si tenemos una señal s[n] que vale -3 en n = 5 y vale cero en cualquier otro punto, entonces expresarla como una función delta desplazada 5 muestras hacia la derecha, y escalada por un factor de -3. Es decir que s[n] = -3*delta[n-5]. Es decir, lo que tenemos es un impulso (es decir, es una señal que es el impulso unitario pero desplazado y escalado).

Una vez que comprendemos el efecto de desplazar y escalar la función delta, podemos descomponer cualquier señal en una sumatoria de impulsos (funciones delta desplazadas y escaladas). A la descoposición de una señal en una otras señales se le llama análisis de la señal. La idea de esto, es que si tomamos cada impulso y los sumamos, volveremos a obtener la señal original. A la composición de una señal a partir de la sumatoria de otras señales (en nuestro caso impulsos) se le llama síntesis.
Veamos un ejemplo simple de descomposición de una señal en una sumatoria de impulsos
Ahora, imaginemos que tenemos un sistema lineal cualquiera. Si en la entrada de dicho sistema ponemos una señal cuañquiera, el sistema, como es de esperarse, nos devovlerá una señal salida, la cual dependerá exclusivamente de qué haga el sistema internamente. O sea que distintos sistemas nos pueden dar distintas respuestas ante la misma entrada. En el caso particular de que la entrada sea el impulso unitario la salida del sistema se llamará respuesta al impulso o respuesta impulsiva y se denota como h[n].
convolucion4.JPG

Lo interesante de esto, es que si la entrada al sistema es un impulso unitario desplazado y escalado, entonces la salida será la respuesta al impulso, pero igualmente desplazada y escalada que que la entrada. Si además, recordamos que cualquier señal puede expesarse como una sumatoria de impulsos, podemos conocer la respuesta del sistema a cada uno de esos impulsos. Y si además, sumamos todas estas respuestas a cada impulso, entonces obtendremos la respuesta del sistema a la señal original.

Ahora si, ¿qué es la convolución?

¿Cuál es el beneficio de todo esto? Que podemos predecir la salida de cualquier sistema linear con solo conocer su respuesta al impulso unitario, es decir, el h[n].y no hay necesidad de introducir realmente una señal de entrada al sistema; sino que descomponemos esa señal en impulsos, evaluamos la respuesta del sistema para cada impulso (escalamos y desplazamos h[n] según cada impulso) y luego sumamos esas respuestas. ¡Todo este proceso, no es más que la convolución de h[n] y la señal de entrada! La convolucion se representa con una estrella. Es decir:

convolucion5.JPG

Matemáticamente, se escribe como:

convolucion6.JPG

donde M es la cantidad de muestras que tiene la respuesta al impulso h[n] y van desde 0 hasta M-1. La señal x[n] tiene N muestras (0 a N-1). La convolución de ambas señales, y[n], tendrá N+M-1 muestras (de 0 a N+M-2).

Bueno, espero que haya sido claro, sino pregunten o sugieran, y nunca está demás complementar con otras lecturas. Personalmente, recomiendo leer el capítulo 6 de un libro disponible en formato digital llamado "The Scientist and Engineer's Guide to Digital Signal Processing" escrito por Steven W. Smith, Ph.D. Enlace al libro. Está en inglés, ¡pero es excelente!

La proxima entrega describo el método de cálculo manual de la convolución. ¡Nos vemos!
Parte 2

jueves, 22 de noviembre de 2007

Implementación de una RED RS-485 utilizando placas PK2230

Este es un pequeño post que tira algunos conceptos básicos para armar una red RS485.

Antes de comenzar con la introducción al RS485, es necesario mencionar que las placas PK2230 que se utilizaron, poseen un procesador Z80 Más Info: www.zworld.com

El link al artículo es este: RED RS485