Professional Documents
Culture Documents
1
2
Algoritmos para el Filtrado Eficiente de Seales Reales
Agradecimientos a mi familia
3
Algoritmos para el Filtrado Eficiente de Seales Reales
4
Algoritmos para el Filtrado Eficiente de Seales Reales
ndice de Contenidos
1 Introduccin.....8
2 Algoritmos FFT..12
3 Algoritmos Tradicionales.......42
3.1 Mtodo de Solapamiento y Almacenamiento (OLS)...42
5
Algoritmos para el Filtrado Eficiente de Seales Reales
4 Nuevos Algoritmos....50
5 Simulaciones y Resultados....62
6 Conclusiones.......68
Referencias..............71
Anexo.......71
6
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
Captulo 1
Introduccin
7
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
1. Introduccin
La transformada discreta de Fourier (DFT, Discrete Fourier Transform) juega un papel muy
importante en el diseo, anlisis y realizacin de sistemas y algoritmos de tratamiento de seales en
tiempo discreto. Las propiedades bsicas de la transformada de Fourier (DTFT, Discrete Time Fourier
Transform) y de la DFT hacen que analizar y disear sistemas en el dominio transformado sea
conveniente y prctico. Este hecho, junto con la existencia de algoritmos eficientes para el clculo
explcito de la DFT (en el captulo 2 del presente documento, se describen brevemente algunos de estos
algoritmos, conocidos como algoritmos de transformada rpida de Fourier (FFT, Fast Fourier
Transform)), la convierten en un componente importante de muchas aplicaciones prcticas de los
sistemas en tiempo discreto.
Una de estas aplicaciones es el filtrado lineal (convolucin lineal), considerada una de las operaciones
fundamentales en el procesamiento digital de seales. En el captulo 3 del presente proyecto, se
expondrn los mtodos empleados tradicionalmente para ello y que son conocidos como algoritmos de
solapamiento y almacenamiento (OLS, OverLap-and-Save) y solapamiento y suma (OLA, OverLap-
and-Add), aplicados principalmente en el caso de seales de entrada de larga duracin.
En la prctica, las seales para las que la DFT es computada son a menudo reales y existen multitud
de algoritmos especficamente diseados para su clculo. La forma ms comn de abordar el filtrado de
una seal real es manejar la DFT de las seales de entrada y de salida separadamente, sin embargo, estos
mtodos no se centran en el proceso de filtrado en s mismo.
En el captulo 4.1, se presentar un mtodo que realiza el proceso completo de filtrado a partir de
versiones complejas de seales reales, logrando as una considerable reduccin del tiempo de ejecucin
con respecto a los mtodos tradicionales OLS y OLA. El sacrificio es un incremento en la latencia que se
duplica. Mientras que la latencia no es un problema en muchas aplicaciones, s puede llegar a ser un
inconveniente para otras, particularmente en sistemas de tiempo real.
En el captulo 4.2, se desarrolla una tcnica que hace uso de DFTs complejas para el filtrado de
seales reales. Este mtodo presenta la misma latencia que OLS y OLA y se basa directamente en la DFT
tradicional. Adems, a diferencia de los algoritmos descritos en los captulos 3 y 4.1, este mtodo no est
limitado al filtrado por bloques, pudiendo ser usado en cualquier tipo de proceso de convolucin. Esta
tcnica reduce el nmero total de operaciones aritmticas, siendo el hecho ms sobresaliente que el
tiempo de ejecucin es inferior al obtenido con los mtodos comentados previamente. Por lo tanto, este
8
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
algoritmo puede ser utilizado en aplicaciones que usen seales reales y, particularmente, en sistemas de
tiempo real donde la latencia deba mantenerse pequea.
9
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
10
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
Captulo 2
Algoritmos FFT
11
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
2. Algoritmos FFT
La DFT [] de puntos de la secuencia [] son las muestras de la transformada de Fourier
2
( ) en frecuencias equiespaciadas = , es decir, en puntos de la circunferencia unidad del
plano complejo. En este captulo se describen varios mtodos muy eficientes que permiten calcular la
DFT. Estos algoritmos se denominan colectivamente transformada rpida de Fourier (FFT, Fast
Fourier Transform).
12
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
Unos meses despus de que Cooley y Tukey publicaran aquel artculo, comenzaron a surgir reportes
de otros investigadores que haban utilizado tcnicas similares. Philip Rudnick, investigador del Instituto
Scripps de Oceanografa de la Universidad de California en San Diego, someta un breve comunicado de
dos pginas [4] para su publicacin en la revista Mathematics of Computation. Rundnick report que haba
estado usando una tcnica similar, adaptada de un trabajo publicado por Danielson y Lanczos en 1942.
Efectivamente, el artculo de Danielson y Lanczos [5] describa en esencia el algoritmo de
desdoblamiento bsico de la FFT. Es interesante el hecho de que el algoritmo se presentaba en referencia
al tratamiento de problemas en imgenes de rayos X, un rea en la que, muchos aos despus de 1942, el
clculo de la Transformada de Fourier haba sido un cuello de botella. Estos autores mostraban cmo
reducir una transformada de 2 puntos en dos transformadas de puntos, utilizando solamente
operaciones adicionales. Hoy en da el tamao y el tiempo de clculo de su problema causan pavor. A
continuacin, se exponen unas lneas extradas de su artculo:
Adopting these improvements the approximate times for Fourier analysis are 10 minutes for 8
coefficients, 25 minutes for 16 coefficients, 60 minutes for 32 coefficients, and 140 minutes for 64
coefficients.
Revisando este breve resumen histrico, resulta llamativo que los algoritmos anteriores al de Cooley
y Tukey hayan desaparecido o permaneciesen ocultos, mientras que ste tuvo enorme repercusin. Una
explicacin posible es que el inters en los aspectos tericos del procesamiento digital de seales fue
creciendo junto con las mejoras tecnolgicas en la industria de los semiconductores, ya que la
disponibilidad de mayor potencia de cmputo a costo razonable permite desarrollar muchas nuevas
aplicaciones.
A su vez, el avance de la tecnologa ha influido en el diseo del algoritmo. Mientras que en los aos
60 y principios de los 70 el inters se centraba en disminuir el nmero de multiplicaciones, el progreso
revel que tambin son de importancia fundamental el nmero de sumas y de accesos a memoria (desde
el punto de vista del software) y los costos de comunicacin (desde el punto de vista del hardware).
13
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
+
Propiedad de Simetra: = (2.2.1)
Propiedad de Periodicidad: +
= (2.2.2)
4 = 12 = 0 = 8 =
3 = 11 = 1 = 9 =
2 = 10 =
14
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
La forma en que se aplica este principio conduce a una variedad de algoritmos diferentes, todos ellos
similares en cuanto a mejora de la velocidad de cmputo.
En este captulo se presentan los algoritmos FFT ms comunes y se realiza una comparativa entre
ellos en cuanto a eficiencia ([6] y [7]). Se estudiar el caso en el que el nmero de puntos de la secuencia
original () es potencia entera de 2, en cuyo caso son de aplicacin dos tipos de algoritmos FFT. El
primero de ellos, denominado de diezmado en tiempo (DET), se basa en descomponer la secuencia []
en subsecuencias ms pequeas. En el segundo, la sucesin de los coeficientes [] de la DFT se
descompone en subsecuencias ms cortas; de ah su nombre de diezmado en frecuencia (DEF). Adems
de estos dos tipos de algoritmos, se estudiar un caso ms general en el que no es necesariamente
potencia de 2, pero s un nmero compuesto, es decir, producto de dos o ms enteros.
1 [] = [2] = 0,1, , 2 1. (2.3.1.1)
2 [] = [2 + 1] = 0,1, , 1. (2.3.1.2)
2
1 Las palabras muestra y punto se usan en este documento indistintamente para referirse a valor de una sucesin.
15
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
1 1
2 2
(2+1)
[] = [2]2 + [2 + 1]
=0 =0
1 1
2 2
= 1 []/2 + 2 []/2 = 1 [] + 2 [] (. . . )
=0 =0
Si a lo anterior aadimos el hecho de que 1 [] y 2 [] son peridicas de periodo /2, por lo que
+/2
1 [ + /2] = 1 [] y 2 [ + /2] = 2 [], y adems = , la DFT de puntos de la
secuencia [] se puede expresar como:
[] = 1 [] + 2 [] = 0,1, , 1. (2.3.1.4)
2
[ + /2] = 1 [] 2 [] = 0,1, , 1. (2.3.1.5)
2
1 [] = 1 [] 2 [] = 2 [].
x[0] X[0]
0
x[2] DFT X[1]
N/2 1
puntos
x[4] X[2]
2
x[6] X[3]
3
x[1] X[4]
4
x[3] DFT X[5]
5
N/2
puntos
x[5] X[6]
6
x[7] X[7]
7
Figura 2.3.1.1: Descomposicin de una DFT de N puntos en dos DFTs de N/2 puntos (N=8)
16
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
Resulta interesante comparar el nmero de multiplicaciones y sumas necesarias para calcular la DFT
mediante este mtodo con el que demanda el clculo directo de la DFT. En este ltimo caso, donde no
2
se explota la simetra del factor = , se necesitan aproximadamente 2 multiplicaciones y
sumas complejas. Si cada una de las transformadas de /2 puntos, 1 [] y 2 [], se efecta por clculo
directo, se deben realizar 2(/2)2 multiplicaciones complejas y aproximadamente 2(/2)2 sumas
complejas. Adems, para combinar las dos DFTs se requieren productos complejos para multiplicar la
2
segunda DFT de /2 puntos, 2 [], por = y sumas complejas para sumar este
resultado con la primera DFT de /2 puntos, 1 []. Por tanto, el clculo de la DFT para todos los
valores de mediante este mtodo requiere un mximo de /2 + 2(/2)2 = /2 + 2 /2
multiplicaciones y sumas complejas. Resulta sencillo comprobar que para > 2, /2 + 2 /2 ser
menor que 2 (equivale, aproximadamente, a dividir por 2 el nmero de operaciones).
Si /2 es par, lo que ocurre cuando es potencia de 2, se puede considerar calcular cada una de las
dos DFTs de /2 puntos, 1 [] y 2 [], dividindolas a su vez en dos DFTs de /4 puntos, que se
combinaran para obtener las DFTs de /2 puntos. Por tanto, 1 [] dar lugar a las dos subsecuencias
de /4 siguientes:
11 [] = 1 [2] = 0,1, , 1. (2.3.1.6)
4
12 [] = 1 [2 + 1] = 0,1, , 4 1. (2.3.1.7)
21 [] = 2 [2] = 0,1, , 4 1. (2.3.1.8)
22 [] = 2 [2 + 1] = 0,1, , 4 1. (2.3.1.9)
1 [] = 11 [] + /2 12 [] = 0,1, , 4 1. (2.3.1.10)
1 [ + /4] = 11 [] /2 12 [] = 0,1, , 4 1. (2.3.1.11)
17
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
2 [] = 21 [] + /2 22 [] = 0,1, , 4 1. (2.3.1.12)
2 [ + /4] = 21 [] /2 22 [] = 0,1, , 4 1. (2.3.1.13)
Figura 2.3.1.2: Descomposicin de una DFT de N/2 puntos en dos DFTs de N/4 puntos (N = 8).
Si sustituimos esta estructura en la figura 2.3.1.1, obtenemos como resultado el siguiente diagrama:
x[2] DFT 2
X[2]
/2 2
N/4
x[6] puntos 3 X[3]
/2
3
x[3] DFT
2 X[6]
N/4 /2 6
x[7] puntos 3 X[7]
/2 7
Figura 2.3.1.3: Descomposicin de una DFT de N/2 puntos en dos DFTs de N/4 puntos (N = 8).
18
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
1 1
2 2
[] = [] = [] 2 = [0] + (1) [1] (. . . )
=0 =0
De modo que:
Por tanto, la DFT de 2 puntos slo necesita una suma y una resta.
x[0]
0 = 1
/2
20 = = 1
x[4]
19
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
x[0] X[0]
0
/4 0 0
/2
x[4] X[1]
1
/4
1
/2 1
x[2] X[2]
2
/2
0
/4 2
x[6] X[3]
1 3
/4 /2
3
x[1] X[4]
4
0
/4 0
/2
x[5] X[5]
1
/4 5
1
/2
x[3] X[6]
2
/2 6
0
/4
x[7] X[7]
3
1
/4 /2 7
Figura 2.3.1.6: Diagrama completo de una DFT de 8 puntos.
20
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
El nmero de clculos necesarios para computar la DFT de la figura 2.3.1.6 se puede reducir an
2
ms explotando la simetra y la periodicidad de los coeficientes =
. En el diagrama de la figura
2.3.1.6 para pasar de una etapa a la siguiente se debe efectuar el clculo bsico que se muestra en la figura
2.3.1.7, que por la forma de representacin se denomina mariposa, donde los coeficientes son siempre
2
potencias de = y los exponentes difieren en /2.
Etapa (i-1)-sima Etapa i-sima
(+/2)
2 2
(+/2)
Adems, teniendo en cuenta que /2 =
2 = = 1, el factor =
(+/2)
de 2).
21
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
x[0] X[0]
0
x[4] X[1]
-1
0
x[2] X[2]
-1
0 2
x[6] X[3]
-1 -1
0
x[1] X[4]
-1
0 1
x[5] X[5]
-1 -1
0 2
x[3] X[6]
-1 -1
0 2 3
x[7] X[7]
-1 -1 -1
Figura 2.3.1.9: Diagrama completo de una DTF de 8 puntos usando mariposa de un solo producto.
Los algoritmos de FFT por DET se basan en calcular la DFT dividiendo la sucesin temporal []
en sucesiones de menor longitud. Una forma equivalente se obtiene si se divide la sucesin frecuencial
[] en sucesiones ms pequeas. Estos algoritmos se denominan de decimacin en frecuencia (DEF).
Al igual que hicimos para el caso DET, estudiaremos la situacin especial en la que es una
potencia entera de 2, es decir, = 2 . Como es un nmero entero par, distinguiremos entre las
muestras pares e impares de []:
1 [] = [2] = 0,1, , 2 1. (2.3.2.1)
2 [] = [2 + 1] = 0,1, , 2 1. (2.3.2.2)
En primer lugar, calcularemos una expresin para las muestras pares de []:
1
2 1
1 [] = []2 + []2 =
=0
=
2
1 1
2 2
2(+ )
2
= []2 + [ + ] = 0,1, , 1. (. . . )
2 2
=0 =0
2 2 2 2
2(+ 2 ) = 2 2 = 2 = /2
= /2 (. . . )
1
2
1 [] = {[] + [ + ]} = 0,1, , 1. (. . . )
2 2 2
=0
1
2 1
(2+1) (2+1)
2 [] = [] + [] = 0,1, , 1. (. . . )
2
=0
=
2
1 1
1 2 2
(2+1)(+ ) 2
(2+1) 2 ( )(2+1) (2+1)
[] = [ + ] = 2 [ + ]
2 2
=0 =0
=
2
1
2
(2+1)
= 2 [ + ]
2
=0
1
2
(2+1)
= [ + ]
2
=0
= 0,1, , 1. (. . . )
2
23
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
1 1 1
2 2 2
(2+1) (2+1) (2+1)
2 [] = [] [ + ] = {[] [ + ]}
2 2
=0 =0 =0
1
2
2
= {([] [ + ]) } = 0,1, , 1. (. . . )
2 2 2
=0
1 () = [] + [ + /2] = 0,1,2, , 2 1 (2.3.2.7)
2 () = ([] [ + /2]) = 0,1,2, , 2 1 (2.3.2.8)
Entonces:
1
2
1 [] = 1 () = 0,1, , 1. (. . . )
2 2
=0
1
2
2 [] = 2 () = 0,1, , 1. (. . . )
2 2
=0
La figura 2.3.2.1 muestra el procedimiento sugerido por las ecuaciones 2.3.2.3 y 2.3.2.6 para el
clculo de una DFT de = 8 puntos:
24
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
x[0] X[0]
x[1] X[2]
DFT de N/2
x[2] puntos X[4]
X[0]
x[3] X[6]
0
x[4] X[1]
-1
1
x[5] DFT de N/2 X[3]
-1
2 puntos
x[6] X[5]
-1
3
x[7] X[7]
-1
Figura 2.3.2.1: Descomposicin de una DFT de N puntos en DFTs de N/2 puntos (N=8).
En este caso podemos proceder de manera similar al desarrollo realizado para obtener el algoritmo
mediante diezmado en el tiempo. Como es potencia de 2, /2 es divisible por 2, por tanto, en las
DFTs de /2 puntos podemos calcular separadamente las muestras de ndice par e impar. Esto se
realiza combinando la primera y la segunda mitad de los puntos de entrada para cada una de las DFT de
/2 puntos, y calculando posteriormente las DFTs de /4 puntos. La figura 2.3.2.2 muestra el
diagrama resultante de aplicar este procedimiento:
Figura 2.3.2.2: Descomposicin de una DFT de N puntos en DFTs de N/4 puntos (N=8).
25
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
En el diagrama de la figura 2.3.2.2 para pasar de una etapa a la siguiente se emplea el clculo bsico
que se muestra en la siguiente figura, y que por su forma de representacin se denomina mariposa:
-1
x[0] X[0]
0
x[1] X[4]
-1
0
x[2] X[2]
-1
2 0
x[3] X[6]
-1 -1
0
x[4] X[1]
-1
1 0
x[5] X[5]
-1 -1
2 0
x[6] X[3]
-1 -1
3 2 0
x[7] X[7]
-1 -1 -1
Contando las operaciones aritmticas que se emplean en la figura 2.3.2.4 y generalizando para
= 2 , podemos comprobar que se necesitan (/2)2 multiplicaciones complejas y 2
sumas complejas para el clculo de los coeficientes de una DFT de puntos. Por tanto, en los
algoritmos de diezmado en el tiempo y diezmado en la frecuencia, el nmero de operaciones necesarias
es el mismo.
26
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
0 1 2 .. .. 2 -1
: : : : :
.. ..
: : : : :
Esto conlleva a una disposicin en la que la primera fila contiene los 2 primeros elementos de
[], la segunda fila contiene los siguientes 2 elementos, y as sucesivamente.
27
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
0 1 2 .. .. 2 -1
En este caso, obtenemos una disposicin en la que la primera columna contiene los 1 primeros
elementos de [], la segunda columna contiene los siguientes 1 elementos, y as sucesivamente.
2 1 1 1
(2 1 +2 )(2 1 +1 )
[1 , 2 ] = [1 , 2 ] (. . . )
2 =0 1 =0
28
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
(2 1 +2 )(2 1 +1 ) 1 1 2 1 1 2 2 1
Teniendo en cuenta que: = 2 2 1 2 y
22 1 1 21 1
1 1 2 1 2 1 1 1
que: 2 = = 21 2 = 1 ; 2 = = 1 = 11 ;
21 2 2
2 2 2
1 = = 22 .
2 1 1 1
1 2 1
[1 , 2 ] = [1 , 2 ] 11 22 2
2 =0 1 =0
2 1 1 1
1 1 2
= ( 2 [1 , 2 ] 11 ) 22 (. . . )
2 =0 1 =0
2 1 1 1
(1 +2 1 )(2 1 +2 )
(, ) = (1 , 2 ) (. . . )
2 =0 1 =0
(1 +2 1 )(2 1 +2 ) 2 1 2 1 2 1 1 2
Teniendo en cuenta que: = 1 1 2 2 y
22 1 1 21 1
2 1 1 1 2 1 1 2
que: 1 = = 1 = 11 ; 2 = 22 1 = 1 ; 2 =
21 2 2
2
= 22 .Obtenemos el siguiente resultado:
29
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
2 1 1 1
2 1 2
(, ) = (1 , 2 ) 22 11 1
2 =0 1 =0
1 1 2 1
2 1
= [ 1 2 (1 , 2 ) 22 ] 11 (. . . )
1 =0 2 =0
A simple vista pudiera dar la impresin de que el clculo computacional de los dos algoritmos
descritos anteriormente es mayor que el clculo directo de la DFT. Sin embargo, analizando el nmero
de operaciones requeridas en ambos procesos confirmamos que no es as:
Multiplicaciones complejas: ( + + )
Sumas complejas: ( + )
Estos esquemas no slo describen un procedimiento eficiente para calcular la DFT, sino que
tambin sugieren una forma de almacenar los datos originales y los resultados de los clculos intermedios
en vectores.
31
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
Para ver el procedimiento, tomaremos como ejemplo el diagrama de la figura 2.3.1.9 que describe el
clculo de una DFT de = 8 puntos mediante el algoritmo FFT de diezmado en el tiempo base 2.
Dentro de este grafo aparecen una serie de nodos que representan las variables necesarias para realizar el
programa, es decir, la cantidad de almacenamiento necesario. El algoritmo se divide en = 2
etapas. En el caso concreto que estamos estudiando el nmero de etapas es 3. Cada etapa obtiene
valores complejos de salida, a partir de otros valores complejos de entrada.
Una forma de almacenar los datos y resultados necesarios para realizar el programa que implemente
este algoritmo es utilizar vectores que permitan almacenar los valores complejos de las entradas y las
salidas de las distintas etapas. Para tener almacenados complejos de entrada y otros de salida slo
son necesarios 2 vectores de registros de almacenamiento complejos para todo el algoritmo, ya que el
vector de salida de una etapa se convierte en el vector de entrada de la siguiente, y por tanto, en un
principio, slo se necesitaran el vector con los resultados de la etapa anterior y el correspondiente a los
resultados que se estn calculando en la etapa actual.
Los elementos de cada vector de salida se obtienen como resultado de aplicar estructuras mariposa
como la de la figura 2.4.1.1 sobre los elementos del vector de entrada. Denominaremos [ ] ( =
0,1, , 1), a la secuencia de nmeros complejos resultantes de la i-sima etapa de clculo ( =
1,2, , ). Por tanto, en la primera etapa, 0 [] ser la secuencia de entrada [], mientras que en la
ltima etapa, [] se corresponder con los coeficientes de la DFT.
1 [] []
-1
1 [] []
Figura 2.4.1.1: Diagrama mariposa
En la figura 2.4.1.1 puede observarse que para obtener los valores de cualquier par de elementos de
una etapa ( [] []) slo se necesitan los valores de los elementos que estn en la misma posicin
en el vector de la etapa anterior (1 [] 1 []). Por tanto, si [] [] se almacenan en los
mismos registros que 1 [] 1 [], respectivamente, slo se necesitan registros complejos de
32
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
Por ltimo, analizaremos el diagrama de la figura 2.4.1.2 que describe el clculo de una DFT de
= 8 puntos mediante el algoritmo FFT de diezmado en frecuencia base 2. En este caso, el clculo
bsico tiene de nuevo la estructura de una mariposa, aunque de forma distinta a la que surge en los
algoritmos de diezmado en tiempo. Sin embargo, tal y como se aprecia en la figura 2.4.1.3, por la
naturaleza del clculo de la mariposa, los grafos de flujo que se basan en esta estructura se pueden
interpretar como algoritmos de cmputo en el mismo lugar.
1 [] []
1 [] []
Figura 2.4.1.3: Diagrama mariposa
Para explicar el significado del trmino bit inverso, tomaremos como ejemplo una secuencia de 8
muestras. En este caso, es suficiente con 3 dgitos binarios para indexar cada una de las muestras
[2 1 0 ], donde 0 es el bit LSB2, de tal forma que el orden de cada muestra viene dado por una
combinacin de estos tres bits.
La forma de ordenacin ms normal es en orden natural, tal y como se muestra en la figura 2.4.2.1.
En este caso, si el bit ms significativo del ndice de la muestra es cero, [0 1 0 ], sta pertenecer a la
mitad superior del vector ordenado. Si por el contrario, el ndice de la muestra es uno, [1 1 0 ],
pertenecer a la mitad inferior. Seguidamente, las subsecuencias de las mitades superior e inferior se
ordenan examinando el segundo bit ms significativo, y as sucesivamente.
2 1 0
0
[000]
0
1
[001]
0
0
[010]
1
1
[2 1 0 ] [011]
0
[100]
0
1
[101]
1
0
[110]
1
1
[111]
Otra forma de ordenar la secuencia es en orden bit inverso, como se muestra en la figura 2.4.2.1,
donde la filosofa de ordenacin es la misma que en el orden natural pero el sentido de la misma es del
bit menos significativo (0 ) al ms significativo (2 ).
Analizando el diagrama de la figura 2.3.1.9, (DFT de 8 puntos mediante diezmado en tiempo base
2), comprobamos que la entrada se almacena en orden bit inverso, las mariposas se realizan por cmputo
en el mismo lugar y, por tanto, la salida se almacena en orden natural.
34
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
En el caso del diagrama de la figura 2.3.2.4 (DFT de 8 puntos mediante diezmado en frecuencia base
2), la secuencia de entrada se almacena en orden natural, el clculo de las mariposas se realiza por
cmputo en el mismo lugar y, consecuentemente, la salida se almacena en orden bit inverso.
0 1 2
0
[000]
0
1
[100]
0
0
[010]
1
1
[2 1 0 ] [110]
0
[001]
0
1
[101]
1
0
[011]
1
1
[111]
35
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
Sin embargo, es posible modificar el orden de las secuencias de entrada y salida, lo que dar lugar a
formas alternativas, presentando cada una de ellas diferentes ventajas e inconvenientes.
Retomamos como ejemplo el diagrama de clculo de una DFT de 8 puntos mediante diezmado en
tiempo base 2 representado en figura 2.3.1.9, en el que la secuencia de entrada se dispone en orden bit
inverso y secuencia de salida en orden natural. Pues bien, realizando una serie de modificaciones sobre la
ubicacin de los nodos del grafo podemos conseguir que la secuencia de entrada est en orden natural y
la secuencia de salida en orden correspondiente a inversin de bits, tal y como se muestra en la figura
2.4.3.1:
x[0] X[0]
0
x[1] X[4]
-1
0
x[2] X[2]
-1
0 2
x[3] X[6]
-1 -1
0
x[4] X[1]
-1
0 1
x[5] X[5]
-1 -1
0 2
x[6] X[3]
-1 -1
0 2 3
x[7] X[7]
-1 -1 -1
Figura 2.4.3.1: Reestructuracin figura 2.3.1.9 con entrada en orden natural y salida en orden bit
inverso
Es posible obtener la figura 2.4.3.1 a partir de la figura 2.3.1.9. Para ello, todos los nodos
horizontalmente adyacentes a [4] en la figura 2.3.1.9 se intercambian con todos los nodos adyacentes
horizontalmente a [1]. De forma similar, todos los nodos horizontalmente adyacentes a [6] en la
figura 2.3.1.9 se intercambian con los adyacentes horizontalmente a [3]. Los nodos horizontalmente
adyacentes a [0], [2], [5] y [7] no se modifican. El grafo de flujo resultante de la figura 2.4.3.1
corresponde a la forma del algoritmo de diezmado en el tiempo dada originalmente por Cooley y Tukey
(1965). Como se puede apreciar, se trata de un algoritmo de cmputo en el mismo lugar, ya que la
disposicin de los nodos es tal que los nodos de entrada y de salida de cada mariposa son adyacentes
horizontalmente. Por tanto, en este caso, tambin ser suficiente con un nico vector de registros de
almacenamiento complejo.
36
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
Las implementaciones con las muestras de entrada en orden natural son muy tiles en procesos en
los que haya que concatenar FFT e IFFT3, como es el caso de un filtrado (figura 2.4.3.2). De esta forma,
se pueden evitar varias ordenaciones de la secuencia, proceso que puede resultar cada vez ms lento a
medida que crece.
X 1
Orden Orden
bit inverso natural
[]
Relleno con 0
Orden Orden Orden
natural natural bit inverso
Existe, por supuesto, una amplia variedad de formas alternativas. Sin embargo, la mayora de ellas no
tienen mucho sentido desde el punto de vista computacional. Por ejemplo, podramos ordenar los nodos
de forma que tanto la secuencia de entrada como la de salida presentaran un orden natural, tal y como se
aprecia en la figura 2.4.3.3.
x[0] X[0]
0
x[1] X[1]
-1
0
x[2] X[2]
-1
0 1
x[3] X[3]
-1
0
x[4] -1 X[4]
-1
0 2
x[5] X[5]
-1
0 2
x[6] -1 X[6]
-1 -1
0 2 3
x[7] X[7]
-1 -1 -1
Figura 2.4.3.3: Reconstruccin de la figura 2.3.1.9 con entrada y salida en orden natural
En este caso, no sera posible realizar el cmputo en el mismo lugar ya que la estructura en mariposa
no se mantiene tras la primera etapa, por lo que se necesitaran dos vectores de registros de
almacenamiento complejos de longitud . Por tanto, esta estructura no presenta ventajas aparentes.
Sin embargo, algunas formas presentan ventajas incluso cuando no es posible el cmputo en el
mismo lugar, como es el caso de la estructura de la figura 2.4.3.4. La caracterstica importante de este
grafo de flujo es que la geometra es la misma en cada etapa y slo las ganancias de los arcos cambian de
etapa en etapa, lo que permite una simplificacin en el acceso a los datos. Este grafo de flujo representa
el algoritmo de diezmado en el tiempo dado originalmente por Singleton (1969).
x[0] X[0]
0 0 0
x[4] X[1]
-1 -1 -1
x[2] X[2]
0 0 1
x[6] X[3]
x[1] -1 -1 -1 X[4]
0 2 2
x[5] X[5]
x[3] -1 -1 -1 X[6]
0 2 3
x[7] X[7]
-1 -1 -1
Figura 2.4.3.4: Reconstruccin de la figura 2.3.1.9 con la misma geometra en cada etapa.
38
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
x[0] X[0]
0
x[4] X[1]
-1
0
x[2] X[2]
-1
2 0
x[6] X[3]
-1 -1
x[1] X[4]
-1
0
1 0
x[5] X[5]
-1 -1
2 0
x[3] X[6]
-1 -1
3 2 0
x[7] X[7]
-1 -1 -1
x[0] X[0]
0 0 0
x[1] X[4]
-1 -1 -1
x[2] X[2]
1 1 1
x[3] X[6]
-1 -1 -1
x[4] X[1]
2 2 2
x[5] X[5]
-1 -1 -1
x[6] X[3]
3 3 3
x[7] X[7]
-1 -1 -1
Figura 2.4.3.6: DEF con misma geometra en cada etapa.
39
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
Como hemos visto en apartados anteriores, hacen falta una serie de coeficientes exponenciales
para = 0,1, , 2 1. Estos coeficientes se pueden requerir en orden normal o en orden de inversin
de bits. Su clculo es un proceso que debe ser optimizado, para lo que se proponen dos alternativas:
1. Uso de una tabla: consiste en calcular previamente todos los coeficientes necesarios en el
algoritmo y almacenarlos en una tabla. Esta opcin tiene la ventaja de la velocidad, sin embargo,
es necesario espacio de almacenamiento adicional; son necesarios N/2 registros de
almacenamiento complejos para guardar la tabla completa de valores de .
2. Clculo recursivo: consiste en calcular los coeficientes cuando sean necesarios. En una etapa
dada todos los coeficientes requeridos son mltiplos de . Si se requieren los coeficientes en
orden normal, se puede utilizar la frmula recursiva 2.4.4.1 para obtener el l-simo coeficiente a
partir del (l-1)-simo coeficiente:
= 1 (2.4.4.1)
Puede comprobarse claramente que los algoritmos que requieren los coeficientes en orden de
inversin de bits no se adaptan bien a esta solucin.
Este mtodo minimiza la memoria necesaria optimizando tambin el tiempo de clculo. Sin
embargo, hay que tener en cuenta que los coeficientes sufren un error de cuantificacin al almacenarlos,
el cual se ir acumulando al ir aplicando la recursin, hacindose inaceptable si crece mucho. Este
problema tiene un pequeo arreglo que consiste en introducir puntos de inicializacin en la recursin,
/4
por ejemplo, = , de forma que los errores no crezcan hasta hacerse inaceptables.
40
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
Captulo 3
Algoritmos Tradicionales
OLS y OLA
41
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
3. Algoritmos Tradicionales
En aplicaciones prcticas en las que es necesario el filtrado de seales, la secuencia de entrada []
suele ser a menudo de muy larga duracin.
En este captulo del proyecto se analizarn dos mtodos que dividen la secuencia de entrada, [],
en bloques de tamao fijo, , antes de ser procesada. Como el filtrado es lineal, los bloques sucesivos se
pueden procesar uno a uno mediante la DFT y la IDFT para obtener el bloque de datos de salida.
Finalmente, los bloques de salida se unen para formar la secuencia de salida global que ser idntica a la
que se habra obtenido si el bloque largo de entrada se hubiese procesado mediante la convolucin en el
dominio del tiempo. Gracias a los conocidos algoritmos FFT, estas tcnicas suponen un gran ahorro
computacional, comparado con el clculo directo del filtrado.
1 [] = {0,
0, ,0, [0], [1],, [ 1]} (. . )
1
2 [] = {[
+ 1],, [ 1],
[],, [2 1]} (. . )
1 1 []
42
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
3 [] = {[2
+ 1],, [2 1],
[2],, [3 1]} (. . )
1 2 []
A continuacin, se calcula la DFT de puntos de cada uno de estos bloques de datos. Por otra
parte, la respuesta impulsional del filtro [] se aumenta en longitud aadiendo 1 ceros, se calcula
su DFT de puntos y se almacena.
El bloque de salida [] para cada bloque de entrada se calcula a travs del producto de las dos
DFTs de puntos, [] y []:
[] = [] [], = 0,1, , 1. (. . )
Los primeros 1 puntos de [] estn distorsionados por el aliasing y deben ser desechados.
Por tanto, los ltimos puntos de [] son exactamente los mismos que se obtendran a partir de la
convolucin lineal:
[] = [], = , + 1, , 1. (. . )
Por ltimo, concatenando los bloques de salida [] se obtiene la secuencia de salida total [].
L L L
Seal de entrada
1 []
2 []
1
3 []
43
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
Seal de salida
1 []
2 []
1
3 []
2 [] = {[],
[ + 1],, [2 1],
0, 0,, 0 } (. . )
1
3 [] = {[2],,
[3 1],
0, 0, ,0 } (. . )
1
A continuacin, se calcula la DFT de puntos de cada uno de estos bloques de datos. Por otra
parte, la respuesta impulsional del filtro [] se aumenta en longitud aadiendo 1 ceros, se calcula
su DFT de puntos y se almacena.
Las dos DFTs anteriores se multiplican para formar el bloque de datos de salida:
[] = [] [], = 0,1, , 1. (. . )
La IDFT da como resultado bloques de salida de longitud que no estn afectados por aliasing,
debido a que tanto el tamao de las DFTs como el de las IDFTs es = + 1 muestras, y los
44
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
La secuencia de salida total [] se obtiene concatenando los bloques de salida [], de modo que
las 1 ltimas muestras de un bloque se solapen y se sumen a las 1 primeras muestras del
bloque siguiente. De aqu, que este mtodo sea conocido como de solapamiento y suma:
(. . )
La fragmentacin de los datos de entrada y la unin de los bloques de datos de salida para formar la
secuencia de salida total se muestra grficamente a continuacin:
L L L
Seal de entrada
1 []
1
2 []
3 []
Seal de salida
1 []
2 []
3 []
45
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
En este apartado se formularn los tradicionales mtodos OLS y OLA como clculos de producto
matriz-vector, donde la matriz es circulante y el vector est compuesto por bloques de entrada. Esto nos
conducir, naturalmente, a algoritmos modificados descritos en el captulo siguiente.
Consideremos el problema del filtrado de una secuencia de longitud infinita, [], con un filtro FIR
de longitud , definido por los coeficientes , = 0,1, , 1. Asumiendo que la secuencia de
salida, [], se compone por bloques, podemos escribir la siguiente expresin para la operacin de
filtrado por bloque:
= [ ] [ ] = + (3.3.1)
Dnde es el ndice de bloque, y 1 son los bloques de entrada de longitud actual y previo,
e se corresponde con el bloque de salida actual:
y denotan las matrices triangulares superior e inferior , constituidas por los coeficientes
del filtro:
0 1 1 0 0 0
0 0 2 1 0 0
[|] [ | ] (3.3.5)
[ 0 0 0 1 1 0 ]
Se aade una columna de ceros a la derecha de la matriz para igualar las dimensiones de ambas
matrices. En el mtodo tradicional OLS se implementa este filtrado por bloque extendiendo las
dimensiones 2 de la matriz [|], obteniendo como resultado una matriz , circulante, de
dimensiones 2 2. A partir de esto, podemos escribir la ecuacin 3.3.1 como sigue:
46
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
[ ] = [ ][ ] = (3.3.6)
El producto de la matriz circulante y el vector de entrada , formado por los bloques actual y
previo, es calculado mediante tcnicas FFT.
Por otra parte, en el mtodo tradicional OLA, en vez de usar dos bloques consecutivos como vector
de entrada, se anexa un bloque de ceros al bloque actual y se evala el producto matriz-vector, tal y
como se muestra a continuacin:
[ ] = [ ] [ ] = [ ] (3.3.7)
Como se puede comprobar, la matriz circulante es la misma que para el caso OLS y el producto
matriz-vector se calcula tambin mediante mtodos FFT.
En este caso, la salida actual del filtro se obtiene mediante la suma de y la versin retrasada de
:
= + = + 1 (3.3.8)
47
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
48
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
Captulo 4
Nuevos Algoritmos
49
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
4. Nuevos Algoritmos
En la mayor parte de los problemas prcticos, la DFT se aplica sobre secuencias reales. Sin embargo,
en la derivacin de los algoritmos DFT a menudo se asume que la secuencia de entrada es compleja.
En este captulo, se describen una serie de algoritmos que realizan el proceso de filtrado a partir de
versiones complejas de la secuencia real de entrada ([9] y [10]). En los computadores de hoy da, el
tiempo de clculo con datos complejos slo es un poco superior al tiempo de clculo con datos reales.
Aun as, embeber una DFT real en una DFT compleja equivalente es mucho ms eficiente.
El filtrado de seales reales de larga duracin mediante un filtro de respuesta impulsiva finita (FIR,
Finite Impulsive Response) con coeficientes reales es un problema comn en el procesamiento de
seales. Para filtros de larga duracin, se suelen emplear mtodos de convolucin muy rpidos basados
en los algoritmos OLS y OLA. Tal y como se describe en el captulo 3, en estos mtodos la seal de
entrada es segmentada en bloques que son procesados mediante algoritmos FFT. En la mayora de los
casos, la longitud de estos bloques es la misma que la del filtro.
Est comprobado que la eficiencia de la FFT es mayor cuando las seales de entrada y salida son
complejas. El objetivo de este apartado es el de presentar un algoritmo de este tipo, cuya clave es la
posibilidad de organizar dos bloques de entrada consecutivos como una secuencia compleja antes del
primer proceso FFT, ejecutar uno de los mtodos tradicionales (OLS u OLA), y obtener dos bloques de
salida consecutivos separando las partes real e imaginaria de la salida del segundo proceso FFT.
50
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
En la versin modificada del mtodo OLS, se consideran tres bloques de entrada de muestas
consecutivos en cada paso: el actual y los dos previos, denotados por , y , respectivamente.
+
[ ] = [ ][ ] (4.1.1.1)
+
En este caso, se combinan dos bloques de entrada consecutivos para formar una secuencia
compleja, pero la matriz circulante sigue siendo la misma que la de los mtodos tradicionales. El
producto matriz-vector se calcula usando transformadas complejas de 2N puntos.
Ahora, las primeras muestras de salida de la ecuacin 4.1.1.1 vienen dadas por:
= + + ( + ) (4.1.1.2)
Comparando esto con la ecuacin 3.3.1, es evidente que las 2 muestras que se requieren para los
bloques e pueden ser calculados por separacin de las partes real e imaginaria del vector . En
el siguiente paso, el procedimiento se repite despus de saltar dos bloques de muestras.
El mtodo OLA modificado se deriva de una forma similar. Se combinan dos bloques de entrada
consecutivos para formar una secuencia compleja, pero la matriz circulante sigue siendo la misma que la
de los mtodos tradicionales. El producto matriz-vector se calcula usando transformadas complejas de
2 puntos.
+ +
[ ] = [ ][ ]=[ ] (4.1.1.3)
0 +
51
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
= + 1 ( ) (4.1.1.4)
= + 1 ( ) (4.1.1.5)
De nuevo, 1 denota un retraso de un bloque. As, este procedimiento se repite despus de saltar
dos bloques de muestras.
Para ilustrar esta tcnica, asumiremos que se quiere reducir el retraso en el algoritmo OLS
modificado a muestras. Para lograr esto, se segmenta la entrada en bloques de muestras, donde
= /2, en vez de segmentarla en bloques de muestras como se haca anteriormente. En esta nueva
situacin, la longitud de los vectores complejos de entrada en la ecuacin 4.1.1.1 ser , por lo que la
dimensin de la matriz circulante formada por los coeficientes del filtro necesitar ser reducida
acordemente. Esto se consigue combinando los coeficientes del filtro, dos en un tiempo, empleando para
ello los componentes multifase, al igual que en la ecuacin 3.3.8, como sigue a continuacin:
() + + 1 , = 0,1, , 1 (4.1.2.1)
Con estos cambios, podemos reformular los clculos para el algoritmo OLS descritos en la ecuacin
4.1.1.1 como un producto de matrices ()(), en el dominio , tomando la transformada del vector
a ambos lados.
La matriz circulante () en este caso es idntica a la matriz circulante anterior, con la excepcin
de que las entradas son reemplazadas por (). Aunque esta matriz es funcin de , sus coeficientes
continan siendo reales. La evaluacin del nuevo producto matriz-vector ()() consistir en una
DFT compleja de puntos, seguido por filtros complejos y una IDFT compleja de puntos.
Podemos, por tanto, obtener los dos bloques de salida de longitud separando las partes real e
imaginaria de la primera mitad del vector de salida, siendo la segunda mitad descartada.
52
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
En los problemas prcticos, las seales para las que las DFTs son calculadas a menudo son reales.
Por el contrario, en la derivacin de los algoritmos DFTs es normalmente asumido que los datos de
entrada son complejos. Adems, la aritmtica compleja requiere slo de un poco de ms tiempo de
procesamiento que la aritmtica real, con los computadores de hoy en da. En definitiva, embeber una
DFT real en una DFT compleja equivalente proporciona mejores resultados.
Es comn encontrar algoritmos que son especficamente diseados para el clculo de DFTs de datos
reales. Sin embargo, el enfoque tpico a la hora de filtrar una seal real es manejar la DFT de las
secuencias de entrada y salida separadamente y no prestando atencin a eficientar el proceso de filtrado
en s mismo.
En este apartado, se desarrolla una tcnica que emplea DFTs complejas para el filtrado de seales
reales. Este mtodo presenta la misma latencia que OLS y OLA y est basado directamente en la DFT
tradicional. Adems, a diferencia de los mtodos OLS y OLA tracionales y modificados, el algoritmo
propuesto no est limitado al filtrado en bloques y puede ser usado para cualquier tipo de proceso de
convolucin. Se demuestra que el nmero total de operaciones aritmticas se reduce, siendo el hecho
ms destacado que el tiempo de ejecucin es inferior al de los mtodos de apartados anteriores. Por
tanto, el algoritmo que se propondr puede resultar til para aplicaciones que emplean seales reales y,
particularmente, para sistemas en tiempo real como reverberaciones acsticas, donde la latencia debe ser
pequea.
En los subapartados siguientes se revisar el mtodo tradicional para clculo de la DFT de una
secuencia real a partir de una versin compleja de esta, y se har uso de este resultado bsico para derivar
el mtodo propuesto.
53
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
En primer lugar, dividimos [] en dos subsecuencias; [] y [], que contienen las muestras
pares e impares de [], respectivamente. A partir de estas subsecuencias, construimos la seal compleja:
[] = [] + [] (4.2.1.1)
1
[] = 2 [ [] + [()]/2 ] (4.2.1.2)
1
[] = 2 [ [] [()]/2 ] (4.2.1.3)
2
[] = [] + [] ( ) = 0,1, , /2 (4.2.1.4)
Debido a la simetra conjugada de [], el resto de muestras = + 1, , 1, no es
2
Como ya es conocido, la FFT y su inversa IFFT estn estrechamente relacionadas. Por tanto, la
tcnica anterior es aconsejable para calcular la IFFT realizando tan slo unas pequeas modificaciones.
54
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
En este apartado, consideramos que queremos realizar un proceso de filtrado de datos reales. La
longitud de la secuencia de entrada es y la del filtro . Con estos datos, DFTs de + 1
puntos se necesitan para asegurar un clculo correcto de la convolucin lneal.
1. Evaluar H[k] y X[k], las FFTs de M puntos de la secuencia de entrada y del filtro,
respectivamente, haciendo uso de las ecuaciones 4.2.1.1, 4.2.1.2, 4.2.1.3 y 4.2.1.4.
2. Calcular Y[k]= X[k] H[k].
3. Calcular la IFFT de M puntos de Y[k] para obtener la secuencia de salida, y[n], empleando de
nuevo los resultados del apartado anterior.
Obviamente, este procedimiento es fcilmente aplicable en el filtrado en bloques, como OLS y OLA.
Dado que [] es usado en cada bloque, se podra precalcular para as reducir los requerimientos
computacionales.
2 2 2
[] + [] ( )
= [ [] + [] ( )
[ [] + [] ( )
] ]
(4.2.2.1)
2 2
( ) ( )
[ + /2] [ + /2] = [ [ + /2] [ + /2] ] [ [ + /2]
2
( )
[ + /2] ] (4.2.2.2)
55
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
Recordando que todas las DFTs de la ecuacin 4.2.2.2 tienen longitud /2, sabemos que [ +
/2] = [], [ + /2] = [], [ + /2] = [], [ + /2] = [], [ +
/2] = [] y [ + /2] = []. Por tanto:
2 2 2
[] [] ( ) = [ [] [] ( ) ] [ [] [] ( ) ] (4.2.2.3)
4
[] = [] [] + [] [] ( ) (4.2.2.4)
[] = [] [] + [] [] (4.2.2.5)
4
( )
[] = [] + [] = [ [] [] + [] [] ] + [ [] [] + [] []]
(4.2.2.6)
A continuacin, sustituyendo los resultados de las ecuaciones 4.2.1.2 y 4.2.1.3 en 4.2.2.6, obtenemos:
4 4
1 ( ) 1 ( )
[] = [] [ [] + [] (1 )] + [()]/2 [] (1 + )
2 2
(4.2.2.7)
4
1
() [] = [] + 2 [] (1 ( ) ) (4.2.2.8)
4
1
() [] = 2 [] (1 + ( ) ) (4.2.2.9)
[] = [] () [] + [()]/2 () [] (4.2.2.10)
56
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
De este modo, se completa el objetivo de obtener la secuencia de salida slo a partir de [], y no
de [].
En resumen, el mtodo propuesto para el filtrado de seales reales contempla los siguientes pasos:
Como se puede observar, las operaciones relacionadas con las seales de entrada y salida se reducen
a expensas de un incremento en el procesamiento de la repuesta impulsiva del sistema.
Adems, asumiremos que cada multiplicacin compleja cuenta como cuatro multiplicaciones reales y dos
sumas reales y que la DFT de puntos calculada mediante una FFT radix-2 requiere de:
Si la seal es real:
7
2 () (2) + 6 multiplicaciones reales.
3
(2) 2 () /2 + 2 sumas reales.
Si la seal es compleja:
2 2 () 7 + 12 multiplicaciones reales.
3 2 () 3 + 4 sumas reales.
57
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
A partir del recuento anterior, el total de requerimientos computacionales para el mtodo tradicional
es:
4 2 () 6 + 10 multiplicaciones reales.
6 2 () + 6 + 2 sumas reales.
4 2 () 6 + 24 multiplicaciones reales.
6 2 () + 8 sumas reales.
Multiplicaciones Sumas
Tradicional OLS 42 () 6 + 10 62 () + 6 + 2
Narasimha 42 () 6 + 12 62 () + 2 + 8
Propuesto 42 () 6 + 24 62 () + 8
58
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
A continuacin, se lista el nmero total de multiplicaciones y sumas requeridas en cada uno de los
algoritmos en funcin de diferentes valores de la longitud del filtro ():
A partir de la tabla anterior, podemos observar que el mtodo Propuesto es el que requiere el menor
nmero de adiciones con un mnimo incremento en el nmero de multiplicaciones.
59
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
60
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
Captulo 5
Simulaciones
61
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
5. Simulaciones y Resultados
En este apartado se evaluar el tiempo de ejecucin de programas para el clculo de los algoritmos
OLS Tradicional, Narasimha y Propuesto, desarrollados en lenguaje C++.
En los tiempos medidos slo se han tenido en cuenta operaciones realmente involucradas en cada
algoritmo. Es decir, no se han tenido en cuenta comandos como declaracin de variables, extraccin de
bloques o los relacionados con clculos de transformacin del filtro.
Dado que el tiempo de ejecucin depende altamente del software y hardware del PC, aparte de
detallar resultados absolutos, se especificar grficamente el ratio entre los tres algoritmos mencionados
para compararlos.
El clculo de las FFTs implicadas en estos algoritmos se realiza mediante subrutinas implementadas
en la librera FFTW, que permite computar la DFT en una o ms dimensiones, para secuencias de
entrada, reales o complejas, de tamao arbitrario. En concreto, se ha empleado la librera FFTW versin
3.3.4 (ltima versin oficial de FFTW) [11].
En las siguientes tablas se detallan los resultados obtenidos de la ejecucin de los algoritmos para
diferentes valores de la longitud de la secuencia de entrada y de la longitud del filtro.
En las siguientes grficas se representa el ratio de tiempo de ejecucin entre los tres algoritmos. En la
grfica 5.1, se representa en funcin de distintos valores de longitud de la secuencia de entrada y valor
fijo de longitud del filtro, y en la grfica 5.2, se representa para distintos valores de longitud del filtro y
valor fijo de longitud de la secuencia de entrada. No se han representado valores de tiempo absolutos,
puesto que estos dependen fuertemente del software y hardware que ha dado soporte a las simulaciones.
63
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
2,5
2
Ratio Tiempo de Ejecucin
1,5
OLS Tradicional
Narasimha
1 Propuesto
0,5
0
12 13 14 15 16
Cada uno de los resultados que se muestra en la grfica 5.1 se corresponde a la media de los resultados
obtenidos en 100 iteraciones del algoritmo correspondiente. En cada iteracin, los valores de la secuencia
de entrada y del filtro han sido generados de forma aleatoria. La longitud del filtro se ha fijado a 213
muestras.
Como se puede observar, cuando la longitud de la secuencia de entrada es muy superior a la longitud
de la secuencia del filtro, el comportamiento de cada mtodo depende fuertemente de la longitud de la
secuencia de entrada. En cualquier caso, los mejores resultados en cuanto a tiempo de ejecucin siempre
se consiguen con el mtodo Propuesto.
64
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
2,5
2
Ratio Tiempo de Ejecucin
1,5
OLS Tradicional
Narasimha
1 Propuesto
0,5
0
12 13 14 15 16
log2(N)
Al igual que en el caso de la grfica 5.1, los resultados que se muestran en la grfica 5.2 se
corresponden a la media de los resultados obtenidos en 100 iteraciones del algoritmo correspondiente.
En cada iteracin, los valores de la secuencia de entrada y del filtro han sido generados de forma
aleatoria. La longitud de la secuencia de entrada se ha fijado a 218 muestras.
Como se aprecia, para valores de la longitud de la secuencia de entrada muy superiores a la longitud
del filtro, el comportamiento de cada algoritmo manifiesta una dependencia muy leve con la longitud del
filtro. En todos los casos, el mtodo Propuesto es el que ofrece los mejores resultados.
65
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
Podemos concluir, por tanto, que el tiempo de ejecucin disminuye en gran medida cuando
recurrimos a FFTs de entradas complejas, siendo el mtodo propuesto el que ofrece mejores resultados
en cuanto a tiempo de ejecucin, requiriendo de un menor nmero de operaciones aritmticas.
66
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
Captulo 6
Conclusiones
67
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
6. Conclusiones
Se conoce que la Transforma Discreta de Fourier permite calcular el filtrado lineal en el dominio de
la frecuencia y que la existencia de algoritmos rpidos para su clculo, como son los algoritmos FFT
descritos en el captulo 2, la convierten en una eficiente herramienta para el clculo del filtrado.
El mtodo propuesto, descrito en el captulo 4, tambin aplica los procesos FFT sobre versiones
complejas de las secuencias reales pero, a diferencia del mtodo Narasimha, no est limitado al filtrado
en bloques y su latencia es la misma que la de los mtodos tradicionales. En cuanto al nmero de
operaciones necesarias, el algoritmo propuesto es el que requiere el menor nmero de sumas con un
incremento poco significativo en el nmero de multiplicaciones.
Como se puede comprobar a partir de los resultados de las simulaciones del captulo 5, el ahorro en
el tiempo de ejecucin de los algoritmos OLS no tradicionales (Narasimha y Propuesto), con respecto al
mtodo OLS Tradicional es mucho ms significativo que lo que respecta al ahorro en complejidad
computacional, siendo el mtodo propuesto el que presenta los mejores resultados en cuanto a tiempo de
ejecucin.
Podemos concluir, por tanto, que de los mtodos que se analizan en este proyecto, el mtodo
propuesto es el ms eficiente para el clculo del filtrado lineal de seales reales.
68
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
A continuacin, se comentan algunas lneas de investigacin futuras que podran ser de inters en la
bsqueda de conseguir mejorar los resultados obtenidos por los mtodos propuestos en este documento:
Adems de los algoritmos FFT, existen otros mtodos que permiten realizar un clculo de la
Transformada Discreta de Fourier de forma ms eficiente que el clculo directo. Teniendo en
cuenta la importancia del clculo de la DFT en el desarrollo de los mtodos expuestos en este
proyecto, resultara interesante analizar alternativas a la FFT, realizando una comparativa en
cuanto a requerimientos computacionales (operaciones aritmticas) y tiempo de ejecucin.
69
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
70
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
Referencias
[1] James D. Broesch, Dag Stranneby, William Walker, Digital Signal
Processing: Instant Access, 2009, 99.
[3] Cooley, J.W., y J.W. Tukey. An Algorithm for the Machine Calculation
of Complex Fourier Series, Mathematics of Computation, Vol.19, No.2,
April, 1965, 297-301.
71
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
[9] F.J Simois, J.I.Acha, Efficient real data filtering using complex-input
discrete Fourier transforms, Signal Processing 92 (2012), 1132-1136.
72
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
Anexo
Cdigos Fuente
73
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
A continuacin se detalla el cdigo fuente, programado en C++, para el clculo del algoritmo OLS
Tradicional:
#include <windows.h>
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <math.h>
#include <unistd.h>
#include <fftw3.h>
using namespace std;
// Prototipos de funciones.
double gaussrng(void);
double etime(LARGE_INTEGER *a, LARGE_INTEGER *b);
double OLS(int length_h, int length_x, int nreal);
int main(void)
{
//// Establecimiento de los parmetros generales. ////
74
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
int length_y = niter*latency + latency; // Longitud total que ha de tener y (rellenando con ceros).
fftw_complex *ph, *px, *py, *pH, *pX, *pY; // Punteros a bloques complejos.
double *pin, *pout,; // Punteros a bloques reales.
fftw_plan planh, planx, plany; // Variables para crear los planes.
75
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
// Reserva de memoria
pin = (double*) fftw_malloc(sizeof(double)*length_y); // Puntero a la secuencia de entrada.
ph = (fftw_complex*) fftw_malloc(sizeof(fftw_complex)*N); // Puntero a h.
for (int real = 0; real < nreal; real++) // Bucle para las realizaciones.
{
// Se crea el vector h y se calcula su DFT.
for (int ind=0; ind < length_h; ind++) {
ph[ind][0] = rand()%10;
ph[ind][0] = ph[ind][0];
ph[ind][1] = 0.0;}
for (int ind=length_h; ind < N; ind++) {
ph[ind][0] = 0.0;
ph[ind][1] = 0.0;}
76
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
// Se calcula la DFT de h.
fftw_execute(planh);
// Se crea el vector x.
for (int ind=0; ind < length_h; ind++) {pin[ind] = 0.0;}
for (int ind=length_h; ind < length_x+length_h; ind++) {pin[ind] = rand()%10;}
for (int ind=length_x+length_h; ind < length_y; ind++) {pin[ind] = 0.0;}
for (int iter=0; iter < niter; iter++) // Bucle para las iteraciones.
{
int s_init = iter*latency; // Posicin de la muestra inicial del bloque.
for (int ind=0; ind < N; ind++) {
px[ind][0] = pin[s_init+ind];
// Se multiplican pH y pX.
for (int ind = 0; ind < N; ind++)
{
pY[ind][0] = (pH[ind][0])*(pX[ind][0]) - (pH[ind][1])*(pX[ind][1]);
pY[ind][1] = (pH[ind][0])*(pX[ind][1]) + (pH[ind][1])*(pX[ind][0]);}
// Se calcula la IDFT de Y.
fftw_execute(plany); // Se calcula la IDFT de Y.
77
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
return secs;
}
A continuacin se detalla el cdigo fuente, programado en C++, para el clculo del algoritmo OLS
Modificado (Narasimha):
#include <windows.h>
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <math.h>
#include <unistd.h>
78
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
#include <fftw3.h>
using namespace std;
// Prototipos de funciones.
double gaussrng(void);
double etime(LARGE_INTEGER *a, LARGE_INTEGER *b);
double OLS(int,int,int);
int main(void)
{
//// Establecimiento de los parmetros generales. ////
int length_h = 4; // Longitud vector h.
int length_x = 16; // Longitud vector x.
79
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
// Reserva de memoria
pin = (double*) fftw_malloc(sizeof(fftw_complex)*length_y); // Puntero a la secuencia de entrada
ph = (fftw_complex*) fftw_malloc(sizeof(fftw_complex)*N); // Puntero a h.
px = (fftw_complex*) fftw_malloc(sizeof(fftw_complex)*N); // Puntero a cada bloque de x.
pH = (fftw_complex*) fftw_malloc(sizeof(fftw_complex)*(N)); // Puntero a la DFT de h.
pX = (fftw_complex*) fftw_malloc(sizeof(fftw_complex)*(N)); // Puntero a DFT de bloque de x.
pP = (fftw_complex*) fftw_malloc(sizeof(fftw_complex)*N); // Puntero a cada bloque de P.
80
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
for (int real = 0; real < nreal; real++) // Bucle para las realizaciones.
{
// Se crea el vector h y se calcula su DFT.
for (int ind=0; ind < length_h; ind++) {
ph[ind][0] = rand()%10;
ph[ind][0] = ph[ind][0];
ph[ind][1] = 0.0;}
// Se calcula la DFT de h.
fftw_execute(planh);
// Se crea el vector x.
for (int ind=0; ind < length_h; ind++) {pin[ind] = 0.0;}
for (int ind=length_h; ind < length_x+length_h; ind++) {pin[ind] = rand()%10;}
for (int ind=length_x+length_h; ind < length_y; ind++) {pin[ind] = 0.0;}
81
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
for (int iter=0; iter < niter; iter++) // Bucle para las iteraciones.
{
int s_init = iter*2*length_h; // Posicin de la muestra inicial del bloque.
// Se multiplican pH y pX.
for (int ind = 0; ind < N; ind++)
{
pP[ind][0] = (pH[ind][0])*(pX[ind][0]) - (pH[ind][1])*(pX[ind][1]);
pP[ind][1] = (pH[ind][0])*(pX[ind][1]) + (pH[ind][1])*(pX[ind][0]);}
// Se calcula la IDFT de P.
fftw_execute(planp); // Se calcula la IDFT de P.
82
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
A continuacin se detalla el cdigo fuente, programado en C++, para el clculo del algoritmo
Propuesto:
#include <windows.h>
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <math.h>
#include <unistd.h>
#include <complex.h>
#include <fftw3.h>
using namespace std;
// Prototipos de funciones.
double gaussrng(void);
double etime(LARGE_INTEGER *a, LARGE_INTEGER *b);
double OLS_Propuesto(int,int,int);
83
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
int main(void)
{
//// Establecimiento de los parmetros generales. ////
84
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
// Reserva de memoria
px = (double*) fftw_malloc(sizeof(double)*(length_y));
ph = (double*) fftw_malloc(sizeof(double)*(length_y)); // Puntero a h.
phe = (fftw_complex*) fftw_malloc(sizeof(fftw_complex)*M); // Puntero a he.
pho = (fftw_complex*) fftw_malloc(sizeof(fftw_complex)*M); // Puntero a ho.
pxc = (fftw_complex*) fftw_malloc(sizeof(fftw_complex)*M); // Puntero a xc.
pXc = (fftw_complex*) fftw_malloc(sizeof(fftw_complex)*M); // Puntero a la DFT de xc.
pXc_cir = (fftw_complex*) fftw_malloc(sizeof(fftw_complex)*M); // Puntero a .
pHe = (fftw_complex*) fftw_malloc(sizeof(fftw_complex)*M); // Puntero a la DFT de he.
85
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
for (int real = 0; real < nreal; real++) // Bucle para las realizaciones.
{
// Se crea el vector h.
for (int ind=0; ind < length_h; ind++) {
ph[ind] = rand()%10;}
for (int ind=length_h; ind < length_y; ind++) {ph[ind] = 0.0;}
86
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
// Se crea el vector x.
for (int ind=0; ind < length_x; ind++) {px[ind] = rand()%10;}
for (int ind=length_x; ind < length_y; ind++) {px[ind] = 0.0;}
// Se calcula Xc*((-k))M/2
pXc_cir[0][0] = pXc[0][0];
pXc_cir[0][1] = -pXc[0][1];
87
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
// Se calcula Yc.
for (int ind = 0; ind < M; ind++){
pYc[ind][0]=(pXc[ind][0])*(pHI[ind][0])+(pXc_cir[ind][0])*(pHII[ind][0])-
(pXc[ind][1])*(pHI[ind][1])-(pXc_cir[ind][1])*(pHII[ind][1]);
pYc[ind][1]=(pXc[ind][0])*(pHI[ind][1])+(pXc_cir[ind][0])*(pHII[ind][1])+(pXc[ind][1])*
(pHI[ind][0])+(pXc_cir[ind][1])*(pHII[ind][0]);}
py[2*ind] = pyc[ind][1]/M;
py[ind+1] = pyc[ind][0]/M;}
88
Algoritmos para el Filtrado Eficiente de Seales Reales basados en la DFT
fftw_free(px);
fftw_free(phe); fftw_free(pho);
fftw_free(pxc); fftw_free(pyc); fftw_free(py);
fftw_free(pXc); fftw_free(pXc_cir);
fftw_free(pHe); fftw_free(pHo);
fftw_free(pHI); fftw_free(pHII);
fftw_free(pYc);
return secs;
}
89