Está en la página 1de 41

5

FILTROS DIGITALES FIR.

Filtro digital FIR.


Diseo de Filtros FIR usando diferentes mtodos.
Ejemplos de Programacin.

Los filtros digitales han venido remplazando a los filtros anlogos en una gran variedad de
aplicaciones industriales. La comodidad del diseo, as como la calidad de la respuesta en
frecuencia hacen de este tipo de herramientas una posibilidad excelente para el procesamiento
digital de seales. Existen una gran variedad de mtodos de diseo de este tipo de filtros, as como
la posibilidad de implementarlos muy fcilmente en un dispositivo digital como un DSP u otro
elemento que permita realizar el algoritmo de convolucin, ya que bsicamente un filtro FIR es el
proceso de convolucin entre dos vectores.

5.1 INTRODUCCION.

Una de las principales aplicaciones que se tiene en el procesamiento de seales es precisamente


los filtros. Un filtro es un sistema que tiene la capacidad de tener diferentes comportamientos
dependiendo la frecuencia de la seal de entrada. Un filtro digital es bsicamente una ecuacin 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 seal de
entrada debe tener una BW limitado, es decir que se conozca la mxima frecuencia de entrada, para
poder determinar la Frecuencia de Muestreo ( F s ) necesaria para cumplir con Nyquist. Si
eventualmente la seal de entrada no tuviera una frecuencia mxima conocida, o si por limitaciones
de Hardware se tuviera una restriccin en cuanto a la F s , se hace necesario limitar el BW a la
entrada con un filtro anlogo, tal y como se muestra en la figura 5.1.

Como puede observarse en dicha figura, la seal de entrada tiene un espectro de frecuencia mayor
que F s /2 , razn por la cual se debe aplicar un filtro pasabajo que limite el ancho de banda final
hasta F s /2 , para evitar el fenmeno de aliasing 1, es decir frecuencia por encima de la frecuencia
mxima permitida, que en un sistema de procesamiento digital va a generar seales indeseables.
1 Aliasing: Frecuencias no deseadas que aparecen cuando la seal digitalizada es ms alta que la mitad de la frecuencia
de muestreo.
Filtro
Seal Seal
Entrada Pasabajo Salida
Fc <Fs/2

Fs/2 F Fs/2 F

Figura 5.1

Dentro de los diseos e implementaciones de filtros digitales existen bsicamente dos opciones,
dependiendo de la respuesta que tenga el sistema al impulso unitario. De ah que se clasifiquen en
filtros FIR o IIR, segn sea que tengan repuesta finita al impulso o respuesta infinita al impulso
unitario. En la siguiente seccin se describir detalladamente el concepto de repuesta al impulso
unitario.

5.2 RESPUESTA AL IMPULSO UNITARIO.

Un sistema digital bsico tiene una entrada tradicionalmente llamada x[n] y una salida y[n]. Tanto x[n]
como y[n] son seales 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 excitacin, la cual es llamada como Respuesta al Impulso Unitario o h[n]. El
impulso unitario [n] se representa matemticamente como:

{
[ n ]= 1 para n=0
0 para n>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 ecuacin de
diferencias:

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

O simplificando
y [ n ] =x [ n ] + x [ n1 ] + x [n2]

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

y [ n ] = [ n ] + [ n1 ] + [n2]
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 realimentacin, es decir, que en la ecuacin de diferencias solamente
dependen de componentes retrasadas de x[n], y no de valores de y [nk ] , para cualquier k, se
denominan filtros FIR, ya que siempre llegarn a un valor estable en 0. Ahora bien, un filtro
realimentado, es decir que dependa de algn componente y [nk ] , puede tambin 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 anlisis 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 [nk ] , como de
y [ nm] .

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 ecuacin de diferencias que representa el sistema discreto descrito en la figura 5.3 es:

y [ n ] =x [ n ] + . y [ n1 ] (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 4
X[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 ecuacin siempre ser diferente de 0, con lo cual se puede decir que tiene una longitud infinita, por tal razn
dicho filtro se puede considerar un filtro IIR.

5.3 FORMA CANONICA DE UN FILTRO FIR.

Un filtro FIR tiene una representacin cannica tanto en forma grfica, en forma de ecuacin de
diferencias y en forma de Funcin de Transferencia (En funcin de la transformada Z).

La ecuacin general en forma de diferencias finitas est dada por:


N 1
y [ n ] = h ( k ) x ( nk ) (5.6)
k=0

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

Frecuencia de Muestreo
Tipo del filtro (LPF, HPF, BPF o SBF)2
Frecuencias de corte ( Fl , 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 seccin posterior se analizar la forma de calcular los coeficientes caractersticos del filtro.
Como se puede observar, la ecuacin descrita anteriormente corresponde a la multiplicacin de dos
vectores, uno que corresponde a los coeficientes, el cual no cambia durante todo el proceso,
mientras que el otro, el de x [nk ] , va cambiando a medida que avanza el tiempo y representa
las ltimas k muestras que el sistema ha tomado de la seal de entrada. Es decir, que la salida
actual depende de las ltimas k muestras de entrada solamente y no depende de algn estado
previo de salida, lo cual obligara a tener un sistema realimentado.

Otra forma de observar el sistema FIR es a travs de una forma grfica. En la figura 5.4 podemos
observar la topologa para este sistema:

2 LPF = Filtro Pasa bajo, HPF = Filtro Pasa alto, BPF = Filtro Pasa banda y SBF =
Filtro de Rechazo
Figura 5.4 Forma Cannica de un filtro FIR.

Por ltimo, se representa el sistema en forma de su Funcin de Transferencia en el dominio Z, es


decir en el dominio de la frecuencia discreta, de la siguiente forma:
N 1
H ( z )= hk z k (5.7)
k=0
Siendo
hk =h ( k ) (5.8)

En donde se observa que la Funcin tiene la misma cantidad de ceros y polos, estos ltimos
ubicados todos en el origen, evitando la posible realimentacin en el sistema, aspecto que si sucede
en un filtro IIR, tal y como se observar en el siguiente captulo.

5.4 RESPUESTA EN FRECUENCIA DE UN FILTRO FIR.

La transformada Z de h[n] es H(z), la cual representa la funcin de transferencia del sistema. Ahora
bien, por definicin tenemos que
z=e jT (5.9)

Siendo T el periodo de muestreo del sistema.

Si se remplaza a Z por su representacin 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 ecuacin de diferencias para el sistema descrito en la figura anterior es:

y [ n ] =0.333 x [ n ] +0.333 x [ n1 ] + 0.333 x [ n2 ] (5.10)

Aplicando la transformada Z tenemos


Y ( z ) =0.333 X ( z ) +0.333 z1 X ( z ) + z2 X ( z)

H ( z )=Y ( z)/ X (z )=0.333+ 0.333 z 1 +0.333 z2

Remplazando z por e jT

H ( e jT )=0.333 ( 1+ e jT + e j2 T )
O
H ( e jT )=0.333 e jT ( e jT +1+e jT )

H ( e jT )=0.333 e jT ( 2 cos ( T )+1 )

Fs
2 f /+1
2cos
H ( e )=0.333 e j 2 f / F
jT s

Donde la Magnitud est dada por:

|H ( e jT )|=|2 cos ( 2 f /F s ) +1|(5.11)


Y la fase
( e jT )=2 f /F s (5.12)

La grfica 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. Adems se puede
observar que la fase del sistema es lineal, aspecto que es tpico dentro de los criterios de diseo de los filtros
digitales.

5.5 DISEO DE UN FILTRO FIR POR EL METODO DE CEROS.

En el plano complejo Z se tiene el crculo unitario (radio r = 1), el cual determina la regin de
convergencia de un sistema o filtro digital. Sobre el crculo se pueden ubicar los ceros de la funcin
de transferencia H (z), teniendo en cuenta que se conoce la Frecuencia de Muestreo F s , la
relacin entre el ngulo del crculo 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 funcin de transferencia. En la figura


5.7 se observa claramente la distribucin:

Figura 5.7

Como se sabe, un cero en una funcin de transferencia hace que el sistema tenga una atenuacin
completa en ese punto, y como la funcin de transferencia est en funcin de la frecuencia, se
infiere que en dicha frecuencia especfica existir un rechazo completo.

5.5.1 Diseo de un Filtro Pasa Bajo.

Teniendo en cuenta que en un filtro digital la frecuencia es peridica con periodo F s , se


contempla el recorrido desde F s / 2 hasta F s /2 , para tener una simetra en el diseo, y as
evitar el trabajar con valores complejos, dado que se tienen los complejos conjugados para efecto de
diseo. Las altas frecuencias estn ubicadas en la cercana de F s /2 , por tal razn 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 condicin de diseo para este tipo de filtros, que
el nmero de ceros de la funcin de transferencia sea igual al nmero de polos para evitar tener
seales adelantadas en el tiempo. Otra condicin de diseo es que todos los polos estn ubicados
en el origen, o de lo contrario el sistema genera una realimentacin, con lo cual no se garantiza que
la respuesta al impulso unitario sea finita.
En consecuencia tenemos que la funcin de transferencia para un filtro de primer orden (un solo
cero), estar dada por:

z +1
H ( z )= =1+ z1 (5.14)
z
Como
H ( z )=Y (z)/ X ( z )
Entonces
Y ( z ) =X ( z ) + z 1 X ( z )
O
y [ n ] =x [ n ] + x [ n1 ]

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

( z +1 ) 2
H ( z )= 2 (5.15)
z
O equivalente a:
1 2
H ( z )=1+ 2 z + z
Como
H ( z )=Y (z)/ X ( z )
Entonces
Y ( z ) =X ( z ) +2 z1 X ( z ) + z2 X (z )

Y aplicando la transformada inversa tenemos

y [ n ] =x [ n ] +2 x [ n1 ] + x [ n2 ] (5.16)

En las figuras 5.8 y 5.9 se pueden observar las respuestas a cada sistema en funcin 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


ecuacin final. Igualmente se observa que la respuesta de la fase es lineal, lo cual es una
caracterstica tpica 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
ms selectivo, pero no se puede parametrizar la frecuencia de corte, lo cual no lo haca muy til en
muchos casos.

5.5.2 Diseo de un Filtro Pasa Alto.


Siguiendo los mismos criterios utilizados en el tem anterior, se puede considerar el diseo de un
filtro pasa alto, excepto que en este caso el o los ceros estarn 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
atenuacin, mientras que para las frecuencias que estn en cercanas de F s /2 haya un paso
total de la seal. Por lo dems, se mantiene el hecho de igualdad de ceros y polos, estos ltimos
ubicados en el origen (0+0j).

La funcin de transferencia est dada por:


z1
H ( z )= (5.17)
z
Mientras que la ecuacin de diferencias es:

y [ n ] =x [ n ]x [ n1 ]

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

( z1 ) 2
H ( z )= (5.18)
z2
Con ecuacin de diferencias:

y [ n ] =x [ n ]2 x [ n1 ] + x [n2]

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 Diseo 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 mxima atenuacin, dejando pasar frecuencias intermedias. Por tal razn la ubicacin
de los ceros se establecern en 0 Hz y en F s /2 , es decir sobre el plano complejo en 0+1j y 0-1j.

La funcin de transferencia est dada por:

( z1 ) ( x+1 )
H ( z )= (5.19)
z
O equivalente a:
2
H ( z )=1z
Como
Y ( z)
H ( z )=
X ( z)
Entonces
Y ( z ) =X ( z ) z2 X ( z )

Mientras que la ecuacin de diferencias es:

y [ n ] =x [ n ]x [ n2 ]

Para este caso, ya que deben existir mnimo 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 Diseo de un Filtro Rechazo de Banda.

Para el diseo 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 ecuacin xxx. En la figura 5.13 se describe la ubicacin de los
ceros, ya que se debe tener en cuenta el cero del complejo conjugado para evitar tener
componentes complejas en la funcin de transferencia.

Figura 5.13 Plano Z con la ubicacin 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 funcin de transferencia queda:

( zcos jsen ) ( z cos+ jsen )


H ( z )= (5.20)
z2

O equivalente a:
H ( z )=12 cos z1+ z 2

Mientras que la ecuacin de diferencias es:

y [ n ] =x [ n ]2cosx [ n1 ] + x [ n2 ] (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 DISEO DE UN FILTRO FIR POR EL METODO DE FOURIER.

Partiendo del hecho de que la frecuencia en un filtro digital es peridica con periodo F s , se puede
disear un filtro digital teniendo como espacio valido en frecuencia desde F s /2 hasta F s /2
. En consecuencia se puede tener como condicin en el diseo la repeticin peridica 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 disea en forma simtrica sobre el eje de 0 Hz, con repeticin en cada mltiplo de F s .
No hay problema en el comportamiento del filtro para esas frecuencias, ya que por el teorema de
Nyquist no puede existir seales mayores a F s /2 , razn por la cual la frecuencia de inters para
el sistema es de 0 Hz hasta F s /2 .

Se puede observar que es una onda cuadrada peridica con periodo F s , con la frecuencia como
abscisa, por lo cual se puede aplicar la transformada inversa de Fourier. En tal sentido la funcin de
transferencia se puede representar como:
j 2 fn

H ( f )= h ( n) e Fs
(5.22)
n=
Con los coeficientes definidos de la forma:
F s /2
1 j 2 fn/ F )
h ( n )= H ( f ) e( df (5.23)
s

Fs F /2 s

Como puede observarse en la ecuacin (5.23), la serie de va desde hasta + , con lo


cual se volvera un filtro de orden infinito, razn por la cual se vuelve inmanejable el diseo y la
implementacin del mismo en un dispositivo digital o de software. Para subsanar este problema,
dicha ecuacin se trunca a un valor de tamao N, el cual ser el orden del filtro final. Para evitar
problemas de valores finales complejos, dicho truncamiento se realiza en forma simtrica sobre el
valor de 0, es decir, entre ( N1 ) /2 hasta ( N +1 ) /2 , con lo cual se contemplan los
complejos conjugados en el momento de los clculos finales. De esta forma la nueva ecuacin de la
funcin de transferencia queda de la forma:
( N +1)
2 j 2 fn

H ( f )= h (n) e Fs
(5.24)
( N 1 )
n=
2

Al calcular los coeficientes con la ecuacin (5.24), se tendran ndices negativos y positivos, razn
por la cual se presentan inconvenientes al hacer el calculo de la convolucin, que en definitiva es el
procedimiento para implementar el filtro, ya que la ecuacin de diferencias para un filtro FIR estar
dado por:
n=N 1
y [n ]= hd ( k ) x ( nk ) (5.25)
k=0
Para realizar el ajuste se propone hacer un desplazamiento de los coeficientes h( n) , de la
siguiente forma:

N 1
(
hd ( k )=h k
2 )
, 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.
Fl
1 ( j 2 fn/ F )
h ( n )=
Fs F
1. e df , s

Fl

|
j 2 fn/ F s j2 Fl n/ F s ) j 2 Fl n / Fs )
1 e( )
e( e ( sen (2 Fl n /F s )
h ( n )= = =
F s j2 n/ F s F L
2 jn n

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

En consecuencia los coeficientes finales para el filtro del ejemplo estn 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 simulacin del comportamiento del sistema, se tiene la siguiente
grfica:

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 grficas
ideales de la funcin 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 integracin del ejemplo 5.4, se tienen las siguientes ecuaciones
generales para cada uno de los cuatro filtros tpicos enunciados anteriormente.

Tipo de Filtro Ecuaciones generales

sen(2 F l n/ F s)
h ( n )=
Filtro Pasa bajo. n

h ( 0 )=2 F l /F s

sen (2 F l n / F s )
h ( n )=
Filtro Pasa Alto. n

h ( 0 )=12 F l / F s
sen ( 2 F h n /F s ) sen (2 F l n /F s )
h ( n )=
Filtro Pasa Banda. n

h ( 0 )=2 ( F hf l ) / F s

sen ( 2 F l n /F s ) sen (2 F h n /F s )
h ( n )=
Filtro Rechazo de Banda. n

h ( 0 )=1+2 ( F lf h ) / F s
Tabla 5.2 Ecuaciones Generales de los coeficientes de los cuatro filtros tpicos.

5.7 ENVENTANADO DE FILTROS FIR.

Si se tiene en cuenta que en este tipo de diseo, se parte del comportamiento de una onda cuadrada
y su representacin en series de Fourier, al hacer el truncamiento obviamente aparece el fenmeno
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 ondulacin se hace ms
notoria, tanto en la parte de paso del filtro como en la parte de atenuacin del mismo. En ese sentido
existen varios estudios para disminuir ese nivel de ondulacin a travs de las funciones de ventana o
simplemente el efecto de enventanado.

5.7.1 Ventana de Hamming.

La ventana de Hamming est dada por:

{
2 n N 1
a H ( n )= 0.54+0.46 cos N 1 paran 2 (5.26)
0 Otro caso

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

h f ( n )=a H ( 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 grfica 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 ecuacin (5.26) son:

a H [ 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 simulacin del comportamiento del sistema, se tiene la siguiente
grfica:

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:

{
2 n 4 n N 1
a B ( n )= 0.42+0.5 cos N 1 + 0.08 cos N 1 paran 2 (5.28)
0Otro caso

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

h f ( n )=a B ( 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 APLICACIN 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 desarrollarn las
siguientes aplicaciones para la implementacin de un filtro FIR en un ambiente de tiempo real.

Se tienen diversas opciones, tales como la captura desde un conversor anlogo a digital con salida
sobre un conversor anlogo a digital, desarrollando el algoritmo en lenguaje C, en Assembler o con
uso de libreras propias del fabricante, hasta tener la posibilidad de simular la seal de entrada a
travs del propio cdigo interno del programa, o desde un archivo almacenado en memoria del
Computador, para poder descargarlo a una direccin fsica del DSP.

5.8.1 Programacin en C con seal simulada en el programa.

En el presente apartado se describir la forma como se puede implementar un filtro FIR aplicado a
una seal senoidal, previamente generada dentro del mismo programa. El usuario final podr
cambiar los parmetros de la seal (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 diseado. Adicionalmente, se podrn cambiar algunos parmetros del
filtro, tales como el tipo del filtro (LPF, HPF, BPF, SBF), frecuencia de corte baja Fl , frecuencia
de corte alta Fh , orden del filtro N, seleccin 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 grficas que aporta dicha plataforma de desarrollo.

//Fir.c Filtro FIR aplicado a una seal seno generada internamente


#include <math.h>
short x [1500], y[1000]; // Reserva espacio en memoria para la seal de entrada y salida
float h[500]; // Reserva espacio en memoria para los coeficientes
short N=101; // Inicializa el orden del filtro inicial en 101
short 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 LPF
short f = 100; // Inicializa la frecuencia de la seal de entrada en 100 Hz.
short amp = 1000; // Inicializa la amplitud de la seal de entrada en 1000
short ven = 0; // Inicializa sin ventana. Con 1 selecciona Hamming. Con 2 selecciona Blackman.

short i, n, k;
float r;

void main()
{
while (1)
{
// Comienzo generacin de la seal seno
for (i=0; i<1500; i++)
x[i] = amp * sin (6.28 * f * i/ Fs);
// Fin generacin seal seno

// Generacin de los coeficientes del filtro


switch (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 generacin de los coeficientes del filtro


}

// Aplicacin de la ventana sobre los coeficientes


switch (ven)
{
case 0:
// Sin ventana
break;
case 1:
// Con ventana Hamming
for (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 Blackman
for (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

// Aplicacin del filtro a la seal generada


for (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 aplicacin del filtro;
}
}
Figura 5.22 Cdigo del programa en C para el CCS con una seal simulada en el DSP.

Respecto al tamao 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 informacin completa en
la seal de entrada. Con esta estimacin se puede tener un orden de hasta N = 500 sin afectar la
seal de salida.
En la figura 5.23 se observa un quick watch del CCS, sobre el cual el usuario puede controlar los
diferentes parmetros del programa.

Figura 5.23 Quick Watch para controlar los parmetros del programa.

En la figura 5.24 se observan las grficas de entrada y salida para una seal seno de 1000 Hz, con
amplitud 1000, aplicada al filtro Pasa bajo de orden N=101 y frecuencia Fl = 1000.

Figura 5.24 Grficas de Entrada y Salida del filtro LPF.

En la figura 5.25 se puede ver la respuesta en frecuencia del filtro entregada aplicndole FFT a los
coeficientes del filtro.
Figura 5.25 Grfica de los coeficientes h, en funcin de la frecuencia.

5.8.2 Programacin en C con Entrada/Salida en Tiempo Real.

Para este caso, se presenta la posibilidad de capturar una seal generada desde un Generador
externo de seales, la cual entrar a travs del Conversor Anlogo a Digital que posee el DSK6713.
Posteriormente se aplica el filtro a dicha seal, para luego ser enviada al exterior a travs del
Conversor Digital a Anlogo del mismo DSK.

Las otras caractersticas del filtro son las mismas del apartado anterior. A continuacin se describe
todo el cdigo 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 seal de entrada y salida
float h[500]; // Reserva espacio en memoria para los coeficientes
short N=101; // Inicializa el orden del filtro inicial en 101
short 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 LPF
short 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() // Interrupcin 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 resultado


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

output_sample(re); // Enva el resultado al CODEC


return;
}

void main()
{
comm_intr (); // Inicializa al CODEC del DSK6713.
while (1)
{
// Generacin de los coeficientes del filtro
switch (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 generacin de los coeficientes del filtro


}

// Aplicacin de la ventana sobre los coeficientes


switch (ven)
{
case 0:
// Sin ventana
break;
case 1:
// Con ventana Hamming
for (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 Blackman
for (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 Cdigo de programa en C para una aplicacin FIR con entrada-salida en Tiempo real.

En el anterior programa se observa que la ejecucin se hace a travs de un proceso de interrupcin


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 ejecucin del filtro se hace precisamente en
ese segmento de cdigo. En la parte principal del programa se est calculando peridicamente los
coeficientes del filtro dependiendo de los parmetros que el usuario cambie en el proceso de
ejecucin. En este programa no se observan grficas 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 Seales o una fuente de audio estreo.

5.8.3 Uso de Cdigo Assembler para implementacin de un FIR.

Con el uso de la programacin en C, aunque es mucho ms cmodo y entendible el cdigo que se


realiza, tambin es cierto que se desperdicia toda la arquitectura que posee un DSP para el
procesamiento de seales, 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 caractersticas,
el cual fue concebido en una arquitectura de Hardware que permita tener la posibilidad de desarrollar
la convolucin en una forma ms eficiente.

En ese sentido se presenta a continuacin la posibilidad de desarrollar el filtro con una rutina de
Assembler. El siguiente cdigo muestra cmo realizar el filtro FIR.
; FIRASMfunc.asm Es una funcin en Assembler llamada desde el programa en C para realizar el FIR
; A4 = Direccin de Memoria donde estn los datos, B4 = Direccin de los coeficientes, A6 = Orden del filtro.
; Los datos estn organizados como: x(n-(N-1))...x(n); los coeficientes estn como h [0]...h [N-1]

.def _firasmfunc
_firasmfunc: ;Funcin en ASM llamada desde C
MV A6, A1 ; Inicializa el contador principal
MPY A6, 2, A6
ZERO A8 ; Inicializa el reg. A8 para acumulacin
ADD A6, B4, B4
SUB B4, 1, B4
cuenta: ; comienza la cuenta del FIR
LDH *A4++, A2 ;A2=x[n-(N-1)+i] i=0,1,...,N-1
LDH *B4--, B2 ; B2=h[N-1-i] i=0,1,...,N-1
NOP 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 A4


B B3 ; retorna la direccin de la direccin donde se invoc la llamada
NOP 4
Figura 5.27 Segmento de Cdigo en Assembler para implementar un filtro FIR.

Este segmento de cdigo 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 funcin se presenta a continuacin.

//FIRCASM.c Programa en C FIR llamando la funcin de Assembler firasmfunc.asm


#include "math.h"
int y = 0, N=41;
short x [41]; //Vector para almacenamiento de los datos
short 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 CODEC
y = firasmfunc(x, h, N); // Llamado de la funcin en Assembler
output_sample (y); // Enva dato de salida al CODEC
return; // Retorno de la Interrupcin ISR
}
void main ()
{
comm_intr (); // Inicializa el CODEC
while (1); // Ciclo infinito
}
Figura 5.28 Cdigo de programa en C para una aplicacin 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 Fl =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 algn tipo de ventana, lo cual genera las
oscilaciones en cada una de las bandas laterales. Las grficas de los coeficientes tanto en tiempo
como en frecuencia se visualizan en la figura 5.29.

Figura 5.29 Grfica de los coeficientes h, en funcin del tiempo y de la frecuencia.

Adems se debe tener en cuenta que la entrada para la funcin 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, razn por la cual todos los clculos
deben hacerse en funcin de esta restriccin. Ante un eventual caso de que se requiera tener
valores en punto flotante, se debe convertir los datos a short3 antes de invocar la funcin y
posteriormente convertir a float4 nuevamente si ese fuere el caso.

5.8.4 Uso de la Librera DSP67X.LIB.

Otra forma de implementar filtros FIR es a travs de una librera desarrollada directamente por Texas
Instruments. Dicha librera, DSP67X.lib permite incluir a travs de la opcin #include de C el archivo
dspf_sp_fir_r2.h, el cual tiene descrita la funcin void DSPF_sp_fir_r2 (x, h, y, N, L),
La cual al ser invocada desarrolla internamente a travs de un cdigo 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 tamao de los coeficientes N debe ser par y L es tamao del vector de salida, el
cual debe ser la diferencia entre el tamao del vector de entrada y el tamao del vector de
coeficientes.

3 short es una representacin de datos del lenguaje C para enteros con signo de 16 bits.
4 float es una representacin de datos del lenguaje C para punto flotante.
A continuacin se describe el cdigo para este programa, teniendo en cuenta que la seal de
entrada se simula, los coeficientes se generan internamente con ventana de Hamming, para un
tamao de N=100, con Fl = 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 opcin Add files to Project del men Project.

//Fir.c Filtro FIR aplicado a una seal seno generada internamente con FIR desde la librera DSP67X.lib
#include <math.h>
#include "dspf_sp_fir_r2.h"
float x [500], y[400];// Reserva espacio en memoria para la seal de entrada y salida
float h[100]; // Reserva espacio en memoria para los coeficientes
int N=100,L=400; // Inicializa el orden del filtro inicial en 100
short 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 f = 100; // Inicializa la frecuencia de la seal de entrada en 100 Hz.
short amp = 1000; // Inicializa la amplitud de la seal de entrada en 1000
short n;

void main()
{
while (1)
{
// Comienzo generacin de la seal seno
for (n=0; n<500; n++)
x[n] = amp * sin (6.28 * f * n/ Fs);
// Fin generacin seal 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 Hamming


for (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];
}

// Aplicacin del filtro a la seal generada


DSPF_sp_fir_r2 (x, h, y, N, L);
// Fin de la aplicacin del filtro;
}
}
Figura 5.30 Cdigo de programa en C para una aplicacin FIR con el uso de la librera dsp67x.lib.

La figura 5.31 muestra una grfica de los coeficientes del filtro, en los cuales se observa que est
suavizado a travs de la ventana de Hamming.
Figura 5.31 Grfica de los coeficientes h, en funcin de la frecuencia.

En la figura 5.32 se presentan las grficas de entrada salida para diferentes frecuencias de entrada,
donde se puede observar que el comportamiento del filtro si concuerda con los parmetros de
diseo.

Figura 5.32 Grfica de la entrada salida para diferentes frecuencias.

5.8.5 Desarrollo desde LABVIEW.

Otra forma de tener comunicacin entre el computador y el DSP es a travs del protocolo de
comunicacin 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 comunicacin del PC
haca el DSP. Los parmetros bsicos del filtro, como son:

Tipo de filtro (LPF, HPF, BPF, SBF)


Orden del filtro
Frecuencia Baja Fl
Frecuencia Alta Fh

Sern enviados desde el programa en Labview. El DSP a travs de un canal reservado por RTDX
capturar los datos y ajustar el programa para que ejecute el filtro que se haya diseado.

El siguiente cdigo 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 soporte
Uint32 fs=DSK6713_AIC23_FREQ_16KHZ; //Fija Frecuencia de Muestreo
int fl = 1000,fh=2000,N=101,tipo=0; //Valor de ganancia inicial
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(); //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 resultado


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

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 Cdigo de programa en C para una aplicacin FIR con interface desde Labview.
Como puede observarse en el anterior cdigo, el filtro en este caso recibe va 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 interrupcin se ejecuta la convolucin. 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 envo de parmetros FIR

Figura 5.35 Cdigo en Labview para envo de parmetros FIR

A travs de Labview se capturan los diferentes parmetros de programacin del filtro, y


posteriormente a travs de un canal RTDX (control_channel) se enva al DSP para su control y
operacin.

5.8.6 Interface entre Visual Studio y el DSP para la ejecucin 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 envo de los datos haca el DSP.

Figura 5.36 Interface en Visual Basic para envo de parmetros FIR

El proceso en Visual Basic asociado al comando Enviar Datos est descrito en el siguiente cdigo:

Private Sub Command1_Click()


Dim rtdx As Object
Dim data As Long
Dim bufferstate As Long
Dim status As Long

On Error GoTo Error_Handler

Set rtdx = CreateObject("RTDX")

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

If status <> Success Then


Debug.Print "Opening of channel ichan failed"
GoTo Error_Handler
End If

data = frec_baja.Text
status = rtdx.WriteI4(data, bufferstate)

data = frec_alta.Text
status = rtdx.WriteI4(data, bufferstate)

data = orden.Text
status = rtdx.WriteI4(data, bufferstate)

' Cerrar el canal


status = rtdx.Close()

Set rtdx = Nothing


Exit Sub

Error_Handler:

Debug.Print "Error in COM method call"

Set rtdx = Nothing


End Sub
Figura 5.37 Cdigo de programa en Visual Basic para envo de parmetros al DSP va RTDX.

El canal RTDX creado fue control_channel, de tal forma que en el DSP tambin 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 cdigo.

// 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 soporte
Uint32 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 convolucin
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 Cdigo de programa en C para una aplicacin FIR recibiendo datos desde el PC va 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 ejecucin de un filtro FIR.

Otra opcin interesante en este tipo de aplicaciones es el uso de MATLAB y sus libreras para
conexin entre este software y el CCS. Al igual que en el caso de Labview, se utilizar la conexin a
travs 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 aplicacin en el DSP es la misma
que se utiliz para conectar a travs de Labview. En el programa en MATLAB se desarroll un GUI 5.
Dicha interface tiene varias funcionalidades de acuerdo a los requerimientos de la aplicacin. Los
datos capturados son:

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

Adems las funciones programadas son:

5 GUI. Graphic User Interface.


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 opcin se para la ejecucin del DSP.
Envo de datos al DSP. Con esta orden se programa el canal de comunicaciones RTDX, se
envan los cuatro parmetros 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 programacin de un FIR.

En la figura 5.40 se presenta el cdigo en MATLAB. Para cada botn 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 processors
visible(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 Cdigo de MATLAB para el filtro FIR.

5.9 APLICACIN SOBRE EL C5535.

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

6 CCS V4. Propiedad de Texas Instruments.


Al igual que en con el anterior entrenador, se revisarn los cdigos para algunos casos especficos
que se amerita se revise el funcionamiento.

5.9.1 Programacin en C con entrada-salida en Tiempo Real.

A continuacin 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 parmetros del programa como es el caso del tipo de filtro, o las frecuencias de corte,
por tal razn el cdigo de clculo de los coeficientes se desarrolla externamente al while, con lo cual
cada vez que se cambie un parmetro 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];
}
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 Cdigo de programa en C para una aplicacin 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 matemticas tales como la
multiplicacin en punto flotante se vuelven demasiado largas, por tal razn 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
razn el ciclo de reloj es de 10 nanosegundos. Al leer el dato de entrada se hacen unos clculos
aritmticos, como es la convolucin, adems 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 ms grande en forma directamente proporcional, afectando la frecuencia de muestreo. Por
ejemplo, para un tamao de 25 el tiempo que tard el DSP en hacer estos clculos 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 razn
es importante en un diseo real, calcular los coeficientes con este ltimo valor para tener el filtro
correcto.
Cada vez que se cambie el orden, debe realizarse estos clculos para hallar la frecuencia de
muestreo real de trabajo.

5.10 REFERENCIAS.

1. Tompkins, Willy. 1993. Biomedical Digital Signal Processing. Prentice Hall. Pginas 100-123.

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

3. Dahnoun, Naim. 2000. Digital Signal Processing Implementation using TMS320C6000 DSP
Platform. Prentice Hall. Pginas 79 113.

4. DeFatta, Lucas. 2000. Digital Signal Processing. Prentice Hall. Pginas 193 235.

5.11 EJERCICIOS.

5.1 Disear un filtro FIR por el mtodo de los ceros con las siguientes caractersticas:

Frecuencia de Muestreo 20000 Hz.


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

Generar la ecuacin de diferencias finitas y modelar la funcin de transferencia en el Software


de Simulacin provisto en el texto.

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

5.3 Mejorar la aplicacin 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 convolucin.

5.4 Cambiar en el cdigo 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 bsico utilizando dichos conceptos. Comparar con la solucin planteada en
el presente texto.

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

También podría gustarte