Professional Documents
Culture Documents
1) Introduccin
2) Objetivos
Objetivo general.
El alumno implementar y comprobar experimentalmente la funcin de
transferencia de un filtro FIR en la tarjeta de desarrollo C6713 DSK.
Objetivos particulares.
Disear filtros de respuesta finita al impulso (FIR) en Matlab.
Implementar filtros digitales FIR en el DSK de TI TMS320C6713.
Caracterizar con un generador de funciones y un osciloscopio la respuesta en
frecuencia del filtro diseado.
Realizar el filtrado digital de una seal de sonido.
4) Marco Terico
Filtros FIR
Mtodo de ventanas
disminuye.
El ancho de la banda de transicin es directamente proporcional al ancho del
lbulo principal: si el ancho del lbulo principal disminuye, ms abrupta ser
la banda de transicin, es decir, ms cercano al ideal ser la respuesta en
frecuencia del filtro.
2) Los lbulos laterales son altos y no decrecen con M.
Los lbulos laterales de la ventana rectangular producen rizado en la
respuesta en frecuencia.
Para disminuir el rizado, se usan ventanas que no provoquen truncamientos abruptos.
Otras ventanas (adems de la rectangular):
Hanning, Hamming, Blackman, Kaiser, etc.
Estas ventanas tienen las siguientes caractersticas:
Disminuyen el rizado. Este suavizado disminuye con M.
Comparadas con la ventana rectangular, tienen lbulos laterales ms bajos pero
la anchura del lbulo principal es mayor.
En la convolucin proporcionan un mayor suavizado pero la regin de transicin
es ms amplia; para disminuirla se requiere aumentar la longitud de la ventana
lo que implica un filtro ms largo.
La funcin fir1 de Matlab emplea el mtodo de ventanas.
Mtodo ptimo
Para el diseo de los filtros implementados en el DSP nos ayudamos con matlab y la
herramienta Filter Desing & Analysis Tools. Como sabemos accedemos a esta
herramienta escribiendo en la ventana de comandos fdatool. Se nos abre una nueva
ventana en la cual, realmente es muy intuitiva y como lo aprendimos en Procesamiento
de Seales 1, dentro de esa ventana seleccionaremos el tipo de de respuesta del filtro
que deseamos como lo es pasa bajas, pasa altas, pasa bandas y rechaza bandas.
Primero lo dejamos con el orden mnimo, colocamos las especificaciones de frecuencia
y por ltimo las especificaciones de magnitud. Las caractersticas usadas son las dadas
en el planteamiento de la prctica.
Una vez colocados los datos correspondientes hacemos clic sobre disear filtro y
comprobamos en la parte de los grficos de respuesta de magnitud si cumplen con las
caractersticas, en caso contrario ahora diseamos un nuevo filtro con igual
caractersticas pero mayor orden de filtro.
Una vez obtenida la respuesta que queremos, lo que sigue es generar las cabeceras
que contendrn los valores de los coeficientes que forman al filtro. Despendiendo del
orden del filtro ser la cantidad de coeficientes que se genere. Los coeficientes sern
del orden del filtro ms uno.
Se nos abre una nueva ventana en donde colocamos los nombres que queremos que
aparezcan en el header para el nombre del numerador y la longitud del numerador.
Dejamos como punto flotante de doble precisin. Y finalmente damos en generar, nos
pedir una ubicacin donde quedar guardado el header y con esto se termina el
proceso en matlab.
Las respuestas de magnitud de los filtros implementados con matlab fueron las
siguientes, mientras que las cabeceras se anexan en el apndice.
Como se menciono se crearon los archivos cabecera con los coeficientes de los
filtros.
x_I0[n]=entrada.canal[0];
x_D0[n]=entrada.canal[1];
y_I=0;y_D=0;
m=n;
for (k=0; k<=n; k++){
y_I+=B_0[k]*x_I0[m];
y_D+=B_0[k]*x_D0[m];
m--;}
m=M_0-1;
for (k=n+1; k<=M_0-1; k++){
y_I+=B_0[m]*x_I0[k];
y_D+=B_0[m]*x_D0[k];
m--;}
salida.canal[0]=(short)y_I;
salida.canal[1]=(short)y_D;
salida.canal[1]=entrada.canal[0];
output_sample(salida.estereo);
//Salida
del
canal
izquierdo
ya
//Salida del canal derecho ya filtrada
filtrada
//Salida
El cdigo lo que hace es que cuando ocurra una interrupcin del cdec, se guarda la
muestra actual en la variables X, se inicializan las salidas para evitar cualquier
informacin basura que pueda haber en la memoria, el ciclo FOR implementa el
algoritmo que hace que los elementos del buffer circular, donde el apuntador k
apunta a la direccin de memoria el vector de coeficientes del filtro; entonces
inicialmente m tiene el valor de cero debido a que n se inicializo con cero,
entonces para el primer ciclo solo se har una multiplicacin de entre el B[0] y X[0],
despus de eso se reinicia el valor de m con el orden del filtro a implementar, e
inicia el siguiente ciclo FOR donde se hacen las dems multiplicaciones y
acumulaciones para el resto de los factores del vector de coeficientes de la ecuacin
de diferencias , donde cada factor del vector de coeficientes se va multiplicando por
la entrada actual, esto provoca que la muestra actual se vaya recorriendo por todo
el buffer, dando como resultado la salida.
Finalmente con las ultimas 5 lneas de cogido la seal de salida y ya procesada se
mandaba a la salida por ambos canales, izquierdo y derecho, por medio de una
unin.
El cdigo anterior se hizo para los cuatro filtros, ya que los filtro que diseamos eran
todos de orden distinto, y por medio de un SWICH-CASE y los dip-swich de la tarjeta,
se eligiera el filtro que se deseaba, por lo tanto tuvimos 4 casos dentro del programa
con los diferentes tamaos de la matriz B (matriz de coeficientes de la ecuacin de
diferencias) .
6) Anlisis de resultados
Una vez que se implementaron los circuitos, se revisaron primero con los archivos de
audio que descargamos desde ning, sin embargo ese era muy superficial y no nos daba
una certeza real de que se tratara del filtro deseado y mucho menos que tuviera la
respuesta esperada, por lo que fe necesario caracterizarlos con ayuda de un generador
de funciones.
Se coloc una seal senoidal con amplitud de 500 mV RMS como entrada y se fue
variando la frecuencia. Se modific el cdigo de tal forma que a la salida se viera en
un canal la seal de entrada y en el otro la seal filtrada. Los datos y sus grficos
obtenidos se muestran a continuacin.
Frecuenci
a
(Hz)
1000
Vsal
(mV)
AV
(dB)
Frecuenci
a
(Hz)
256
242
0.48849199
2000
9.36
242
-28.2507903
2000
230
242
-0.4417506
3000
9.9
241
-27.727637
3000
250
241
0.31845932
4000
10
240
-27.6042248
3200
230
240
-0.36966811
4600
10.4
240
-27.263558
3400
193
241
-1.92919467
4800
12
239
-25.9843331
3600
150
240
-4.08239965
5000
13
239
-25.289091
3800
104
239
-7.22729123
5400
25
239
-19.6091578
4000
66.9
240
-11.0957025
5800
82
238
-9.25526209
4200
35.5
338
-19.5737669
6000
113
241
-6.57877198
4400
17.5
239
-22.707197
6200
172
241
-2.92977191
4600
5.2
240
-33.284158
6400
212
241
-1.11362363
4800
240
-38.0617997
6600
246
241
0.17836129
5000
2.7
237
-38.8676916
6800
267
241
0.88988438
5500
2.7
235
-38.794082
7500
235
241
-0.21898361
8000
218
240
-0.83509496
8500
Filtro Pasa Banda
Frecuenci
a
(Hz)
Vsal
(mV)
Vin
(mV)
AV
(dB)
Frecuenci
a
(Hz)
Vsal
(mV)
Vin
(mV)
AV
(dB)
252
240
Filtro Rechaza Banda
Vsal
(mV)
Vin
(mV)
0.42378598
AV
(dB)
1000
8.46
242
-29.1289001
1000
350
317
0.86017564
1400
10
242
-27.6763073
1200
347
320
0.70358993
1600
11
242
-26.8484536
1400
324
320
0.10790064
1800
12
242
-26.0926824
1600
280
320
-1.15983894
2000
14
242
-24.7537466
1800
230
310
-2.59267716
2400
42
242
-15.2113215
2000
180
310
-4.72178377
2800
96
242
-8.03088266
2200
130
310
-7.54836683
3000
127
241
-5.56426643
2400
90
310
-10.7423837
3200
163
241
-3.39658876
2600
60
310
-14.2642089
3400
199
241
-1.66327932
2800
22
310
-22.9787803
3600
232
240
-0.29446514
3000
11
310
-28.9993802
3800
262
240
0.76180099
3400
10
310
-29.8272339
4000
286
240
1.52309583
3800
10
310
-29.8272339
4200
300
240
1.93820026
4600
10
310
-29.8272339
4400
314
240
2.33436813
5100
10
310
-29.8272339
4600
319
240
2.47158883
5500
10
310
-29.8272339
4800
320
240
2.49877473
5800
10
273
-28.7232529
5400
294
239
1.79898859
6000
10
310
-29.8272339
5800
254
238
0.56513519
6200
16
270
-24.5448756
6200
199
241
-1.66327932
6400
16
270
-24.5448756
6400
164
241
-3.34346389
6800
20
265
-22.4443176
6800
97.5
241
-7.86024854
7000
32
265
-18.3619179
7200
44.3
241
-14.7122663
7200
63
261
-12.3459992
7600
16.6
241
-23.2381791
7400
99
260
-8.38676307
8000
9.6
240
-27.9588002
7600
160
258
-4.14999447
8400
7.8
240
-29.7623328
7800
204
256
-1.97219596
8000
247
255
-0.27686454
8200
274
253
0.69260083
8400
282
251
1.01150774
8600
270
249
0.70328834
8800
250
248
0.06976656
9000
228
246
-0.6600052
9500
221
244
-0.85995105
10000
264
240
0.8278537
7) Conclusiones
Logramos completar el objetivo de implementar 4 filtros digitales tipo FIR en la tarjeta
de desarrollo. La respuesta obtenida mediante la caracterizacin de los filtros cumple
en parte con lo esperado, sin embargo se puede notar que no tenemos en ninguno de
los 4 filtros tenemos una atenuacin de -60 dB como era esperado y de aqu tenemos
una observacin. Notamos que como la seal de entrada est en el orden de 250
milivolts en promedio, ya el osciloscopio para las seales atenuadas no se notaba
diferencia de amplitudes del orden de 10 mlivolts as que el osciloscopio se volvi un
inconveniente debido a que cuando se trata de atenuacin de 60 dB la seal sera del
orden de microvolts y eso ya no era posible ver en el osciloscopio, la seal se vea
como ruido. Sin embargo el comportamiento si fue el esperado. Las frecuencias de
corte y frecuencias de paso se cumplen, y el rizado en la banda de paso si estn en el
orden de 1 dB.
8) Referencias
[1] Rulph Chassaing, Digital Signal Processing and Applications with the
C6713 and
C6417 DSK, Ed. John Wiley & Sons.
[2] Vinay K. Ingle, John G. Proakis, Digital Signal Processing Using MATLAB,
Ed. Bookware Companion Series.
[3] Ricardo A. Losada, Digital Filters with MATLAB, The MAthWork Inc.
[4] John G. Proakis, Dimitris G. Manolakis, Tratamiento Digital de Seales,
Principios y Algoritmos, Ed. Prentice Hall, 3 Edicin.
9) Apndice
Cdigo Primera Parte
#include "fda_pl.h"
// soporte para el filtro
en matlab
#include "fda_ph.h" // soporte para el filtro
en matlab
#include "fda_pb.h" // soporte para el filtro en
matlab
#include "fda_rb.h" // soporte para el filtro
en matlab
#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
dip =
2*DSK6713_DIP_get(1)+DSK6713_DIP_get(0);
switch (dip){
case 0: //PASA BAJAS
entrada.estereo=input_
sample();
x_I0[n]=entrada.canal[0
];
x_D0[n]=entrada.canal[
1];
y_I=0;y_D=0;
m=n;
for (k=0; k<=n; k++)
{
y_I+=B_0[k]*x_I0[m];
Uint32 fs=DSK6713_AIC23_FREQ_44KHZ; //
Frecuencia de muestreo
int
dip, n=NULL;
float y_I , y_D ;
float x_I0[61] = {0}, x_D0[61] = {0};
//PASA BAJAS
float x_I1[51] = {0}, x_D1[51] = {0};
//PASA ALTAS
float x_I2[45] = {0}, x_D2[45] = {0};
//PARSA BANDA
float x_I3[51] = {0}, x_D3[51] = {0};
//RECHAZA BANDA
union {Uint32 estereo; short canal[2];}
entrada, salida;
interrupt void c_int11(){
register short m,k;
y_D+=B_0[k]*x_D0[m];
m--;
}
m=M_0-1;
for (k=n+1; k<=M_0-1;
k++)
{
y_I+=B_0[m]*x_I0[k];
y_D+=B_0[m]*x_D0[k];
m--;
}
y_I;
salida.canal[0]=(short)
//Salida del canal izquierdo ya filtrada
salida.canal[1]=(short)
y_D;
//Salida del canal derecho ya
filtrada(descomentarla)
y_D +=
B_2[k]*x_D2[m];
m--;
output_sample(salida.es
tereo);
m = M_2-1;
//Salida
for ( k=n+1; k<=M_2if(++n > (M_0-1)){
n=0;}
1; k++ ){
y_I +=
B_2[m]*x_I2[k];
break;
case 1: //PASA altas
entrada.estereo =
input_sample();
x_I1[n] =
entrada.canal[0];
x_D1[n] =
entrada.canal[1];
m = n;
y_I = 0;
y_D = 0;
y_D +=
B_2[m]*x_D2[k];
m--;
}
salida.canal[0] =
(short)y_I;
salida.canal[1] =
(short)y_D;
output_sample(salida.es
tereo);
if ( ++n>M_2-1 ){
n=
0; }
break;
y_I +=
default : //RECHAZA
B_1[k]*x_I1[m];
BANDA
y_D +=
entrada.estereo =
B_1[k]*x_D1[m];
input_sample();
m--;
x_I3[n] =
entrada.canal[0];
m = M_1-1;
x_D3[n] =
entrada.canal[1];
m = n;
y_I = 0;
y_D = 0;
1; k++ ){
y_I +=
B_1[m]*x_I1[k];
y_D +=
B_1[m]*x_D1[k];
m--;
}
salida.canal[0] =
(short)y_I;
y_I +=
B_3[k]*x_I3[m];
y_D +=
B_3[k]*x_D3[m];
salida.canal[1] =
m--;
(short)y_D;
output_sample(salida.es
m = M_3-1;
tereo);
for ( k=n+1; k<=M_3if(++n > (M_1-1)){
n=0;}
break;
case 2: //PASA BANDAS
entrada.estereo =
1; k++ ){
y_I +=
B_3[m]*x_I3[k];
y_D +=
B_3[m]*x_D3[k];
input_sample();
m--;
x_I2[n] =
}
salida.canal[0] =
entrada.canal[0];
x_D2[n] =
(short)y_I;
m = n;
y_I = 0;
y_D = 0;
(short)y_D;
entrada.canal[1];
salida.canal[1] =
output_sample(salida.es
tereo);
if ( ++n>M_3-1 ){
0; };
y_I +=
B_2[k]*x_I2[m];
}
}
n=
void main(){
// Programa principal
DSK6713_DIP_init();
DIP
comm_intr();
codec, McBSPwhie(1);
while(1){
}
}
// Inicializa los
// Inicializa el DSK,
Headers
// Pasa Altas
//Pasa Bajas
//Pasa Banda
};
//Rechaza Banda