Sunteți pe pagina 1din 12

UNIVERSIDAD DE GUADALAJARA

CENTRO UNIVERSITARIO DE CIENCIAS


EXACTAS E INGENIERIAS

Implementaci
on de la FFT
Radix-2
Sotero Ordones Nogales
Programa: Maestra en Ciencias en Ingeniera Electronica y
Computacion

Profesor: Dr. Roberto Carrasco Alvarez


15 de noviembre de 2014

1.

Introducci
on

La transformada discreta de Fourier (DFT) es un caso particular de la


transformada de Fourier para secuencias de longitud finita. La DFT juega un
papel importante en el analisis, dise
no y la realizacion de algoritmos y sistemas de procesamiento de se
nales digitales. Entre las principales aplicaciones
de la DFT descartan tres: 1) La estimacion espectral, 2) Para determinar
la salida temporal de un sistema LTI y 3) La identificacion de la funcion de
transferencia de sistemas a partir de su comportamiento frecuencial. Desde un
punto de vista practico, por el caracter discreto de la transformada obtenido
y su aplicacion a secuencia de longitud finita, vuelve idonea su aplicacion en
dispositivos de calculo digital. Sin olvidar los algoritmos que permite calcular la DFT de forma eficiente denominados Transformada Rapida de Fourier
(FFT).
El objetivo del presente documento es deducir e implementar la FFT
Radix-2. En la siguiente seccion muestra la deduccion del algoritmo en cuestion. Posteriormente se aborda al implementacion del mismo y en la u
ltima
seccion se mencionan las conclusiones a que se llegaron.

2.

Transformada Discreta de Fourier

La transformada Discreta de Fourier (DFT) es el equivalente en discreto


de la Transformada de Fourier donde se a transformado la variable continua
t por la variable discreta nTs siendo Ts el periodo de muestreo. Recordando
la Transformada de Fourier de una se
nal analogica x(t)
Z
x(t)ejt dt
(1)
X() =

Por otra parte la Transformada Discreta de Fourier es un metodo eficiente


para determinar espectro en frecuencia de una se
nal[10]. La DFT permite
llevar (convertir) una secuencia de valores en el dominio del tiempo al dominio
de la frecuencia. De la misma forma que en tiempo continuo, la DFT tiene una
transformada inversa (IDFT) que realiza el proceso contrario. A continuacion
se muestra este par de transformadas.
X[k] =

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

El termino FFT abarca distintos algoritmos.


La biblioteca FFTW esta desarrollada por el MIT y presume de ser la implementaci
on
libre mas r
apida de la transformada de fourier http://http://www.fftw.org/.
2

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)

entonces si se desea obtener la transformada completa de la secuencia X(k)


se necesita N 2 sumas complejas y N 2 productos complejos; si N es lo suficientemente grande se vuelve necesario aumentar los requerimiento computacionales del dispositivo. Por conveniencia reescribimos a (2 en forma matricial
como sigue

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 ,

n1 [0, N1 1], n2 [0, N2 1]


3

del mismo modo k se puede expresar de forma analoga a n


k = N2 k1 + k2 ,

k1 [0, N1 1], k2 [0, N2 1]

as tenemos un mapeo de una secuencia en una dimension (1D) de longitud


N a otra secuencia de dos dimensiones (2D) de dimension N1 N2 . Por lo
tanto podemos expresar (4) como
X[k] = X[N2 k1 + k2 ] =

N
1 1 N
2 1
X
X

[n +N1 +n2 ][N2 k1 +k2 ]

x[n1 + N1 n2 ]WN 1

(9)

n1 =0 n2 =0

por ley de los exponentes tenemos que


X[k] =

N
1 1 N
2 1
X
X

x[n1 + N1 n2 ]WNn1 N2 k1 WNn1 k1 WNN1 n2 N2 k1 WNN1 n2 k2

(10)

n1 =0 n2 =0

donde 0 k1 N1 y 0 k2 N2 . Ahora bien


N 2 k1
WNn1 N2 k1 = WNn11 N
= WNn11 k1 ,
2
N 1 n 2 N 2 k1
N 1 n 2 k1
= 1 y,
= WN1 N2
WN
WNN1 n2 k2 = WNN11Nn22 k2 = WNn22 k2

aplicando lo anterior a (10) se puede reducir la expresion a


X[k] =

N
1 1 N
2 1
X
X

x[n1 + N1 n2 ]WNn11 k1 WNn1 k2 WNn22 k2

(11)

n1 =0 n2 =0

reagrupando los sumatorios tenemos lo siguiente


X[k] =

N
1 1
X
n1 =0

"

N
2 1
X

x[n1 +

N2 n2 ]WNn22 k2

n2 =0

WNn2 k2

WNn11 k1

(12)

donde k1 [0, N1 1] y k2 [0, N2 1]. Sea


G[n1 , k2 ] =

N
2 1
X

x[n1 + N1 n2 ]WNn22 k2 ,

n2 =0

0 k2 N2 1

(13)

donde G[n1 , k2 ] es una Transformada Discreta de Fourier de N2 puntos para


cada n1 del arreglo bidimensional definido por x[n1 + N1 n2 ], sustituyendo
(13) en (12) obtenemos
X[k1 + N1 k2 ] =

N
1 1
X


G[n1 , k2 ]WNn1 k2 WNn11 k1

n1 =0

(14)

ahora si definimos la funcion


b 1 , k2 ] = G[n1 , k2 ]W n1 k2
G[n
N

(15)

b en (14) se tiene lo siguiente


sustituyendo G
X[k1 + N1 k2 ] =

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

la ecuacion (18) se le conoce como Radix 2 [11].


5

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.

Figura 1: Algoritmo de Transformada de Fourier Radix 2 o Cooley-Tukey.


En el codigo 1 se muestra una implementacion fiel de (18) en lenguaje C.
6

Cabe mencionar que la funcion fft giro multiplica el vector de transformada


por el coeficiente de giro W . Es conocido que debido a la representacion de los
n
umeros en la computadora el error de redondeo3 depende del algoritmo [1, 3],
es decir, dependiendo de la implementacion de codigo este sera afectado de
forma distinta. Cabe mencionar que el error de redondeo aumenta conforme
el n
umero de operaciones crece. Si el lector desea profundizar el analisis del
error de redondeo en aritmetica de punto flotante se recomienda el libro de
Wilkinson [16]. Para el analisis de error de redondeo en el algoritmo de la
transformada rapida de fourier Radix-2 se recomiendan los trabajos [15, 12].
Como menciona Down et al.[3] la velocidad de ejecucion de un programa
depende del porcentaje de tiempo que el procesador este ocupado haciendo
nuestros calculos; la gestion de la memoria para minimizar la adquisicion de
los datos es crucial para reducir los cuellos de botella en el procedimiento
[6]. El analisis a profundidad de estos temas se sale del marco de los objetivos del presente documento. Sin embargo, para presentar un primer contacto
con esto se realizo la implementacion de la Transformada Discreta de Fourier
en base a la ecuacion (4) y otras dos basadas en el algoritmo Radix-2 diferenciadas por la tecnica de programacion de recursion. La finalidad de las
tres implementaciones es analizar la velocidad de ejecucion, as como el error
de redondeo. Por conveniencia se utiliza el comando fft de Matlab como
solucion exacta.
Codigo 1: FFT Radix-2 recursivo.
60
61

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

62
63
64
65
66
67
68

void fft_giro ( complex * c , int n , double v ) {


int k ;
for ( k = 0; k < n ; k ++) {
c [ k ] = c [ k ] * exp ( v *2* PI * I * k / n ) ;
}
}

69
70

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

71
72
73

void fft_rradix2 ( complex *x , complex *y , int n , int type ) {


int nh ;
3

Tipo de error debido a la aritmetica finita de las computadoras.

int k ;
// crear
complex
complex
complex
complex

74
75
76
77
78
79

memoria para los


* b = make_cv ( n /2
* c = make_cv ( n /2
* s = make_cv ( n /2
* t = make_cv ( n /2

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

En la Figura 3 se muestran los resultados del tiempo de ejecucion (para


graficar se utilizo el comando loglog de Matlab). Observamos que la version
recursiva es mas eficiente que la no-recursiva. Lo realmente interesante es
8

que para secuencia de longitud menor a 27 es mas eficiente el metodo de (4)


a pesar que el n
umero de operaciones realizadas es mayor que FFT Radix-2;
esto se debe a que la memoria en le caso de (4) esta alineada caso contrario
de FFT Radix-2. Para incrementar el rendimiento de FFT Radix-2 el lector
(si existe alguno) puede abordarse el problema desde un punto de vista de la
arquitectura pipeline como los propuestos en [14] y [7]. Ademas en la grafica
podemos observar que para una secuencia de longitud mayor que 512 es mas
recomendable utilizar la version recursiva por ser mas eficiente.

Enlapsed time for DFT and FFT Radix2

10

Enlapsed time (ms)

10

10

10

10

Recursive Radix2
6

NoRecursive Radix2

10

DFT
8

10

10

11

12

13

Signal dimension 2

Figura 2: Algoritmo de Transformada de Fourier Radix 2 o Cooley-Tukey,


codigo compilado con GCC 4.8.1 (version MinGW) bandera de compilacion
-O2 -pipe -Ofast -funroll-loops y ejecutado en un procesador Intel Core i5-4258U a 2.4Ghz.

4.

Conclusiones

A manera de conclusion decimos que calcular la transformada discreta


de fourier mediante Radix-2 es mas eficiente que calcularla como la multiplicacion matriz-vector. Esto se debe a dos aspectos esenciales en metodos
numericos: 1) se reduce el n
umero de operaciones aritmeticas y 2) se reduce
la propagacion del error de redondeo por la reduccion en el n
umero de operaciones. Por lo tanto, Radix-2 es el algoritmo recomendado para calcular la
transformada discreta de fourier.
9

Referencias
[1] S.C. Chapra and R.P. Canale.
McGraw-Hill, 2007.

Metodos numericos para ingenieros.

[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

[13] H.F. Silverman. An introduction to programming the winograd fourier


transform algorithm (wfta). Acoustics, Speech and Signal Processing,
IEEE Transactions on, 25(2):152165, Apr 1977.
[14] R. Storn. Radix-2 fft-pipeline architecture with reduced noise-tosignal ratio. Vision, Image and Signal Processing, IEE Proceedings -,
141(2):8186, Apr 1994.
[15] P. D. Welch. A fixed-point fast fourier transform error analysis. Audio
and Electroacoustics, IEEE Transactions on, 17(2):151157, Jun 1969.
[16] J.H. Wilkinson. Rounding errors in algebraic processes. Prentice-Hall,
1963.
[17] S. Winograd. On computing the discrete fourier transform. Mathematics
of Computation, 32(141):175199, Jan 1978.

11

S-ar putea să vă placă și