Está en la página 1de 14

Benemérita Universidad Autónoma

de Puebla

Lic. Ciencias de la Electrónica

Procesamiento de Señales II
Profesor:
Dr. Héctor Santiago Ramı́rez

Filtros FIR
en la tarjeta de desarrollo
DSK6713

Equipo:
Garcia Rosas Andrea
Diaz Huesca Eduardo
Soto Quechol Sandra Luz
Rubı́n Alvarado Abel Alejandro
RV
Puebla, Pue., 25 Septiembre 2016
Introducción
La tarjeta de desarrollo TMS320C6713 es una excelente plataforma de desa-
rrollo inicial de aplicaciones, pues brinda herramientas muy sofisticadas para
la ejecución de algoritmos muy complejos disponibles para diseñadores con una
gran experiencia en el área de procesamiento digital de señales. Además, provee
de herramientas esenciales para desarrollar aplicaciones básicas para aquellos
que son principiantes en ésta.

La aplicación que se le dará en esta práctica, es la de la creación de filtros


FIR, tipo pasa-bajas, pasa-altas, pasa-banda y rechaza-banda, cada una con
caracterı́sticas exclusivas, de modo que al introducir una señal sólo “pasen” las
frecuencias deseadas. El presente reporte tratará de explicar el procedimiento
teórico y práctico de lo antes mencionado.

Objetivo
General
El alumno diseñará e implementará Filtros de Respuesta Finita al Impulso
(FIR) en la tarjeta de desarrollo C6713DK.

Particulares
1. Diseñar Filtros de Respuesta Finita al Impulso (FIR) en Matlab.
2. Implementar filtros digitales en el DSK de TI TMS320C6713.
3. Realizar el filtrado digital de una señal de sonido.

Planteamiento del problema


Se desea diseñar e implementar un ecualizador de tres bandas a través de
tres filtros FIR: un pasa-bajas, un pasa-banda y un pasa-altas, de acuerdo al
diagrama que se muestra en la siguiente imagen:

Figura 1: Diagrama a bloques del sistema de filtro a implementar


y(t) = [1 + αm(t)]x(t) (1)
Los filtros deben poseer las siguientes caracterı́sticas de frecuencia:

Pasa-bajas:
• Borde Banda de Paso: Fp=400 Hz
• Borde Banda de Rechazo: Fs=800 Hz
Pasa-banda:
• Bordes Banda de Paso: Fp1=800 Hz y Fp2=1600 Hz
• Bordes Bandas de Rechazo: Fs1=400 Hz y Fs2=2000 Hz

Pasa-altas
• Borde Banda de Paso: Fp=2000 Hz
• Borde Banda de Rechazo: Fs=1600 Hz

La atenuación mı́nima en la(s) banda(s) de rechazo debe ser de al menos


de 40 dB y el rizado máximo en la banda de paso debe ser de 1 dB en los
tres casos.
La frecuencia de muestreo debe de ser de 8000 Hz.
Las ganancias GLP, GBP y GHP deben ser seleccionables a través de
“slider’s” (un “slider” para cada uno). Los valores deben ir desde 0.2 hasta
2 en incrementos de 0.2.
El volumen debe ser seleccionable con un “slider” entre 0.1 y 4 en pasos
de 0.1.

Marco teórico
Filtro FIR
Un filtro digital emplea un procesador digital que efectúa operaciones ma-
temáticas en valores muestreados de la señal. El procesador puede ser de propósi-
to general, tal como cualquier ordenador personal, un chip DSP (procesador
digital de señales) especializado. La señal de entrada analógica debe ser mues-
treada y digitalizada usando un ADC (conversor analógico digital).

El resultado son números binarios que representan los valores sucesivos mues-
treados. Estos son transferidos al procesador, el cual efectúa operaciones ma-
temáticas en ellos. Las operaciones pueden ser desde filtros de promediado de la
muestra actual con alguna delas anteriores hasta multiplicaciones por constantes
de los valores de entrada o de instantes anteriores almacenados en memoria.
Funcionamiento de un filtro digital
Los filtros FIR (Finite Impulse Response), llamados ası́ porque su respuesta
al impulso se da en un número finito de muestras, son filtros del tipo no recur-
sivo, por tal motivo estos filtros al no tener retroalimentación no tienen polos,
y por lo tanto siempre son estables. Estos filtros son muy utilizados en proble-
mas de filtrado donde hay un requerimiento de caracterı́stica de fase lineal en
la banda de paso del filtro. Su requerimiento en cuanto a recursos es mayor y
dada la mayor cantidad de operaciones estos filtros son más sensibles a errores.
Estos filtros no tienen una contraparte analógica.

El filtro FIR es un tipo de filtro digital que, si su entrada es un impulso,


la salida será un número limitado de términos no nulos. Para obtener la salida
solo se emplean valores de las entradas actuales y anteriores.

Figura 2: Diagrama general del funcionamiento de un filtro digital.

Los filtros FIR son estables puesto que solo tienen polos, es decir, elementos
en el numerador en su función de transferencia. Tienen además la ventaja que
pueden diseñarse para ser de fase lineal, es decir, no introducen desfases en la
señal, a diferencia de los IIR o los filtros analógicos, por este motivo tienen
interés en audio.

Figura 3: Estructura de un filtro FIR.


Ventajas de los filtros FIR

• Facilidad de diseño para filtros de fase lineal


• Realización eficiente en forma tanto recursiva como no recursiva
• Los filtros FIR no recursivos, son siempre estables
• El ruido de redondeo puede hacerse fácilmente pequeño con realiza-
ciones no recursivas.
Desventajas de los filtros FIR
• Se requiere un número de puntos N alto para aproximar filtros de
transición brusca
• El retardo de fase puede no ser entero.

Fdatool
Es una herramienta gráfica de diseño de filtros, de Matlab, muy sencilla y
práctica. Para abrirla basta con escribir fdatool en la ventana de comandos. La
ventana que aparece es la siguiente:

Figura 4: Vista de Fdatool.


En el lado inferior izquierdo es posible seleccionar el método de diseño, tipo
de filtro y la estructura. En la parte inferior derecha se indican las especifica-
ciones en frecuencia, por último, se da en Desing Filter, y como su nombre lo
dice, el filtro deseado se diseña.

Los ı́conos de la parte superior muestran los resultados: respuesta de mag-


nitud, respuesta de fase, retraso se grupo, retraso de fase, respuesta al impulso,
respuesta al escalón, ubicación de polos y ceros, coeficientes de la función de
transferencia, etc.

Desarrollo de la práctica
Se diseño bajo la herramienta FDATOOL los diversoso filtros solicitados pa-
ra el sistema los cuales se muestren en las siguientes figuras:

Figura 5: Diseño de filtro mediante la herramienta en MatLab FDATOOL


Una vez generados los filtro en la herramienta FDATOOL creamos el archivo
cabecera de los coeficientes del filtro empleando una precisión simple, estos
coeficientes son los que seran agregados en el codigo C que se muestra en el
apendice A, el cual generamos junto con 4 sliders para controlar el efecto de
cada filtro es decir que vayan de 0 a 100, asi como uno adicional para regular el
volumen.

Figura 6: Se muestran slider para volumen y filtros


Conclusiones
Para el desarrollo del programa, fue esencial el uso de la herramienta “Fda-
tool” que nos proporciona Matlab. Con ella fue posible diseñar más fácilmente
los filtros pasa-bajas, pasa-banda y pasa-altas, ası́ mismo aprovechamos la uti-
lidad de “Generate C header” para ası́ obtener los coeficientes para cada filtro,
Durante las pruebas se presentaron ciertos inconvenientes como el de la mala
interpretación del diagrama, el cual fue corregido con ayuda del profesor, ası́
también el saturamiento del sistema por tener un multiplicador muy grande
lo cual fue corregido haciéndolo más pequeño en este caso se redujo a 0.1 el
multiplicador para cada Slider.

Figura 7: Respuesta experimental del filtro Pasa-banda (Fp=800-1600 Hz a


Fs=400a 2000 Hz)
Figura 8: Respuesta experimental del filtro Pasa-altas (Fp=2000 Hz a Fs=1600
Hz)

Figura 9: Respuesta experimental del filtro Pasa-bajas (Fp=400 Hz a Fs=800


Hz)
Bibliografı́a

[1] Chassaing, R. Digital Signal Processing and Aplications with the C6713
DSK, Ed. John Wiley and Sons.
[2] Ingle, V. K., and Proakis, J. G. (n.d.). Digital Signal Processing Using
MATLAB., Ed. Bookware Companion Series.
[3] McGraw Hill Interamericana de España. Lenguaje ANSI C. Guı́a
de referencia. Retrieved from Online Learning Center: http :
//www.mhe.es/universidad/inf ormatica/8448145127/archivos/apendiceg eneral2 .pdf

10
Índice de figuras

1. Diagrama a bloques del sistema de filtro a implementar . . . . . 2


2. Diagrama general del funcionamiento de un filtro digital. . . . . . 4
3. Estructura de un filtro FIR. . . . . . . . . . . . . . . . . . . . . . 4
4. Vista de Fdatool. . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
5. Diseño de filtro mediante la herramienta en MatLab FDATOOL 6
6. Se muestran slider para volumen y filtros . . . . . . . . . . . . . 7
7. Respuesta experimental del filtro Pasa-banda (Fp=800-1600 Hz
a Fs=400a 2000 Hz) . . . . . . . . . . . . . . . . . . . . . . . . . 8
8. Respuesta experimental del filtro Pasa-altas (Fp=2000 Hz a Fs=1600
Hz) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
9. Respuesta experimental del filtro Pasa-bajas (Fp=400 Hz a Fs=800
Hz) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

11
Apéndice A

Codigo fuente, P1 Tremolo

//Filtro FIR { Método 1: Registro de corrimiento


#include <dsk6713.h> // Soporte del chip
#include <dsk6713_dip.h> // Soporte de los DIPs
#include <dsk6713_led.h> // Soporte de los LEDs
#include "DSK6713_AIC23.h" // Archivo de soporte del codec-DSK
#include "pasabajas.h" // Coeficientes de los filtros
#include "pasabanda.h" // Coeficientes de los filtros
#include "pasaaltas.h" // Coeficientes de los filtros
Uint32 fs=DSK6713_AIC23_FREQ_8KHZ; // Frecuencia de muestreo

--Union para envı́o/Recepción de datos--

union {short canal[2]; Uint32 estereo;} entrada,salida; //


// entrada.estereo, salida.estereo
contiene ambos canales
// entrada.canal[0], salida.canal[0]
contiene el canal izquierdo para entrada y salida, respectivamente
// entrada.canal[1], salida.canal[1]
contiene el canal derecho para entrada y salida

short x_I[BL]={0}, x_D[BL]={0}; //


Registro de la se~
nal de entrada (como registro de corrimiento)
short x_II[CL]={0}, x_DD[CL]={0}; //
Registro de la se~
nal de entrada (como registro de corrimiento)
short x_III[DL]={0}, x_DDD[DL]={0}; //
Registro de la se~
nal de entrada (como registro de corrimiento)

short volumen=1; //usado para slider


short alta=1; //usado para slider
short media=1; //usado para slider
short baja=1; //usado para slider

12
interrupt void c_int11() // Rutina de servicio de interrupción
{
int k; // Variable para ı́ndices de los arreglos
float y_I=0, y_D=0,y_II=0, y_DD=0,y_III=0, y_DDD=0,y_D4,y_I4; //
Variables temporales para cálculo de la salida

entrada.estereo=input_sample(); // Captura de la se~


nal de entrada

x_I[0]=entrada.canal[0]; //
Canal izquierdo y derecho son almacenados

x_D[0]=entrada.canal[1]; //
al inicio del registro de corrimiento

x_II[0]=x_I[0];
x_III[0]=x_I[0];
x_DD[0]=x_D[0];
x_DDD[0]=x_D[0];

y_I=0; // Inicialización de variables para algoritmo


y_D=0; // FIR de multiplicación - acumulación bajas
y_II=0; // Inicialización de variables para algoritmo
y_DD=0; // FIR de multiplicación - acumulación medias
y_III=0; // Inicialización de variables para algoritmo
y_DDD=0; // FIR de multiplicación - acumulación altas
for (k=0;k<BL;k++)
{
y_I += x_I[k]*B[k]; // Algoritmo FIR para
y_D += x_D[k]*B[k]; // ambos canales
}
for (k=BL-1;k>0;k--) // Corrimiento de los datos para registro bajas
{ // de corrimiento
x_I[k] = x_I[k-1];
x_D[k] = x_D[k-1];
}

for (k=0;k<CL;k++)
{
y_II += x_II[k]*C[k]; // Algoritmo FIR para
y_DD += x_DD[k]*C[k]; // ambos canales
}
for (k=CL-1;k>0;k--) // Corrimiento de los datos para registro medias
{ // de corrimiento
x_II[k] = x_II[k-1];
x_DD[k] = x_DD[k-1];
}

for (k=0;k<DL;k++)
{
y_III += x_III[k]*D[k]; // Algoritmo FIR para
y_DDD += x_DDD[k]*D[k]; // ambos canales
}
for (k=DL-1;k>0;k--) // Corrimiento de los datos para registro altas
{ // de corrimiento
x_III[k] = x_III[k-1];
x_DDD[k] = x_DDD[k-1];
}

y_I4=volumen*(alta*y_III/10+media*y_II/10+baja*y_I/10)/10+.1;
//ecualizacion canal izquierdo

y_D4=volumen*(alta*y_DDD/10+media*y_DD/10+baja*y_D/10)/10+.1;
//ecualizacion canal derecho

salida.canal[0]=(short)y_I4; // Captura de la salida para


salida.canal[1]=(short)y_D4; // ambos canales con conversión forzada a short
output_sample(salida.estereo); // Envı́o de los dos canales a la salida de la tarjeta
return; // Retorno de la interrupción
}

void main() // Programa principal


{
comm_intr(); // Inicializa el DSK, codec, McBSP
while(1); // Ciclo infinito
}

También podría gustarte