Está en la página 1de 14

INSTITUTO POLITECNICO NACIONAL UNIDAD PROFESIONAL INTERDISCIPLINARIA EN INGENIERIA Y TECNOLGIAS AVANZADAS - IPN

MATERIA Procesadores Digitales de Seales

ALUMNOS Cerda Baos Omar Lopez Reyes Omar

PROFESOR Juan Manuel Madrigal Bravo.

TEMA Implementacion de la FFT en un DSP

Grupo 6TV1

Equipo 1

Practica No. 3 9 y 11/02/2011

Objetivo:
Conocer el comportamiento y las caractersticas de algunos filtros, as como las funciones de Matlab que ayudan en la elaboracin de filtros.

Antecedentes
FFT y DFT
Considrese la Transformada Discreta de Fourier (DFT):
N X( n) k=0 1 x 0 ( k ) . exp j . 2. . n. k N

n 0 .. N

(22-1)

donde se ha reemplazado k.T por k y n/N.T por n por conveniencia de notacin. Se percibe que la ecuacin (22-1) describe el cmputo de N ecuaciones. Por ejemplo, si N = 4 y si se hace:

W exp

j . 2. N

(22-2)

la expresin (22.1) puede ser escrita como:

X( 0 ) x 0 ( 0 ) . W

0 0

x 0 ( 1 ). W x 0 ( 1 ). W x 0 ( 1 ). W x 0 ( 1 ). W

0 1 2 3

x 0 ( 2 ). W x 0 ( 2 ). W x 0 ( 2 ). W x 0 ( 2 ). W

0 2 4 6

x 0 ( 3 ). W x 0 ( 3 ). W x 0 ( 3 ). W x 0 ( 3 ). W

0 3 6 9

X( 1 ) x 0 ( 0 ) . W 0 X( 2 ) x 0 ( 0 ) . W 0 X( 3 ) x 0 ( 0 ) . W

(22-3)

Las ecuaciones anteriores pueden ser ms fcilmente representadas en forma matricial:


X( 0 ) X( 1 ) X( 2 ) X( 3 ) W W W W
0 0 0 0

W W W W

0 1 2 3

W W W W

0 2 4 6

W W W W

0 3 6 9

x 0( 0) . x 0( 1) x 0( 2) x 0( 3)

(22-4)

o ms compactamente:

X( n) W

n . k.

x 0( k)

(22-5)

El examen de (22-4) revela que ya que W y posiblemente x0(k) sean complejas, entonces son necesarias N2 multiplicaciones complejas y N.(N-1) adiciones para realizar el cmputo matricial requerido.

La FFT debe su xito al hecho que el algoritmo reduce el nmero de multiplicaciones y adiciones requeridas en el clculo de (22-4). Ahora se discutir, a nivel intuitivo, como se lleva a cabo esta reduccin. Desarrollo intuitivo Para ilustrar el algoritmo FFT, es conveniente elegir el nmero de puntos muestras de x0(k) de acuerdo a la relacin N = 2 donde es un entero. Recurdese que la ecuacin (22-4) resulta de la eleccin N = 4 = 2 = 22 por lo tanto, se puede aplicar la FFT al cmputo de (22-4). El primer paso en el desarrollo del algoritmo FFT para este ejemplo es reescribir (22.4) como:
X( 0 ) X( 1 ) X( 2 ) X( 3 ) 1 1
1 2 3

1 W W W
2 0 2

1 W W W
3 2 1

x 0( 0) . x 0( 1) x 0( 2) x 0( 3)

1 W 1 W 1 W

(23-1)

La matriz de la ecuacin (23-1) se deriva de la (22-4) usando la relacin:

n.k

mo d( n . k , N )

Recerdese que mod(n.k,N) es el resto de la divisin entre n.k y N, por lo tanto si N=4, n=2 y k=3 entonces:

W
ya que

(23-2)

n.k

exp

j . 2. . ( 6) 4 W
2

exp( j . 3. ) exp( j . )
mod( n . k , N )

exp

j . .2. ( 2) 4

(23-3)

El segundo paso en el desarrollo es factorear la matriz cuadrada en (23-1) como sigue:


X( 0 ) X( 2 ) X( 1 ) X( 3 ) 1 W 1 W 0 0 0 0
0 2

0 0

0 0
1 3

1 0 W . 0 1 0

0 W
0

x 0( 0) . x 0( 1) x 0( 2)
2

1 W 1 W

1 0 W 0 1 0

0 W

(23-4)

x 0( 3)

Se puede demostrar fcilmente que el producto de las dos matrices cuadradas da por resultado la matriz cuadrada de (23-1). Con la excepcin que las filas 1 y 2 han sido intercambiadas. Note que el intercambio ha sido tomado en cuenta en (23-4) reescribiendo el vector columna X(n), se denota el vector con la fila intercambiada por:

X( 0 ) X d ( n) X( 2 ) X( 1 ) X( 3 )

(23-5)

Esta factorizacin es la clave de la eficiencia del algoritmo FFT. Habiendo aceptado el hecho que (23-4) es correcta, aunque los resultados estn "revueltos", se puede observar el nmero de multiplicaciones requeridas para computar la ecuacin. Hgase primero:
x 1( 0) x 1( 1) x 1( 2) x 1( 3) 1 0 W 0 1 0
2 0

0 W 0 W
2 0

x 0( 0) . x 0( 1) x 0( 2) x 0( 3)

1 0 W 0 1 0

(23-6)

Esto es, el vector columna x1(k) es igual al producto entre el vector y la matriz a la derecha de la ecuacin (23-4). El elemento x1(0) es computado por una multiplicacin compleja y una adicin compleja (W0 no es reducido a la unidad para desarrollar un resultado general).

x 1( 0) x 0( 0)

0 W .x 0( 2)

(23-7)

El elemento x1(1) est tambin determinado por una multiplicacin compleja y una adicin. Slo una adicin compleja se realiza para computar x1(2). Esto deviene del hecho que W0 = - W2. Por lo tanto

x 1( 2) x 0( 0)

2 W .x 0( 2) x 0( 0)

0 W .x 0( 2)

(23-8)

donde la multiplicacin compleja W0.x0(2) ya ha sido computada en la determinacin de x1(0). Por el mismo razonamiento, x1(3) es computada por slo por una adicin compleja y ninguna multiplicacin. El vector intermedio x1(k) es entonces determinado por cuatro adiciones y dos multiplicaciones complejas.
X( 0 ) X( 2 ) X( 1 ) X( 3 ) x 2( 0) x 2( 1) x 2( 2) x 2( 3) 1 W 1 W 0 0 0 0
0 2

0 0

0 0
1 3

x 1( 0) . x 1( 1) x 1( 2) x 1( 3)

1 W 1 W

(23-9)

El elemento x2(0) est determinado por una multiplicacin y una adicin complejas:

x 2( 0) x 1( 0)
10)

0 W .x 1( 1)

(23-

El elemento x2(1) est determinado por una adicin compleja porque W0 = - W2. Con un razonamiento similar x2(2) est determinado por una multiplicacin compleja y una adicin y x2(3) por slo una adicin. Luego el cmputo de (23-4) requiere un total de cuatro multiplicaciones complejas y ocho sumas complejas. En cambio el cmputo de (22-4) requiere diecisis multiplicaciones complejas y 12 sumas complejas. Ntese que el proceso de factorizacin de la matriz introduce ceros en las matrices factoreadas y, como resultado, reduce el nmero requerido de multiplicaciones. Para este ejemplo, el proceso de factorizacin de matriz ha reducido el nmero requerido de multiplicaciones en un factor de dos. Ya que el tiempo de cmputo es fuertemente gobernado por el nmero de multiplicaciones, se ve la razn de la eficiencia del algoritmo FFT. Para N = 2 el algoritmo FFT es entonces simplemente un proceso de factorizacin de una matriz N x N en matrices (cada una de N x N) de modo tal que cada una de las matrices factoreadas tenga una propiedad especial de minimizar el nmero de multiplicaciones y adiciones. Si se extiende el resultado del ejemplo previo, se nota que la FFT requiere N. /2 = 4 multiplicaciones complejas y N. = 8 adiciones complejas, mientras que el mtodo directo requiere N multiplicaciones complejas y N.(N-1) adiciones complejas. Si se supone que el tiempo de cmputo es proporcional al nmero de multiplicaciones, entonces la razn aproximada de tiempo de cmputo del mtodo directo al de la FFT est dado por:

N N.

2. N
(23-11)

la cual para N =1024 = 210 es una reduccin computacional de ms de 200 a 1. La Figura 23.1 ilustra la relacin entre el nmero de multiplicaciones requeridas usando el algoritmo FFT comparada con el nmero de multiplicaciones del mtodo directo.
2

f dir( N )

f fft( N )

N . ln( N ) 2 ln( 2 )

2 .. 1024

El procedimiento de factorizacin introduce una discrepancia. Recurdese que el cmputo de (23-4) produce:

X d ( n)

en vez de

X( n)

este reordenamiento es inherente al proceso de factorizacin de la matriz y es un problema menor debido a que es sencillo generalizar una tcnica de "reordenamiento" de Xd(n) para obtener X(n). Reescribiendo Xd(n) reemplazando el argumento n con sus equivalentes binarios:

X( 0 ) X( 2 ) X( 1 ) X( 3 )
se convierte en

X( 00) X( 10 ) X( 01) X( 11 )
(23-12)

Obsrvese que si los argumentos binarios de (18) son "flippeados" o "bit reversed" (es decir, 10 se transforma en 01, etc.) En otras palabras, la imagen del espejo del binario. entonces

X( 00) X d ( n) X( 10 ) X( 01) X( 11 )
flipea a

X( 00) X( 01) X( 10 ) X( 11 ) X( n)
(23-13)

Es sencillo desarrollar un resultado generalizado para "reordenar" la FFT. Para N mayor que 4, es voluminoso describir el proceso de factorizacin de la matriz anloga a (23-4). Por esta razn es conveniente interpretar a (23-4) de manera grfica. Usando esta formulacin grfica se puede describir en forma suficientemente generalizada un diagrama de flujo para un programa de computadora. 24 - GRAFICO DE FLUJO DE SEAL Se convertir la expresin (23-4) en un grfico de flujo como el de la Figura 24.1.

Como se muestra, se representa el vector de datos o arreglo x0(k) por una columna vertical de nodos sobre la izquierda del grfico. El segundo arreglo vertical de nodos es el vector x1(k) computado en la ecuacin (23-6), y el prximo arreglo corresponde el vector x0(k) = Xd(n), ecuacin (23-9). En general, se computarn arreglos, donde N =2 . El flujo de seal se interpreta como sigue. A cada nudo ingresan dos lneas slidas representando "sendas de transmisin" desde nudos previos. Una senda transmite o trae una cantidad desde un nodo en un arreglo, multiplica la cantidad por Wp, y saca el resultado por el nudo del prximo arreglo. El factor Wp aparece cerca de la flecha de la senda de transmisin, la ausencia de este factor implica que Wp = 1. Los resultados entrantes en un nudo desde dos sendas de transmisin son combinados aditivamente. Para ilustrar la interpretacin del grfico de flujo de seal, considrese el nudo x1(2) de la Figura 24.1. De acuerdo a las reglas para interpretar el grfico de flujo de seal:

x 1( 2) x 0( 0)

2 W .x 0( 2)

(24.1)

lo cual es simplemente la ecuacin (23-8). Cada nodo del grfico de flujo de seal es expresado similarmente. Este mtodo es entonces un mtodo conciso para representar los cmputos requeridos en la matriz factorizada del algoritmo FFT (23-4). Cada columna del grfico corresponde a una matriz factorizada; se requieren arreglos verticales de N puntos cada uno (N=2 ). La utilizacin de esta presentacin grfica permite fcilmente describir el proceso de factorizacin para N grande. Se muestra en grfico aparte (Figura 24.2) el diagrama de flujo de seal para N=16. Con un diagrama de flujo de seal de este tamao, es posible desarrollar las propiedades concernientes al proceso de factorizacin de la matriz y as proveer de un marco para el desarrollo de un diagrama de flujo para un programa de computadora que aplique el algoritmo FFT.

Uso del cdec en el DSKC6713

Para utilizar el cdec, es necesario configurarlo o modificarlo por medio de la BSL (boar support library, biblioteca de coporte de tarjeta) que de forma general tienen las siguientes caractersticas: La BSL prove una interface en C para la configuracion y control de los dispositivos en la tarjeta. - La librera consiste en modulos discretos que estn ya hechos y archivados en un archivo de biblioteca. El modulo del codec AIC23 se encuentra en esta biblioteca BSL, y para poder acceder a este dispositivo se requiere de los archivos de cabezera o headers: - DSK6713_AIC23_openCodec(int id DSK6713_AIC23_Config * Config) En el cual id = tipo de codec. Para DSK6713 id = 0 Config = valor de registro del cdec. A continuacin muestro los registros del cdec con su descripcin de a cuerdo al manual. /* Codec configuration settings */ DSK6713_AIC23_Config config = {\ 0x0017, /* 0 DSK6713_AIC23_LEFTINVOL Left line input channel volume */ \ 0x0017, /* 1 DSK6713_AIC23_RIGHTINVOL Right line input channel volume */\ 0x01f9, /* 2 DSK6713_AIC23_LEFTHPVOL Left channel headphone volume */ \ 0x01f9, /* 3 DSK6713_AIC23_RIGHTHPVOL Right channel headphone volume */ \ 0x0011, /* 4 DSK6713_AIC23_ANAPATH Analog audio path control */ \ 0x0000, /* 5 DSK6713_AIC23_DIGPATH Digital audio path control */ \ 0x0000, /* 6 DSK6713_AIC23_POWERDOWN Power down control */ 0x0043, /* 7 DSK6713_AIC23_DIGIF Digital audio interface format */ \ 0x0081, /* 8 DSK6713_AIC23_SAMPLERATE Sample rate control */ \ 0x0001 /* 9 DSK6713_AIC23_DIGACT Digital interface activation */ \ ;{ Entonces si quieremos hacer alguna modificacion en el funcionamiento del codec, de acuerdo a la instruccion antes mencionada, tendremos que referirnos a la caracteristica que queremos modificar, ya sea mediante su direccion (ej 0x01F9) o por su etiqueta (ej. DSK6713_AIC23_RIGHTHPVOL)

Desarrollo
Despues de implementar los siguientes programas se obtuvieron las siguientes graficas.
//FFTmain1.c //#include "dsk6713_aic23.h" //Uint32 fs=DSK6713_AIC23_FREQ_48KHZ; #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include <time.h> #include <conio.h> #define PTS 256 //Nmero de puntos de la FFT (potencia de 2) #define PI 3.14159265358979 typedef struct {float real,imag;} COMPLEX;

void FFT(COMPLEX *Y, int n); //FFT prototype float iobuffer[PTS]; //as input and output buffer float x1[PTS]; //intermediate buffer short i; //general purpose index variable short buffercount = 0; //number of new samples in iobuffer short flag = 0; //set to 1 by ISR when iobuffer full COMPLEX w[PTS]; //twiddle constants stored in w COMPLEX samples[PTS]; //primary working buffer main() { for (i = 0 ; i<PTS ; i++) // set up twiddle constants in w { w[i].real = cos(2*PI*i/PTS); //Re component of twiddle constants w[i].imag =-sin(2*PI*i/PTS); //Im component of twiddle constants } memset(iobuffer,0,sizeof(iobuffer)); for (i = 0 ; i<PTS/2 ; i++) { //iobuffer[i] = cos(2*PI*i/512.0)+sin(2*PI*i/512.0); iobuffer[i] = 1; } for (i = PTS/2 ; i<PTS ; i++) { //iobuffer[i] = cos(2*PI*i/512.0)+sin(2*PI*i/512.0); iobuffer[i] = 0; } //comm_intr(); //init DSK, codec, McBSP flag=1; //while(1) //infinite loop //{ while (flag == 0) ; //wait until iobuffer is full flag = 0; //reset flag for (i = 0 ; i < PTS ; i++) //swap buffers { samples[i].real=iobuffer[i]; //buffer with new data //iobuffer[i] = x1[i]; //processed frame to iobuffer } for (i = 0 ; i < PTS ; i++) samples[i].imag = 0.0; //imag components = 0 FFT(samples,PTS); //call function FFT.c

for (i = 0 ; i < PTS ; i++) //compute magnitude { x1[i] = sqrt(samples[i].real*samples[i].real + samples[i].imag*samples[i].imag); } //end of infinite loop } //end of main /* interrupt void c_int11() //ISR { output_sample((short)(iobuffer[buffercount])); //out from iobuffer iobuffer[buffercount++]=(float)((short)input_sample()); //input to iobuffer if (buffercount >= PTS) //if iobuffer full { buffercount = 0; flag = 1; } } */ Segundo cdigo: //FFT.c Funcin externa que contiene el algoritmo de la //FFT con N puntos (potencia de 2) con diezmado en frecuencia. #define PTS 256 //# of points for FFT typedef struct {float real,imag;} COMPLEX; extern COMPLEX w[PTS]; //twiddle constants stored in w //} return 0;

void FFT(COMPLEX *Y, int N) //input sample array, # of points { COMPLEX temp1,temp2; //temporary storage variables int i,j,k; //loop counter variables int upper_leg, lower_leg; //index of upper/lower butterfly leg int leg_diff; //difference between upper/lower leg int num_stages = 0; //number of FFT stages (iterations) int index, step; //index/step through twiddle constant i = 1; //log(base2) of N points= # of stages do { num_stages +=1; i = i*2; }while (i!=N); leg_diff = N/2; //difference between upper&lower legs step = 1; //step between values in twiddle.h for (i = 0;i < num_stages; i++) //for N-point FFT { index = 0; for (j = 0; j < leg_diff; j++) { for (upper_leg = j; upper_leg < N; upper_leg += (2*leg_diff)) { lower_leg = upper_leg + leg_diff; temp1.real = (Y[upper_leg]).real + (Y[lower_leg]).real; temp1.imag = (Y[upper_leg]).imag + (Y[lower_leg]).imag; temp2.real = (Y[upper_leg]).real - (Y[lower_leg]).real; temp2.imag = (Y[upper_leg]).imag - (Y[lower_leg]).imag; (Y[lower_leg]).real = temp2.real*(w[index]).real -temp2.imag*(w[index]).imag; (Y[lower_leg]).imag = temp2.real*(w[index]).imag +temp2.imag*(w[index]).real; (Y[upper_leg]).real = temp1.real; (Y[upper_leg]).imag = temp1.imag; } index += step; } leg_diff = leg_diff/2; step *= 2; } j = 0; for (i = 1; i < (N-1); i++) //bit reversal for resequencing data { k = N/2; while (k <= j) { j = j - k; k = k/2; } j = j + k; if (i<j) { temp1.real = (Y[j]).real; temp1.imag = (Y[j]).imag; (Y[j]).real = (Y[i]).real; (Y[j]).imag = (Y[i]).imag; (Y[i]).real = temp1.real; (Y[i]).imag = temp1.imag; } } return; } Tercer cdigo //FFTmain2.c #include "dsk6713_aic23.h" Uint32 fs=DSK6713_AIC23_FREQ_48KHZ;

#include <math.h> #define PTS 256 //Nmero de puntos de la FFT (potencia de 2) #define PI 3.14159265358979 typedef struct {float real,imag;} COMPLEX; void FFT(COMPLEX *Y, int n); //FFT prototype float iobuffer[PTS]; //as input and output buffer float x1[PTS]; //intermediate buffer short i; //general purpose index variable short buffercount = 0; //number of new samples in iobuffer short flag = 0; //set to 1 by ISR when iobuffer full COMPLEX w[PTS]; //twiddle constants stored in w COMPLEX samples[PTS]; //primary working buffer main() { for (i = 0 ; i<PTS ; i++) // set up twiddle constants in w { w[i].real = cos(2*PI*i/PTS); //Re component of twiddle constants w[i].imag =-sin(2*PI*i/PTS); //Im component of twiddle constants } memset(iobuffer,0,sizeof(iobuffer)); comm_intr(); //init DSK, codec, McBSP while(1) //infinite loop { while (flag == 0) ; //wait until iobuffer is full flag = 0; //reset flag for (i = 0 ; i < PTS ; i++) //swap buffers { samples[i].real=iobuffer[i]; //buffer with new data iobuffer[i] = x1[i]; //processed frame to iobuffer } for (i = 0 ; i < PTS ; i++) samples[i].imag = 0.0; //imag components = 0 FFT(samples,PTS); //call function FFT.c

for (i = 0 ; i < PTS ; i++) //compute magnitude { x1[i] = sqrt(samples[i].real*samples[i].real + samples[i].imag*samples[i].imag)/16; } x1[0]=32000; } } //end of main interrupt void c_int11() //ISR { output_sample((short)(iobuffer[buffercount])); //out from iobuffer iobuffer[buffercount++]=(float)((short)input_sample()); //input to iobuffer if (buffercount >= PTS) //if iobuffer full { buffercount = 0; flag = 1; } }

NOTA. Las graficas obtenidas no son las que se esperaban de acuerdo con el libro: esto se debe a que haba mucha interferencia en los caimanes, dado que los cables largos actan como antenas, aadiendo que nos encontramos en una zona muy cercana al cerro de transmiciones El Chiquihuite. Incluso cuando desconect el generador de funciones, segua apareciendo un ruido u onda menos a 1 khz en la pantalla.

Cuestionario 1. Cuntas sumas y multiplicaciones complejas se emplean en calcular una FFT de 8 puntos?

2. Cuntas sumas y multiplicaciones complejas se emplean en calcular una DFT de 8 puntos?

3. Qu diferencia existe entre la FFT con diezmado en frecuencia y la FFT con diezmado en tiempo.

Conclusiones Cerda Baos Omar :

Lopez Reyes Omar ( ausente el dia de la practica)

Se hace el desentendido, tubo una participacin nula en la practica, y no colabor ni en la ejecucin de las practicas, ni en la redaccin de los reportes y mucho menos en las invectigaciones.

Bibliografa [1] Code Composer Studio IDE Getting Started Guide, User's Guide. SPRU509f. [2] Tratamiento digital de seales. Proakis. Manolakis

INSTITUTO POLITECNICO NACIONAL UNIDAD PROFESIONAL INTERDISCIPLINARIA EN INGENIERIA Y TECNOLGIAS AVANZADAS - IPN

MATERIA Procesadores Digitales de Seales

ALUMNOS Cerda Baos Omar

PROFESOR Juan Manuel Madrigal Bravo.

TEMA FFT de 64 Puntos

Grupo 6TV1

Equipo 1

Tarea No.1 15/02/2011