30 agosto 2009

Graficar la respuesta a la frecuencia y los polos y ceros de un filtro FIR en MATLAB

En este ejemplo se grafican los filtros que vienen como ejemplo en el post anterior: ¿Qué es un filtro de respuesta finita? (FIR:Finite impulse Response). Un ejemplo.

Si tenemos un filtro como se muestra a continuación:

clip_image002[4]

Lo podemos graficar en MATLAB con el siguiente código:

RaizDeDos = 2^(1/2);
h = [1/RaizDeDos 1/RaizDeDos];
freqz(h,1);

La función freqz ejecutada de la manera anterior nos regresa una ventana con la siguiente información:

image

Como se puede observar nos regresa la magnitud y la fase del filtro, pero solo nos muestra hasta pi, para graficar la respuesta de 2pi, tenemos que hacerlo de la siguiente manera:

RaizDeDos = 2^(1/2);
h = [1/RaizDeDos 1/RaizDeDos];
freqz(h,1,'whole');

Si, es de la misma manera, simplemente  se le agrega ‘whole’ a la función freqz. Para mas información simple y sencillamente teclear doc freqz para acceder a la documentación de MATLAB. La respuesta a la frecuencia queda como a continuación:

image

Para graficar los polos y ceros del filtro, el código en MATLAB es de la siguiente manera:

RaizDeDos = 2^(1/2);
h = [1/RaizDeDos 1/RaizDeDos];
z = roots(h);
zplane(z',1);

Como se observa, primero se tienen que calcular las raíces de h, ya que tenemos que clip_image002[6]

y

clip_image002[8]

Así que para calcular los ceros tenemos que calcular las raíces de z en h, por eso la línea z=roots(h); y como nos regresa un vector columna, ponemos la transpuesta en la función zplane. La gráfica quedaría como se muestra a continuación:

image

Si, es simple como eso, pero para poder llegar a eso tuve que pelearme un buen rato con MATLAB, por eso es que aquí lo pongo, jeje.

 

Technorati Tags: ,,,,

24 agosto 2009

¡Santas pandemias Bacman!

Poster 

Hay cosas que no se pueden definir con la rigurosidad científica que en más de un par de ocasiones embarga este espacio, como por ejemplo el explicar invasiones de seres putrefactos y hambrientos y es por eso que los expertos en la materia se encargan de ello, este es un buen ejemplo.

Infestación es la obra de un grupo de comiqueros en el borderland juarezpaseño y áreas circunvecinas. Ya tienen un buen rato haciendo monitos por estos lados y a primera vista se aprecia el resultado de su excelente jale. Es un orgullo ver el nacimiento de este pequeño insecto y esperemos que pronto se pueda ver infectando por doquier.

Bueno no me podía quedar así y pues ahí les van unos cuantos datos cuantizados de esta obra:

 

- 370 páginas

- 16 historias

- 2 países

- 3 escritores

- 8 dibujantes

- 6+ Artistas invitados

- 1era edición

- 07/2009

- ISBN: 978-0-578-03442-3

- Portada a Colores

- Resto a escala de grises

 

Loguito

 

Para más información pues, dense una vuelta por el blog oficial de los seis cinco seis.

 

10 agosto 2009

¿Qué es un filtro de respuesta finita? (FIR:Finite Impulse Response): Un ejemplo.

Este post trata sobre un ejemplo tomado del Libro: Digital Signal Processing Using MATLAB and Wavelets, de Michael Weeks, Capítulo 3.
Básicamente, existen principalmente tres tipos de filtros: pasabajas que dejan pasar solamente bajas frecuencias; pasaaltas que dejan pasar altas frecuencias y pasabanda que permiten el paso de todo el espectro, no es menester de este ejemplo el explicar en teoría que es un filtro (eso tomaría demasiado) ni tratar el diseño de los mismos (eso tomaría aún más).
El nombre FIR viene de la manera en que el filtro afecta una señal. Una función impulso es una entrada bastante interesante, donde la señal es 0 siempre, excepto en un lugar donde tiene valor de 1 (una unidad). Se llama también delta Dirac en tiempo continuo y delta Kronecker en discreto (shhh!). La respuesta de un filtro FIR a esta entrada es de duración finita, y por lo consiguiente se le da este nombre.
Suponiendo que la Figura 1 tiene una entrada x[n] = [1,0]. La salida sería [0.5,0.5], y cero después de eso. Se pueden obtener estas salidas aplicándolas en orden a la estructura del filtro. En el tiempo 0, x[0] aparece en la entrada, y cualquier cosa antes de esto es cero, que es lo que el elemento delay producirá como salida. En el siguiente intervalo de tiempo x[0] será la salida del delay mientras que x[1] será la entrada actual.

EjemploFIRDiagrama Figura 1: Filtro FIR con coeficientes {0.5,0.5}

¿Cómo se expresa y[n] en forma de ecuación? Como se observa de calcular y[0] y y[1], se tiene exactamente el mismo patrón:
y[0] = 0.5x[0] + 0.5x[-1]
y[1] = 0.5x[1] + 0.5x[0]
esto se generaliza como:
y[n] = 0.5x[n] + 0.5x[n-1]
La Figura 2 muestra la forma general de un filtro FIR, para K+1 coeficientes (son K+1, porque se empieza en 0 y se cuenta hasta K). El número de coeficientes también es llamado taps. Por convención el número de taps es igual al número de coeficientes. Así que un filtro con coeficientes {b0, b1, …, bK} tiene K+1 taps, debido a que tiene K+1 coeficientes. De todas maneras se dice que el orden es K. En otras palabras el orden del filtro y los taps expresan lo mismo pero con diferencia de 1.

Forma general de un Filtro FIR Figura 2: Forma generalizada de un Filtro FIR
Con la estructura de la Figura 2 es posible determinar la salida. También es posible determinar la ecuación de la salida, la cual es:
y[n] = b[0]x[n-0] + b[1]x[n-1] + b[2]x[n-2] + … + b[K]x[n-K]
Nótese que para cualquier índice que se usa para b[.] es usado en x[n-.]. Esto significa que podemos representar todo lo que se encuentra al lado derecho de la ecuación como una sumatoria:
FIRgeneralizationFormula
¡Hey!, eso parece como una convolución, ¿no es así?
Un filtro pasabajas, puede llamarse también filtro promediador, mientras que un pasaaltas, puede ser llamado filtro diferenciador, debido a que estos términos describen el funcionamiento de los filtros.
Por ejemplo, un filtro FIR con dos coeficientes de 0.5 y 0.5, se observa que la salida es:
y[n] = 0.5x[n] + 0.5x[n-1], o equivalentemente y[n]=(x[n]+x[n-1])/2
dicha salida, encuentra el promedio entre la entrada actual y la anterior. Si se observa la respuesta a la frecuencia de dicho filtro, se observa que las partes de bajas frecuencias (cambian lentamente) aparecen en la salida, mientras que el filtro decrementa las partes de altas frecuencias (cambian rápidamente).
Para el filtro de diferencias, se pueden tener coeficientes de {0.5 , –0.5} donde:
y[n]=(x[n]-x[n-1])/2
Esto da el cambio entre las dos muestras, escalado por 1/2 para ser consistente con el filtro de promedios. Como es de esperarse, la respuesta a la frecuencia de dicho filtro, debe atenuar las partes de cambios lentos en la señal, y enfatizar la parte que cambia rápidamente, concluyendo que es un filtro pasaaltas.

WTF

The pseudomathematicalgeek Joke of the day...

- How do you say that! It’s not allowed here.

- Easy, easy, let me explain to you what it means.

- It better be true!

- Wavelet Transform

- And the F?

- Nah!, that is just for Fun…

05 agosto 2009

Ejemplo para leer una imagen PGM en Visual Basic 6.0

En el mundo de los programadores de software, Visual Basic no sirve para nada, je je, y para un par de cosas es cierto, pero para el resto, no. Déjenme explicarme un poco en esto. Visual Basic es un lenguaje desarrollado para hacer aplicaciones rápidas, en pocas palabras es un RAD (Rapid Application Development) como a los geeks de IBM los 80's les gusto llamarle.

Así que por ende, debe tener unas cosas por otras, es un lenguaje hasta cierto punto fácil de aprender y puedes desarrollar interfaces graficas de tres patadas, pero, pierdes un poco de control sobre la programación así que nada en cuestiones como programación orientada a objetos y apuntadores), conste no es solo esto, si no una lista que desconozco y tampoco necesito conocer. Otra de las desventajas es la lentitud para ejecutar los programas. Esta última es muy notable si lo comparamos con lenguajes un tanto más específicos para el procesamiento digital de imágenes, como por ejemplo MATLAB, o hasta LabVIEW.

Dejando de lado un poco el rollo, este ejemplo lo iniciaremos haciendo la interfaz gráfica de nuestro ejemplito, en una forma de Visual Basic, no iniciaré desde la creación del proyecto para no volver este post muy largo como el ejemplo de GUIDE. Primero ponemos un PictureBox y un CommandButton, el primero lo dejé con el nombre que le pone por default VB Picture1 y el segundo le puse cmdLoadPGM y le cambié el caption a “Cargar PGM”

GUI

La siguiente función es la que se encarga de leer el archivo PGM de la PC, y lo despliega en el Picturebox que le pasamos como parámetro:

Public Function LoadPGMtoPictureBox(strPGMpath As String, myPictureBox As PictureBox)

Dim bytes() As Byte
Dim pFileLenght As Long
Dim iWidth As Long
Dim iHeight As Long
Dim i As Long
Dim j As Long
Dim iCountZeros As Long
Dim iCounter As Long
Dim strCatchWidth As String
Dim strCatchHeight As String
Dim pFileLength As Long
Dim ptrToBytes As Long
Const PGM_MAGIC_NUMBER = "P5"
Dim u As Long
Dim u2 As Long

pFileLength = FileLen(strPGMpath)

ReDim bytes(1 To pFileLength)

Open strPGMpath For Binary Access Read As #10

Get #10, 1, bytes

Close #10

If Not Chr(bytes(1)) & Chr(bytes(2)) = PGM_MAGIC_NUMBER Then _

Exit Function

iCountZeros = 0
iCounter = 4
strCatchWidth = ""
strCatchHeight = ""

Do
strCatchWidth = strCatchWidth & Chr(bytes(iCounter))
iCounter = iCounter + 1
Loop While IsNumeric(Chr(bytes(iCounter)))

Do
strCatchHeight = strCatchHeight & Chr(bytes(iCounter))
iCounter = iCounter + 1
Loop While IsNumeric(Chr(bytes(iCounter)))


iWidth = CInt(strCatchWidth)
iHeight = CInt(strCatchHeight)

For i = 0 To iHeight - 1
For j = 0 To iWidth - 1
ptrToBytes = ((i) * iWidth) + j
u = bytes(ptrToBytes + &H10)
u2 = RGB(u, u, u)
SetPixelV myPictureBox.hdc, j, i, u2
Next j
Next i

myPictureBox.ScaleMode = 3
myPictureBox.Height = iHeight
myPictureBox.Width = iWidth

End Function






03 agosto 2009

Cuando suficiente nunca es suficiente

O como los gringos dirían, when enough is not enough, esta ocasión me he puesto a buscarle dos pies al gato sabiendo que solo tiene tres (si, adivinaron: es cojo).

Estoy a punto de empezar oficialmente a escribir mi tesis de maestría. Digo oficialmente porque el lunes inician clases en la UACJ, pero pues ya he iniciado a darle unos entres a esto de la tesis. No he escrito nada todavía en formato oficial, es más ni siquiera en formato no oficial. Pero, ya he leído un par de cosas al respecto, es más, ya hasta he pensado en más de una vez que hasta creo que sé lo que estoy haciendo.

En este blog he tratado de poner algo de las cosas que he ido aprendiendo en estos semestres que llevo de la escuela, y es reconfortante ver que tiene algo de tráfico el blog, el objetivo de este espacio es que pongo lo que voy viendo y lo que considero que vale la pena subir, y que además no lo enseñan en la escuela, al menos no de manera clara, (jeje) claro, aquí ni yo mismo me entiendo tampoco.

Eso no es todo, me puse a cambiarle la plantilla al blog y encontré esta que esta bastante bien, solo espero cambiarle el logo. Ya que nada más lo puse a lo loco para que no dijera lo que traía el theme por default.

¿Y por qué molestarse? Bueno, en realidad no es molestia, más bien es una manera de canalizar lo que esta en la sesera y no dejarlo que se amontone ahí, sin ningún oficio ni beneficio. Sé que la mayoría que visitan este sitio es gente que esta estudiando y busca con relación al procesamiento de imágenes, así que que mejor que poner un par de comentarios para así poder mejorar este sitio y poder agregar contenido (esta bien, también alimentar mi ego :P)

This is I

Blog dedicado a escribir sobre Sistemas Embebidos y el Internet de las Cosas o IoT que le llaman.