Documente Academic
Documente Profesional
Documente Cultură
Implementaci
on de la FFT
Radix-2
Sotero Ordones Nogales
Programa: Maestra en Ciencias en Ingeniera Electronica y
Computacion
1.
Introducci
on
2.
N
1
X
x[n]ej2/N
n=0
k = 0, 1, . . . , N 1
(2)
N 1
1 X
x[n] =
X[k]ej2/N
N k=0
n = 0, 1, . . . , N 1
(3)
Como menciona Nakamura [9], no es recomendable implementar algoritmos siendo incondicional a las ecuaciones o formulas; debido que generalmente, existen maneras mas eficientes de implementarlas. Como se puede
observar en (4) y (5) el problema abordado tiene un orden de complejidad
O(n2 ) lo que significa que el crecimiento de la demanda de calculos crece en
forma cuadratica (N 2 ).
En la presente seccion tiene como objetivo implementar la DFT de forma eficiente basada en el algoritmo de la Transformada Rapida de Fourier
(FFT)1 mediante la reduccion del n
umero de calculos. En el presente trabajo
se utilizo el algoritmo de Cooley-Tukey descrito en [2] que tiene un orden
de complejidad de O(N log(N ), si bien es cierto, el algoritmo de Winograd
(WFTA)[17] reduce el n
umero multiplicaciones a un total de N pero aumenta el n
umero de sumas considerablemente; WFTA es mas ventajoso cuando
la multiplicacion es significativamente mas lenta que la suma, lo que normalmente ocurre cuando se utiliza aritmetica de coma fija [10]. Sin embargo, la
complejidad de WFTA para la implementacion radica en el indexado para
las operaciones, la imposibilidad de hacer computo en el mismo lugar y que
se presentan diferencias estructurales significativas para los valores de N [10],
para mas detalles de la implementacion consultar [13]. A esto se debe que
para secuencias con N suficientemente grande el algoritmo de Cooley-Turkey
es mas recomendable [4]. Cabe mencionar que las diferentes versiones de fft
de Matlab utilizan las bibliotecas de FFTW2 y esta a su vez utiliza como
algoritmo principal el de Cooley-Tukey [5].
El algoritmo de Cooley-Tukey para una implementacion eficiente de la
Transformada Discreta de Fourier se desarrolla en seguida, por cuestiones de
claridad se reescriben las ecuaciones (2) y (3) como sigue
X[k] =
N
1
X
x[n]W nk
k = 0, 1, . . . , N 1
(4)
n=0
x[n] =
N 1
1 X
X[k]W nk
N k=0
n = 0, 1, . . . , N 1
(5)
donde las constantes W son conocidas como factores twiddle y estan definidas
como:
W = ej2/N
(6)
se debe observar que W es una funcion de longitud N , por ello mas adelante
podemos expresarla como WN .
Como se puede observar en (2) la DFT para un valor X(k) se requiere
de N sumas y N (N 1) multiplicaciones complejas, como se muestra a
continuacion
X(k) = x(0) + x(1)W k + + x(N 1)W (N 1)k
k = 0, 1, . . . , N 1 (7)
X0
X1
X2
..
.
XN 1
1
1
1
..
.
1
WN
WN2
..
.
1
WN2
WN4
..
.
1
WN3
WN6
..
.
2(N 1)
1 WNN 1 WN
1
WNN 1
2(N 1)
WN
..
.
(N 1)(N 1)
WN
x0
x1
x2
x3
..
.
xN 1
(8)
con esta representacion se abordan la explicacion del algoritmo implementado
para la solucion del problema.
Ahora consideramos una secuencia x[n] de dimension N tal que
N = N1 N2
as el n se puede expresar como una funcion de dos indices,
n = n1 + N 1 n2 ,
N
1 1 N
2 1
X
X
x[n1 + N1 n2 ]WN 1
(9)
n1 =0 n2 =0
N
1 1 N
2 1
X
X
(10)
n1 =0 n2 =0
N
1 1 N
2 1
X
X
(11)
n1 =0 n2 =0
N
1 1
X
n1 =0
"
N
2 1
X
x[n1 +
N2 n2 ]WNn22 k2
n2 =0
WNn2 k2
WNn11 k1
(12)
N
2 1
X
x[n1 + N1 n2 ]WNn22 k2 ,
n2 =0
0 k2 N2 1
(13)
N
1 1
X
G[n1 , k2 ]WNn1 k2 WNn11 k1
n1 =0
(14)
(15)
N
1 1
X
n1 =0
b 1 , k2 ]W n1 k1
G[n
N1
(16)
b 1 , k2 ] se obtuvieron de
donde podemos observar que las N1 secuencias G[n
multiplicar las Transformadas G[n1 , k2 ] por los factores de giro WNn1 k2 . Con
base a (12) y (15) decimos que las trasformadas del renglon (12) y la multiplicacion del factor de giro pueden realizarse en el mismo lugar [8].
Si separamos la transformada discreta de fourier en dos sumarios para los
k
indices de k pares y los impares y dado que WN/2
= (cos j sin )k = (1)k
se obtiene
N
2
X[k] =
1
P
n=0
N
1
2
X[k] =
x[n] + x n +
x[n] x n +
n=0
N
2
N
2
W nk
para k par
(17)
nk
para k impar
decimos que 2k son todos los valores pares de k y 2k+1 todos lo impares, y
reescribimos las ecuaciones anteriores tenemos
N
2
X[2k] =
1
P
n=0
X[2k + 1] =
nk
a[n]WN/2
N
2
1
P
n=0
k = 0, 1, . . . , N/2 1
(18)
nk
b[n]WNn WN/2
k = 0, 1, . . . , N/2 1
3.
Implementaci
on
A continuacion se escribe este algoritmo en pseudo-codigo que corresponde a (18) el cual es considerado base para el desarrollo de las subrutinas en
lenguaje de programacion C que se muestran mas adelante.
Algoritmo 1 Algoritmo de Cooley-Tukey
1: para todo m = n, n 1, . . . , 2, 1 hacer
2:
para todo k = 0, 1, 2, . . . , 2m+1 1 hacer
3:
e Wmk
4:
para todo r = 0, 2m , 2m+1 , . . . , 2n 1 hacer
5:
u = f[
r + k]
6:
v = f [
r + k + 2m1 ]
7:
f [
r + k] = u + v
8:
f [
r + k + 2m1 ] = (u v)e
9:
fin para
10:
fin para
11: fin para
En la figura 3 se ilustra la ejecucion del algoritmo anterior (Cooley-Tukey
o Radix 2), a los bloques de la derecha se les nombra mariposas; a ello se debe
que el algoritmo tambien se le nombre de algoritmo de mariposas. Podemos
observar que el algoritmo consiste en calcular las Transformadas de Fourier
de dos valores de la secuencia en forma recursiva.
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
62
63
64
65
66
67
68
69
70
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
71
72
73
int k ;
// crear
complex
complex
complex
complex
74
75
76
77
78
79
arreglos temporales
- 1) ;
- 1) ;
- 1) ;
- 1) ;
80
if ( n == 1) {
// la recursion termino
y [0] = x [0];
free ( b ) ; free ( c ) ;
free ( t ) ; free ( s ) ;
return ;
}
nh = n / 2;
// hacer los conjuntos de transformadas por pares e
// impares
for ( k = 0; k < nh - 1; k ++) {
s [ k ] = x [2* k ]; // pares
t [ k ] = x [2* k + 1]; // impares
}
// calcular las transformadas recursivamente
// las transformadas ( el diagrama de mariposa )
fft_rradix2 (s , b , nh , type ) ; // pares
fft_rradix2 (t , c , nh , type ) ; // impares
// multiplicar por la constante de giro
fft_giro (c , nh , type * 1/2) ;
// guardar los valores de la transformada en
// el vector resultado .
for ( k = 0; k < nh ; k ++) {
y [ k ] = b [ k ] + c [ k ];
x [ k + nh ] = b [ k ] - c [ k ];
}
free ( b ) ; free ( c ) ;
free ( s ) ; free ( t ) ;
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
10
10
10
10
10
Recursive Radix2
6
NoRecursive Radix2
10
DFT
8
10
10
11
12
13
Signal dimension 2
4.
Conclusiones
Referencias
[1] S.C. Chapra and R.P. Canale.
McGraw-Hill, 2007.
[2] J.W. Cooley and J.W. Tukey. An algorithm for machine calculation of
complex fourier series. Mathematics of Computation, 19(90):297301,
Apr 1965.
[3] K. Dowd and C.R. Severance. High Performance Computing. A Nutshell
handbook. OReilly, 1998.
[4] P. Duhamel and M. Vetterli. Fast fourier transforms: A tutorial review
and a state of the art. Signal Process., 19(4):259299, April 1990.
[5] M. Frigo and S. G. Johnson. The design and implementation of FFTW3.
Proceedings of the IEEE, 93(2):216231, 2005. Special issue on Program
Generation, Optimization, and Platform Adaptation.
[6] G. Goedecker and A. Hoisie. Performance Optimization of Numerically
Intensive Codes. Society for Industrial and Applied Mathematics, 2001.
[7] C. Meletis, P. Bougas, G. Economakos, P. Kalivas, and K. Pekmestzi.
High-speed pipeline implementation of radix-2 dif algorithm. International Journal of Electrical, Robotics, Electronics and Communications
Engineering, 1(2):232 235, 2007.
[8] S.K. Mitra. Procesamiento de se
nales digitales: un enfoque basado en
computadora. McGraw-Hill-Interamericana, 2007.
[9] S. Nakamura. Metodos numericos aplicados con software. Pearson Educacion, 1992.
[10] A.V. Oppenheim and R.W. Schafer. Discrete-Time Signal Processing.
Pearson Custom Library. Pearson Education, Limited, 2013.
[11] J.G. Proakis and D.G. Manolakis. Tratamiento digital de se
nales. Fuera
de coleccion Out of series. Pearson Educacion, 2007.
[12] G. Ramos. Roundoff error analysis of the fast fourier transform. Mathematics of Computation, 25(116):757768, Oct 1971.
10
11