unlversl dad auton om a metro po lltana148.206.53.84/tesiuami/uamr0205.pdf · obtencion del...
TRANSCRIPT
UNlVERSl DAD AUTON OM A METRO PO LlTANA ~
Casa abterta al tiempa UNIDAD IZTAPALAPA División de Ciencias Básicas e Ingenieda
DEPARTAMENTO D E I N G . ELECTRICA
Area I n y . E l e c t r ó n i c a
"TRANSFOPUDA RAPIDA D E FOURIER"
t
Autores : Mauricio L6pez Vil laseñor
Gonzálo Diichen Sáiichez
Faus to C a s c o Sánchez
0 2 . 0 2 0 2 . I 1 . 0 1 . 0 0 3 / 9 2 [Reimpresión. 94:)
DEPARTAMENTO DE ING. ELECTRICA
Area ing. Electrónica
“TRANSFORMADA RAPIDA DE FOURIER”
Autores :
Mauricio LÓpez Villaseñor
Gonzálo Duchen Sánchez
Fausto Casco Sánchez
02.0202.11.01.003/92 [Reimpresión. 941
UNIVERSIDAD AUTONOMA METROPOLITANA-IZTAPALAPA División C B I
Departamento de Ingeniería Eléctrica
Area de Ingeniería Electrónica
TRASNSFORMADA RAPIDA DE FOURIER
Monografía
M. en I. Mauricío López Villaseñor M. en C. Gonzalo Duchen G.
M. en C. Fausto Casco Sánchez
Diciembre 1991.
Transformada Rápida de Fourier
Mauricio López Villaseñor
Gonzalo Duchen G. Fausto Casco Sánchez
R E S U M E N
En este trabajo se describe a la Transformada Rápida de Fourier (TRF) ,
que es un algoritmo computacional para la obtención de la Transformada
de Fourier Discreta (TFD).
Se plantea una matriz como solución de la TFD ; a travéz de un
desarrollo intuitivo de la TRF, se explica con un ejemplo el
funcionamiento del algoritmo para N = 4 puntos.
Adjunto se tiene un paquete computacional para la obtención de
la TRF, fácil de usar en una computadora personal.
Finalmente cabe mencionar que este trabajo es de utilidad en la
uea Procesamiento de Señales de la Licenciatura de Ingeniería
Electrónica, Ó bien en cursos de extensión universitaria, para
actualización de ingenieros.
Otras Obras Publicadas :
1- Transformada Z
UAM-Iztapalapa ( Julio 1991 1
M. en I. Mauricio López Villaseñor, M. en C. Fausto Casco Sánchez
2- Convolución Continua
UAM-Iztapalapa ( Noviembre 1991 1 M.en I. Mauricio López Villaseñor, M. en C. Fausto Casco Sánchez
2
C O N T E N I D O
1. o
1.1
1.2
1.3
1 . 4
1.4. 1
1. 4 .2
1.5
1.6
1 .7
2.
INTRODUCCION
PLANTEAMIENTO DE LA MATRIZ
COMPORTAMIENTO INTUITIVO DE LA TRF
SEÑALES DE FLUJO GRAFICO
NODO DUAL
ESPACIAMENTO DE LOS NODOS DUALES
EVALUACION DE LOS NODOS DUALES
DETERMINACION DE LOS TERMINOS Wp
REACOMODO DE LA TRF
OBTENCION DEL DIAGRAMA DE FLUJO DE LA TRF
LISTADO DEL PROGRAMA.
APENDICE A
APENDICE B
APENDICE C
BIBLIOGRAFIA
4
5
6
12
14
15
17
20
22
23
28
33
36
44
47
3
TRANSFORMADA RAPIDA DE FOURIER (TRF).
1. O. INTRODUCCION.
Una de las herramientas más importantes con las que cuenta el
Ingeniero en Comunicaciones es la Teoría Matemática de Fourier, ya que le permite interpretar las características sobresalientes de las
señales y los sistemas de comunicación de manera rápida y eficiente.
En la actualidad con la llegada de las computadoras se abrió un nuevo
panorama para obtener la Transformada de Fourier por medio de
algoritmos computacionales, llamada Transformada de Fourier Discreta
(TDF), sin embargo el cálculo es lento a medida que el número de
muestras crece. Afortunadamente se cuenta con algoritmos rápidos que
puede evaluar esta Transformada de Fourier Discreta, llamada
Transformada Rápida de Fourier (TRF). De aquí que en los diferentes
campos de la Ingeniería donde se aplica la Transformada Rápida de
Fourier no se requiere de un estudio a fondo de su algoritmo pero si
de un claro entendimiento de la Transformada de Fourier Discreta; esto
se debe a que la TRF es simplemente un algoritmo (y por ende un método particular de ejecutar una serie de cálculos.), que puede encontrar la
Transformada de Fourier Discreta mucho más rápido que otros
algoritmos. Por esta razón nuestra discusión de la TRF se direcciona
sólo al aspecto computacional.
Inicialmente se usa un ejemplo de matriz factorizada para justificar
intuitivamente el algoritmo de la TRF, posteriormente se representa
recíprocamente a las matrices factorizadas por señales de flujo
gráfico y a partir de estas Últimas se construye la lógica del
programa de la TRF.
4
1 . 1 . PLANTEAMIENTO DE LA MATRIZ.
X(0) - X ( 1 )
X(2 1 X ( 3 )
- -
- a
Como se mencionó la TRF es un algoritmo rápido para obtener la TDF y por ende su análisis matemático se fundamenta en este Último.
Inicialmente se parte de la definición de la Transformada de Fourier
Discreta (TDF), dada por:
- wo wo wo wo - - x0(O) - wo w' w2 w3 x o ( l )
wo w2 w4 w6 xo ( 2 1 wo w3 w6 w9 X J 3 ) -
N- 1
(1.1) - J2Tlnk/N X(k) = 1 xo(n) e ; con k = O, 1. . . . . , ( N - 1 ) n=O
observando que esta describe el cálculo de N ecuaciones. Antes de verificar lo anterior se hace el cambio de variable W = e en la
ecuación (1.11, la cual queda como:
- j 2X/N N
N - 1
X(k) = 1 xo(n) W i k n=O
( 1 . 2 )
Si la secuencia x (n) a transformar se considera de 4 muestras O
( N = 4) la ecuación ( 1 . 2 ) puede describirse como:
X ( O ) = x0(O) wo + x o ( l ) wo + x0(2 ) wo + x0(3) wo X(1)= x0(O) wo + x o ( l ) w1 + x0(2) w2 + xo(3) w3 X(2)= x0(O) wo + x o ( l ) w2 + x0(2 ) w4 + xo(3 ) w6 X ( 3 ) = x0(O) wo + x o ( l l w3 + x0(2 ) w6 + xo(3 ) w9
o en forma matricial de la forma:
Una expresión compacta de ( 1 . 4 ) es:
(1 .3)
( 1 . 4 )
(1.5) nk + 2 ( k ) = dN xo(n)
+ y debido a que 3 y posiblemente x (n) son complejas, entonces son N O
5
necesarias N2 multiplicaciones complejas y N(N-1) sumas complejas
para evaluar la matriz.
1 1 1 1 -
1 w1 w2 w3 1 w2 wo w2 1 w3 w2 w1
A
De hecho, la TRF es un algoritmo que reduce el número de
multiplicaciones y sumas requeridas en el cálculo de la matriz, y con
el fin de mostrar cómo se realiza esta reducción se parte de un
análisis intuitivo.
x0(O) - xo(l 1 x0 (2 )
x0 (3 ) - -
1.2. COMPORTAMIENTO INTUITIVO DE LA TRF.
Con el fin de ilustrar el algoritmo de la TRF, es conveniente
seleccionar el número de muestras o puntos de x (n) de acuerdo a la relación N = 2 , donde a es un entero. De acuerdo a esta condición es posible evaluar la TRF para el ejemplo previamente considerado ya que
se seleccionó a N = 4 = 2'= 2 (7 = 2 ) .
O T
2
El primer paso en el desarrollo del algoritmo de la TRF para este
ejemplo, es escribir la ecuación (1.4) como:
(1.6)
La modificación de la matriz se justifica en el hecho de que el
producto nk (en la ecuación (1 .211, para N 5 nk < 2N puede
considerarse como la suma de N muestras más "p" muestras (con p < NI, es decir nk = N + p, y esta suma de términos permite aplicar la
cuya ecuación general esta dada por:
(p+mN) W"k = w = Up, para toda m y con p < N. (1.8a)
6
o bien :
- 1 w o o o - - 1 o w o o - - x0(OS 1 w 2 0 0 0 1 0 wo xo(l)
1 o w 2 0 x0(2)
O 0 1 w 3 0 1 0 w2 x0(3)
- - O 0 l w l
- - - A - d
Las modificaciones realizadas en (1 .4 ) se muestran a continuación
(para N=4):
2 6 1 9 w = w wo = w4, w = w Y
El segundo paso en el desarrollo del algoritmo de la TRF, es
factorizar la matriz (1.6) como:
(1.9)
La metodología de la factorización está basada en la teoría del
algoritmo de la TRF. Por el momento, es suficiente que la
multiplicación de las dos matrices cuadradas den como resultado a la
matriz cuadrada (1.6), con la excepción de que los renglones 1 y 2 de
? ( k ) están intercambiados; el vector intercambiado se puede denotar
por:
Esta factorización es la clave de la eficiencia del algoritmo de la
TRF .
Es el momento de examinar el número de multiplicaciones requeridas
para el cálculo de la ecuación (1.91. Inicialmente se genera un nuevo
vector cuyo resultado es el producto del vector x (n) con la segunda
matriz cuadrada en (1.91:
i
O
7
x0(O) - x o ( l )
x0 (2 )
x0(3) - - - - I - - X 1 ( O ) - - 1 o wo o -
X l ( l ) 0 1 0 wo
x1 (3) O 1 0 w2
- - 1 o w 2 0 x1 (2)
(1 .111
El elemento x (O) se calcula mediante una multiplicación compleja y una suma compleja ( W presente en (1.11) no se reduce a la unidad con
el fin de obtener un resultado generalizado), como se muestra:
1 O
x (O) = x0(O) + wo xo(2) ( 1 . 1 2 ) 1
y el elemento x (1) también se determina por una multiplicación y una
adición: 1
Para evaluar el
y ésto se justif
x (1) = x o ( l ) + wo x0(3) 1
término x (2) s ó l o se requiere de una suma
za por el hecho de que el factor W es igua 1
O
(1.13)
compleja,
a: - w2:
(1. 14)
O y la multiplicación W x ( 2 ) ya fué calculada al determinar x l ( 0 ) ,
esto se muestra a continuación: o
(1.15) O x ( 2 ) = x (O) + w2 x ( 2 ) = x (O) - w x 0 ( 2 ) 1 O O O
A partir de un razonamiento similar, x (3) se determina por s ó l o una 1
suma compleja y ninguna multiplicación:
x ( 3 ) = x ( 1 ) + w2 x 0 ( 3 ) = x o ( l ) - wo x0(3) (1.16) 1 O
+ Es así, que el vector intermedio x (n) se determina por 4 sumas 1
complejas y dos multiplicaciones complejas.
Continuando con el cálculo del arreglo (1 .91 , se obtiene el vector
X(k) mediante el producto del vector x (n) con la primera matriz i 1
+ -
8
cuadrada de (1.9):
(1.17)
El término x (O) se determina por una multiplicación compleja y una suma compleja, y el término x (1) por una suma compleja, ya que w0 =
-W2:
2
2
X2(O) = X 1 ( O 1 + wo x p 1 (1. 18)
(1. 19) 2 x (1 ) = x ( O ) + w x ( 1 ) = x (O) - wo x p 2 1 1 1
Razonando en forma similar, x (2) se determina por una multiplicación 2
compleja y una suma compleja, y x ( 3 ) por sólo una suma compleja: 2
x (2) = x1(2) + w' x1(3) (1.20) 2
x (3) = x (2) + w3 x (3) = x1(2) - w 1 x1(3) (1.21) 2 1 1
+ Se observa que el vector x (n) requiere de 4 sumas complejas y dos
multiplicaciones complejas. 2
De las indicaciones de los Últimos párrafos se concluye que al
evaluar el vector X k) mediante la ecuación (1.91, solo se requieren 4
multiplicaciones y 8 sumas complejas, que son mucho menos operaciones que las requeridas para determinar el vectorX)(k) de (1.41, ya que se
necesitarían 16 multiplicaciones y 12 sumas complejas. Se observa que
el proceso de factorización de la matriz, introduce ceros dentro de
las matrices factorizadas, dando como resultado la reducción del número de multiplicaciones y sumas complejas requeridas.
- 4
Además para este ejemplo, el proceso de factorización reduce el
número de multiplicaciones por un factor cuadrático, y tomando en
9
..
cuenta que el tiempo de proceso de cómputo se gobierna principalmente
por el número de multiplicaciones, se concluye que el algoritmo de la
TRF es un proceso eficiente.
a En resumen, el algoritmo de la TRF para N = '2 es simplemente un
proceso para factorizar una matriz N * N en 7 matrices (cada una de N * NI de tal forma que cada una de las matrices factorizadas tienen la propiedad especial de minimizar el número de multiplicaciones y sumas comple jas.
Si se extiende el resultado del ejemplo previo, se observa que la TRF requiere de Na/2 multiplicaciones complejas (Na/2 = 4 ) y Na sumas complejas (NT = 81, mientras que el método directo requiere de N2 multiplicaciones complejas (N = 16) y N(N-1) sumas complejas (N[N-11 = 12).
2
N (número de muestras)
Fig. 1. Comparación de las multiplicaciones requeridas por el algoritmo directo y el de la TRF.
Por Último si se asume que el tiempo de proceso de cómputo es
proporcional al número de multiplicaciones, entonces la razón de la aproximación del tiempo de computación de la forma directa y TRF es:
N2 2N - - - N7/2 - a (1 .22)
10 asi para N = 1024 = 2 se tiene una reducción del tiempo de proceso
de cómputo por más de 200 a 1. La figura 1 ilustra la relación entre
el número de multiplicaciones requeridas usando el algoritmo de la TRF comparándola con el número de multiplicaciones usando el método
directo.
Sin embargo el proceso de factorizar la matriz introduce una
discrepancia, esta se fundamenta en el hecho de que los vectores de
( 1 . 4 ) y (1.9) son diferentes en relación al orden en l o s renglones,
como se muestra a continuación:
( 1 . 2 3 )
Este reacomodo es intrínseco en el proceso de la factorización de la
matriz y afortunadamente es un problema menor ya que no se desvía del
fin último.
A continuación se presenta una técnica generalizada para reacomodar
Inicialmente se escribe a $ ( k ) - - X(k) con el fin de obtener x)(k) . + reemplazando el argumento k por su equivalente binario:
( 1 . 2 4 )
Obsérvese que si en los argumentos binarios se cambian o invierten
sus bits (O1 quedando 10; 10 quedando 01, etc. 1, entonces ( 1 . 2 4 ) se
expresa:
11
(1.25)
Siendo este comportamiento un resultado generalizado del reacomodo de
renglones en la TRF.
Para N mucho mayor que 4, es tedioso describir el proceso de la
factorización de la matriz análogamente a (1.91, por esa razón se
interpretará a (1.9) por medio de señales de flujo gráfico y a partir
de este Último generalizar un programa para computadora.
1.3. SEÑALES DE FLUJO GRAFICO.
Con el fin de introducir las señales de flujo gráfico que describen a
la ecuación (1.9) es necesario partir de esta Última:
Esta conversión se indica en la figura 2, en la que se representa el
vector dato o arreglo x (n) por una columna vertical de nodos en la parte izquierda de la gráfica, el segundo arreglo vertical de nodos se
representa por el vector xl(n), y el siguiente arreglo vertical
correponde al vector x2(n) = X(k). Como se mencionó habrá a arreglos donde N = 2 .
i
o
3
3 - 3 a
La señal de flujo gráfico se interpreta como sigue: para cada nodo
(excepto el primero) entran dos líneas representando los caminos de
transmisión provenientes de l o s nodos del arreglo previo, estos
caminos transmiten o transportan una cantidad x (n) (donde i indica el i
12
arreglo vertical de nodos antecesores al considerado y n toma
diferentes valores según el caso), en donde uno de ellos se multiplica
por W p . El factor Wp aparece cerca de la flecha del camino de
transmisión; la ausencia de este factor implica que Up = Wo = 1 , y el resultado total de un nodo es la suma de los dos caminos de
transmisión.
Con el fin de ser más explícitos en la interpretación de la señal de
flujo gráfico, considérese el nodo x (2) de la figura 2 y de acuerdo a las reglas establecidas por los párrafos anteriores el vector de este
nodo está dado por:
1
x1(2) = x0(O) + w 2 x0(2) (1.27)
el cual es idéntico al ya especificado, ver (1 .15) . Cada nodo de la
señal de flujo gráfico se expresa en forma similar.
En resumen, la s-eñal de flujo gráfico es un método que representa el
cálculo de la matriz factorizada en el algoritmo de la TRF donde cada
columna de la gráfica corresponde a una matriz factorizada; es así que
se requiere de a arreglos verticales de N puntos cada uno (N = 2'1.
Como se observa el uso de está representación gráfica permite
describir fácilmente el proceso de factorización de la'matriz para N
grande.
ARREGLO COMPUTACIONAL Arreglo - de Datos Arreglo 1 Arreglo 2
xdk)
Fig. 2. Señal de flujo gráfico de la TRF, N = 4.
En la figura 3 se muestra la señal de flujo gráfico para N = 16,
ahora partiendo de esta dimensión es posible generalizar las
propiedades concernientes al proceso de factorización de la matriz y
así proporcionar los fundamentos para desarrollar el diagrama de flujo
del algoritmo de la TRF.
1 . 4 . NODO DUAL.
La figura 3 revela que en cualquier arreglo de nodos (excepto para el
primero), se pueden encontrar dos nodos evaluados por el resultado de
l o s caminos de transmisión provenientes de dos nodos ubicados al mismo
nivel con respecto a los renglones del arreglo previo. Por ejemplo,
los nodos x ( O ) y x (8) se calculan en términos de l o s nodos x ( O ) y 1 1 O
xo(8), además éstos Últimos no inciden en ninguna forma en cualquier
otro nodo y debido a esta característica particular a este par de
nodos se les define como par de nodos dual.
Lo anterior permite visualizar que un par de nodos dual se puede
evaluar mediante un programa computacional de manera simultánea, es
decir los nodos x (O) y x ( 8 ) de la figura 3 se calcula en términos de
x ( O ) y x (8) y el resultado de estos Últimos se almacena en las
mismas localidades de memoria de una computadora previamente ocupadas
por xo(0) y x0(8):
1 1
O O
x 1 (O) = x o ( 0 ) + xo(8) Wo (1.28a)
x (8) = xo(0) + xo(8) W8 (1.28b) 1
La discusión del Último párrafo permite establecer la mínima
capacidad de memoria de datos requerida al desarrollar un programa
computacional y ésta está restringida por el número de puntos del
arreglo inicial de datos xo(n), es decir al evaluar un arreglo de
nodos el resultado regresa a las mismas localidades de memoria de
datos.
14
ARREGLO DE DATOS
X O ( k )
ARREGLO COMPVTACIONAL
Fig. 3. Ejemplo de nodos dual.
1 . 4 . 1 . ESPACIAMIENTO DE LOS NOWS DUAL.
El objetivo de esta sección es proporcionar una herramienta para
establecer el espaciamiento de los nodos dual para los diferentes
arreglos bajo el esquema de señales de flujo gráfico.
Partiendo de la figura 3 se pueden identificar 5 arreglos de nodos
(en forma vertical) y para referirnos a cada uno de ellos se usará la
variable "l", en donde la columna de la parte izquierda es el arreglo
15
1 = O, el segundo el arreglo 1 = 1. etc.
Ahora, con el fin de proporcionar el espaciamiento entre los nodos
dual inicialmente se hacen las siguientes observaciones: del par de
nodos dual para el segundo arreglo ( 1 = 11, por decir x l ( 0 ) y x1(8 ) se
percibe que están separados por n = 8 = 16/2 = N/2 muestras, para un
par de nodos dual en el tercer arreglo ( 1 = 21, por decir x 2 ( 8 ) y x ( 1 2 ) están separados por n = 4 = 16/22 = N/2 muestras y de manera
similar, para el cuarto arreglo ( 1 = 3) los pares de nodos x 3 ( 4 ) y x ( 6 ) están separados por n = 2 = 16/2 = N/2l, finalmente para el
arreglo n = 4 ( 1 = 3 ) el par de nodos, por decir x ( 8 ) y x 4 ( 9 ) están
separados por n = 1 =16/2
1 1
1
2
3
3
4 4 = N/2l.
Generalizando estos resultados, se observa que el espaciamiento
entre nodos dual para cualquiera de los arreglos 1 está dada por N/2 . Así, si se considera un nodo particular xl(n) su nodo dual es
x1 (n+N/2* 1 , esta propiedad permite identificar fácilmente un par de
nodos dual.
1
Para el ejemplo considerado ( N = 1 6 ) : N = 2' con 7 = 4, se puede
obtener el siguiente conjunto de pares duales para: 1 = 1 , 2 , 3 y 4:
x ( O ) = x ( O + 16/22) = ~ ~ ( 4 ) 1 1 2 2
x ( O ) = x (O + 16/21 = ~ ~ ( 8 )
x ( 1 ) = x ( 1 + 16/41 = x 2 ( 5 ) 1 1 2 2
x ( 1 ) = x ( 1 + 16/21 = ~ ~ ( 9 )
x (21 = x 2 ( 6 ) 2
x 1 ( 2 ) = X1(1O)
x ( 3 ) = X l ( l l ) x 2 ( 3 ) = x 2 ( 7 ) 1
x ( 4 ) = x1(12) x ( 8 ) = x2(12) 1 2
x ( 9 ) = x2(13) 2
x (5) = ~ ~ ( 1 3 ) 1
x (10) = x2(14) x1 (6 ) = x1(14) 2
x (7 ) = x (15) x (11 ) = x2(15) 1 1 2
x3(0) = x3(0 + 16/23) = ~ ~ ( 2 )
x ( 1 ) = x 3 ( l + 16/81 = x3(3)
x3 (4 ) = x3(6)
3
x ( 5 ) = x3(7) 3
x (8) = x3(10) 3
x ( 9 ) = x p 3
x (12) = ~ ~ ( 1 4 )
x (13) = x3(15)
3
3
x4(0) = x (O + 16/24) = x 4 ( l ) 4
x4(2) = x4(l + 16/16) x4 (3 )
x4 (4 ) = x4(5)
x4 (6 ) = x4(7)
x ( 8 ) = x4(9) 4
X 4 ( 1 O ) = x 4 ( l l )
x4(12) = x4(13)
x (14) = x4(15) 4
1.4.2 EVALUACION DE NODOS DUAL.
Esta sección permite observar que un par de nodos dual requiere para
su evaluación de s ó l o una multiplicación compleja y 2 sumas complejas.
Inicialmente considere el nodo x ( 8 ) y su dual ~ ~ ( 1 2 ) . ilustrado en la
figura 3. Los caminos de transmisión que fluyen desde el nodo x (12)
al arreglo 1 = 2 se ven afectados por W y W cuyos resultados son
los nodos x2(8) y x 2 ( 1 2 ) , respectivamente, como l o muestran las
siguientes ecuaciones:
2
1 4 12
4 x 2 ( 8 ) = x2(12) W + otro término ( 1 . 2 9 a )
x 2 ( i 2 ) = x 1 ( i 2 ) + otro término (1 .29b)
4 Ahora, si el factor principal en un nodo es Up (ejemplo W 1 , entonces
, donde n = 12 el factor principal en su nodo dual es WP+N/2(ejernplo W
161, pero debido a que Up = - (ejemplo 12 - 8 4 -
e w4 = e -jn 4 = - wI6; por i o tanto w4 = - se '16 - '16 '16 -
4 -J (2TI/16)8
'16 16
17
observa que se requiere sólo una multiplicación en la evaluación de un par de nodos dual, de aquí que para cualquier par de nodos dual su cálculo está dado por el par de ecuaciones:
x (n) = x (n) + wP x (n + 1 1-1 1-1
1-1 xl(n + N/2l) = x (n) - Wp x
1-1
N/2I ) (1.30a)
n + N/2') (1.30b)
A continuación se presentan las ideas principales que deberá observar
la lógica de un algoritmo computacional para calcular los pares de
nodos dual. Se parte de que se sabe que el dual de cualquier nodo en
el arreglo 1 está ubicado después de N/2 valores de muestra del mismo
arreglo al evaluar éste en forma ascendente, es decir iniciando con el
nodo n = O. Como el espaciamiento es de N/2 muestras se concluye que 1 un algoritmo debe "saltar" N/2l nodos una vez que ha calculado N/2
muestras y así sucesivamente hasta terminar de evaluar todo el
arreglo, esto se ilustra en la figura 4 al considerar el arreglo 1 = 2
e iniciar con el nodo n = O, donde el nodo dual está localizado en n =
1
1
N/2L = 1614 = 4. De igual manera se procede en forma ascendente en
este arreglo, hasta llegar al nodo 3, ya que el nodo dual está
espaciado 4 valores hacia abajo (2 = 4 ) . 2
Una vez obtenidos los primeros 4 puntos de este arreglo (n = O, 1, 2
y 3) se entra a un conjunto de nodos previamente evaluados, los cuales son los nodos duales de los nodos n = O , 1, 2 y 3. Por consiguiente es
necesario "saltar" sobre los nodos n = 4, 5, 6 y 7, y continuar con el
nodo n = 8 hasta el nodo 11 siguiendo la convención original.
En general, si se trabaja de arriba hacia abajo en el arreglo 1,
desde el punto de vista matemático deben calcularse las
ecuaciones establecidas por (1.30a) y (1.30b) para los primeros N/2 nodos, a continuación se salta los N/2l nodos consecutivos y así
sucesivamente dejando de saltar cuando se llega al nodo cuyo índice sea mayor que N - 1 (N-1 = 1 5 ) .
1
18
Por el momento las ecuaciones (1.30a) y (1.30b) no pueden ser
evaluadas totalmente ya que falta por determinar el termino Up, el
cual será tema de la próxima sección.
ARREGLO DE DATOS
F i g . 4. Ejemplo de nodos a ser saltados cuando se calcula la señal de flujo.
19
1.5 DETERMINACION DE LOS TERMINOS Up.
Hasta este punto se han definido las propiedades de cada arreglo con
la excepción del valor de p de las ecuaciones (1.30). A continuación
se proporciona la lógica para encontrar este valor.
El valor de p se determina por el siguiente procedimiento:
1.- Escribir el índice n en forma binaria con a bits, donde n es el nodo a calcularse.
2 . - Desplazar este número binario a - 1 bits hacia la derecha e introducir ceros en la posición del bit de lado izquierdo.
3.- Invertir el orden de los bits. Este número de los bits
invertidos es el término p.
Con el fin de ilustrar este proceso, considere el nodo x ( 8 ) de la
figura 4 con a = 4, n = 8 y 1 = 3. E l primer paso en el procedimiento
es escribir n en forma binaria: 1000, el segundo paso es desplazar
este número binario hacia la derecha a - 1 = 4 - 3 = 1 bit
introduciendo un cero: 0100. Por último se invierte el orden de los
bits produciendo 0010 o en forma decimal 2, y el valor de p es
entonces 2 .
3
Ahora, es necesario implantar un proceso para las operaciones de la
inversión de los bits. Se sabe que un número binario, por decir algo
a a a a puede escribirse en base 10 como se muestra a
continuación: 3 2 1 0
a x z 3 + a 2 x z 2 + a x2' + a x2O (1.31) 3 1 O
mientras que el número deseado con los bits invertidos se describe como :
a x z 3 + a x 2 ' + a x z l + a x2O ( 1 . 3 2 ) O 1 2 3
20
.
Al comparar (1.31) y (1.32) se observa que si se describe una técnica para determinar l o s bits: a a a a entonces se ha definido la
3’ 2’ 1’ o* operación de la inversión de los bits.
Inicialmente se supone que M es un número binario igual a: a a a a 3 2 1 0 ’ se divide M por 2, se trunca y se multiplica el resultado por 2. Es
[ a3 a2 al a. - 2 ( a3 a2 al 1 I , si el bit a es decir, se calcula
cero, ésta diferencia será cero ya que un número binario es par si su
bit menos significativo es cero y al dividir por dos y multiplicar por
dos no se altera el valor de M, además el dividir por 2 un número binario implica un corrimiento a la derecha introduciendo un cero en
el bit más significativo y multiplicar por 2 implica un corrimiento
hacia la izquierda introduciendo un cero en el bit menos
significativo. Si el bit a es uno (un número binario es impar si su
bit menos significativo es uno), el truncamiento cambia el valor de M y la expresión de la diferencia anterior será uno. Lo anterior se
puede ver como la diferencia de: un número M y el número M dividido entre 2, truncado su valor fraccionario y multiplicado por 2.
O
O
Obsérvese que por medio de esta técnica se puede determinar si el bit
a es O ó 1. Por ejemplo, sea: a a a a = 1000, en base 10 equivale O 3 2 1 0 a 8 , se divide entre 2 (resulta 41, se trunca la parte fraccionaria
(resulta 4), se multiplica por dos (resulta 8 ) y se realiza la
diferencia (resulta O); con lo cual a = O. Ahora sea: a a a a =
1001, en base 10 equivale a 9, al dividir por dos (resulta 4.51, al
truncar la parte fraccionaria (resulta 41, al multiplicar por dos
(resulta 8 ) y al diferenciar resulta diferente de cero (9-8 < > O),
con lo cual a = 1.
o 3 2 1 0
O
Se puede identificar el bit a de manera similar a partir del valor:
a a a donde la ecuación de diferencia es [ a a a - 2 ( a3 a2 1 I , 3 2 1 3 2 1 y si la diferencia es cero entonces a = O, de lo contrario a = 1. Los
bits a y a se determinan en forma similar.
1
1 1
2 3
Este proceso será la base en la ejecución de la rutina del programa
encargado de la inversión de los bits que será estudiada posteriormente.
21
1 . 6 . REACOMOW DE LA TRF.
Antes de pasar al desarrollo del algoritmo computacional, el paso
final de la TRF es el reacomodo de los resultados del vector al
vector XJk). Recuerde que de manera general el proceso de reacomodo A
- del vector X k ) es escribir k en forma binaria e invertir este número -L binar io.
2
3
4
5
6
7
a
9
10
11
12
13
X4(0010)
x4(001 I)
x,(OlOO)
~ ~ ( 0 1 0 1 )
x4(Oí IO)
x4(Of 11)
X4(1000)
x4( 1 o01 )
~ ~ ( 1 0 1 0 )
~ ~ ( 1 0 1 I)
x4( 1 100)
x4( i 101)
x(oo1 o)
x(oo11)
x(o100)
x(0101)
x(o11 o)
x(o111)
x( 1000)
x( 1001)
x( 1 Of o)
x( lOl1)
x( 1 100)
x( l lO1)
Fig. 5. Ejemplo de la operación de inversión de bits, N = 16
22
Se muestra en la figura 5 el resultado de esta operación de inversión
de los bits, en donde se han intercambiado los términos x4(n) y x4(i),
e i es el valor entero obtenido al invertir los bits del valor entero
n.
De lo anterior se observa que aquí se presenta una situación similar
como en el concepto de nodos dual en relación a la inversión de bits,
para el acomodo del arreglo de salida. Si se procede hacia abajo en el arreglo, intercambiando x(n) con el adecuado x(i), se puede
eventualmente encontrar un nodo que ha sido previamente intercambiado.
Por ejemplo, en la figura 5, el nodo n = O permanece en la misma
posición, los n = 1, 2 y 3 son intercambiados por l o s nodos 8 , 4 y 12 respectivamente. Continuando, el próximo nodo a ser considerado es el
nodo 4, pero este nodo fué previamente intercambiado con el nodo 2.
Una forma para eliminar la posibilidad de considerar un nodo que ha
sido previamente intercambiado, es verificando si i (el valor entero
obtenido por la inversión de l o s bits del valor entero n) es menor que
n, si esto ocurre, implica que el nodo ha sido intercambiado por una
operación previa. Con esta verificación es posible asegurar un proceso
de reacomodo correcto.
1.7. OBTENCION DEL DIAGRAMA DE FLUJO DE LA TRF.
Usando las propiedades discutidas en la señal de flujo gráfico de la
TRF, se puede realizar fácilmente un diagrama de flujo con el fin de
programar una computadora. Se inicia al proporcionar un resumen de las
secciones estudiadas.
Primero se calcula el arreglo 1 = 1, iniciando en el nodo n = O y
trabajando en forma ascendente del arreglo. Para cada nodo n se
calcula el par de ecuaciones (1 .30) donde p está determinado por la
descripción estudiada. Procediendo en forma ascendente, hasta llegar
al conjunto de nodos que hay que "saltar", y una vez que se "saltan"
los nodos apropiados se continúa con el proceso hasta llegar al final
23
del arreglo. Continuando con el cálculo de los arreglos restantes,
usando el mismo procedimiento. Finalmente se ordena el Último arreglo
para obtener el resultado deseado.
Los pasos anteriores se pueden esquematizar en la figura 6 la cual
representa el diagrama de flujo del algoritmo de la TRF, y la
descripción se proporciona a continuación.
El bloque 1 establece los datos de entrada necesarios, donde el
vector x (k) se asume complejo. Sin embargo si x (k) es real entonces
la parte imaginaria se establece a cero. El número de muestras N debe
satisfacer la relación N = 2 , donde a es un entero.
O O
7
En el bloque 2 se inicializan algunos parámetros del programa, estos
son: el parámetro "1" es el número del arreglo considerado, iniciando
con el arreglo 1 = 1; el espaciamiento entre los nodos dual está
asignado por el parámetro N2, de aquí que para el arreglo 1 = 1, N2 =
N/2 y se inicaliza como tal; el parámetro NU1 es el número de bits que deben recorrerse hacia la derecha, necesarios para determinar el valor
de p y es inicializado a 7 - 1 ( 7 - 1 ) ; finalmente el índice k del
arreglo se inicializa a k = O, así se trabaja de arriba hacia abajo en
el arreglo.
El bloque 3 se encarga de verificar si el arreglo 1 a calcularse es mayor que 7 ( 7 indicador del total de arreglos), si esto ocurre el
programa "salta" al bloque 13 acomodando los resultados obtenidos al
invertir los bits, de lo contrario (todos los arreglos no han sido
calculados) se va al bloque 4.
El bloque 4 inicializa un contador I el cual se encargará de
monitorear el número de pares de nodos dual que han sido considerados.
Recuerde que es necesario "saltar" ciertos nodos con el fin de
asegurar que los nodos previamente considerados no sean encontrados
una segunda vez.
Los bloques 5 y 6 se encargan de evaluar las ecuaciones:
24
x (n) = x (n) + Wp x (n + N / 2 l ) 1 1-1 1-1
xl(n + N / 2 1 ) = x (n) - Up x (n + N / 2 l ) 1-1 1-1
donde se puede observar que debido a que k y 1 se han inicializado a O y a 1, respectivamente, el nodo considerado inicialmente es el primer nodo del primer arreglo. Para determinar el factor p para este nodo,
se debe primero recorrer el número binario k a la derecha a - 1 bits y para realizarlo se calcula el valor entero de k/2'-l = k/2NU1 y se
establece el resultado M como se muestra en el bloque 5. De acuerdo al
procedimiento para determinar p, se pueden invertir los bits de M al representarlo por 7 = NU bits.
La función IBR(M) referida en el bloque 5, es una rutina o función
especial que se encarga de invertir los bits; esta rutina sera
descrita posteriormente.
1 El bloque 6 calcula las ecuaciones x (n) y x (n + N / 2 1 . En principio se obtiene el producto Up x (k + N / n 2 ) y se asigna el resultado a
una localidad de memoria temporal, a continuación se suma y se resta
este término de acuerdo a las ecuaciones x (n) y x ( n + N / 2 1 y el
1 1 1
1-1
1
1 1
- resultado es la salida del nodo dual.
Con el fin de calcular el próximo nodo del arreglo, k se incrementa
en 1, como se muestra en el bloque 7 y para evitar que se evalúe un
nodo dual previamente considerado, se verifica en el bloque 8 si el
contador I es igual a N 2 . Por ejemplo para el arreglo 1, el número de
nodos que deben ser considerados sin "saltar" es igual a N / 2 = N 2 , de
aquí que el bloque 8 determina esta condición. Si I no es igual a N 2 ,
se continúa con el nodo siguiente y se incrementa el contador I como
lo muestra el bloque 9. Bajo esta Última condición (I Q N 2 ) los
bloques 5 y 6 son repetidos para el nuevo valor de k (k fue incrementado en el bloque 7). Ahora si se cumple que I = N 2 en el
bloque 8, entonces se ha llegado a un nodo previamente considerado,
por consiguiente se salta N 2 nodos estableciendo a k = k + N 2
(mostrado en el bloque lo), y como k se incrementó en 1 en el bloque 7
25
es suficiente incrementar k por N2 para "saltar" los nodos previamente
cons iderados.
INlClO
DATOS: x@). k = O. 1.. . . , N - 1
N - 2'. 7 es un entero
N2-N/2 NU1 - 7 - 1
K-O I
-T M -Valor entero de (U P - IBR(M)
o
K - K + l
1 I- N2 7 K - K i N Z K < N - 1 ?
I1 - I 1 + 1 I B R - 2 * IBR (M - 2- J2)
Fig. 6. Diagrama de f l u j o del programa de la TRF.
26
Por otra parte, antes de ejecutar los cálculos indicados en los
bloques 5 y 6 para el nuevo nodo k = k + N2, se debe primero verificar
si este valor de k no excede el tamaño del arreglo, como lo muestra el
bloque 11. Si k es menor que N-1 (k tiene l o s límites de O a N-1) se
inicializa el contador I a 1 en el bloque 4 y se repite el bloque 5 y el bloque 6. Sin embargo, si k > N-1 en el bloque 11, se debe evaluar
el arreglo que sigue. De aquí que es necesario inicializar las
variables mostradas en el bloque 12: 1 se incrementa a 1, el nuevo
espaciamiento N2 es simplemente N2/2 (espaciamiento es N/2 I , NU1 se decrementa por 1 ( N U 1 es igual a a - 11 y k se inicializa a cero.
1
Posteriormente se verifica en el bloque 3 si todos los arreglos han
sido calculados; si es así, se procede a reacomodar el resultado
final. Esta operación es realizada por l o s bloques del 13 al 17.
El bloque 13 se encarga de invertir los bits del valor entero k para
obtener el valor entero i, esto con ayuda de la función IBR(kI la cual
es la que realiza propiamente la operación de inversión de los bits.
Para reacomodar la TRF simplemente se intercambia x(k1 por x(i) y esta manipulación es realizada por las operaciones indicadas en el
bloque 15. No obstante antes de entrar al bloque 15 es necesario
determinar, como se muestra en el bloque 14, si i es menor o igual a
k, con el fin de evitar que se alteren l o s nodos reacomodados
previamente.
El bloque 16 verifica en que momento todos los nodos han sido
reacomodados y en el bloque 17 simplemente se incrementa la variable k con el fin de considerar el siguiente nodo x ( k ) .
En el bloque 18 se describe la lógica de la función IBR(k), inversora de los bits, en la que se ha implementado el procedimiento relacionado
a la inversión de l o s bits.
Finalmente es necesario considerar a las variables X(kI y W’como
números complejos al implantar el diagrama de flujo en un lenguaje.
27
2 . LISTADO DEL PROGRAMA.
Las señales en muchas ocasiones son procesadas con el fin de
modificarlas de tal forma que facilite su interpretación, este
procesamiento se lleva a cabo en la mayoria de los casos mediante el
uso del algoritmo de la Transformada Rapida de Fourier. A continuación se proporciona el listado del programa del procedimiento de la
Transformada Rápida de Fourier que en secciones anteriores fue
estudiado, en su culminación, como un diagrama de flujo:
PROCEDURE FFT(VAR n,nu : Integer; VAR xrea1,ximag : arreglo);
{ Encuentra la Transformada Rapida de Fourier }
VAR 1, { Parametro del arreglo 1 aconsiderar } k, { indice del arreglo (arriba hacia abajo) } waste, { Auxiliar de la potencia de W 1 PP { Valor potenica de W ( W a la p ) } N2 9 { Espaciamiento de los nodos duales } Nul, { Corrimiento a la derecha en el
i, { Contador que monitorea el numero de calculo del parametro p }
pares de nodos duales que han sido considerados }
kl,kln2 : Integer; { Variables auxiliares } arg, { Argumento del seno y del coseno } c, s, { Valores del coseno y del seno } trea1,timag : Real; { Variables temporales en la
transferencia de la parte real y parte imaginaria }
FUNCTION ibitr(j,nu : Integer): Integer;
Funcion inversora de bits }
VAR ji, i, j2, { Variables auxiliares 1 temp : Integer; { Variable temporal }
BEGIN { Ibitr } j1: =j. temp: =O; FOR i:=l TO nu DO BEG IN j2:=jl DIV 2; temp: =temp*2+( jl-2*j2); ji: =j2 END ;
28
-- .
ibitr: =temp END: 4 Ibitr }
BEGIN { FFT } n2:=n DIV 2; nul: =nu-1; k: =O; 1: =o; REPEAT
1: =1+1; REPEAT
i: =O; REPEAT
i: =i+l; waste: =k DIV TRUNC(potencia(2,nul) 1; p: =ibitr(waste,nu); arg: =2*pi*p/n; c: =COS(arg); s: =SIN(arg); kl: =k+l; kln2: =kl+n2; treal:=xreal[kln2l*c+ximag[kln2l*s; timag:=ximag[kln2l*c-xreal[kln2l*s; xreal[kln2l:=xreal[kll-treal; ximag[kln2l:=ximag[kll-timag; xreal[kll:=xreal[kll+treal;
- ximag [ kl I : =ximag [ kl 1 + t imag; k: =k+l
Until (i=n2); k: =k+n2;
Until (k>=n); k: =O; nul: =nul-1; n2:=n2 DIV 2;
Until (l=nu); k: =O; REPEAT k: =k+l; i: =ibitr(k-l,nu)+l; IF (i>k) THEN BEGIN
treal: =xreal [kl ; timag: =ximag[kl; xreal[kl:=xreal[il; ximag [kl : =ximag [ i I ; xreal [ i 1 : =treal; ximag [ i 1 : =timag END
Until (k=n) END; { FFT }
Con el fin de tener una mejor idea de las caracteríscticas de este
procedimiento a continuación se proporciona una descripción del
29
--
procedimiento FFT y del procedimiento IBITR, en la que se puede
identificar la forma de declararla, los parámetros usados, las
variables utilizadas y su relación cruzada:
FFT Declaración procedure FFT(VAR n,nu : Integer;
VAR xrea1,ximag : arreglo);
Forma de usarse FFT(n, nu, xreal, ximag);
Parámetros n : (Entero) Número total de puntos a pro- cesar. Correspondiente a la resolución del diseño.
nu : (Entero) Valor potencia de dos. xreal: (Arreglo vectorial real) Variable del
vector que controla la parte real de la función discretizada al entrar, y controla la parte real del espectro en frecuencia al salir.
ximag: (Arreglo vectorial real) Variable del vector- que controla la parte imaginaria de la función discretizada al entrar, y controla la parte imaginaria del espectro en frecuencia al salir.
Variables
k
waste :
P
N2
NU 1
i
kl, kln2: arg
C S
treal :
timag :
(Entero) Parámetro del arreglo "1" a considerar. (Entero) Indice del arreglo (de arri- ba hacia abajo). (Entero) Auxiliar de la potencia de W. (Entero) Valor de la potenica de W ( W a la p). (Entero) Espaciamiento de los nodos dua 1 es. (Entero) Corrimiento a la derecha en el cálculo del parámetro p. (Entero) Contador que controla el
número de pares de nodos duales que han sido considerados. (Enteros) Variables auxiliares.
coseno. (Real) Valor del coseno. (Real) Valor del seno. (Real) Variable temporal en la trans- ferencia de la parte real. (Real) Variable temporal en la trans- ferencia de la parte imaginaria.
(Real) Argumento del seno y del
30
Descripción Realiza el cálculo de la Transformada Rápida de Fourier.
Restricciones N i nguna . Relación Cruzada Potencia.
Ibitr.
Ibitr
Declaración function ibitr( j,nu : Integer): Integer;
Forma de usarse ibi tr ( j , nu ;
Parámetros
Var i ab 1 es
j : (Entero) Bit a invertir. nu : (Entero) Valor potencia de dos
ji, i, j2 : (Enteros) Variables auxiliares. temp : (Entero) Variable temporal.
Descripción Función inversora de bits.
Restricciones Ninguna .
Además, para que el lector le sea fácil implementar el algoritmo y
obtener las gráficas que le permita visualizar el comportamiento
espectral de una cierta señal, en este programa se incluye la lógica
que debe seguir un programa que incluye l a s librerías de Turbo
Graphics para la visualización por pantalla.
Inicialmente se proporciona un listado de programa de un algoritmo
que genera una señal de prueba, el cual se encuentra en el apéndice A, y así asegurar al lector que su programa esta funcionando
problema. Este programa genera un archivo de datos el cual
en el directorio de trabajo con el nombre: 'PRUEBA.DAT' el
ser leído por el programa que realiza de Transformada
sin ningún
se almacena
cual deberá Rápida de
31
Fourier
En el apéndice B se proporciona el listado del programa que se
encarga de obtener la Transformada Rápida de Fourier. En este se puede
distinguir: el proceso de lectura, el del procesamiento (obtención de
la TRF) y el proceso de graficación.
El proceso de lectura le permite leer un archivo de datos, cuyas características principales es: debe ser un archivo texto, debe ser
potencia de dos (esto se justifica en el estudio de la sección
anterior). En caso de no ser el número de datos leídos potencia de
dos, la lógica del programa le indica al usuario de esta discrepancia
y selecciona el máximo número de puntos que sea potencia de dos y
realiza el procesado de l o s datos.
Finalmente el usuario podrá observar en su pantalla las gráficas de
la señal introducida, la gráfica de la parte real, la parte
imaginaria, la magnitud y la fase de la Transformada Discreta de
Fourier. Estas se encuentran desplegadas en el apéndice C.
32
A P E N D I C E A
Program generador-senal;
uses Crt, Dos, Printer;
TYPE arreglo = ARRAYfl.. 10241 OF Real; cadena = STñING[80];
VAR fnci : arreglo; tecla : Char; nn, j : Integer; archivo : cadena; arch : Text; datos : Real;
PROCEDURE Genera-Coeficientes(VAR j : Integer);
VAR k : Integer; arg, valor : Real; wt : Real;
{ Argumento de los calculos } { Valor de la funcion o de la ventana }
BEGIN { GENERA COEFICIENTES } for k : = 1 to 64 do
fncilkl : = 0.0; wt: =O. 5*pi; for k : = 1 to 6 do BEG IN arg: =wt* (k-1); IF (arg=O)
THEN fnci [7-k1: =O. 5 ELSE BEGIN
valor: =O. 5*(SIN(arg)/arg); fnci [7-kl: =valor; fnci [5+k]: =valor; END
END ;
BEG IN for k : = 1 to 11 do
valor : = fnci [12-k]; fnci[lZ-k] : = 0.0; fnci[26+kl : = valor END;
j : = 64 END; { GENERA COEFICIENTES }
34
BEGIN ClrScr; Genera-Coeficientes(nn1; GotoXY(10.10); Write(’1nicia a crear el archivo de datos en el directorio actual’); archivo : = ’ prueba. dat’ ; ASSIGN(arch, archivo); Rewrite (arch); for j : = 1 to nn do BEG I N datos : = fncifjl ; wri teln(arch, datos ) END;
Close(arch); GotoXY(10,15); Write ( ’ El nombre del archivo generado es : PRUEBA. DAT’ ; GotoXY( 10.20); Write(’Cua1quier tecla para continuar’ 1; Repeat
tecla : = ReadKey; Until (tecla <> ” 1 END.
35
A P E N D I C E B
Program Trans-FourRapida;
{$I Float. Inc}
uses Crt, Dos, Printer, GDriver, Gkernel, GWindow, GShell;
CONST rnax-real = 1E16; max-long = 80; BELL = 7; lmax = 1024;
TYPE arreglo = ARRAY[l..lmaxI OF Real; cadena = STRINGImax-long];
VAR n, nu : Integer; preal, pimag, mag, fase, fnci : arreglo; adios : Boolean;
{ Representa la potencia de 2 ( 2 a la nu) }
FUNCTION Potencia(base : Real; exponente : Real) : Real;
BEGIN { Potencia }
END; { Potencia } potencia:=EXP(exponente*LN(base))
PROCEDURE Lectura(VAR i : Integer; VAR adios : Boolean);
VAR archivo : cadena; arch : Text; datos : Real; pot : Integer; tecla : Char;
FUNCTION Pot-Dos (m : Integer) : Boolean;
{ Entrega un valor verdadero si el numero m es potencia de dos y define el valor de NU para la FFT }
BEGIN { Pot-Dos } nu: =O; WHILE (m>i) and ((m MOD 2)=01 DO
BEG IN
37
nu: =SUCC(nuI; m:=m DIV 2 END;
THEN po tdos : =true ELSE pot-dos: =false
IF (m=i)
END; { Pot-Dos }
BEGIN { Lectura 1 C1 rScr ; adios : = false; GotoXY(20,lOI; Write(’Cua1 es el nombre de su archivo : ’ I ; Readln(archiv0); ASSIGN(arch, archivo 1 ; {$I-} Reset (arch) {$I+}; IF (IOresult<>O)
THEN BEGIN gotoxy(20,15);
gotoxy(20,20); Write ( ’ No se encuentra ese archivo’ ;
Writeln(’ A D I O S ’ 1 ; writeln; wri teln; adios : = true END
ELSE BEG IN i: =O; While (not Eof(arch1) Do BEG IN i: =i+l; Readln(arch, datos); fnci[il .:= datos END ;
Close(arch1; IF (not Pot-dos(iII THEN BEG IN gotoxy(20,15);
gotoxy(20,17); Writeln(’E1 valor de i es : ’,i);
Write(’Su archivo no es potencia de dos’); gotoxy(20,18); Write(’se tomara el numero maximo de potencia de dos’); gotoxy(20,20); Write(’Presione cualquier tecla para continuar’ I ; Repeat
tecla : = Readkey; Until (tecla <> ” 1; pot: =TRUNC(ln(i)/ln(2)); i: =TRUNC(potencia(2,pot)I
END END
END: { Lectura }
PROCEDURE FFT(VAR n,nu : Integer; VAR xrea1,ximag : arreglo);
{ Encuentra la Transformada Rapida de Fourier }
VAR 1, { Parametro del arreglo 1 aconsiderar } k. { indice del arreglo (arriba hacia abajo) 1 was te, { Auxiliar de la potencia de W } P. { Valor potenica de W (W a la p } N2, { Espaciamiento de los nodos duales } Nul, { Corrimiento a la derecha en el
i, Contador que monitorea el numero de calculo del parametro p }
pares de nodos duales que han sido considerados 1
kl,kln2 : Integer; { Variables auxiliares } arg, { Argumento del seno y del coseno } c, s> { Valores del coseno y del seno } trea1,timag : Real; { Variables temporales en la
transferencia de la parte real y parte imaginaria }
FUNCTION ibitr(j,nu : Integer): Integer;
{ Funcion inversora de bits }
VAR j1, i,j2, { Variables auxiliares } temp : Integer; { Variable temporal }
BEGIN Ibitr- } jl: =j; temp: =O; FOR i: =1 TO nu DO BEG IN j2:=jl DIV 2; temp:=temp*2+(jl-2*j2); jl: =j2
ibitr: =temp END; { Ibitr }
END;
BEGIN { FFT } n2:=n DIV 2; nul: =nu-1; k: =O; 1: =o; REPEAT
1: =1+1; REPEAT
i: =O; REPEAT
39
i: =i+l; waste: =k DIV TRUNC(potencia(2, nul) 1 ; p: =ibitr(waste, nu); arg: =2*pi*p/n; c: =COS(arg); s: =SIN(arg); kl: =k+l; kln2: =kl+n2; treal:=xreal[kln21*c+ximag[kln2l*s; timag:=ximag[kln2l*c-xreal[kln2l*s; xreal[kln2l:=xreal[kll-treal; ximag[kln2l:=ximag[kll-timag; xreal[kll:=xreal[kll+treal; ximag [ kl I : =ximag [ kl I + t imag; k: =k+l
Until (i=n2); k: =k+n2;
Until (k>=n); k: =O; nul: =nul-1; n2:=n2 DIV 2;
Until (l=nu); k: =O; REPEAT k: =k+l; i : = i b i t r ( k- 1 , nu 1 + 1 ; IF (i>k) -
THEN BEGIN treal: =xreal [kl; timag: =ximag[kl; xreal[kl:=xreal[il; ximag[kl:=ximag[il; xreal[il: =treal; ximag[il: =timag END
Until (k=n) END; { FFT }
PROCEDURE Calculo-FFT(n : Integer);
VAR i : Integer;
BEGIN { Calculo-FFT } preal: =fnci; FOR i:=l TO n DO
FFT(n, nu, preal, pimag) pimag [ i 1 : =O;
END; { Calculo-FFT }
PROCEDURE TipoMagnitud;
40
i : Integer; maxmag : Real;
BEGIN {TipoMagnitud) maxmag: =O; i: =O; REPEAT
i: =i+l; mag[il:=SQRT(SQR(preal[il )+SQR(pimag[il)); IF (mag[i]>maxmag)
THEN maxmag: =mag [ i I ; UNTIL ( i = n 1 END; {TipoMagnitud}
PROCEDURE TipoFase;
VAR i : Integer; aux : Real;
BEGIN { Tipo-Fase 1 i: =O; REPEAT
i: =i+l; IF ( preal[iI=O) . THEN fase [ i I : =90
ELSE BEGIN aux:=pimag[il/preal[il; fase[i]:=90*ARCTAN(aux)/(pi/2) END
UNTIL (i=n) END; { Tipo-Fase 1
PROCEDURE Graf icador (vec : Arreglo; Tip-graf: integer 1 ;
VAR tecla : Char; xmax, xmin, ymax, ymin : Real; A : PLOTARRAY;
PROCEDURE Eje-Grafica;
PROCEDURE Lim-Sup-Inf;
VAR ir : Integer; maxy, miny : Real;
BEGIN {Lim-Sup-Inf1 xmin: =O;
xmax: =n-1; maxy: =O; miny: =maxy; ir: =O; REPEAT
ir: =ir+l; IF (vec[irl > maxy)
IF (vec[irl < miny)
A [ ir, 1 I : =xmax* ( ir- 1 1 /n; A [ ir, 21 : =vec [ ir 1
THEN maxy:=vec[irl;
THEN miny: =vec [ ir 1 ;
Until (ir = n); ymin: =1.075*miny; ymax: =1.075*maxy END; {Lim-Sup-Inf }
PROCEDURE Rotulos (Tip-Graf: Integer) ;
VAR cabeza: cadena;
BEGIN Rotulos } Clearscreen; SetForeGroundColor(7); Def ineWindow.( 1, O, O, XMAXGLB, YMAXGLB) ; Def ineWorld ( 1, O, 1000,1000, O ) ; SelectWorld(1); SelectWindow(1); CASE Tip-Graf OF
1: cabeza: =’ FUNCION DISCRETIZADA’ ; 2 : cabeza: =’ PARTE REAL’ ; 3: cabeza: =’ PARTE IMAGINARIA’ ; 4: cabeza: =’MAGNITUD’ ; 5: cabeza: =’ FASE’
END ; DefineHeader(1,cabeza); SetHeaderOn; SetHeaderToTop; DrawBorder END; { Rotulos }
BEGIN {Eje-Grafica} Lim-Sup-Inf; Rotulos(Tip-graf); Definewindow (2,1,45, XMAXGLB, YMAXGLB-2) ; Defineworld (2, xmin, ymin, xmax, ymax); SelectWorld(2); SelectWindow(2); Drawaxis(8,8, O, O, O, O, 20,20, true); DrawPolygon(A, 1, n, O, O, -1) END; {Eje-Graf ica}
BEGIN { Graficador 1
42
Ini tGraphic; E jeGraf ica; Repeat
tecla : = Readkey; Until (tecla <> "1 ; LeaveGraphic
END; { Graficador 1
BEGIN Lectura(n, adios); IF (not adios)
THEN BEGIN CalculoFFT(n1; Graf icador ( f nci , 1 ; Graficador(preal,2); Graf icador (pimag, 3) ; TipoMagnitud; Ti po-Fase ; Graf icador (mag, 4 ) ; Graficador(fase, 5 )
END END.
43
A P E N D I C E C
44
1.6%
3.33.
3.20.
2.1%
1.76
1.03.
0.31.
.0.12.
.l.l+,
0 . 0 0 0.6
I
I
, , , I , , I , , , , , , , , , , I
45
3 1 .0
0 . 9
O . 7
O .6
0 . 5
0 . 3
0 . 1
0 . 1
0 . 0 0 . 0 0
0 . 6 6 1 I: !
10 ' *
1 . 3 . 2 2
4 . 3 7
.7 .52 1-
46
B I B L I O G R A F I A
1.- E. Oran Brigham, The Fast Fourier Transform, Prentice Hall
Englewood Cliffs, N. J., 1975.
2.- A. V. Oppenheim and W. S. Schafer, Digital Signal Processing,
Prentice Hall, Englewood Cliffs, N. J., 1975.
3.a L.R. Rabiner and B.Gold, Theory and Application of Digital Signal
Processing, Prentice Hall, Englewood Cliffs, N. J., 1975.
4.- A. Antoniou, Digital Filters: Analysis and Design, Mc Graw Hill, New York, 1979.
5 . - David J. DeFatta, Joseph G. Lucas and William S Hodgkiss, Digital Signal Processing : A System Design Apprach, John Wiley & Sons,
1988.
6. - William D. Stanley, Digital Signal Processing, Prentice Hall
Company , 1975.
7.- Fred J. Taylor, Digital Filter Design Handbook, Marcel Dekker,
Inc. , 1983.
8.- B. Gold and C. M. Rader, Digital Processing of Signals, Mc Graw - Hill, New York, 1969.
9.- Programs for Digital Signal Processing , Edited by the Digital
Processing Commitee, IEEE Acoustics, Speech, and Signal
Processing Society, John Wiley & Sons, Inc., 1979.
10- Digital Signal Processing, Edited by Lawrence R. Rabiner and
Charles M. Rader, IEEE PRESS, Board, New York, 1972.
47