Filtros Digitales Fir

54
5 FILTROS DIGITALES FIR. Filtro digital FIR. Diseño de Filtros FIR usando diferentes métodos. Ejemplos de Programación. Los filtros digitales han venido remplazando a los filtros análogos en una gran variedad de aplicaciones industriales. La comodidad del diseño, así como la calidad de la respuesta en frecuencia hacen de este tipo de herramientas una posibilidad excelente para el procesamiento digital de señales. Existen una gran variedad de métodos de diseño de este tipo de filtros, así como la posibilidad de implementarlos muy fácilmente en un dispositivo digital como un DSP u otro elemento que permita realizar el algoritmo de convolución, ya que básicamente un filtro FIR es el proceso de convolución entre dos vectores. 5.1 INTRODUCCION. Una de las principales aplicaciones que se tiene en el procesamiento de señales es precisamente los filtros. Un filtro es un sistema que tiene la capacidad de tener diferentes comportamientos dependiendo la frecuencia de la señal de entrada. Un filtro digital es básicamente una ecuación de diferencias finitas que permite generar un comportamiento a la salida en forma variable dependiendo el espectro de frecuencia.

Transcript of Filtros Digitales Fir

5 FILTROS DIGITALES FIR.

Filtro digital FIR. Diseño de Filtros FIR usando diferentes métodos. Ejemplos de Programación.

Los filtros digitales han venido remplazando a los filtros análogos en una gran variedad de aplicaciones industriales. La comodidad del diseño, así como la calidad de la respuesta en frecuencia hacen de este tipo de herramientas una posibilidad excelente para el procesamiento digital de señales. Existen una gran variedad de métodos de diseño de este tipo de filtros, así como la posibilidad de implementarlos muy fácilmente en un dispositivo digital como un DSP u otro elemento que permita realizar el algoritmo de convolución, ya que básicamente un filtro FIR es el proceso de convolución entre dos vectores.

5.1 INTRODUCCION.

Una de las principales aplicaciones que se tiene en el procesamiento de señales es precisamente los filtros. Un filtro es un sistema que tiene la capacidad de tener diferentes comportamientos dependiendo la frecuencia de la señal de entrada. Un filtro digital es básicamente una ecuación de diferencias finitas que permite generar un comportamiento a la salida en forma variable dependiendo el espectro de frecuencia.

El ancho de banda (BW) se define como el espectro de frecuencia sobre el cual el filtro permite tener alguna respuesta. Es importante saber que para que haya un funcionamiento óptimo, la señal de entrada debe tener una BW limitado, es decir que se conozca la máxima frecuencia de entrada, para poder determinar la Frecuencia de Muestreo (F s) necesaria para cumplir con Nyquist. Si eventualmente la señal de entrada no tuviera una frecuencia máxima conocida, o si por limitaciones de Hardware se tuviera una restricción en cuanto a la F s, se hace necesario limitar el BW a la entrada con un filtro análogo, tal y como se muestra en la figura 5.1.

Como puede observarse en dicha figura, la señal de entrada tiene un espectro de frecuencia mayor que F s/2, razón por la cual se debe aplicar un filtro pasabajo que limite el ancho de banda final hasta F s/2, para evitar el fenómeno de aliasing1, es decir frecuencia por encima de la frecuencia máxima permitida, que en un sistema de procesamiento digital va a generar señales indeseables.

1 Aliasing: Frecuencias no deseadas que aparecen cuando la señal digitalizada es más alta que la mitad de la frecuencia de muestreo.

Figura 5.1

Dentro de los diseños e implementaciones de filtros digitales existen básicamente dos opciones, dependiendo de la respuesta que tenga el sistema al impulso unitario. De ahí que se clasifiquen en filtros FIR o IIR, según sea que tengan repuesta finita al impulso o respuesta infinita al impulso unitario. En la siguiente sección se describirá detalladamente el concepto de repuesta al impulso unitario.

5.2 RESPUESTA AL IMPULSO UNITARIO.

Un sistema digital básico tiene una entrada tradicionalmente llamada x[n] y una salida y[n]. Tanto x[n] como y[n] son señales discretas, las cuales son representadas por vectores unidimensionales. Si el sistema se excita a la entrada por un impulso unitario δ [n], el sistema tendrá a la salida una respuesta única a esta excitación, la cual es llamada como Respuesta al Impulso Unitario o h[n]. El impulso unitario δ [n] se representa matemáticamente como:

δ [n ]={1 paran=00 paran>0

(5.1)

O δ [n ]={1,0,0,0,0 , ……. }(5.2)

Ejemplo 5.1

Hallar la respuesta al impulso unitario en el siguiente sistema:

Figura 5.2

Como podemos observar, el sistema descrito en la figura 5.1 puede ser representado por la siguiente ecuación de diferencias:

y [ nT ]=x [ nT ]+x [ nT−T ]+x [ nT−2T ] (5.3)

O simplificandoy [ n ]=x [n ]+x [ n−1 ]+x [n−2]

De tal forma que se remplazamos a x[n] por δ [n ] tenemos que:

y [ n ]=δ [n ]+δ [ n−1 ]+δ [n−2]O equivalente a

h [ n ]= [1,0,0,0,0 , … ]+[ 0,1,0,0,0 , … ]+ [ 0,0,1,0,0 , … ]

h [ n ]= [1,1,1,0,0,0,0 …. ]

5.2.1 Respuesta Finita al Impulso Unitario FIR.

Si se analiza el ejemplo 5.1 se puede observar que el vector h[n], el cual representa la salida o respuesta al impulso unitario, tiene una longitud finita, es decir que luego de algunos datos el sistema queda permanentemente en un valor de 0, con lo cual se puede decir que el vector h[n] es un vector de longitud finita, en el caso del ejemplo, de longitud 2. Si se tiene este comportamiento se dice que el filtro es tipo FIR, esto es, Filtro de Respuesta Finita al Impulso Unitario.

Todos los filtros que no tienen realimentación, es decir, que en la ecuación de diferencias solamente dependen de componentes retrasadas de x[n], y no de valores de y [n−k ], para cualquier k, se denominan filtros FIR, ya que siempre llegarán a un valor estable en 0. Ahora bien, un filtro realimentado, es decir que dependa de algún componente y [n−k ], puede también llegar a ser un filtro FIR, sin embargo en el presente texto se considerará como regla general solamente los sistemas no realimentados para efectos de análisis de filtros FIR.

5.2.2 Respuesta Infinita al Impulso Unitario IIR.

Si un filtro al ser excitado a la entrada con un impulso unitario presenta a la salida un vector y[n], el cual tiene longitud infinita, es decir, que nunca va a llegar a estar estable en 0, se le

denomina Filtro de Respuesta Infinita al Impulso Unitario IIR. Para que un filtro se comporte de esta forma, necesariamente debe estar realimentado, es decir, debe depender tanto de x [n−k ], como de y [n−m ].

Ejemplo 5.2

Considere el siguiente sistema, y analice el comportamiento para cuando la entrada x[n] es un impulso unitario.

Figura 5.3

La ecuación de diferencias que representa el sistema discreto descrito en la figura 5.3 es:

y [ n ]=x [n ]+α . y [ n−1 ] (5.4)

En la siguiente tabla se tabula todo el comportamiento del sistema cuando es excitado con un impulso unitario.

n 0 1 2 3 4X[n] 1 0 0 0 0

Y[n-1] 0 1 α α 2 α 3

Y[n] 1 α α 2 α 3 α 4

Tabla 5.1

De tal forma que la respuesta al impulso h[n] queda como:

h [ n ]=[1 , α , α 2 ,α 3 , α4 , .…. ](5.5)

Esta ecuación siempre será diferente de 0, con lo cual se puede decir que tiene una longitud infinita, por tal razón dicho filtro se puede considerar un filtro IIR.

5.3 FORMA CANONICA DE UN FILTRO FIR.

Un filtro FIR tiene una representación canónica tanto en forma gráfica, en forma de ecuación de diferencias y en forma de Función de Transferencia (En función de la transformada Z).

La ecuación general en forma de diferencias finitas está dada por:

y [ n ]=∑k =0

N−1

h (k ) x ( n−k )(5.6)

Donde h (k) corresponden a los coeficientes propios del filtro, los cuales son función de:

Frecuencia de Muestreo Tipo del filtro (LPF, HPF, BPF o SBF)2

Frecuencias de corte (F l , Fh )

Y N es el orden del filtro, el cual al ser bastante grande genera un mayor grado de selectividad en el filtro.

En una sección posterior se analizará la forma de calcular los coeficientes característicos del filtro. Como se puede observar, la ecuación descrita anteriormente corresponde a la multiplicación de dos vectores, uno que corresponde a los coeficientes, el cual no cambia durante todo el proceso, mientras que el otro, el de x [n−k ], va cambiando a medida que avanza el tiempo y representa las últimas k muestras que el sistema ha tomado de la señal de entrada. Es decir, que la salida actual depende de las últimas k muestras de entrada solamente y no depende de algún estado previo de salida, lo cual obligaría a tener un sistema realimentado.

Otra forma de observar el sistema FIR es a través de una forma gráfica. En la figura 5.4 podemos observar la topología para este sistema:

Figura 5.4 Forma Canónica de un filtro FIR.

2 LPF = Filtro Pasa bajo, HPF = Filtro Pasa alto, BPF = Filtro Pasa banda y SBF = Filtro de Rechazo

Por último, se representa el sistema en forma de su Función de Transferencia en el dominio Z, es decir en el dominio de la frecuencia discreta, de la siguiente forma:

H ( z )=∑k=0

N −1

hk z−k (5.7)

Siendohk=h (k )(5.8)

En donde se observa que la Función tiene la misma cantidad de ceros y polos, estos últimos ubicados todos en el origen, evitando la posible realimentación en el sistema, aspecto que si sucede en un filtro IIR, tal y como se observará en el siguiente capítulo.

5.4 RESPUESTA EN FRECUENCIA DE UN FILTRO FIR.

La transformada Z de h[n] es H(z), la cual representa la función de transferencia del sistema. Ahora bien, por definición tenemos que

z=e jωT(5.9)

Siendo T el periodo de muestreo del sistema.

Si se remplaza a Z por su representación en frecuencia, tenemos la respuesta en frecuencia del sistema. En el siguiente ejemplo podemos observar el comportamiento de su sistema FIR en el dominio de la frecuencia.

Ejemplo 5.3

Determinar el comportamiento del sistema descrito en la figura 5.5 en el dominio de la frecuencia.

Figura 5.5

La ecuación de diferencias para el sistema descrito en la figura anterior es:

y [ n ]=0.333 x [n ]+0.333 x [ n−1 ]+0.333 x [n−2 ] (5.10)

Aplicando la transformada Z tenemos

Y ( z )=0.333 X ( z )+0.333 z−1 X ( z )+z−2 X (z )

H ( z )=Y (z )/ X (z)=0.333+0.333 z−1+0.333 z−2

Remplazando z por e jωT

H (e jωT )=0.333 (1+e− jωT +e− j2 ωT )O

H (e jωT )=0.333 e− jωT (e jωT +1+e− jωT )

H (e jωT )=0.333 e− jωT (2cos (ωT )+1 )

H (e jωT )=0.333 e− j 2 πf /Fs¿

Donde la Magnitud está dada por:

|H (e jωT )|=|2 cos (2 πf / F s )+1|(5.11) Y la fase

θ (e jωT )=−2πf /F s(5.12)

La gráfica para el sistema se muestra en la figura 5.6, teniendo como frecuencia de muestreo F s = 1800 Hz.

Figura 5.6 Respuesta en Frecuencia para el ejemplo 5.3

Se tiene que el filtro rechaza la componente de 600 Hz, dejando pasar las bajas frecuencias. Además se puede observar que la fase del sistema es lineal, aspecto que es típico dentro de los criterios de diseño de los filtros digitales.

5.5 DISEÑO DE UN FILTRO FIR POR EL METODO DE CEROS.

En el plano complejo Z se tiene el círculo unitario (radio r = 1), el cual determina la región de convergencia de un sistema o filtro digital. Sobre el círculo se pueden ubicar los ceros de la

función de transferencia H (z), teniendo en cuenta que se conoce la Frecuencia de Muestreo F s, la relación entre el ángulo del círculo y la frecuencia de muestreo está dada por:

θ=2 π ( f 0/ F s )(5.13)

Donde f 0 es la frecuencia donde se ubicará el cero de la función de transferencia. En la figura 5.7 se observa claramente la distribución:

Figura 5.7

Como se sabe, un cero en una función de transferencia hace que el sistema tenga una atenuación completa en ese punto, y como la función de transferencia está en función de la frecuencia, se infiere que en dicha frecuencia específica existirá un rechazo completo.

5.5.1 Diseño de un Filtro Pasa Bajo.

Teniendo en cuenta que en un filtro digital la frecuencia es periódica con periodo F s, se contempla el recorrido desde −F s/2 hasta F s/2, para tener una simetría en el diseño, y así evitar el trabajar con valores complejos, dado que se tienen los complejos conjugados para efecto de diseño. Las altas frecuencias están ubicadas en la cercanía de F s/2, por tal razón se ubicará en dicho punto un cero, en el plano completo es -1+0j, para obligar al sistema que en esas frecuencias tenga como respuesta 0. Igualmente se tiene como condición de diseño para este tipo de filtros, que el número de ceros de la función de transferencia sea igual al número de polos para evitar tener señales adelantadas en el tiempo. Otra condición de diseño es que todos los polos estén ubicados en el origen, o de lo contrario el sistema genera una realimentación, con lo cual no se garantiza que la respuesta al impulso unitario sea finita.

En consecuencia tenemos que la función de transferencia para un filtro de primer orden (un solo cero), estará dada por:

H ( z )= z+1z

=1+z−1(5.14)

Como H ( z )=Y (z )/ X (z)

Entonces

Y ( z )=X ( z )+z−1 X ( z )O

y [ n ]=x [n ]+x [ n−1 ]

Y para un filtro de segundo orden (dos ceros en F s/2) se tiene:

H ( z )= (z+1 )z2

2

(5.15)

O equivalente a:H ( z )=1+2 z−1+z−2

Como H ( z )=Y (z )/ X (z)

EntoncesY ( z )=X ( z )+2 z−1 X ( z )+z−2 X (z)

Y aplicando la transformada inversa tenemos

y [ n ]=x [n ]+2 x [n−1 ]+x [ n−2 ] (5.16)

En las figuras 5.8 y 5.9 se pueden observar las respuestas a cada sistema en función de la frecuencia.

Figura 5.8 Respuesta al sistema de primer orden.

Figura 5.9 Respuesta al sistema de segundo orden.

En los dos casos se observa una ganancia de 2 y 4 respectivamente, la cual es normalizada en la ecuación final. Igualmente se observa que la respuesta de la fase es lineal, lo cual es una característica típica de los filtros FIR. El sistema de segundo orden muestra un mayor grado de selectividad. Si se incrementara el orden del filtro se puede observar que el sistema se vuelve mucho más selectivo, pero no se puede parametrizar la frecuencia de corte, lo cual no lo haca muy útil en muchos casos.

5.5.2 Diseño de un Filtro Pasa Alto.

Siguiendo los mismos criterios utilizados en el ítem anterior, se puede considerar el diseño de un filtro pasa alto, excepto que en este caso el o los ceros estarán ubicados en 0 Hz, es decir sobre el plano completo el punto es 1+0j. Con este criterio se busca que para las bajas frecuencias haya una atenuación, mientras que para las frecuencias que están en cercanías de F s/2 haya un paso total de la señal. Por lo demás, se mantiene el hecho de igualdad de ceros y polos, estos últimos ubicados en el origen (0+0j).

La función de transferencia está dada por:

H ( z )= z−1z

(5.17)

Mientras que la ecuación de diferencias es:

y [ n ]=x [n ]−x [ n−1 ]

Y para un filtro de segundo orden (dos ceros en F s/2) se tiene:

H ( z )= (z−1 )z2

2

(5.18)

Con ecuación de diferencias:

y [ n ]=x [n ]−2 x [ n−1 ]+x [n−2 ]

Al igual que en el caso anterior, se presenta la respuesta en frecuencia tanto en amplitud como en fase para los dos sistemas de 1 y 2 orden respectivamente.

Figura 5.10 Respuesta al sistema de primer orden.

Figura 5.11 Respuesta al sistema de segundo orden.

5.5.3 Diseño de un Filtro Pasa Banda.

Para el caso de un filtro pasa banda se tiene que tanto a bajas como a altas frecuencias el sistema debe tener su máxima atenuación, dejando pasar frecuencias intermedias. Por tal

razón la ubicación de los ceros se establecerán en 0 Hz y en F s/2, es decir sobre el plano complejo en 0+1j y 0-1j.

La función de transferencia está dada por:

H ( z )= (z−1 ) ( x+1 )z

(5.19)

O equivalente a:H ( z )=1−z−2

Como

H ( z )=Y (z )X (z)

EntoncesY ( z )=X ( z )−z−2 X ( z )

Mientras que la ecuación de diferencias es:

y [ n ]=x [n ]−x [ n−2 ]

Para este caso, ya que deben existir mínimo dos ceros, no se puede tener un sistema de primer orden.

En la figura 5.12 se observa la respuesta en frecuencia para la amplitud y fase.

Figura 5.12 Respuesta al sistema Pasa Banda de segundo orden.

En este caso, la frecuencia intermedia no puede ser controlada y siempre quedará en F s/4.

5.5.4 Diseño de un Filtro Rechazo de Banda.

Para el diseño de un filtro de rechazo de banda es indispensable saber exactamente donde ubicar el cero del rechazo, por lo cual la frecuencia f 0 es importante conocerla. De acuerdo a dicha frecuencia se calcula el ángulo con la ecuación xxx. En la figura 5.13 se describe la ubicación de los ceros, ya que se debe tener en cuenta el cero del complejo conjugado para evitar tener componentes complejas en la función de transferencia.

Figura 5.13 Plano Z con la ubicación de los ceros en un Sistema Rechazo de Banda.

En la figura se puede observar que se ubican dos polos en el origen para mantener el criterio de la misma cantidad de ceros y de polos.

La función de transferencia queda:

H ( z )= (z−cosθ− jsenθ ) ( z−cosθ+ jsenθ )z2

(5.20)

O equivalente a:H ( z )=1−2 cosθ z−1+z−2

Mientras que la ecuación de diferencias es:

y [ n ]=x [n ]−2 cosθx [n−1 ]+ x [ n−2 ](5.21)

En la figura 5.14 se observa la respuesta en frecuencia para la amplitud y fase.

Figura 5.14 Respuesta al sistema Rechazo de Banda de segundo orden.

5.6 DISEÑO DE UN FILTRO FIR POR EL METODO DE FOURIER.

Partiendo del hecho de que la frecuencia en un filtro digital es periódica con periodo F s, se puede diseñar un filtro digital teniendo como espacio valido en frecuencia desde −F s/2 hasta F s/2. En consecuencia se puede tener como condición en el diseño la repetición periódica del comportamiento del filtro tal y como se observa en la figura 5.15.

Figura 5.15 Respuesta en frecuencia de un filtro pasa bajo ideal.

El filtro se diseña en forma simétrica sobre el eje de 0 Hz, con repetición en cada múltiplo de F s. No hay problema en el comportamiento del filtro para esas frecuencias, ya que por el teorema de Nyquist no puede existir señales mayores a F s/2, razón por la cual la frecuencia de interés para el sistema es de 0 Hz hasta F s/2.

Se puede observar que es una onda cuadrada periódica con periodo F s, con la frecuencia como abscisa, por lo cual se puede aplicar la transformada inversa de Fourier. En tal sentido la función de transferencia se puede representar como:

H ( f )= ∑n=−∞

h (n ) e− j 2 πfn

Fs (5.22)

Con los coeficientes definidos de la forma:

h (n )= 1F s

∫−F s /2

F s/2

H ( f ) e( j 2 πfn/F s )df (5.23)

Como puede observarse en la ecuación (5.23), la serie de va desde −∞ hasta +∞, con lo cual se volvería un filtro de orden infinito, razón por la cual se vuelve inmanejable el diseño y la implementación del mismo en un dispositivo digital o de software. Para subsanar este problema, dicha ecuación se trunca a un valor de tamaño N, el cual será el orden del filtro final. Para evitar problemas de valores finales complejos, dicho truncamiento se realiza en forma simétrica sobre el valor de 0, es decir, entre ( N−1 ) /2 hasta ( N+1 ) /2, con lo cual se contemplan los complejos conjugados en el momento de los cálculos finales. De esta forma la nueva ecuación de la función de transferencia queda de la forma:

H ( f )= ∑n=

−( N−1 )2

(N +1 )2

h (n ) e− j 2 πfn

Fs (5.24 )

Al calcular los coeficientes con la ecuación (5.24), se tendrían índices negativos y positivos, razón por la cual se presentan inconvenientes al hacer el calculo de la convolución, que en definitiva es el procedimiento para implementar el filtro, ya que la ecuación de diferencias para un filtro FIR estará dado por:

y [ n ]= ∑k=0

n=N−1

hd ( k ) x (n−k )(5.25)

Para realizar el ajuste se propone hacer un desplazamiento de los coeficientes h(n), de la siguiente forma:

hd (k )=h(k−N−12 ) , para k=0 , N−1 (5.25)

Ejemplo 5.4

Calcular los coeficientes paras un filtro Pasa Bajo, con F s=10 Khz, f l=1000 Hz y orden N=11.

h (n )= 1F s

∫−F l

F l

1. e ( j 2 πfn/F s) df ,

h (n )= 1F s

e ( j2 πfn/Fs )

j 2 πn/ F s|−FL

F l

= e( j 2 π F l n/F s )−e (− j 2 π Fl n /Fs )

2 jπn=

sen (2 π F ln /F s)πn

Para el caso de n=0, aplicando L’Hopital, se tiene que h (0 )=2 F l / F s.

En consecuencia los coeficientes finales para el filtro del ejemplo están dados por:

hd [n ]={0 , 0.0467 , 0.1009 ,0.1513 ,0.1870 ,0.2 , 0.1870 ,0.1513 , 0.1009 ,0.0467 ,0 }

Aplicando dichos coeficientes a un software de simulación del comportamiento del sistema, se tiene la siguiente gráfica:

Figura 5.16 Respuesta en frecuencia del filtro del ejemplo 5.4

Aplicando los mismos principios del filtro Pasa bajo de la figura 5.15, se tienen las siguientes gráficas ideales de la función de transferencia para los filtros Pasa Alto, Pasa Banda y Rechazo de Banda.

Figura 5.17 Respuesta en frecuencia del filtro ideal Pasa Alto.

Figura 5.18 Respuesta en frecuencia del filtro ideal Pasa Banda.

Figura 5.19 Respuesta en frecuencia del filtro ideal Rechazo de Banda.

Ahora bien, si se sigue la norma de integración del ejemplo 5.4, se tienen las siguientes ecuaciones generales para cada uno de los cuatro filtros típicos enunciados anteriormente.

Tipo de Filtro Ecuaciones generales

Filtro Pasa bajo.h (n )=

sen(2π Fl n /F s)πn

h (0 )=2 F l / F s

Filtro Pasa Alto.h (n )=

−sen (2 π Fl n /F s)πn

h (0 )=1−2 Fl /F s

Filtro Pasa Banda.h (n )=

sen (2 π Fh n/ F s )−sen(2π Fl n/ F s)πn

h (0 )=2 ( Fh−f l ) /F s

Filtro Rechazo de Banda.h (n )=

sen (2 π F l n/ F s )−sen(2 π Fh n/ F s)πn

h (0 )=1+2 ( F l−f h ) /F s

Tabla 5.2 Ecuaciones Generales de los coeficientes de los cuatro filtros típicos.

5.7 ENVENTANADO DE FILTROS FIR.

Si se tiene en cuenta que en este tipo de diseño, se parte del comportamiento de una onda cuadrada y su representación en series de Fourier, al hacer el truncamiento obviamente aparece el fenómeno de GIBBS, el cual consiste en las ondulaciones de la onda, producto de no calcular todas las componentes espectrales. A medida que el filtro es de menor orden, dicha ondulación se hace más notoria, tanto en la parte de paso del filtro como en la parte de atenuación del mismo. En ese sentido existen varios estudios para disminuir ese nivel de ondulación a través de las funciones de ventana o simplemente el efecto de enventanado.

5.7.1 Ventana de Hamming.

La ventana de Hamming está dada por:

aH (n )={0.54+0.46 cos2 πnN−1

para∨n∨≤N−1

20 Otro caso

(5.26)

Calculando los coeficientes la ventana de Hamming y los coeficientes h[n], se tiene que:

h f (n )=aH (n ) h (n )(5.27)

Siendo h f (n ) los coeficientes finales aplicables al filtro.

Ejemplo 5.5

Aplicar la ventana de Hamming a los coeficientes del ejemplo 5.4 y realizar la gráfica de respuesta en frecuencia.

Los coeficientes iniciales del filtro son:

hd [n ]={0 , 0.0467 , 0.1009 ,0.1513 ,0.1870 ,0.2 , 0.1870 ,0.1513 , 0.1009 ,0.0467 ,0 }

Y los coeficientes de Hamming, aplicando la ecuación (5.26) son:

aH [ n ]={0 , 0.1678 , 0.3978 , 0.6821, 0.9121 , 1 ,0.9121 , 0.6821 , 0.3978 ,0.1678 ,0 }

Al multiplicar los dos vectores tenemos:

h f [ n ]={0 ,0.0078 , 0.0401 ,0.1032 ,0.1706 , 0.2 , 0.1706 , 0.1032 ,0.0401 , 0.0078 , 0 }

Aplicando dichos coeficientes a un software de simulación del comportamiento del sistema, se tiene la siguiente gráfica:

Figura 5.20 Respuesta en frecuencia del filtro del ejemplo 5.5

En esta figura se puede observar las diferencias respecto a la figura 5.14, en la cual no existe el proceso de enventanado.

5.7.2 Ventana de Blackman.

La ventana de Blackman está dada por:

aB (n )={0.42+0.5 cos2 πnN−1

+0.08 cos4 πnN−1

para∨n∨≤N−1

20Otro caso

(5.28)

Calculando los coeficientes la ventana de Blackman y los coeficientes h[n], se tiene que:

h f (n )=aB (n )h (n )(5.29)

Siendo h f (n ) los coeficientes finales aplicables al filtro.Si se aplican estos coeficientes a los criterios del ejemplo 5.4 tenemos la siguiente respuesta en frecuencia:

Figura 5.21 Respuesta en frecuencia del filtro del ejemplo 5.4 con Ventana de Blackman.

Se puede observar que este último filtro tiene un descenso menos fuerte que el de Hamming.

5.8 APLICACIÓN SOBRE EL DSK 6713.

Haciendo uso del DSK6713 de Texas Instruments como herramienta de Hardware, y la plataforma de desarrollo Code Composer Studio V3 propiedad de Texas Instruments, se desarrollarán las siguientes aplicaciones para la implementación de un filtro FIR en un ambiente de tiempo real.

Se tienen diversas opciones, tales como la captura desde un conversor análogo a digital con salida sobre un conversor análogo a digital, desarrollando el algoritmo en lenguaje C, en Assembler o con uso de librerías propias del fabricante, hasta tener la posibilidad de simular la señal de entrada a través del propio código interno del programa, o desde un archivo almacenado en memoria del Computador, para poder descargarlo a una dirección física del DSP.

5.8.1 Programación en C con señal simulada en el programa.

En el presente apartado se describirá la forma como se puede implementar un filtro FIR aplicado a una señal senoidal, previamente generada dentro del mismo programa. El usuario

final podrá cambiar los parámetros de la señal (frecuencia y amplitud) para poder observar el comportamiento del filtro a distintas frecuencias de entrada y poder comprobar si efectivamente el filtro tiene la respuesta para el cual fue diseñado. Adicionalmente, se podrán cambiar algunos parámetros del filtro, tales como el tipo del filtro (LPF, HPF, BPF, SBF), frecuencia de corte baja F l, frecuencia de corte alta Fh, orden del filtro N, selección de respuesta al filtro sin ventana, con ventana de Hamming o con ventana de Blackman.

El programa fue creado sobre el editor de CCS V3, y el comportamiento del mismo se visualiza sobre las diferentes ventanas gráficas que aporta dicha plataforma de desarrollo.

//Fir.c Filtro FIR aplicado a una señal seno generada internamente#include <math.h>short x [1500], y[1000]; // Reserva espacio en memoria para la señal de entrada y salidafloat h[500]; // Reserva espacio en memoria para los coeficientesshort N=101; // Inicializa el orden del filtro inicial en 101short Fs = 10000; // Inicializa la frecuencia de muestreo en 10000 Hz.short Fl = 1000; // Inicializa la frecuencia de corte en 1000 Hz.short Fh = 1500; // Inicializa la frecuencia de corte en 1000 Hz.short sel = 0; // Inicializa el tipo del filtro en LPFshort f = 100; // Inicializa la frecuencia de la señal de entrada en 100 Hz.short amp = 1000; // Inicializa la amplitud de la señal de entrada en 1000short ven = 0; // Inicializa sin ventana. Con 1 selecciona Hamming. Con 2 selecciona Blackman.

short i, n, k;float r;

void main() {

while (1){

// Comienzo generación de la señal seno for (i=0; i<1500; i++)

x[i] = amp * sin (6.28 * f * i/ Fs);// Fin generación señal seno

// Generación de los coeficientes del filtroswitch (sel){

case 0:// Calculo para filtro Pasa bajo

for (n=1; n< (N+1)/2; n++){

h[(N-1)/2+n] = sin(6.2832 * Fl * n/ Fs)/(3.1416*n); h[(N-1)/2- n] = sin(6.2832 * Fl * n/ Fs)/(3.1416*n);

}h [(N-1)/2] = 2 * Fl / Fs;break;

case 1:// Calculo para filtro Pasa alto

for (n=1; n< (N+1)/2; n++){

h[(N-1)/2+n] = -sin(6.2832 * Fl * n/ Fs)/(3.1416*n); h[(N-1)/2- n] = -sin(6.2832 * Fl * n/ Fs)/(3.1416*n);

}h [(N-1)/2] = 1 - 2 * Fl / Fs;break;

case 2:// Calculo para filtro Pasa Banda

for (n=1; n< (N+1)/2; n++){

h[(N-1)/2+n] = (sin(6.2832 * Fh * n/ Fs) - sin(6.2832 * Fl * n/ Fs)) / (3.1416*n); h[(N-1)/2- n] = (sin(6.2832 * Fh * n/ Fs) - sin(6.2832 * Fl * n/ Fs)) / (3.1416*n);

}h [(N-1)/2] = 2 * (Fh - Fl )/ Fs;break;

case 3:// Calculo para filtro Rechazo de Banda

for (n=1; n< (N+1)/2; n++){

h[(N-1)/2+n] = (sin(6.2832 * Fl * n/ Fs) - sin(6.2832 * Fh * n/ Fs)) / (3.1416*n); h[(N-1)/2- n] = (sin(6.2832 * Fl * n/ Fs) - sin(6.2832 * Fh * n/ Fs)) / (3.1416*n);

}h [(N-1)/2] = 1 + 2 * (Fl – Fh) / Fs;break;

// Fin generación de los coeficientes del filtro }

// Aplicación de la ventana sobre los coeficientesswitch (ven){

case 0:// Sin ventanabreak;

case 1:// Con ventana Hammingfor (i = 1; i <( N+1)/2; i++)

{h[(N-1)/2+i] = h[(N-1)/2+i] * (0.54 + 0.46 * cos (6.28*i/(N-1)));h[(N-1)/2-i] = h[(N-1)/2+i];}

break;case 2:

// Con ventana Blackmanfor (i = 1; i <( N+1)/2; i++)

{h[(N-1)/2+i] = h[(N-1)/2+i] *(0.42+0.5*cos (6.28*i/(N-1))+0.08*cos(12.56* i/(N-

1)));h[(N-1)/2-i] = h[(N-1)/2+i];}

break;}// Fin enventanado

// Aplicación del filtro a la señal generadafor (i=0; i<1000; i++){

r = 0;for (k=0; k<N; k++)

r = r + x [i+k] * h [k];y[i]= r;

}// Fin de la aplicación del filtro;

}

}Figura 5.22 Código del programa en C para el CCS con una señal simulada en el DSP.

Respecto al tamaño del vector de salida y, el cual fue calculado solamente para 1000 datos, se debe a que para los últimos N datos no se puede garantizar que exista la información completa en la señal de entrada. Con esta estimación se puede tener un orden de hasta N = 500 sin afectar la señal de salida.

En la figura 5.23 se observa un quick watch del CCS, sobre el cual el usuario puede controlar los diferentes parámetros del programa.

Figura 5.23 Quick Watch para controlar los parámetros del programa.

En la figura 5.24 se observan las gráficas de entrada y salida para una señal seno de 1000 Hz, con amplitud 1000, aplicada al filtro Pasa bajo de orden N=101 y frecuencia F l = 1000.

Figura 5.24 Gráficas de Entrada y Salida del filtro LPF.

En la figura 5.25 se puede ver la respuesta en frecuencia del filtro entregada aplicándole FFT a los coeficientes del filtro.

Figura 5.25 Gráfica de los coeficientes h, en función de la frecuencia.

5.8.2 Programación en C con Entrada/Salida en Tiempo Real.

Para este caso, se presenta la posibilidad de capturar una señal generada desde un Generador externo de señales, la cual entrará a través del Conversor Análogo a Digital que posee el DSK6713. Posteriormente se aplica el filtro a dicha señal, para luego ser enviada al exterior a través del Conversor Digital a Análogo del mismo DSK.

Las otras características del filtro son las mismas del apartado anterior. A continuación se describe todo el código de programa.

//Fir.c Filtro FIR aplicado a una capturada desde el CODEC#include <math.h>#include "DSK6713_AIC23.h"short x [1500], y[1000]; // Reserva espacio en memoria para la señal de entrada y salidafloat h[500]; // Reserva espacio en memoria para los coeficientesshort N=101; // Inicializa el orden del filtro inicial en 101short fs = 48000; // Inicializa la frecuencia de muestreo en 10000 Hz.short Fl = 1000; // Inicializa la frecuencia de corte en 1000 Hz.short Fh = 1500; // Inicializa la frecuencia de corte en 1000 Hz.short sel = 0; // Inicializa el tipo del filtro en LPFshort ven = 0; // Inicializa sin ventana. Con 1 selecciona Hamming. Con 2 selecciona Blackman.

short i, n, k;float r;

Uint32 Fs=DSK6713_AIC23_FREQ_48KHZ;

interrupt void c_int11() // Interrupción ISR{

short j, e; float re; e = input_sample (); // Captura la entrada desde el CODEC

for (j = 0; j < N-1; j++) // Hace el desplazamiento del vector x[N-1-j] = x[N-2-j];

x[0] = re; // Actualiza el vector de datos de entrada

re = 0; // Inicializa el valor resultadofor (j = 0; j< N; j++) re = re + h[j] * x[j]; // Realiza la convolución

output_sample(re); // Envía el resultado al CODEC return;}

void main() { comm_intr (); // Inicializa al CODEC del DSK6713.

while (1){

// Generación de los coeficientes del filtroswitch (sel){

case 0:// Calculo para filtro Pasa bajo

for (n=1; n< (N+1)/2; n++){

h[(N-1)/2+n] = sin(6.2832 * Fl * n/ fs)/(3.1416*n); h[(N-1)/2- n] = sin(6.2832 * Fl * n/ fs)/(3.1416*n);

}h [(N-1)/2] = 2 * Fl / fs;break;

case 1:// Calculo para filtro Pasa alto

for (n=1; n< (N+1)/2; n++){

h[(N-1)/2+n] = -sin(6.2832 * Fl * n/ fs)/(3.1416*n); h[(N-1)/2- n] = -sin(6.2832 * Fl * n/ fs)/(3.1416*n);

}h [(N-1)/2] = 1 - 2 * Fl / fs;break;

case 2:// Calculo para filtro Pasa Banda

for (n=1; n< (N+1)/2; n++){

h[(N-1)/2+n] = (sin(6.2832 * Fh * n/ fs) - sin(6.2832 * Fl * n/ fs)) / (3.1416*n); h[(N-1)/2- n] = (sin(6.2832 * Fh * n/ fs) - sin(6.2832 * Fl * n/ fs)) / (3.1416*n);

}h [(N-1)/2] = 2 * (Fh - Fl )/ fs;break;

case 3:// Calculo para filtro Rechazo de Banda

for (n=1; n< (N+1)/2; n++){

h[(N-1)/2+n] = (sin(6.2832 * Fl * n/ fs) - sin(6.2832 * Fh * n/ fs)) / (3.1416*n); h[(N-1)/2- n] = (sin(6.2832 * Fl * n/ fs) - sin(6.2832 * Fh * n/ fs)) / (3.1416*n);

}h [(N-1)/2] = 1 + 2 * (Fl – Fh) / fs;break;

// Fin generación de los coeficientes del filtro }

// Aplicación de la ventana sobre los coeficientesswitch (ven){

case 0:

// Sin ventanabreak;

case 1:// Con ventana Hammingfor (i = 1; i <( N+1)/2; i++)

{h[(N-1)/2+i] = h[(N-1)/2+i] * (0.54 + 0.46 * cos (6.28*i/(N-1)));h[(N-1)/2-i] = h[(N-1)/2+i];}

break;case 2:

// Con ventana Blackmanfor (i = 1; i <( N+1)/2; i++)

{h[(N-1)/2+i] = h[(N-1)/2+i] *(0.42+0.5*cos (6.28*i/(N-1))+0.08*cos(12.56* i/(N-1)));h[(N-1)/2-i] = h[(N-1)/2+i];}

break;}// Fin enventanado

}}

Figura 5.26 Código de programa en C para una aplicación FIR con entrada-salida en Tiempo real.

En el anterior programa se observa que la ejecución se hace a través de un proceso de interrupción generada por el CODEC del DSK. Dicho CODEC interrumpe al DSP cada T s segundos, para atender la rutina que está descrita como c_int11 ( ). La ejecución del filtro se hace precisamente en ese segmento de código. En la parte principal del programa se está calculando periódicamente los coeficientes del filtro dependiendo de los parámetros que el usuario cambie en el proceso de ejecución. En este programa no se observan gráficas de salida, dado que todos los resultados se observan en el osciloscopio ó parlante que estará conectado al puerto de salida del CODEC. Como fuente de entrada se puede conectar un Generador de Señales o una fuente de audio estéreo.

5.8.3 Uso de Código Assembler para implementación de un FIR.

Con el uso de la programación en C, aunque es mucho más cómodo y entendible el código que se realiza, también es cierto que se desperdicia toda la arquitectura que posee un DSP para el procesamiento de señales, ya que en ese caso no se aprovechan los recursos del DSP para realizar varias operaciones en paralelo y otras bondades que brinda un dispositivo de estas características, el cual fue concebido en una arquitectura de Hardware que permita tener la posibilidad de desarrollar la convolución en una forma más eficiente.

En ese sentido se presenta a continuación la posibilidad de desarrollar el filtro con una rutina de Assembler. El siguiente código muestra cómo realizar el filtro FIR.

; FIRASMfunc.asm Es una función en Assembler llamada desde el programa en C para realizar el FIR; A4 = Dirección de Memoria donde están los datos, B4 = Dirección de los coeficientes, A6 = Orden del filtro.; Los datos están organizados como: x(n-(N-1))...x(n); los coeficientes están como h [0]...h [N-1]

.def _firasmfunc_firasmfunc: ;Función en ASM llamada desde C

MV A6, A1 ; Inicializa el contador principal MPY A6, 2, A6

ZERO A8 ; Inicializa el reg. A8 para acumulaciónADD A6, B4, B4SUB B4, 1, B4

cuenta: ; comienza la cuenta del FIRLDH *A4++, A2 ;A2=x[n-(N-1)+i] i=0,1,...,N-1LDH *B4--, B2 ; B2=h[N-1-i] i=0,1,...,N-1NOP 4

MPY A2,B2,A6 ;A6=x[n-(N-1)+i]*h[N-1-i] NOP ADD A6,A8,A8 ;acumula en A8

LDH *A4, A7 NOP 4 STH A7,*-A4 [1] SUB A1, 1, A1 ; decremento el contador de cuenta [A1] B cuenta ; ramifica a cuenta si conteo es diferente de 0

NOP 5

MV A8, A4 ; retorna el resultado en A4B B3 ; retorna la dirección de la dirección donde se invocó la llamadaNOP 4

Figura 5.27 Segmento de Código en Assembler para implementar un filtro FIR.

Este segmento de código debe estar almacenado en un archivo FIRASMfunc.asm el cual se incluirá en el proyecto creado para este filtro en el CCS. El programa principal desarrollado en C, el cual invoca la anterior función se presenta a continuación.

//FIRCASM.c Programa en C FIR llamando la función de Assembler firasmfunc.asm#include "math.h"int y = 0, N=41;short x [41]; //Vector para almacenamiento de los datosshort i;short h[N] = {0,0xff87,0,0x018a,0x02fe,0x02b7,0,0xfc0d,0xf98b,0xfad4,0,0x0653,0x09b0,0x0756,0,0xf7da,0xf407,0xf748,0,0x0904,0x0ccd,0x0904,0,0xf748,0xf407,0xf7da,0,0x0756,0x09b0,0x0653,0,0xfad4,0xf98b, 0xfc0d, 0,0x02b7, 0x02fe, 0x018a, 0,0xff87,0};

interrupt void c_int11 () //ISR{

x [N-1] = input_sample (); // Nuevo dato capturado desde el CODECy = firasmfunc(x, h, N); // Llamado de la función en Assembler

output_sample (y); // Envía dato de salida al CODECreturn; // Retorno de la Interrupción ISR

}

void main (){

comm_intr (); // Inicializa el CODECwhile (1); // Ciclo infinito

}Figura 5.28 Código de programa en C para una aplicación FIR invocando la rutina en Assembler.

Para este caso, se tomó como coeficientes un vector de datos previamente generado desde Matlab, para un filtro Pasa banda de F s=8 KHz. Y frecuencias de corte F l=850 Hz y Fh=1150 Hz . El filtro como puede observarse es de orden N= 41, lo cual lo hace no tan selectivo como en los casos anteriores. El filtro no tiene algún tipo de ventana, lo cual genera las oscilaciones en cada una de las bandas laterales. Las gráficas de los coeficientes tanto en tiempo como en frecuencia se visualizan en la figura 5.29.

Figura 5.29 Gráfica de los coeficientes h, en función del tiempo y de la frecuencia.

Además se debe tener en cuenta que la entrada para la función firasmfunc(x, h, N) son los apuntadores a los vectores de datos x(n) y coeficientes h(n), así como el orden del mismo N, todos ellos debe estar representados en entero con signo de 16 bits, razón por la cual todos los cálculos deben hacerse en función de esta restricción. Ante un eventual caso de que se requiera tener valores en punto flotante, se debe convertir los datos a short3 antes de invocar la función y posteriormente convertir a float4 nuevamente si ese fuere el caso.

5.8.4 Uso de la Librería DSP67X.LIB.

Otra forma de implementar filtros FIR es a través de una librería desarrollada directamente por Texas Instruments. Dicha librería, DSP67X.lib permite incluir a través de la opción #include de C el archivo “dspf_sp_fir_r2.h”, el cual tiene descrita la función void DSPF_sp_fir_r2 (x, h, y, N, L),La cual al ser invocada desarrolla internamente a través de un código Assembler el filtro FIR. Como restricciones se tiene que los vectores de entrada x, salida y y de coeficientes h deben estar en punto flotante. El tamaño de los coeficientes N debe ser par y L es tamaño del vector de salida, el cual debe ser la diferencia entre el tamaño del vector de entrada y el tamaño del vector de coeficientes.

A continuación se describe el código para este programa, teniendo en cuenta que la señal de entrada se simula, los coeficientes se generan internamente con ventana de Hamming, para un tamaño de N=100, con F l = 1000, Fh= 1500 y F s = 10000 Hz.

En el directorio del proyecto deben estar los archivos dspf_sp_fir_r2.h y DSP67X.lib. Este último debe estar incluido desde CCS con la opción “Add files to Project” del menú “Project”.

//Fir.c Filtro FIR aplicado a una señal seno generada internamente con FIR desde la librería DSP67X.lib#include <math.h>#include "dspf_sp_fir_r2.h"float x [500], y[400]; // Reserva espacio en memoria para la señal de entrada y salidafloat h[100]; // Reserva espacio en memoria para los coeficientesint N=100,L=400; // Inicializa el orden del filtro inicial en 100short Fs = 10000; // Inicializa la frecuencia de muestreo en 10000 Hz.short Fl = 1000; // Inicializa la frecuencia de corte en 1000 Hz.short Fh = 1500; // Inicializa la frecuencia de corte en 1000 Hz.

3 short es una representación de datos del lenguaje C para enteros con signo de 16 bits.4 float es una representación de datos del lenguaje C para punto flotante.

short f = 100; // Inicializa la frecuencia de la señal de entrada en 100 Hz.short amp = 1000; // Inicializa la amplitud de la señal de entrada en 1000short n;

void main() {

while (1){

// Comienzo generación de la señal seno for (n=0; n<500; n++)

x[n] = amp * sin (6.28 * f * n/ Fs);// Fin generación señal seno

for (n=1; n< (N+1)/2; n++){

h[(N-1)/2+n] = (sin(6.2832 * Fh * n/ Fs) - sin(6.2832 * Fl * n/ Fs)) / (3.1416*n); h[(N-1)/2- n] = (sin(6.2832 * Fh * n/ Fs) - sin(6.2832 * Fl * n/ Fs)) / (3.1416*n);

}h [(N-1)/2] = 2.0 * (Fh - Fl )/ Fs;

// Enventanado por Hammingfor (n = 1; n < (N+1)/2; n++)

{h[(N-1)/2 + n] = h[(N-1)/2+n] * (0.54 + 0.46 * cos (6.28*n/(N-1)));h[(N-1)/2- n] = h[(N-1)/2+n];}

// Aplicación del filtro a la señal generadaDSPF_sp_fir_r2 (x, h, y, N, L);

// Fin de la aplicación del filtro;}

}Figura 5.30 Código de programa en C para una aplicación FIR con el uso de la librería dsp67x.lib.

La figura 5.31 muestra una gráfica de los coeficientes del filtro, en los cuales se observa que está suavizado a través de la ventana de Hamming.

Figura 5.31 Gráfica de los coeficientes h, en función de la frecuencia.

En la figura 5.32 se presentan las gráficas de entrada salida para diferentes frecuencias de entrada, donde se puede observar que el comportamiento del filtro si concuerda con los parámetros de diseño.

Figura 5.32 Gráfica de la entrada – salida para diferentes frecuencias.

5.8.5 Desarrollo desde LABVIEW.

Otra forma de tener comunicación entre el computador y el DSP es a través del protocolo de comunicación RTDX (Real Time Data Exchange). Dicho protocolo permite comunicarse en forma bidireccional entre el PC y el DSP. Para este caso, se utilizará solamente la comunicación del PC hacía el DSP. Los parámetros básicos del filtro, como son:

Tipo de filtro (LPF, HPF, BPF, SBF) Orden del filtro Frecuencia Baja F l

Frecuencia Alta Fh

Serán enviados desde el programa en Labview. El DSP a través de un canal reservado por RTDX capturará los datos y ajustará el programa para que ejecute el filtro que se haya diseñado.

El siguiente código muestra como es el programa en el DSP.

//rtdx_vbloop.c RTDX usando Labview para un filtro FIR controlado desde Labview#include "rtdx_vb_es_cfg.h" //generado por archivo .cdb#include "dsk6713_aic23.h"#include <math.h>#include <rtdx.h> //codec-DSK Archivo de soporteUint32 fs=DSK6713_AIC23_FREQ_16KHZ; //Fija Frecuencia de Muestreoint fl = 1000,fh=2000,N=101,tipo=0; //Valor de ganancia inicialshort j,n,Fs=16000;

short x[101];float h[101];RTDX_CreateInputChannel(control_channel); //Crea Canal de entrada

interrupt void c_int11() //Atencion a la Interrupcion{ short re,en; en=input_sample(); //Escribe (Entrada con ganancia)

for (j = 0; j < N-1; j++) // Hace el desplazamiento del vector x[N-1-j] = x[N-2-j];

x[0] = en; // Actualiza el vector de datos de entrada

re = 0; // Inicializa el valor resultadofor (j = 0; j< N; j++) re = re + h[j] * x[j]; // Realiza la convolución

output_sample(re);

return;}

void main(){ for (n=1; n< (N+1)/2; n++)

{h[(N-1)/2+n] = (sin(6.2832 * fl * n/ Fs) - sin(6.2832 * fh * n/ Fs)) / (3.1416*n);h[(N-1)/2+n] = h[(N-1)/2+n]* (0.54 + 0.46 * cos (6.28*n/(N-1)));h[(N-1)/2- n] = h[(N-1)/2+n];

}h [(N-1)/2] = 1.0 + 2.0 * (fl - fh) / Fs;

comm_intr(); //Inicializa codec,DSK,MCBSP RTDX_enableInput(&control_channel); //Habilita canal RTDX

while(1) //Loop Infinito { if(!RTDX_channelBusy(&control_channel)) //Si el canal no esta ocupado RTDX_read(&control_channel,&fl,sizeof(fl)); //Leer Gain desde el PC RTDX_read(&control_channel,&fh,sizeof(fh)); //Leer Gain desde el PC RTDX_read(&control_channel,&N,sizeof(N)); //Leer Gain desde el PC

RTDX_read(&control_channel,&tipo,sizeof(tipo)); //Leer Gain desde el PC

switch (tipo){

case 0: for (n=1; n< (N+1)/2; n++)

{h[(N-1)/2+n] = sin(6.2832 * fl * n/ Fs) / (3.1416*n);h[(N-1)/2+n] = h[(N-1)/2+n]* (0.54 + 0.46 * cos (6.28*n/(N-1)));h[(N-1)/2- n] = h[(N-1)/2+n];

}h [(N-1)/2] = 2.0 * fl / Fs;break;

case 1: for (n=1; n< (N+1)/2; n++)

{

h[(N-1)/2+n] = -sin(6.2832 * fl * n/ Fs) / (3.1416*n);h[(N-1)/2+n] = h[(N-1)/2+n]* (0.54 + 0.46 * cos (6.28*n/(N-1)));h[(N-1)/2- n] = h[(N-1)/2+n];

}h [(N-1)/2] = 1.0 -2.0 * fl / Fs;break;

case 2: for (n=1; n< (N+1)/2; n++)

{h[(N-1)/2+n] = (sin(6.2832 * fh * n/ Fs) - sin(6.2832 * fl * n/ Fs)) / (3.1416*n);h[(N-1)/2+n] = h[(N-1)/2+n]* (0.54 + 0.46 * cos (6.28*n/(N-1)));h[(N-1)/2- n] = h[(N-1)/2+n];

}h [(N-1)/2] = 2.0 * (fh - fl) / Fs;break;

case 3: for (n=1; n< (N+1)/2; n++)

{h[(N-1)/2+n] = (sin(6.2832 * fl * n/ Fs) - sin(6.2832 * fh * n/ Fs)) / (3.1416*n);h[(N-1)/2+n] = h[(N-1)/2+n]* (0.54 + 0.46 * cos (6.28*n/(N-1)));h[(N-1)/2- n] = h[(N-1)/2+n];

}h [(N-1)/2] = 1.0 + 2.0 * (fl - fh) / Fs;break;}

}}

Figura 5.33 Código de programa en C para una aplicación FIR con interface desde Labview.

Como puede observarse en el anterior código, el filtro en este caso recibe vía RTDX por el canal control_channel los cuatro datos enviados desde la interface del PC. El filtro está permanentemente calculando los coeficientes del filtro y por otro lado desde la interrupción se ejecuta la convolución. El filtro siempre trabaja con una ventana de Hamming.

En la figura 5.34 se observa el diagrama correspondiente la interface de usuario en Labview.

Figura 5.34 Interface en Labview para envío de parámetros FIR

Figura 5.35 Código en Labview para envío de parámetros FIR

A través de Labview se capturan los diferentes parámetros de programación del filtro, y posteriormente a través de un canal RTDX (control_channel) se envía al DSP para su control y operación.

5.8.6 Interface entre Visual Studio y el DSP para la ejecución de un filtro FIR.

Al igual que en el caso de Labview, en este caso se usará el protocolo RTDX. La Interface en el computador se elabora con Visual Basic. En la figura 5.36 se muestra como queda la interface de usuario para el envío de los datos hacía el DSP.

Figura 5.36 Interface en Visual Basic para envío de parámetros FIR

El proceso en Visual Basic asociado al comando Enviar Datos está descrito en el siguiente código:

Private Sub Command1_Click()Dim rtdx As ObjectDim data As LongDim bufferstate As LongDim status As Long

On Error GoTo Error_Handler

Set rtdx = CreateObject("RTDX")

status = rtdx.Open("control_channel", "W")

If status <> Success ThenDebug.Print "Opening of channel ichan failed"GoTo Error_HandlerEnd If

data = frec_baja.Textstatus = rtdx.WriteI4(data, bufferstate)

data = frec_alta.Textstatus = rtdx.WriteI4(data, bufferstate)

data = orden.Textstatus = rtdx.WriteI4(data, bufferstate)

' Cerrar el canal

status = rtdx.Close()

Set rtdx = NothingExit Sub

Error_Handler:

Debug.Print "Error in COM method call"

Set rtdx = NothingEnd Sub

Figura 5.37 Código de programa en Visual Basic para envío de parámetros al DSP vía RTDX.

El canal RTDX creado fue control_channel, de tal forma que en el DSP también debe coincidir con este canal para recibir todos los datos. Igualmente se debe tener el mismo orden en que fueron enviados para su correspondiente lectura en el DSP. El DSP estará trabajando con un filtro FIR rechazo de banda con ventana de Hamming y el usuario solamente le programará las frecuencias de corte y el orden.

El programa en el DSP se muestra en el siguiente código.

// RTDX usando Visual basic para un loop con filtro FIR#include "rtdx_vb_es_cfg.h"#include "dsk6713_aic23.h"#include <math.h>#include <rtdx.h> //codec-DSK Archivo de soporteUint32 fs=DSK6713_AIC23_FREQ_16KHZ; //Fija Frecuencia de Muestreo

int fl = 1000,fh=2000,N=101;short j, n, Fs = 16000;short x[101];float h[101];RTDX_CreateInputChannel(control_channel); //Crea Canal de entrada

interrupt void c_int11() //Atencion a la Interrupcion{ short re,en; en=input_sample(); //Lee entrada

for (j = 0; j < N-1; j++) // Hace el desplazamiento del vector x[N-1-j] = x[N-2-j];

x[0] = en; // Actualiza el vector de datos de entrada re = 0; // Inicializa el valor resultado

for (j = 0; j< N; j++) re = re + h[j] * x[j]; // Realiza la convolución

output_sample(re);return;}

void main(){ for (n=1; n< (N+1)/2; n++) {

h[(N-1)/2+n] = (sin(6.2832 * fl * n/ Fs) - sin(6.2832 * fh * n/ Fs)) / (3.1416*n);h[(N-1)/2+n] = h[(N-1)/2+n]* (0.54 + 0.46 * cos (6.28*n/(N-1)));h[(N-1)/2- n] = h[(N-1)/2+n];

} h [(N-1)/2] = 1.0 + 2.0 * (fl - fh) / Fs;

comm_intr(); //Inicializa codec,DSK,MCBSP RTDX_enableInput(&control_channel); //Habilita canal RTDX

while(1) //Loop Infinito { if(!RTDX_channelBusy(&control_channel)) //Si el canal no esta ocupado RTDX_read(&control_channel,&fl,sizeof(fl)); //Leer fl desde el PC RTDX_read(&control_channel,&fh,sizeof(fh)); //Leer fh desde el PC RTDX_read(&control_channel,&N,sizeof(N)); //Leer N desde el PC

for (n=1; n< (N+1)/2; n++) {

h[(N-1)/2+n] = (sin(6.2832 * fl * n/ Fs) - sin(6.2832 * fh * n/ Fs)) / (3.1416*n);h[(N-1)/2+n] = h[(N-1)/2+n]* (0.54 + 0.46 * cos (6.28*n/(N-1)));h[(N-1)/2- n] = h[(N-1)/2+n];

} h [(N-1)/2] = 1.0 + 2.0 * (fl - fh) / Fs; }}

Figura 5.38 Código de programa en C para una aplicación FIR recibiendo datos desde el PC vía RTDX.

Existen otras formas de conectar al DSP con el PC, por ejemplo con un desarrollo en Visual C, donde se usan los mismos principios tratados en este apartado.

5.8.7 Interface entre MATLAB y el DSP para la ejecución de un filtro FIR.

Otra opción interesante en este tipo de aplicaciones es el uso de MATLAB y sus librerías para conexión entre este software y el CCS. Al igual que en el caso de Labview, se utilizará la conexión a través de un canal de RTDX. Dicho canal se denominará Control_channel, el cual se tiene que programar tanto en el DSP como en el programa en MATLAB. La aplicación en el DSP es la misma que se utilizó para conectar a través de Labview. En el programa en MATLAB se desarrolló un GUI5. Dicha interface tiene varias funcionalidades de acuerdo a los requerimientos de la aplicación. Los datos capturados son:

Frecuencia Baja. Frecuencia Alta. Tipo de Filtro. Orden del Filtro.

Además las funciones programadas son:

Ejecutar el CCS. Esta funcionalidad sirve para realizar todo el protocolo de conectividad con el CCS. Se debe abrir el CCS, abrir el proyecto, descargar el ejecutable y correr el programa.

Finalizar el CCS. Con esta opción se para la ejecución del DSP. Envío de datos al DSP. Con esta orden se programa el canal de comunicaciones

RTDX, se envían los cuatro parámetros y luego se cierra el canal.

En la figura 5.39 se observa la interface de usuario.

Figura 5.39 Interface en MATLAB para la programación de un FIR.

5 GUI. Graphic User Interface.

En la figura 5.40 se presenta el código en MATLAB. Para cada botón de control de la interface está asociada la tarea que desarrolla el programa.

function varargout = fir_matlab(varargin)gui_Singleton = 1;gui_State = struct('gui_Name', mfilename, ...

'gui_Singleton', gui_Singleton, ... 'gui_OpeningFcn', @fir_matlab_OpeningFcn, ... 'gui_OutputFcn', @fir_matlab_OutputFcn, ... 'gui_LayoutFcn', [] , ... 'gui_Callback', []);

if nargin && ischar(varargin{1}) gui_State.gui_Callback = str2func(varargin{1});

end if nargout [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});

else gui_mainfcn(gui_State, varargin{:});

end

function fir_matlab_OpeningFcn(hObject, eventdata, handles, varargin)handles.output = hObject;guidata(hObject, handles);

function crear_RTDX_Callback(hObject, eventdata, handles)a=str2double(get(handles.FL,'String'));b=str2double(get(handles.FH,'String'));c=str2double(get(handles.Tipo,'String'));d=str2double(get(handles.Orden,'String'));cc = ccsdsp;rx = cc.rtdx;open(rx,'control_channel','w');enable(rx,'control_channel');writemsg(cc.rtdx,'control_channel', int32(a));writemsg(cc.rtdx,'control_channel', int32(b));writemsg(cc.rtdx,'control_channel', int32(d));writemsg(cc.rtdx,'control_channel', int32(c));close(rx,'control_channel');

function pushbutton2_Callback(hObject, eventdata, handles)delete(handles.figure1) ;

function Ejecutar_Callback(hObject, eventdata, handles)cc = ccsdsp('boardnum',0,'procnum',0);cc.timeout = 20;demodir = '.\';cd(cc,demodir);open(cc,'rtdx_lv_es_fir.pjt'); % use for c62x/c67x processorsvisible(cc,1);load(cc,'.\debug\rtdx_lv_es_fir.out');cc.run;

function Cerrar_CCS_Callback(hObject, eventdata, handles)cc = ccsdsp('boardnum',0,'procnum',0);cc.halt;

Figura 5.40 Código de MATLAB para el filtro FIR.

5.9 APLICACIÓN SOBRE EL C5535.

Texas Instruments también ha desarrollado otra tarjeta para entrenamiento basado en el DSP TMS320C5535. Dicho DSP es de punto fijo, razón por la cual tiene algunas consideraciones que se observarán en el siguiente apartado. Por otro lado, para el desarrollo de los proyectos se usará el Code Composer Studio CCS V46.

Al igual que en con el anterior entrenador, se revisarán los códigos para algunos casos específicos que se amerita se revise el funcionamiento.

5.9.1 Programación en C con entrada-salida en Tiempo Real.

A continuación se observa el programa completo desarrollado en C para este DSP. Cabe anotar que por la naturaleza de la tarjeta con la cual se desarrolló el proyecto, esta no permite en tiempo real cambiar los parámetros del programa como es el caso del tipo de filtro, o las frecuencias de corte, por tal razón el código de cálculo de los coeficientes se desarrolla externamente al while, con lo cual cada vez que se cambie un parámetro se deberá compilar todo el proyecto y volverlo a cargar.

#include "stdio.h"#include "ezdsp5535.h"#include "ezdsp5535_i2c.h"#include "math.h"#include "ezdsp5535_i2s.h"#include "csl_i2s.h"

extern programa_codec();

short d1, d2,gd=1,gi=1;short m,fl=1000,fh=2000,sel=0,i;Uint16 fs=48000,N=25;Int32 x[200],h[200],r;

void main( void ){

switch(sel){

case 0: h[(N-1)/2]=4000.0 *fl/fs ;

for (m=1;m<=((N-1)/2);m++) {

h[(N-1)/2 - m]=(2000/(3.1416*m))*sin(6.2832*m*fl/fs)*(0.54+ 0.46*cos(6.2832*m/(N-1))); h[(N-1)/2 + m]=h[(N-1)/2 - m]; } break;

case 1: h[(N-1)/2]=2000.0 -(4000.0*fl)/fs ;

for (m=1;m<=((N-1)/2);m++) { h[(N-1)/2 - m]=-(2000/(3.1416*m))*sin(6.2832*m*fl/fs)*(0.54+ 0.46*cos(6.2832*m/(N-1))); h[(N-1)/2 + m]=h[(N-1)/2 - m]; }

6 CCS V4. Propiedad de Texas Instruments.

break;

case 2:h[(N-1)/2]=4000.0*(fh-fl)/fs ;

for (m=1;m<=((N-1)/2);m++) {

h[(N-1)/2 - m]=(2000/(3.1416*m))*(sin(6.2832*m*fh/fs)-sin(6.2832*m*fl/fs))*(0.54+ 0.46*cos(6.2832*m/(N-1)));

h[(N-1)/2 + m]=h[(N-1)/2 - m]; } break;

case 3:h[(N-1)/2]= 2000.0 + 4000.0*(fl-fh)/fs ;

for (m=1;m<=((N-1)/2);m++) {

h[(N-1)/2 - m]=(2000/(3.1416*m))*(sin(6.2832*m*fl/fs)-sin(6.2832*m*fh/fs))*(0.54+ 0.46*cos(6.2832*m/(N-1)));

h[(N-1)/2 + m]=h[(N-1)/2 - m]; } break;

}

programa_codec();

while (1){

EZDSP5535_I2S_readRight(&d2); // Lectura del Dato for (i=0;i<N-1;i++)

x[N-1-i]= x[N-2-i];x[0]=d2;r=0;for (i=0;i<N ;i++)r= r+ (x[i]*h[i]);r=r/2000;

EZDSP5535_I2S_writeRight(r); // Escritura del dato de salida }

}Figura 5.39 Código de programa en C para una aplicación FIR con el DSP TMS320C5535 en CCS V4.

Es importante observar varios aspectos que son diferentes respecto al DSP 6713. Debido a que este DSP es de punto fijo, es importante tener en cuenta que las operaciones matemáticas tales como la multiplicación en punto flotante se vuelven demasiado largas, por tal razón los coeficientes son normalizados a un valor entero, que en este caso fue 2000. Al final el resultado se divide entre 2000 para volver al valor correcto.

Otro aspecto que hay que tener en cuenta es que este DSP trabaja con un reloj de 100 MHz, por tal razón el ciclo de reloj es de 10 nanosegundos. Al leer el dato de entrada se hacen unos cálculos aritméticos, como es la convolución, además del desplazamiento del vector x. Realizando las medidas desde el CCS se concluyó que aproximadamente por cada valor de longitud del orden se utilizan 81 ciclos de reloj, lo cual equivale a 0.81 microsegundos. Al incrementar el orden este valor se vuelve más grande en forma directamente proporcional, afectando la frecuencia de muestreo. Por ejemplo, para un tamaño de 25 el tiempo que tardó el DSP en hacer estos cálculos fue de 21,86 microsegundos, lo cual afecta la frecuencia de muestreo, que originalmente es de 48000 Hz, con un periodo de aproximadamente 20 microsegundos. Es decir el periodo de muestreo se convierte en 41,86 microsegundos, con

una frecuencia de muestreo de aproximadamente 24 KHz. Por tal razón es importante en un diseño real, calcular los coeficientes con este último valor para tener el filtro correcto.

Cada vez que se cambie el orden, debe realizarse estos cálculos para hallar la frecuencia de muestreo real de trabajo.

5.10 REFERENCIAS.

1. Tompkins, Willy. 1993. Biomedical Digital Signal Processing. Prentice Hall. Páginas 100-123.

2. Chassaing, Rulph. 2005. Digital Signal Processing and Applications with the C6713 and C6416 DSK. Wiley Editores. Páginas 120 – 176.

3. Dahnoun, Naim. 2000. Digital Signal Processing Implementation using TMS320C6000 DSP Platform. Prentice Hall. Páginas 79 – 113.

4. DeFatta, Lucas. 2000. Digital Signal Processing. Prentice Hall. Páginas 193 – 235.

5.11 EJERCICIOS.

5.1 Diseñar un filtro FIR por el método de los ceros con las siguientes características:

Frecuencia de Muestreo 20000 Hz. Frecuencia de Rechazo 1000 Hz. Filtro de Rechazo de banda.

Generar la ecuación de diferencias finitas y modelar la función de transferencia en el Software de Simulación provisto en el texto.

5.2 Implementar en el DSP el anterior ejercicio revisando la entrada y la salida verificando con la función de transferencia generada en el ejercicio 5.1

5.3 Mejorar la aplicación desarrollada en el literal 5.8.7 para que sea la interface de MATLAB la que genere los coeficientes y los transmita al DSP, y este solamente genere la convolución.

5.4 Cambiar en el código del DSP la ventana de Hamming por la ventana de Blackman y revisar las dos funciones de transferencia y comentar los resultados.

5.5 Consultar en la herramienta de Simulink de MATLAB la forma de programar al DSP DSK6713 y realizar un filtro FIR básico utilizando dichos conceptos. Comparar con la solución planteada en el presente texto.

5.6 Consultar la forma como realizar un filtro FIR en la plataforma C5535 utilizando librerías propias de la plataforma. (Revisar en www.spectrumdigital.com)