Blog Entry

Algoritmo mejorado para Filtro FIR decimador.

lunes, julio 18, 2005 by , under

Explicaré a continuación, la justificación matemática del algoritmo mejorado para un Filtro FIR decimador.

La idea detrás del filtro decimador la he tomado a partir de un ADC sigma/delta: Se toma un grupo de muestras, se filtra y se tomará la última muestra filtrada. La señal resultante está decimada por la razón:

Rd = Fm / Fd

Donde:
Rd ---> Es la razón de decimación
Fm ---> Es la Frecuencia de Muestreo de la señal de entrada.
Fd ---> Es la Frecuencia de Muestreo de la señal de salida.

Los coeficientes del Filtro FIR se pueden diseñar mediante cualquier método. Para aquellos insulsos como yo, los coeficientes del filtro son la respuesta al impulso. Una vez diseñado el filtro, podemos recurrir a la convolución en tiempo discreto.

Para aquellos que no sabemos y para aquellos que buscan la explicación a todo: La convolución es una operación matemática tal como la suma, la resta o la derivada. Provee la manera de combinar dos señales para formar una tercera. La convolución es importante en proceso digital de señales ya que relaciona tres señales de interés: la señal de entrada, la señal de salida y la respuesta al impulso.

Si nosotros conocemos la respuesta al impulso de un sistema, entonces podremos calcular la salida de ese sistema para cualquier tipo de señal de entrada; en pocas palabras: si conocemos la respuesta al impulso, entonces conocemos todo acerca de ese sistema y en cualquier momento.

La respuesta al impulso tiene diferentes nombres para distintos tipos de aplicaciones. Por ejemplo si el sistema es un filtro, la respuesta al impulso se puede llamar kernel o núcleo del filtro, o kernel de convolución, o símplemente el núcleo. En procesamiento digital de imágenes se le llama en inglés: "Point spread function". A pesar de los diferentes nombres tódos se refieren al mismo objeto.

Para mostrar el funcionamiento de la convolución de dos señales, me referiré al libro de la bilbiografía [1]. El capítulo 6 contiene una explicación por más satisfactoria del proceso de convolución. Partes de este blog son extractos de este libro.

La convolución se representa por la operación:
                 oo
y[n] = x[n]*h[n]= sum {x[k]h[n-k] }
k=-oo
[Eq. 1]
Sin embargo, una de las propiedades más útiles de la convolución es que es conmutativa, de tal manera que:

y[n] x[n]*h[n]= h[n]*x[n]
[Eq. 2]

Es necesario que consulten la biliografía para que puedan comprender mejor este concepto. Es muy importante remarcar que la convolución se representa como una estrella, a diferencia del signo de multiplicación que es una X.

La propiedad de ser conmutativa nos da ventajas y manera de interpretar la convolución de dos formas: Desde el punto de vista de entrada y desde el punto de vista de la salida, siendo éste último el que tomaremos como base.

El punto de vista de la salida toma en cuenta la manera de cómo se produce una salida en específico, es decir, la manera en que la señal de entrada y la respuesta al impulso se combinan para formar una muestra a la salida:

y[n] = combinación de otras variables.

Ejemplo 1
Supongamos que tenemos la siguientes señal de entrada y respuesta al impulso:
x[n] = [ 0 , 1 , -1 , -1.25 , 2 , 1.25 , 1.25 , 0.5 , 0 , -0.5 ]
h[n] = [ 1 , -0.5 , -0.25 , 0 ]
Desde el punto de vista de la salida, deberíamos poder calcular cualquier punto de la salida y[n] con base en la convolución x[n] * h[n]. Con base en [Eq. 1] tenemos que:
                9 
y[n]= x[n]*h[n]= sum {x[k] h[n-k]}
k=0
[Eq. 3]
Debemos de tener en cuenta que hemos elegido el rango de k igual a la longitud de x[n]. La convolución permite tomar el rango que deseemos. Por otra parte, tomar un rango de k infinito es la manera correcta, sin embargo la convolución no existe o está incompleta para 0 >= K <>.

Ejemplo 1 : Calcule y[1]:
                 9
y[1]=x[1]*h[1]= sum {x[k]h[1-k] } = x[0]h[1] + x[1]h[0] + x[2]h[-1] + ... + x[9]h[-8]
k=0
[Eq. 4]
Debido a que h[n] sólo esta definido para valores de 0 >= K <>, deberemos asumir que los valores desconocidos son cero. En el argot de proceso digital de señales se le llama rellenar con ceros (Padding with zeros). Como resultado del proceso tendremos que [Eq. 4] queda reducida a:

y[1] = x[0]h[1] + x[1]h[0] = (0)(-0.5) + (1)(1) = 1

Si se sigue con detallda atención al proceso, anterior, da la impresión de que h[n] se ha invertido y se desliza de izquierda a derecha para traslaparse, muestra por muestra, con x[n].

Ejemplo 2: Calcule y[9].
                 9
y[9]=x[9]*h[9]= sum {x[k]h[9-k] } = x[0]h[9] + x[1]h[8] + x[2]h[7] + ... + x[9]h[0]
k=0

Debido a que h[n] sólo esta definido para valores de 0 >= K <>, rellenaremos con cero los valores faltantes de h[k] para k>=4,entonces obtendremos:
y[9] = x[6]h[3] + x[7]h[2] + x[8]h[1] + x[9]h[0]
= (1.25)(1)
(0.5)(-0.5) (0)(-0.25) + (-0.5)(0)
= 1.25 - 0.25 + 0 + 0 = 1

La longitud total de la convolución se dada por la longitud de la señal de entrada + la longitud de la respuesta al impulso más uno. Sin embargo se puede probar que la convolución sólo arroja valores completos para valores de n+Ni a Ne.

Donde
Ni es la longitud de la respuesta al impulso,
Ne es la longitud de la señal de entrada.

Ya tenemos las bases puestas para el filtro decimador.

.. continuara ...



1 Responses to “Algoritmo mejorado para Filtro FIR decimador.”

10:04 p.m.


Hola señor Hormiga!
Quiero decirte que tu trabajo de "Algoritomo mejorado para Filtro FIR decimador" se me hizo muy interesante, pero... "NO LO TERMINAS", me fui frustrante saber que no esta terminado, me gusto como explicas tan sencillo el proceso de convolución y me gustaria conocer el final de tu trabajo, claro si así lo deseas.
Gracias por tu atención y tus aportaciones que haces en esta pagina.
ATTE:
(una admiradora a medias)
Lila Ahorkis :)