Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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.
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 (𝐹𝑠 ) 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 𝐹𝑠 , 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 𝐹𝑠 ⁄2, razón por la cual se debe aplicar un filtro pasabajo que limite el ancho de
banda final hasta 𝐹𝑠 ⁄2, para evitar el fenómeno de aliasing1, es decir frecuencia por encima
1
Aliasing: Frecuencias no deseadas que aparecen cuando la señal digitalizada es más alta que la mitad de la
frecuencia de muestreo.
de la frecuencia máxima permitida, que en un sistema de procesamiento digital va a generar
señales indeseables.
Filtro
Señal Señal
Entrada Pasabajo Salida
Fc < Fs/2
Fs/2 F Fs/2 F
Figura 5.1
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 𝛿[𝑛], 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 𝛿[𝑛] se representa matemáticamente como:
1 𝑝𝑎𝑟𝑎 𝑛 = 0
𝛿[𝑛] = { (5.1)
0 𝑝𝑎𝑟𝑎 𝑛 > 0
O
𝛿[𝑛] = {1,0,0,0,0, … … . } (5.2)
Ejemplo 5.1
+ Y[n]
Figura 5.2
Como podemos observar, el sistema descrito en la figura 5.1 puede ser representado por la siguiente
ecuación de diferencias:
O simplificando
𝑦[𝑛] = 𝑥[𝑛] + 𝑥[𝑛 − 1] + 𝑥[𝑛 − 2]
ℎ[𝑛] = [1,1,1,0,0,0,0 … . ]
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 𝑦[𝑛 − 𝑘], 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 𝑦[𝑛 − 𝑘], 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
𝑥[𝑛 − 𝑘], como de 𝑦[𝑛 − 𝑚].
Ejemplo 5.2
Considere el siguiente sistema, y analice el comportamiento para cuando la entrada x[n] es un impulso
unitario.
+
X[n] Y[n]
T
Figura 5.3
La ecuación de diferencias que representa el sistema discreto descrito en la figura 5.3 es:
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
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.
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:
𝑁−1
𝑦[𝑛] = ∑ ℎ(𝑘)𝑥(𝑛 − 𝑘) (5.6)
𝑘=0
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 ( 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 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 𝑥[𝑛 − 𝑘], 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:
2
LPF = Filtro Pasa bajo, HPF = Filtro Pasa alto, BPF = Filtro Pasa banda y SBF = Filtro de
Rechazo
X[n] h(0)
+ Y[n]
T
h(1)
+
T
h(2)
+
T
.. ..
.
T h(N-1)
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.
Ejemplo 5.3
X[n]
T T
Y[n]
+ 1/3
Figura 5.5
La gráfica para el sistema se muestra en la figura 5.6, teniendo como frecuencia de muestreo 𝐹𝑠 = 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.
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
𝐹𝑠 , la relación entre el ángulo del círculo y la frecuencia de muestreo está dada por:
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.
En consecuencia tenemos que la función de transferencia para un filtro de primer orden (un
solo cero), estará dada por:
𝑧+1
𝐻(𝑧) = = 1 + 𝑧 −1 (5.14)
𝑧
Como
𝐻(𝑧) = 𝑌(𝑧)⁄𝑋(𝑧)
Entonces
𝑌(𝑧) = 𝑋(𝑧) + 𝑧 −1 𝑋(𝑧)
O
𝑦[𝑛] = 𝑥[𝑛] + 𝑥[𝑛 − 1]
(𝑧 + 1)2
𝐻(𝑧) = (5.15)
𝑧2
O equivalente a:
𝐻(𝑧) = 1 + 2𝑧 −1 + 𝑧 −2
Como
𝐻(𝑧) = 𝑌(𝑧)⁄𝑋(𝑧)
Entonces
𝑌(𝑧) = 𝑋(𝑧) + 2𝑧 −1 𝑋(𝑧) + 𝑧 −2 𝑋(𝑧)
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 𝐹𝑠 ⁄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).
(𝑧 − 1)2
𝐻(𝑧) = (5.18)
𝑧2
Con ecuación de diferencias:
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 𝐹𝑠 ⁄2, es decir sobre el plano
complejo en 0+1j y 0-1j.
(𝑧 − 1)(𝑥 + 1)
𝐻(𝑧) = (5.19)
𝑧
O equivalente a:
𝐻(𝑧) = 1 − 𝑧 −2
Como
𝑌(𝑧)
𝐻(𝑧) =
𝑋(𝑧)
Entonces
𝑌(𝑧) = 𝑋(𝑧) − 𝑧 −2 𝑋(𝑧)
Para este caso, ya que deben existir mínimo dos ceros, no se puede tener un sistema de
primer orden.
En este caso, la frecuencia intermedia no puede ser controlada y siempre quedará en 𝐹𝑠 ⁄4.
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.
O equivalente a:
𝐻(𝑧) = 1 − 2𝑐𝑜𝑠𝜃𝑧 −1 + 𝑧 −2
Partiendo del hecho de que la frecuencia en un filtro digital es periódica con periodo 𝐹𝑠 , se
puede diseñar un filtro digital teniendo como espacio valido en frecuencia desde − 𝐹𝑠 ⁄2 hasta
𝐹𝑠 ⁄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
𝐹𝑠 . 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 𝐹𝑠 ⁄2, razón por la cual la frecuencia
de interés para el sistema es de 0 Hz hasta 𝐹𝑠 ⁄2.
Se puede observar que es una onda cuadrada periódica con periodo 𝐹𝑠 , 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:
∞
𝑗2𝜋𝑓𝑛
−
𝐻(𝑓) = ∑ ℎ(𝑛)𝑒 𝐹𝑠 (5.22)
𝑛=−∞
Con los coeficientes definidos de la forma:
𝐹𝑠 ⁄2
1
ℎ(𝑛) = ∫ 𝐻(𝑓)𝑒 (𝑗2𝜋𝑓𝑛⁄𝐹𝑠 ) 𝑑𝑓 (5.23)
𝐹𝑠
−𝐹𝑠 ⁄2
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 (𝑁 − 1)/2 hasta (𝑁 + 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:
(𝑁+1)
2
𝑗2𝜋𝑓𝑛
−
𝐻(𝑓) = ∑ ℎ(𝑛)𝑒 𝐹𝑠 (5.24)
(𝑁−1)
𝑛=−
2
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:
𝑛=𝑁−1
𝑁−1
ℎ𝑑 (𝑘) = ℎ (𝑘 − ) , 𝑝𝑎𝑟𝑎 𝑘 = 0, 𝑁 − 1 (5.25)
2
Ejemplo 5.4
Calcular los coeficientes paras un filtro Pasa Bajo, con 𝐹𝑠 = 10 𝐾ℎ𝑧, 𝑓𝑙 = 1000 𝐻𝑧 y orden N=11.
1 𝐹𝑙
ℎ(𝑛) = ∫ 1. 𝑒 (𝑗2𝜋𝑓𝑛⁄𝐹𝑠 ) 𝑑𝑓,
𝐹𝑠 −𝐹𝑙
𝐹𝑙
1 𝑒 (𝑗2𝜋𝑓𝑛⁄𝐹𝑠) 𝑒 (𝑗2𝜋𝐹𝑙 𝑛⁄𝐹𝑠 ) − 𝑒 (−𝑗2𝜋𝐹𝑙 𝑛⁄𝐹𝑠 ) 𝑠𝑒𝑛(2𝜋𝐹𝑙 𝑛⁄𝐹𝑠 )
ℎ(𝑛) = | = =
𝐹𝑠 𝑗2𝜋𝑛⁄𝐹𝑠 −𝐹 2𝑗𝜋𝑛 𝜋𝑛
𝐿
En consecuencia los coeficientes finales para el filtro del ejemplo están dados por:
ℎ𝑑 [𝑛] = {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:
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.
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.
𝑠𝑒𝑛(2𝜋𝐹𝑙 𝑛⁄𝐹𝑠 )
Filtro Pasa bajo. ℎ(𝑛) =
𝜋𝑛
ℎ(0) = 2 𝐹𝑙 ⁄𝐹𝑠
𝑠𝑒𝑛(2𝜋𝐹𝑙 𝑛⁄𝐹𝑠 )
Filtro Pasa Alto. ℎ(𝑛) = −
𝜋𝑛
ℎ(0) = 1 − 2 𝐹𝑙 ⁄𝐹𝑠
Filtro Pasa Banda.
𝑠𝑒𝑛(2𝜋𝐹ℎ 𝑛⁄𝐹𝑠 ) − 𝑠𝑒𝑛(2𝜋𝐹𝑙 𝑛⁄𝐹𝑠 )
ℎ(𝑛) =
𝜋𝑛
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.
2𝜋𝑛 𝑁−1
𝑎𝐻 (𝑛) ={ 0.54 + 0.46𝑐𝑜𝑠 𝑝𝑎𝑟𝑎 |𝑛| ≤ (5.26)
𝑁−1 2
0 𝑂𝑡𝑟𝑜 𝑐𝑎𝑠𝑜
Calculando los coeficientes la ventana de Hamming y los coeficientes h[n], se tiene que:
Ejemplo 5.5
Aplicar la ventana de Hamming a los coeficientes del ejemplo 5.4 y realizar la gráfica de respuesta en
frecuencia.
ℎ𝑑 [𝑛] = {0, 0.0467, 0.1009, 0.1513, 0.1870, 0.2, 0.1870, 0.1513, 0.1009, 0.0467, 0}
𝑎𝐻 [𝑛] = {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:
ℎ𝑓 [𝑛] = {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:
En esta figura se puede observar las diferencias respecto a la figura 5.14, en la cual no existe el proceso de
enventanado.
Calculando los coeficientes la ventana de Blackman y los coeficientes h[n], se tiene que:
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.
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.
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.
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
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;
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 𝐹𝑙 = 1000.
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.
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.
short i, n, k;
float r;
Uint32 Fs=DSK6713_AIC23_FREQ_48KHZ;
void main()
{
comm_intr (); // Inicializa al CODEC del DSK6713.
while (1)
{
// Generación 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;
; 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ón
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
Para este caso, se tomó como coeficientes un vector de datos previamente generado desde
Matlab, para un filtro Pasa banda de 𝐹𝑠 =8 KHz. Y frecuencias de corte 𝐹𝑙 = 850 𝐻𝑧 y 𝐹ℎ =
1150 𝐻𝑧. 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.
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.
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.
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.
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 𝐹𝑙 = 1000, 𝐹ℎ = 1500 y 𝐹𝑠 = 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 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 señal de entrada en 100 Hz.
short amp = 1000; // Inicializa la amplitud de la señal de entrada en 1000
short 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
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.
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:
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.
//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
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;
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.
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.
El proceso en Visual Basic asociado al comando Enviar Datos está descrito en el siguiente
código:
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()
Error_Handler:
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.
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;
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.
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.
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 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.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.
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.
6
CCS V4. Propiedad de Texas Instruments.
5.9.1 Programación en C con entrada-salida en Tiempo Real.
#include "stdio.h"
#include "ezdsp5535.h"
#include "ezdsp5535_i2c.h"
#include "math.h"
#include "ezdsp5535_i2s.h"
#include "csl_i2s.h"
extern programa_codec();
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 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.
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:
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.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)