PacoP's Place

  • Aumentar fuente
  • Fuente predeterminada
  • Disminuir fuente
Inicio Transformada de Fourier-FFT Programación algoritmo FFT

Programación del algoritmo FFT

E-mail Imprimir

    Sea In[0], In[1], ... In[N-1] un array con los datos de entrada temporales a transformar, y Out[0], Out[1], ... Out[N-1] el buffer de salida. El algoritmo tiene dos pasos fundamentales:
 

    Paso 1, Intercambio de bits (Bit reversal):

 

    Se copian los datos del buffer de entrada al buffer de salida, pero la posición que ocupará cada dato en el array de salida vendrá determinada por una inversión de los bits de la posición ocupada en el array original.

    Voy a explicar esto, que es simple, aunque confuso de comprender al principio. Se ve claramente con la siguiente tabla, para ocho muestras:
 
 

Posición de los datos del array de entrada

Posición de los datos arrayde salida: inversión de bit

Decimal Binario Binario Decimal
0 000 000 0
1 001 100 4
2 010 010 2
3 011 110 6
4 100 001 1
5 101 101 5
6 110 011 3
7 111 111 7
 

    Como vemos en la tabla anterior, el dato de la posición 0, se copiaría en la posición 0 en el array de salida, el de la posición 1 en la posición 4, el de la posición 2 en la posición 2, etc.

 De esta forma, si por ejemplo tuviésemos el siguiente array de entrada:
 
 

0 1 2 3 4 5 6 7
1 3 5 2 5 1 3 4
 

    en el array de salida obtendríamos:
 
 

0 1 2 3 4 5 6 7
1 5 5 3 3 1 2 4
 

    El algoritmo que se ocupa de la reordenación anterior es el siguiente (basado en desplazamientos y operaciones lógicas a nivel de bit):
 

    int k,khat,bit;

      for (k=0, khat=0; k
        {
          Out[khat]=In[k];
          for (bit=N/2; (khat & bit)!=0; bit >>=1)
            khat ^= bit;
          khat ^= bit;    /* Fin del incremento de khat */
        }

     

    Paso 2, Iteración:

 

    Una vez ordenado el array de salida, solo hay que realizar el siguiente bucle (donde * denota una multiplicación compleja) para obtener en el array de salida la transformada:
 

    # define pi 3.14159265358
    for (n=2; n<=N; n <<= 1)
    {
      w=2*pi/n;
      for (m=0; m
        {
        for (k=0; k
          {
          y=Out[m+k];
          z=Out[m+k+n/2] * exp(-ikw);
          Out[m+k]=(y+z)/2;
          Out[m+k+n/2]=(y-z)/2;
          }
        }
    }
 
Comentarios (3)
unas dos q tres preguntas mas
3 Domingo, 11 de Julio de 2010 08:49
jose
bueno este algoritmo sirver para calcular la traformada rapida de fouier (FFT), bueno si vale me parece una gran idea una de las mejores q he visto en mi vida.
segundo el array de entrada puede ser de cualquier tamañano?, segun lo q lei la fft se creo para q no haya el problema de q la onda sea simetrica, y bueno la respuesta ppor asi decirlo de una fft es la sumaoria de todas las frecuencias q componen la onda, hasta q frecuencia me da a la salida? me da la amplitud ? en la salida lo implemente en matlab pero me dio datos medios raros ? si no fuera mucha molestia podrias ampliar mucho mas el proceso y el porq de algunos pasos muchas gracias de ante mano
error
2 Sábado, 07 de Noviembre de 2009 15:49
angel
hay un error, esta incompleto el texto, yo antes cuando esta info estaba en otra web habia copiado y escrito los algoritmos en vb6 y veo que ahora le falta esa parte y otras mas...
for (k=0; k
{
peticion si no es mucho pedir
1 Lunes, 25 de Mayo de 2009 18:36
benikito
ME podrian hacer el favor
de realizar esta misma programacion pero en matlab?
La cuestion es que yo lo intento xo algo falla si me dieran ideas...seria
muy de agradecer
Gracias

Agrega tu comentario

Tu nombre:
Título:
Comentario:
  La palabra para verificación anti SPAM. Letras minúsculas sólamente y sin espacios.
Palabra de seguridad: