Está en la página 1de 247

INSTITUTO POLITCNICO NACIONAL

ESCUELA SUPERIOR DE INGENIERA MECNICA Y ELCTRICA

UNIDAD PROFESIONAL CULHUACAN

INGENIERA EN COMUNICACIONES Y ELECTRNICA (I.C.E.)

ELABORACIN DE UN PROGRAMA DE DISEO


DE FILTROS DIGITALES DE RESPUESTA AL
IMPULSO FINITO

T E S I S:
QUE PARA OBTENER EL TITULO DE:

INGENIERO EN COMUNICACIONES Y
ELECTRNICA

P R E S E N T A:
ALBERTO LANDA PALEO

MXICO, D.F. OCTUBRE DE 1998


Esta Tesis est dedicada
a la memoria de mi padre
Alberto Landa Vzquez, ya
que sin su valiosa ayuda yo
no sera lo que soy.
AGRADECIMIENTOS
Le estoy profundamente agradecido a mis padres, Alberto Landa Vzquez
e Irene Paleo Castro, por haberme alentado a realizar este esfuerzo. Tambin al

Ing. Ernesto Mercado Escutia que me asesor para elaborar este trabajo.
Le agradezco al Instituto Politcnico Nacional, mi alma mater por darme la

oportunidad de estudiar en sus instituciones y desarrollarme como persona y como


profesionista.

Tambin le quiero dar el crdito a todas aquellas personas que de alguna


manera han colaborado a mi desarrollo y aprendizaje.
Slo nosotros somos responsables de nuestro destino.

Corresponde a nosotros la responsabilidad de descubrir el camino y andarlo con


nuestros propios pies.

A.L.P.
NDICE
INTRODUCCIN 1

CAPITULO 1. LA TRANSFORMADA DISCRETA DE FOURIER 3

1.1 Desarrollo Grfico 3

1.2 Desarrollo Terico 6

1.3 Programa para realizar la Transformada Discreta de Fourier 14

Diagrama de flujo 15

Programa fuente 16

1.4 Transformada Discreta Inversa de Fourier 29

1.5 Programa para realizar la Transformada Discreta Inversa de Fourier 33

Diagrama de flujo 34

Programa fuente 35

CAPITULO 2. LA TRANSFORMADA RPIDA DE FOURIER 41

2.1 Formulacin de la matriz 42

2.2 Desarrollo intuitivo 43

2.3 Diagramas de mariposa 48

2.4 Nodos duales 49

Espaciamiento entre nodos duales 50

Clculo de nodos duales 52


2.5 Determinacin de W p 53

2.6 Reordenacin de datos de la FFT 55

2.7 Diagrama de flujo del programa en computadora de la FFT 69

2.8 Programa para realizar la FFT 72

Descripcin de la funcin fft del matlab 73

Descripcin de la funcin fft2 del matlab 74

Programa fuente 75

2.9 La Transformada Rpida Inversa de Fourier 89

2.10 Programa para realizar la Transformada Rpida Inversa de Fourier 102

Descripcin de la funcin ifft del matlab 103

Descripcin de la funcin ifft2 del matlab 103

Programa fuente 104

CAPITULO 3. LA TRANSFORMADA Z 111

3.0 Introduccin 111

3.1 La Transformada Z 112

3.2 Propiedades de la Transformada Z 113

3.2.1 Regin de convergencia (RCO) 113

3.2.2 Linealidad 117

3.2.3 Propiedad de retardo 117

3.2.4 Escalamiento en tiempo por una secuencia exponencial compleja 118

3.2.5 Diferenciacin de x(z) o multiplicacin de x(nT) por (nT) 119

3.2.6 Propiedad de convolucin 119


3.2.7 Teorema del valor inicial 120

3.2.8 Teorema del valor final 120

3.3 La transformada Z inversa 121

3.3.1 Integral de la inversin compleja 121

3.3.2 Inversin por fracciones parciales 123

3.3.3 Inversin por divisin 124

3.3.4 Teorema de la convolucin compleja 124

3.4 Anlisis de sistemas discretos en tiempo 126

3.5 Estabilidad del sistema 127

CAPITULO 4. DISEO DE FILTROS DIGITALES DE RESPUESTA AL IMPULSO


FINITO 128

4.0 Introduccin 128

4.1 Caractersticas de los filtros digitales FIR 129

4.2 Propiedades de los filtros FIR 130

4.2.1 Fase lineal de los filtros 130

4.2.2 Respuesta en frecuencia de los filtros FIR de fase lineal 133

4.3 Mtodo de las series de Fourier para el diseo de filtros FIR 135

4.3.1 Funciones Ventana 137

Funcin de la ventana rectangular 138

Funcin ventana de Hamming 139

Funcin ventana de Blackman 140

Funcin ventana de Kaiser 140

4.3.2 Diseo de filtros FIR usando la funcin de la ventana de Kaiser 143


Especificaciones de diseo 143

Procedimiento de diseo 144

4.3.3 Ecuaciones generales de diseo de filtros FIR 145

Filtros FIR pasa bajas 145

Filtros FIR pasa altas 146

Filtros FIR pasa banda 146

Filtros FIR rechaza banda 147

4.4 Programa de diseo de filtros digitales FIR 148

4.4.1 Funciones del matlab que intervienen en el proceso de filtrado 149

La funcin butter 149

La funcin cheby1 149

La funcin cheby2 150

La funcin freqz 150

La funcin yulewalk 151

La funcin filter 151

Programa fuente 152

4.5 Aplicaciones del procesamiento digital de seales 206

4.6 Filtrado digital 208

CONCLUSIONES 209

APNDICE A. FRMULA DE EULER 211

APNDICE B. OBTENCIN DE LAS ECUACIONES GENERALES DE DISEO DE 213


LOS FILTROS FIR

APNDICE C. CONVOLUCIN DISCRETA 221


GLOSARIO 237

BIBLIOGRAFA 239
INTRODUCCIN
El proyecto que se desarrolla consiste en disear un programa que tiene la
finalidad de apoyar al estudiante que cursa la materia de procesamiento digital de
seales como material didctico; ya que el procesamiento digital de seales tiene
un gran auge en cada una de las reas de la ciencia y la ingeniera.
En la actualidad los sistemas digitales de telecomunicaciones estn
reemplazando a los sistemas analgicos. Por lo cual es de gran importancia
comprender el diseo y el comportamiento de los filtros digitales de respuesta al
impulso finito (FIR).
El desarrollo de este proyecto consiste en poder simular los filtros digitales
FIR en sus cuatro tipos (Pasa Altas, Pasa Bajas, Pasa Banda y Rechaza Banda),
con cuatro tipos diferentes de ventanas (Rectangular, Hamming, Blackman y
Kaiser).
El programa le permite cambiar al usuario uno o varios de los parmetros
de diseo del filtro, como son:

Frecuencias de paso.
Frecuencias de rechazo.
Atenuacin en la banda de paso.
Atenuacin en la banda de rechazo.

Esto nos permite observar y comparar las diferencias que existen en cada
una de las funciones ventana para un mismo tipo de filtro y el comportamiento del
filtro al cambiar uno o varios de sus parmetros de diseo.
Para simular el proceso de filtrado se tienen que generar seales con el
mismo programa las cuales son senoidal, triangular y pulso cuadrado. Estas
seales pueden ser manipuladas por el usuario cambiando algunos de sus
parmetros como son periodo y amplitud en el caso de las seales triangular y
pulso cuadrado y frecuencia y amplitud en el caso de la seal senoidal.
Un mtodo para obtener el filtrado es obtener los coeficientes del filtro ya
ventaneados y convolucionarlos con las muestras de la seal elegida por el
usuario, una vez realizado este proceso se procede a obtener la respuesta en
frecuencia del filtro.
Para poder respaldar el programa en una forma terica es necesario tener
los conceptos o conocimientos bsicos de lo que es el procesamiento digital de
seales.
En el Captulo 1 se da una descripcin detallada de lo que es la
Transformada Discreta de Fourier (DFT), describiendo el proceso en su forma
1
grfica y en su forma matemtica, se plantea un programa que realiza la DFT, se
describe el proceso para realizar la TDF en su forma inversa; es decir la
Transformada Discreta Inversa de Fourier (DIFT), as como tambin se plantea
un programa para realizar la DIFT.
En el Captulo 2 debido a que la TDF involucra un gran nmero de sumas
y multiplicaciones se plantea un mtodo para realizar este mismo proceso de una
manera ms rpida; este proceso es la Transformada Rpida de Fourier (FFT), se
plantea un programa para realizar la FFT, as como tambin se describe en que
consiste el proceso inverso de la FFT; es decir la Transformada Rpida Inversa
de Fourier (FIFT), as como tambin se plantea un programa para realizar la FIFT.
En el Captulo 3 se describe lo que es la Transformada Z, algunas de sus
propiedades, la Transformada Z inversa y la estabilidad de un sistema.
En el Captulo 4 se describen en forma general las caractersticas de los
filtros digitales de respuesta al impulso finito (FIR), sus propiedades de fase lineal
y su respuesta en frecuencia, posteriormente se desarrolla un tratamiento
matemtico para el diseo de filtros digitales FIR por medio de series de Fourier.
Para evitar las oscilaciones presentes en la banda de paso y en la banda de
rechazo de los filtros digitales FIR causadas por la lenta convergencia de las series
de Fourier, se utiliza una funcin ventana, por lo cual se presenta una miscelnea
de funciones ventana.
De acuerdo a la teora establecida, se procede al desarrollo de un algoritmo para
el clculo de los filtros FIR y a la obtencin de las ecuaciones generales de diseo.
En base a esto, se desarrolla el programa de diseo de filtros FIR descrito
anteriormente.

2
CAPTULO 1
LA TRANSFORMADA DISCRETA DE FOURIER

1.1 DESARROLLO GRFICO


Considere el ejemplo de la funcin h(t) y su transformada de Fourier H(f)
ilustrados en la Fig. 1-1(a). Se desea modificar esta transformada de Fourier de
tal manera que sea recibida por una computadora digital para su proceso.
Esta modificacin de la funcin, se llam la Transformada discreta de Fourier
esta es la aproximacin ms estrechamente posible a la transformada continua de
Fourier.
Para determinar la transformada de Fourier de h(t) por medio de tcnicas
digitales de anlisis, es necesario muestrear h(t). El muestreo es realizado por la
multiplicacin de h(t) por la funcin de muestreo ilustrada en la Fig. 1-1(b). El
intervalo de muestreo es T. La funcin muestreada h(t) y su transformada de
Fourier estn ilustradas en la Fig. 1-1(c). Esta transformada de Fourier representa
la primera modificacin a la funcin original que es necesaria para definir a la
transformada discreta. Note que en este punto la transformada nicamente difiere
de la transformada original por el efecto de traslape de espectros que es resultado
del muestreo. "Si una forma de onda h(t) es muestreada a una frecuencia de al
menos dos veces la componente ms grande de frecuencia de h(t), no habr
prdida de informacin como resultado del muestreo"(Teorema del muestreo de
Nyquist). Si la funcin h(t) no esta limitada en banda; por ejemplo H(f) 0 para
algunos f > f , entonces el muestreo introducir traslape de espectros como se
c
muestra en la Fig. 1-1(c). Para reducir este error nosotros tenemos un slo
recurso, y es muestrear ms rpido, esto es, escogiendo T pequeo.
La transformada de Fourier de la Fig. 1-1(c) no es apta para procesarla en
una computadora debido a que se considera una cantidad infinita de muestras de
h(t); es necesario truncar la funcin muestreada h(t) para tener un nmero finito
de puntos, es decir, se consideran N puntos. La funcin rectangular o truncacin
y su transformada de Fourier son ilustradas en la Fig. 1-1(d). El producto
de una secuencia infinita de funciones impulso representadas por h(t) y la
funcin de truncamiento produce una funcin de longitud finita en tiempo ilustrada
en la Fig. 1- 1(e). El truncamiento introduce la segunda modificacin de la
transformada de Fourier original; este efecto de traslape de espectros presente en
la transformada en frecuencia de la Fig. 1-1(c) esta convolucionado con la
transformada de Fourier de la funcin de truncamiento [Fig. 1-1(d)]. Como se
3
muestra en la Fig. 1-1(e), la transformada en frecuencia ahora tiene un rizo; este
efecto se ha acentuado en la ilustracin para mayor nfasis. Para reducir este
efecto, hay que recordar la relacin inversa que existe entre la anchura de una
funcin en tiempo y su transformada de Fourier. De aqu en adelante, si la funcin
de truncamiento (rectangular) es incrementada en longitud, entonces la funcin
sen( f ) / f se acercar a un impulso; la funcin sen( f ) / f es la que ms
estrechamente se aproxima a un impulso, el rizo ms pequeo o error ser
introducido por la convolucin como resultado del truncamiento. Por lo tanto, es
deseable escoger la longitud de la funcin de truncamiento lo ms extensa posible.
La modificacin de la transformada de la Fig. 1-1(e) todava no es una
transformada discreta de Fourier aceptable porque la transformada en frecuencia
es una funcin continua. Para una computadora, solo valores muestreados de la
funcin en frecuencia pueden ser procesados; es necesario modificar la
transformada en frecuencia por la funcin muestreada en frecuencia ilustrada en
la Fig. 1-1(f). El intervalo en la funcin muestreada es 1/ T0 .
La transformada discreta de Fourier de la Fig. 1-1(g) es aceptable para los
propsitos de una computadora en ambos dominios el de frecuencia y el de tiempo
ya que estn representados por valores discretos. Como se muestra en la Fig. 1-
1(g), La funcin en tiempo original se aproxima a N muestras; la transformada de
Fourier original H(f) tambin es aproximada a N muestras. Estas N muestras
definen la transformada discreta de Fourier y es aproximada a la transformada de
Fourier original. Note que de este muestreo en el dominio del tiempo resulta una
funcin peridica en frecuencia; del muestreo en el dominio de la frecuencia
resulta una funcin peridica en tiempo. Por lo tanto, la transformada discreta de
Fourier requiere que ambas funciones originales la de frecuencia y la de tiempo
se modifiquen tal que lleguen a ser funciones peridicas. N muestras en tiempo y
N valores en frecuencia representan un periodo del dominio de las formas de onda
en tiempo y en frecuencia, respectivamente. Como N valores de frecuencia y de
tiempo son relacionados con la transformada continua de Fourier, podemos definir
una relacin discreta.

4
5
1.2 DESARROLLO TERICO
El procedimiento del desarrollo grfico ilustra en un punto que si una
transformada de Fourier continua se modifica correctamente, entonces el par
modificado es aceptable para su proceso en una computadora. As, para
desarrollar esta transformada discreta de Fourier, lo nico necesario para
determinar las ecuaciones matemticas es el resultado de cada una de las
modificaciones requeridas: muestreo en el dominio del tiempo, truncamiento, y
muestreo en el dominio de la frecuencia.
Considere la transformada de Fourier ilustrada en la Fig. 1-2(a). Al
discretizar esta transformada primero es necesario muestrear la forma de onda
h(t); el muestreo de la forma de onda puede ser escrito como h( t) 0 ( t) donde
0 ( t) es la funcin de muestreo en el dominio del tiempo ilustrada en la
Fig 1- 2(b). El intervalo de muestreo es T.
La ecuacin de muestreo puede ser escrita como:

h( t ) 0 ( t ) = h( t ) ( t kT )
k =

= h( kT ) ( t kT ) (1 1)
k =

El resultado de esta multiplicacin se ilustra en la Fig. 1-2(c). Note que el efecto


de traslape de espectros resulta de la eleccin de T.
En seguida, la funcin muestreada es truncada por la multiplicacin con la
funcin rectangular x(t) ilustrada en la Fig. 1-2(d):

x( t ) = 1 T2 < t < T0 T2
=0 en otro punto (1 2)
Donde T0 es la duracin de la funcin de truncacin.
La truncacin produce:

h(t ) 0 (t ) x(t ) = h( kT ) (t kT ) x(t )


k =
N 1
= h( kT ) (t kT ) (1 3)
k =0

Donde se ha asumido que hay N funciones impulso equidistantes que yacen


dentro del intervalo de truncamiento; que es, N = T0 / T . La forma de onda
muestreada truncada y su transformada de Fourier se ilustran en la Fig. 1-2(e).

6
El paso final de la modificacin de la transformada de Fourier original a la
transformada discreta de Fourier es muestrear la transformada de Fourier de la
Eq. (1-3).
En el dominio del tiempo este producto es equivalente a la convolucin de la forma
de onda muestreada truncada (1-3) y la funcin en el tiempo 1( t) , ilustrada en la
Fig. 1-2(f). La funcin 1( t) esta dada por la transformada de Fourier como:


1 ( t ) = T0 ( t rT0 ) (1 4)
r =

[ ]
La relacin deseada es h( t) 0 ( t)x( t) 1( t) ; por lo tanto:

[h(t ) (t ) x(t )] (t ) = h( kT ) (t kT ) T (t rT0 )


N 1


0 1 0
k =0 r =
N 1
= + T0 h( kT ) (t + T0 kT )
k =0
N 1
+ T0 h( kT ) (t kT )
k =0
N 1
+ T0 h( kT ) (t T0 kT ) + (1 5)
k =0

Note que la ecuacin (1-5) es peridica con periodo T0 ; en forma de notacin


compacta la ecuacin puede ser escrita como:

h (t ) = T0 h( kT ) (t kT rT0 )
N 1
~
(1 6)
r =
k =0

~ ~
Nosotros seleccionamos la notacin h( t) para implicar que h( t) es una
aproximacin a la funcin h(t).
Seleccionamos de la funcin rectangular x(t) como se describe en la
Eq. (1- 2) la cual podemos explicar ahora. Note que el resultado de la convolucin
de la Eq. (1-6) es una funcin peridica con periodo T0 el cual consiste de N
muestras. Si la funcin rectangular se elige tal que un valor de muestreo coincida
con cada punto a fin de la funcin rectangular, la convolucin de la funcin
rectangular con los impulsos espaciados a intervalos de T0 dara como resultado
traslape de espectros en el dominio del tiempo. Esto es, los N puntos de un
periodo coincidiran con el primer punto del prximo perodo. Para asegurar que
el traslape de espectros en el dominio del tiempo no ocurra, es necesario
seleccionar el intervalo de truncacin como se ilustra en la Fig. 1-2(d).
Para desarrollar la transformada de Fourier de la Eq. (1-6), tenemos que
recordar las series de Fourier, que la transformada de Fourier de una funcin
peridica h(t) es una secuencia de puntos equidistantes:

7
( )=

n ( f nf 0 ) (1 7)
~
H n
T0 f0 = 1
T0
n =

Donde:
T0 T / 2
h ( t )e (1 8)
~ j 2 nt / T0
n = 1
T0 dt n = 0, 1, 2,...
T /2

Sustituyendo la Eq. (1-6) en la Eq. (1-8) tenemos:


T0 T / 2 N 1
T0 h( kT ) (t kT rT0 )e
j 2 nt / T0
= 1
T0 dt
n T /2 r = k = 0

Integrando solo un perodo, tenemos:


T0 T / 2 N 1
h( kT ) (t kT )e
j 2 nt / T0
n = dt
T /2 k =0
N 1 T0 T / 2
= h( kT ) e j 2nt / T0 (t kT )dt
k =0 T /2
N 1
= h( kT )e j 2knT / T0 (1 9)
k =0

Como T0 = NT , la Eq. (1-9) puede ser reescrita como:

N 1
n = h( kT )e j 2kn / N n = 0, 1, 2,... (1 10)
k =0

Y la transformada de Fourier de la Eq. (1-6) es:

~ ( n ) = N 1h(kT )e j 2kn / N (1 11)


H NT
n = k = 0

De la evaluacin precipitada de la Eq. (1-11), no resulta obvio que la


~
transformada de Fourier H(n / NT) sea peridica como se ilustra en la Fig. 1-2(g).

8
Sin embargo, hay solo N valores complejos distintos calculables de la Eq. (1-11).
Para establecer este hecho asignamos a n = r donde r es un entero arbitrario; la
Eq. (1-11) se convierte en:

N 1
H ( NTr ) = h( kT )e j 2kr / N (1 12)
~
k =0

Ahora asignamos a n = r + N; note que:

9
e j 2k ( r + N ) / N = e j 2kr / N e j 2k
= e j 2kr / N (1 13)

Entonces e j2k = cos( 2k ) jsen( 2k ) = 1 para valores enteros de k. As para


n = r + N:

N 1
H ( rNT ) = h( kT )e j 2k ( r + N )/ N
~ +N
k =0
N 1
= h( kT )e j 2kr / N
k =0

= H ( NTr ) (1 14)
~

Por lo tanto, hay solo N valores distintos para que la Eq. (1-11) pueda ser
~
evaluada; H(n / NT) es peridica con un periodo de N muestras. La transformada
de Fourier de la Eq. (1-11) puede ser expresada equivalentemente como:

N 1
H ( NT
n
) = h( kT )e j 2nk / N n = 0, 1,........, N 1 (1 15)
k =0

La Eq. (1-15) es la deseada transformada discreta de Fourier; la expresin


relaciona N muestras de tiempo y N muestras de frecuencia por medio de la
transformada continua de Fourier. La transformada discreta de Fourier es
entonces un caso especial de la transformada continua de Fourier. Si se asume
que esas N muestras de la funcin original h(t) son un periodo de una forma de
onda peridica, la transformada de Fourier de esta funcin peridica esta dada
~
por las N muestras como se clculo en la Eq. (1-15). La notacin H(n / NT) es
usada para indicar que la transformada discreta de Fourier es una aproximacin
a la transformada continua de Fourier. Normalmente, la Eq. (1-15) se escribe
como:

N 1
G( NT
n
) = g( kT )e j 2nk / N n = 0, 1,........, N 1 (1 16)
k =0

Entonces la transformada de Fourier de una funcin peridica muestreada g(kT)


es idntica a G(n/NT).

10
EJEMPLO 1.1
Encontrar la transformada discreta de Fourier de la siguiente secuencia:

11
N = 8, h(0) = 1, h(1) = 2, h(2) = 3, h(3) = 4,
h(4) = 5, h(5) = 6, h(6) = 7, h(7) = 8.
N 1
H ( NT
n
) = h( kT )e j 2nk / N n = 0,1,.........., N 1
k =0

n=0
H (0) = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 = 36
n=1
H (1) = 1 + 2e j / 4 + 3e j / 2 + 4e j 3 / 4 + 5e j +
6e j 5 / 4 + 7e j 6 / 4 + 8e j 7 / 4 =
1 + 2( cos[45] j sen[45]) + 3( cos[90] j sen[90]) +
4( cos[135] j sen[135]) + 5( cos[180] j sen[180]) +
6( cos[225] j sen[225]) + 7( cos[270] j sen[270]) +
8( cos[315] j sen[315]) =
1 + 1414213562
. 2.828427125 5 4.242640687 +
5.65685425 + j ( 1414213562
. 3 2.828427125 +
4.242640687 + 7 + 5.65685425) = 4 + j9.65685425
n=2
H ( 2) = 1 + 2e j / 2 + 3e j + 4e j 3 / 2 + 5e j 2 +

6e j 5 / 2 + 7e j 3 + 8e j 7 / 2 =
1 + 2( cos[90] j sen[90]) + 3( cos[180] j sen[180]) +
4( cos[270] j sen[270]) + 5( cos[360] j sen[360]) +
6( cos[450] j sen[450]) + 7( cos[540] j sen[540]) +
8( cos[630] j sen[630]) =
1 3 + 5 7 + j ( 2 + 4 6 + 8) = 4 + j4
n=3
H ( 3) = 1 + 2e j 3 / 4 + 3e j 3 / 2 + 4e j 9 / 4 + 5e j 3 +
6e j15 / 4 + 7e j 9 / 2 + 8e j 21 / 4 =
1 + 2( cos[135] j sen[135]) + 3( cos[270] j sen[270]) +
4( cos[405] j sen[405]) + 5( cos[540] j sen[540]) +
6( cos[675] j sen[675]) + 7( cos[810] j sen[810]) +
8( cos[945] j sen[945]) =
1 1414213562
. + 2.828427125 5 + 4.242640687
5.65685425 + j ( 1414213562
. + 3 2.828427125 +
4.242640687 7 + 5.656854249) = 4 + j1.656854249
12
n=4
H (4) = 1 + 2e j + 3e j 2 + 4e j 3 + 5e j 4 +
6e j 5 + 7e j 6 + 8e j 7 =
1 + 2( cos[180] j sen[180]) + 3( cos[360] j sen[360]) +
4( cos[540] j sen[540]) + 5( cos[720] j sen[720]) +
6( cos[900] j sen[900]) + 7( cos[1080] j sen[1080]) +
8( cos[1260] j sen[1260]) =
1 2 + 3 4 + 5 6 + 7 8 = 4
n=5
H (5) = 1 + 2e j 5 / 4 + 3e j 5 / 2 + 4e j15 / 4 + 5e j 5 +
6e j 25 / 4 + 7e j15 / 2 + 8e j 35 / 4 =
1 + 2( cos[225] j sen[225]) + 3( cos[450] j sen[450]) +
4( cos[675] j sen[675]) + 5( cos[900] j sen[900]) +
6( cos[1125] j sen[1125]) + 7( cos[1350] j sen[1350]) +
8( cos[1575] j sen[1575]) =
1 1414213562
. + 2.828427125 5 + 4.242640687
5.656854249 + j (1414213562
. 3 + 2.828427125
4.242640687 + 7 5.656854249) = 4 - j1.656854249
n=6
H ( 6) = 1 + 2e j 3 / 2 + 3e j 3 + 4e j 9 / 2 + 5e j 6 +
6e j15 / 2 + 7e j 9 + 8e j 21 / 2 =
1 + 2( cos[270] j sen[270]) + 3( cos[540] j sen[540]) +
4( cos[810] j sen[810]) + 5( cos[1080] j sen[1080]) +
6( cos[1350] j sen[1350]) + 7( cos[1620] j sen[1620]) +
8( cos[1890] j sen[1890]) =
1 3 + 5 7 + j (2 4 + 6 8) = 4 j4
n=7
H ( 7) = 1 + 2e j 7 / 4 + 3e j 7 / 2 + 4e j 21 / 4 + 5e j 7 +
6e j 35 / 4 + 7e j 21 / 2 + 8e j 49 / 4 =
1 + 2( cos[315] j sen[315]) + 3( cos[630] j sen[630]) +
4( cos[945] j sen[945]) + 5( cos[1260] j sen[1260]) +
6( cos[1575] j sen[1575]) + 7( cos[1890] j sen[1890]) +
8( cos[2205] j sen[2205]) =
1 + 1414213562
. 2.828427125 5 4.242640687 +
5.656854249 + j (1414213562
. + 3 + 2.828427125
4.242640687 7 5.656854249) = 4 j9.656854249
13
1.3 PROGRAMA PARA REALIZAR LA
TRANSFORMADA DISCRETA DE FOURIER
DESCRIPCIN
Este programa fue elaborado en Turbo C Ver. 2.0 con el propsito de
auxiliar al estudiante de procesamiento digital de seales en el aprendizaje de
dicho tema; el programa trabaja de la siguiente manera:

Pide al usuario un archivo de datos (el cual puede ser elaborado en el editor
de MS-DOS).
Despliega los datos contenidos en el archivo de datos.
Despliega los resultados obtenidos.
Despliega la grfica de los valores reales.
Despliega la grfica de los valores imaginarios.
Despliega la grfica del valor absoluto.
Despliega la grfica de la fase.

Para realizar este programa se necesita tener Turbo C Ver. 2.0 y un


monitor VGA color.
NOTA. Si empleamos una versin de C++ el programa podra marcar errores o
advertencias al compilarlo.
Para el modo grfico el programa esta diseado para trabajar con la
resolucin de 640x480 pixeles y desplegar las grficas en color; si
empleamos un monitor SVGA o un UVGA no tendremos problema alguno
siempre y cuando el monitor sea de color; si el monitor es monocromtico
como el programa tiene instrucciones de color lo que suceder es que
nuestra pantalla al desplegar la grfica se pondr toda gris o negra.
Si se desea modificar el programa de tal manera que no ocurra esto es
necesario modificar las instrucciones de setcolor, de floodfillstyle y las de
floodfill. Tambin se puede modificar el programa para que se pueda usar
otro tipo de monitor (CGA u otro); pero hay que tener cuidado ya que si
dejamos as las coordenadas la grfica saldr incompleta o corrida.

14
DIAGRAMA DE FLUJO

15
P ROGRAMA F UENTE
/*PROGRAMA QUE REALIZA LA TRANSFORMADA DISCRETA DE
FOURIER*/
#include <graphics.h>
#include <conio.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#define N 890

int gd,gm;
float n,n1,k,w,q,z[N],c[N],s[N],a[N],b[N],pi=3.141592654,temp,r,e,max,
aa[N],bb[N],zz[N],num;
double h[N],y[N];
FILE *fp;
char nombre[9],p[10];

graficos()
{
gd=VGA;
gm=VGAHI;
initgraph(&gd,&gm,"");
}

clculos()
{
clrscr();
gotoxy(22,11);printf("DAME EL NOMBRE DEL ARCHIVO DE DATOS.");
gotoxy(32,13);printf("Nombre = ");scanf("%s",nombre);
if((fp = fopen(nombre,"rt"))==NULL)
{
puts("\n\t\t\t NO SE PUEDE ABRIR EL ARCHIVO");
exit(1);
}
gotoxy(25,25);printf("<Presione Enter Para Continuar>");getche();
n=0;
clrscr();
gotoxy(22,1);printf("VALORES DE LAS MUESTRAS INTRODUCIDAS");
n=0;
while(!feof(fp))
{
fscanf(fp,"%lf\n",&h[n]);
gotoxy(34,n+3);printf("h[%.0f] = %.2lf",n,h[n]);
n++;
}
16
gotoxy(25,25);printf("<Presione Enter Para Continuar>");getche();
fclose(fp);
w=(2*pi)/n;
clrscr();
gotoxy(30,1);printf("RESULTADOS OBTENIDOS");
for(n1=0;n1<=n-1;n1++)
{
for(k=0;k<=n-1;k++)
{
c[k]=h[k]*cos(w*n1*k);
s[k]=-h[k]*sin(w*n1*k);
a[n1]=a[n1]+c[k];
b[n1]=b[n1]+s[k];
}
gotoxy(30,n1+3);printf("x[%.0f] = %.2f + j%.2f",n1,a[n1],b[n1]);
}
gotoxy(25,25);printf("<Presione Enter Para Continuar>");getche();
}

ejes()
{
setcolor(15);
line(60,0,60,480);
line(60,240,640,240);
setlinestyle(0,0,3);
line(640,240,630,230);
line(640,240,630,250);
line(630,230,630,250);
line(60,0,70,10);
line(60,0,50,10);
line(50,10,70,10);
floodfill(59,5,WHITE);
floodfill(61,5,WHITE);
floodfill(635,239,WHITE);
floodfill(635,241,WHITE);
settextjustify(CENTER_TEXT,CENTER_TEXT);
settextstyle(TRIPLEX_FONT,HORIZ_DIR,1);
setcolor(10);
outtextxy(632,218,"n");
q=60;setcolor(15);
setlinestyle(0,0,0);
settextjustify(CENTER_TEXT,LEFT_TEXT);
settextstyle(DEFAULT_FONT,HORIZ_DIR,1);
outtextxy(320,479,"Presione Enter Para Continuar");
q=20;
while(q<=196)
17
{
line(55,q,65,q);
q+=44;
}
q=284;
while(q<=640)
{
line(55,q,65,q);
q+=44;
}
q=60;n1=0;
while(q<640)
{
line(q,235,q,245);
num = n1+1;
itoa(num,p,10);
q+=580/n;n1++;
outtextxy(q,257,p);
}
}

ejes_num()
{
itoa(max,p,10);
settextstyle(DEFAULT_FONT,HORIZ_DIR,1);
setcolor(15);
outtextxy(40,20,p);
itoa(-max,p,10);
setcolor(15);
outtextxy(35,460,p);
getche();
}

dibujo_real()
{
settextjustify(CENTER_TEXT,CENTER_TEXT);
settextstyle(TRIPLEX_FONT,HORIZ_DIR,2);
setcolor(2);
outtextxy(320,10,"VALORES REALES DE LA FUNCION");
for(n1=0;n1<=n-1;n1++)
{
aa[n1] = a[n1];
}
for(r=0;r<=n-1;r++)
for(e=r+1;e<=n+1;e++)
if (aa[r]<aa[e])
18
{
temp = aa[r];
aa[r] = aa[e];
aa[e] = temp;
}
max = aa[0];
for(n1=0;n1<=n-1;n1++)
{
setcolor(14);
setlinestyle(0,0,3);
circle(60+(n1*(580/n)),240-(a[n1]*(220/max)),2);
setfillstyle(1,14);
floodfill(60+(n1*(580/n)),240-(a[n1]*(220/max)),14);
line(60+(n1*(580/n)),240,60+(n1*(580/n)),240-(a[n1]*(220/max)));
}
}

dibujo_imaginario()
{
settextjustify(CENTER_TEXT,CENTER_TEXT);
settextstyle(TRIPLEX_FONT,HORIZ_DIR,2);
setcolor(2);
outtextxy(320,10,"VALORES IMAGINARIOS DE LA FUNCION");
for(n1=0;n1<=n-1;n1++)
{
bb[n1] = b[n1];
}
for(r=0;r<=n-1;r++)
for(e=r+1;e<=n+1;e++)
if (bb[r]<bb[e])
{
temp = bb[r];
bb[r] = bb[e];
bb[e] = temp;
}
max = bb[0];
for(n1=0;n1<=n-1;n1++)
{
setcolor(14);
setlinestyle(0,0,3);
circle(60+(n1*(580/n)),240-(b[n1]*(220/max)),2);
setfillstyle(1,14);
floodfill(60+(n1*(580/n)),240-(b[n1]*(220/max)),14);
line(60+(n1*(580/n)),240,60+(n1*(580/n)),240-(b[n1]*(220/max)));
}
}
19
absoluto()
{
settextjustify(CENTER_TEXT,CENTER_TEXT);
settextstyle(TRIPLEX_FONT,HORIZ_DIR,2);
setcolor(2);
outtextxy(320,10,"VALOR ABSOLUTO DE LA FUNCION");
for(n1=0;n1<=n-1;n1++)
{
z[n1]=sqrt(pow(a[n1],2)+pow(b[n1],2));
for(q=0;q<=n-1;q++)
{
zz[q] = z[q];
}
for(r=0;r<=n-1;r++)
for(e=r+1;e<=n+1;e++)
if (zz[r]<zz[e])
{
temp = zz[r];
zz[r] = zz[e];
zz[e] = temp;
}
max = zz[0];
setcolor(14);
setlinestyle(0,0,3);
circle(60+(n1*(580/n)),240-(z[n1]*(220/max)),2);
setfillstyle(1,14);
floodfill(60+(n1*(580/n)),240-(z[n1]*(220/max)),14);
line(60+(n1*(580/n)),240,60+(n1*(580/n)),240-(z[n1]*(220/max)));
}
}

fase()
{
settextjustify(CENTER_TEXT,CENTER_TEXT);
settextstyle(TRIPLEX_FONT,HORIZ_DIR,2);
setcolor(2);
outtextxy(320,10,"FASE DE LA FUNCION");
for(n1=0;n1<=n-1;n1++)
{
if (a[n1]==0)
{
setcolor(14);
setlinestyle(0,0,3);
circle(60+(n1*(580/n)),20,2);
setfillstyle(1,14);
20
floodfill(60+(n1*(580/n)),20,14);
line(60+(n1*(580/n)),240,60+(n1*(580/n)),20);
}
else
{
y[n1]=b[n1]/a[n1];
z[n1]=(atan(y[n1])*180)/pi;
setcolor(14);
setlinestyle(0,0,3);
circle(60+(n1*(580/n)),240-(z[n1]*2.5),2);
setfillstyle(1,14);
floodfill(60+(n1*(580/n)),240-(z[n1]*2.5),14);
line(60+(n1*(580/n)),240,60+(n1*(580/n)),240-(z[n1]*2.5));
}
}
getche();
closegraph();
}

ejes2()
{
setcolor(15);
line(60,0,60,480);
line(60,240,640,240);
setlinestyle(0,0,3);
line(640,240,630,230);
line(640,240,630,250);
line(630,230,630,250);
line(60,0,70,10);
line(60,0,50,10);
line(50,10,70,10);
floodfill(59,5,WHITE);
floodfill(61,5,WHITE);
floodfill(635,239,WHITE);
floodfill(635,241,WHITE);
settextjustify(CENTER_TEXT,CENTER_TEXT);
settextstyle(TRIPLEX_FONT,HORIZ_DIR,1);
setcolor(10);
outtextxy(632,218,"n");
setcolor(15);
setlinestyle(0,0,0);
q=460;
while(q>=284)
{
line(55,q,65,q);
q=q-44;
21
}
q=196;
while(q>=20)
{
line(55,q,65,q);
q=q-44;
}
q=60;n1=0;
while(q<640)
{
line(q,235,q,245);
num = n1+1;
itoa(num,p,10);
q+=580/n;n1++;
settextstyle(DEFAULT_FONT,HORIZ_DIR,1);
outtextxy(q,257,p);
}
settextjustify(LEFT_TEXT,LEFT_TEXT);
settextstyle(DEFAULT_FONT,HORIZ_DIR,1);
outtextxy(23,464,"-90");
outtextxy(23,420,"-72");
outtextxy(23,376,"-54");
outtextxy(23,332,"-36");
outtextxy(23,288,"-18");
outtextxy(31,200,"18");
outtextxy(31,156,"36");
outtextxy(31,112,"54");
outtextxy(31,68,"72");
outtextxy(31,24,"90");
settextjustify(CENTER_TEXT,LEFT_TEXT);
outtextxy(320,479,"Presione Enter Para Continuar");
}

main()
{
clculos();
graficos();
settextjustify(CENTER_TEXT,CENTER_TEXT);
settextstyle(TRIPLEX_FONT,HORIZ_DIR,1);
setcolor(10);
outtextxy(35,5,"Re");
ejes();dibujo_real();ejes_num();
cleardevice();
settextjustify(CENTER_TEXT,CENTER_TEXT);
settextstyle(TRIPLEX_FONT,HORIZ_DIR,1);
setcolor(10);
22
outtextxy(35,5,"Im");
ejes();dibujo_imaginario();ejes_num();
cleardevice();
settextjustify(CENTER_TEXT,CENTER_TEXT);
settextstyle(TRIPLEX_FONT,HORIZ_DIR,1);
setcolor(10);
outtextxy(25,5,"X(n)");
setlinestyle(0,0,3);
line(5,0,5,15);
line(45,0,45,15);
setlinestyle(0,0,0);
ejes();absoluto();ejes_num();
cleardevice();
settextjustify(CENTER_TEXT,CENTER_TEXT);
settextstyle(TRIPLEX_FONT,HORIZ_DIR,1);
setcolor(10);
outtextxy(25,5,"0(w)");
ejes2();
fase();
}

23
EJEMPLO 1.2
Para ilustrar el funcionamiento de este programa tomaremos la secuencia
que calculamos en el ejemplo 1.1 creando un archivo llamado 8_m.dat.

24
25
26
27
28
1.4 TRANSFORMADA DISCRETA INVERSA DE FOURIER

La transformada discreta inversa de Fourier esta dada por:

N 1
g( kT ) = 1
N G( NT
n
)e j 2nk / N k = 0,1,........, N 1 (1 17)
n=0

Para probar que la Eq. (1-17) y la relacin de la transformada (1-16) forman una
transformada discreta de Fourier, sustituimos la Eq. (1-17) en la Eq. (1-16).

) = k=0 N1 r=0 G( NTr )e j 2rk / N e j 2nk / N


N 1 N 1
G( NT
n

G( NTr ) e
j 2 rk / N j 2 nk / N
N 1 N 1
= 1
e
N
r =0 k =0
= G( NTn
) (1 18)
La identidad (1-18) resulta de la relacin de ortogonalidad:

N 1 N si r = n
e
j 2 rk / N j 2 nk / N
e = (1 19)
k =0 0 en otro punto

La frmula de la transformada discreta inversa (1-17) expone la


periodicidad de la misma manera que la transformada discreta; el perodo es
definido por N muestras de g(kT). Esta propiedad resulta de la naturaleza
peridica de e j2nk /N . De aqu, g(kT) se define realmente como el conjunto completo
de enteros k = 0,1,2,.... y es limitada por la identidad:

g( kT ) = g[(rN + k )T ] r = 0,1,2,.... (120)


En resumen, la transformada discreta de Fourier esta dada por:

N 1 N 1
g( kT ) = 1
N G( NT
n
)e j 2nk / N G( NT
n
) = g( kT )e j 2nk / N (1 21)
n=0 k =0

Es importante recordar que el par (1-21) requiere que ambas funciones del
dominio de frecuencia y tiempo sean peridicas;

G( NT
n
)=G [ ( rN + n )
NT ] r = 0,1,2,..... (1 22)
g( kT ) = g[(rN + k )T ] r = 0,1,2,..... (1 23)

29
EJEMPLO 1.3
Encontrar la transformada discreta inversa de Fourier de la siguiente
secuencia:

30
N = 8, X (0) = 36, X (1) = 4 + 9.66 j , X (2) = 4 + 4 j ,
X (3) = 4 + 166
. j , X (4) = 4, X (5) = 4 166
. j,
X (6) = 4 4 j , X (7) = 4 9.66 j.
N 1
x( kT ) = 1
N X ( NT
n
)e j 2nk / N k = 0,1,.........., N 1
n=0

k=0
x (0) = 81 ([36 4 4 4 4 4 4 4] + j[9.66 + 4 + 166
. 166
.
4 9.66]) = 1
k =1
x (1) = 81 [36 + ( 4 + 9.66 j )e j / 4 + ( 4 + 4 j )e j / 2 +
. j )e j 3 / 4 4e j + ( 4 166
( 4 + 166 . j )e j 5 / 4 +
( 4 4 j )e j 6 / 4 + ( 4 9.66 j )e j 7 / 4 ] =
1
8 {36 + ( 4 + 9.66 j )( cos[45] + j sen[45]) +
( 4 + 4 j )( cos[90] + j sen[90]) + ( 4 + 166
. j )( cos[135] + j sen[135])
4( cos[180] + j sen[180]) + ( 4 166 . j )( cos[225] + j sen[225]) +
( 4 4 j )( cos[270] + j sen[270]) + ( 4 9.66 j )( cos[315] + j sen[315])} =
1
8 [(36 2.828427125 6.830651506 4 + 2.828427125
1173797257
. + 4 + 2.828427125 1173797257
. 4
2.828427125 6.830651506) + j ( 2.828427125 +
6.830651506 4 2.828427125 1173797257
. +
2.828427125 + 1173797257
. + 4 + 2.828427125
6.830651506)] = 2
k=2
x( 2) = 81 [36 + ( 4 + 9.66 j )e j / 2 + ( 4 + 4 j )e j + ( 4 + 166
. j )e j 3 / 2 4e j 2 +

(-4 - 166
. j )e j 5 / 2 + ( 4 4 j )e j 3 + ( 4 9.66 j )e j 7 / 2 ] =

8 {36 + ( 4 + 9.66 j )( cos[ 90] + j sen[ 90]) + ( 4 + 4 j )( cos[180] + j sen[180]) +


1

. j )( cos[270] + j sen[270]) 4( cos[360] + j sen[360]) +


(-4 + 166
. j )( cos[450] + j sen[450]) + ( 4 4 j )( cos[540] + j sen[540]) +
(-4 - 166
( 4 9.66 j )( cos[630] + j sen[630])} =
1
8 [(36 9.66 + 4 + 166
. 4 + 166
. + 4 9.66) + j ( 4 4 + 4 4 + 4 + 4)] = 3
k=3
x( 3) = 81 [36 + ( 4 + 9.66 j )e j 3 / 4 + ( 4 + 4 j )e j 3 / 2 + ( 4 + 166
. j )e j 9 / 4
4e j 3 + ( 4 166
. j )e j15 / 4 + ( 4 4 j )e j 9 / 2 + ( 4 9.66 j )e j 21 / 4 ] =
1
8 {36 + ( 4 + 9.66 j )( cos[135] + j sen[135]) + ( 4 + 4 j )( cos[270] + j sen[270]) +
. j )( cos[405] + j sen[405]) 4( cos[540] + j sen[540]) +
(-4 + 166
. j )( cos[675] + j sen[675]) + ( 4 4 j )( cos[810] + j sen[810]) +
( 4 166
(-4 - 9.66 j )( cos[945] + j sen[945])} =
1
8 [(36 + 2.828427125 6.830651506 + 4 2.828427125 1173797257
. +
4 2.828427125 1173797257
. + 4 + 2.828427125 6.830651506) +
j( 2.828427125 6.830651506 + 4 2.828427125 + 1173797257
. +
2.828427125 1173797257
. 4 + 2.828427125 + 6.830651506)] = 4
31
k=4
x (4) = 81 [36 + ( 4 + 9.66 j )e j + ( 4 + 4 j )e j 2 + ( 4 + 166
. j )e j 3 4e j 4 +

(-4 - 166
. j )6e j 5 + ( 4 4 j )e j 6 + ( 4 9.66 j )e j 7 ] =

8 {36 + ( 4 + 9.66 j )( cos[180] + j sen[180]) + ( 4 + 4 j )( cos[ 360] + j sen[ 360]) +


1

. j )( cos[540] + j sen[540]) 4( cos[720] + j sen[720]) +


(-4 + 166
. j )( cos[900] + j sen[900]) + ( 4 4 j )( cos[1080] + j sen[1080]) +
(-4 - 166
(-4 - 9.66 j )( cos[1260] + j sen[1260])} =
1
8 [(36 + 4 4 + 4 4 + 4 4 + 4) + j ( 9.66 + 4 166
. + 166
. 4 + 9.66)] = 5
k=5
x(5) = 81 [36 + ( 4 + 9.66 j )e j 5 / 4 + ( 4 + 4 j )e j 5 / 2 + ( 4 + 166
. j )e j15 / 4 4e j 5 +
(-4 - 166
. j )e j 25 / 4 + ( 4 4 j )e j15 / 2 + ( 4 9.66 j )e j 35 / 4 ] =

8 {36 + ( 4 + 9.66 j )( cos[ 225] + j sen[ 225]) + ( 4 + 4 j )( cos[ 450] + j sen[ 450]) +
1

. j )( cos[675] + j sen[675]) 4( cos[900] + j sen[900]) +


(-4 + 166
. j )( cos[1125] + j sen[1125]) + ( 4 4 j )( cos[1350] + j sen[1350]) +
(-4 - 166
(-4 - 9.66 j )( cos[1575] + j sen[1575])} =
1
8 [(36 + 2.828427125 + 6.830651506 4 2.828427125 + 1173797257
. +4
2.828427125 + 1173797257
. 4 + 2.828427125 + 6.830651506) +
j (2.828427125 6.830651506 4 + 2.828427125 + 1173797257
.
2.828427125 1173797257
. + 4 2.828427125 + 6.830651506)] = 6
k=6
x( 6) = 81 [36 + ( 4 + 9.66 j )e j 3 / 2 + ( 4 + 4 j )e j 3 + ( 4 + 166
. j )e j 9 / 2
4e j 6 + ( 4 166
. j )e j15 / 2 + ( 4 4 j )e j 9 + ( 4 9.66 j )e j 21 / 2 ] =
1
8 {36 + ( 4 + 9.66 j )( cos[270] + j sen[270]) + ( 4 + 4 j )( cos[540] + j sen[540]) +
. j )( cos[810] + j sen[810]) 4( cos[1080] + j sen[1080]) +
(-4 + 166
. j )( cos[1350] + j sen[1350]) + ( 4 4 j )( cos[1620] + j sen[1620]) +
(-4 - 166
(-4 - 9.66 j )( cos[1890] + j sen[1890])} =
1
8 [(36 + 9.66 + 4 166
. 4 166
. + 4 + 9.66) + j (4 4 4 + 4 + 4 4)] = 7
k =7
x( 7) = 81 [36 + ( 4 + 9.66 j )e j 7 / 4 + ( 4 + 4 j )e j 7 / 2 + ( 4 + 166
. j )e j 21 / 4
4e j 7 + ( 4 166
. j )e j 35 / 4 + ( 4 4 j )e j 21 / 2 + ( 4 9.66 j )e j 49 / 4 ] =
1
8 {36 + ( 4 + 9.66 j )( cos[315] + j sen[315]) + ( 4 + 4 j )( cos[630] + j sen[630]) +
. j )( cos[945] + j sen[945]) 4( cos[1260] + j sen[1260]) +
(-4 + 166
. j )( cos[1575] + j sen[1575]) + ( 4 4 j )( cos[1890] + j sen[1890]) +
(-4 - 166
(-4 - 9.66 j )( cos[2205] + j sen[2205])} =
1
8 [(36 2.828427125 + 6.830651506 + 4 + 2.828427125 + 1173797257
. +
4 + 2.828427125 + 1173797257
. + 4 2.828427125 + 6.830651506) +
j (2.828427125 + 6.830651506 + 4 + 2.828427125 1173797257
.
2.828427125+1173797257
. 4 2.828427125 6.830651506)]= 8
32
1.5 PROGRAMA PARA REALIZAR LA
TRANSFORMADA DISCRETA INVERSA DE
FOURIER
DESCRIPCIN
Este programa fue elaborado en Turbo C Ver. 2.0 con el propsito de
auxiliar al estudiante de procesamiento digital de seales en el aprendizaje de
dicho tema; el programa trabaja de la siguiente manera:

Pide al usuario un archivo de datos (el cual puede ser elaborado en el editor
de MS-DOS).
Despliega los datos contenidos en el archivo de datos.
Despliega los resultados obtenidos.
Despliega la grfica de los valores obtenidos.

Para realizar este programa se necesita tener Turbo C Ver. 2.0 y un


monitor VGA color.
NOTA. Si empleamos una versin de C++ el programa podra marcar errores o
advertencias al compilarlo.
Para el modo grfico el programa esta diseado para trabajar con la
resolucin de 640x480 pixeles y desplegar las grficas en color; si
empleamos un monitor SVGA o un UVGA no tendremos problema alguno
siempre y cuando el monitor sea de color; si el monitor es monocromtico
como el programa tiene instrucciones de color lo que suceder es que
nuestra pantalla al desplegar la grfica se pondr toda gris o negra.
Si se desea modificar el programa de tal manera que no ocurra esto es
necesario modificar las instrucciones de setcolor, de floodfillstyle y las de
floodfill. Tambin se puede modificar el programa para que se pueda usar
otro tipo de monitor (CGA u otro); pero hay que tener cuidado ya que si
dejamos as las coordenadas la grfica saldr incompleta o corrida.

33
DIAGRAMA DE FLUJO

34
P ROGRAMA F UENTE
/*PROGRAMA QUE REALIZA LA TRANSFORMADA DISCRETA DE
FOURIER INVERSA*/
#include <graphics.h>
#include <conio.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#define N 1000
#define pi 3.141592654

int gd,gm;
float c[N],s[N],a[N],b[N],yy,n1,k,w,q,n,num,max,e,r,temp;
double re[N],im[N],y[N];
FILE *fp;
char nombre[9],p[10];

graficos()
{
gd=VGA;
gm=VGAHI;
initgraph(&gd,&gm,"");
}

clculos()
{
clrscr();
gotoxy(22,11);printf("DAME EL NOMBRE DEL ARCHIVO DE DATOS.");
gotoxy(32,13);printf("Nombre = ");scanf("%s",nombre);
if((fp = fopen(nombre,"rt"))==NULL)
{
puts("\n\t\t\t NO SE PUEDE ABRIR EL ARCHIVO");
exit(1);
}
gotoxy(25,25);printf("<Presione Enter Para Continuar>");getche();
n=0;
while(!feof(fp))
{
fscanf(fp,"%lf",&re[n]);
fscanf(fp,"%lf",&im[n]);
n++;
}
fclose(fp);
clrscr();
gotoxy(22,1);printf("VALORES DE LAS MUESTRAS INTRODUCIDAS");
35
for(n1=0;n1<=n-1;n1++)
{
gotoxy(22,n1+3);printf("h(Re)[%.0f] = %.2lf",n1,re[n1]);
gotoxy(44,n1+3);printf("h(Im)[%.0f] = %.2lf",n1,im[n1]);
}
gotoxy(25,25);printf("<Presione Enter Para Continuar>");getche();
w=(2*pi)/n;
yy=1/n;
clrscr();
gotoxy(30,1);printf("RESULTADOS OBTENIDOS");
for(k=0;k<n;k++)
{
for(n1=0;n1<=n-1;n1++)
{
c[n1]=(re[n1]*cos(w*n1*k))-(im[n1]*sin(w*n1*k));
s[n1]=(re[n1]*sin(w*n1*k))+(im[n1]*cos(w*n1*k));
a[k]=a[k]+c[n1];
b[k]=b[k]+s[n1];
}
gotoxy(36,k+3);printf("x[%.0f] = %.0f",k,yy*a[k]);
}
gotoxy(25,25);printf("<Presione Enter Para Continuar>");getche();
}

ejes()
{
setcolor(15);
line(60,0,60,480);
line(60,240,640,240);
setlinestyle(0,0,3);
line(640,240,630,230);
line(640,240,630,250);
line(630,230,630,250);
line(60,0,70,10);
line(60,0,50,10);
line(50,10,70,10);
floodfill(59,5,WHITE);
floodfill(61,5,WHITE);
floodfill(635,239,WHITE);
floodfill(635,241,WHITE);
settextjustify(CENTER_TEXT,CENTER_TEXT);
settextstyle(TRIPLEX_FONT,HORIZ_DIR,1);
setcolor(10);
outtextxy(25,5,"h(kt)");
outtextxy(632,218,"n");
q=60;setcolor(15);
36
setlinestyle(0,0,0);
settextjustify(CENTER_TEXT,LEFT_TEXT);
settextstyle(DEFAULT_FONT,HORIZ_DIR,1);
outtextxy(320,479,"Presione Enter Para Continuar");
q=20;
while(q<=196)
{
line(55,q,65,q);
q+=44;
}
q=284;
while(q<=640)
{
line(55,q,65,q);
q+=44;
}
q=60;n1=0;
while(q<640)
{
line(q,235,q,245);
num = n1+1;
itoa(num,p,10);
q+=580/n;n1++;
outtextxy(q,257,p);
}
}

ejes_num()
{
itoa(max,p,10);
settextstyle(DEFAULT_FONT,HORIZ_DIR,1);
setcolor(15);
outtextxy(40,20,p);
itoa(-max,p,10);
setcolor(15);
outtextxy(35,460,p);
getche();
closegraph();
}

real()
{
settextjustify(CENTER_TEXT,CENTER_TEXT);
settextstyle(TRIPLEX_FONT,HORIZ_DIR,3);
setcolor(2);
outtextxy(320,10,"VALORES OBTENIDOS DE LA TDIF");
37
for(n1=0;n1<=n-1;n1++)
{
b[n1] = a[n1];
}
for(r=0;r<=n-1;r++)
for(e=r+1;e<=n+1;e++)
if (b[r]<b[e])
{
temp = b[r];
b[r] = b[e];
b[e] = temp;
}
max = (yy*b[0]);
for(n1=0;n1<=n-1;n1++)
{
setcolor(14);
setlinestyle(0,0,3);
circle(60+(n1*(580/n)),240-(yy*a[n1]*(220/max)),2);
setfillstyle(1,14);
floodfill(60+(n1*(580/n)),240-(yy*a[n1]*(220/max)),14);
line(60+(n1*(580/n)),240,60+(n1*(580/n)),240-(yy*a[n1]*(220/max)));
}
}

main()
{
clculos();
graficos();
ejes();
real();
ejes_num();
}

38
EJEMPLO 1.4
Para ilustrar el funcionamiento de este programa tomaremos la secuencia
que calculamos en el ejemplo 1.3 creando un archivo llamado 8_m_ti.dat.

39
40
CAPTULO 2
LA TRANSFORMADA RPIDA DE FOURIER

Durante una reunin de la Presidencia del Comit Consultivo Cientfico,


Richard L. Garwin noto que John W. Tukey escriba transformadas de Fourier.
Garwin, quien en su propia investigacin tuvo la necesidad desesperada de
mtodos rpidos para calcular la transformada de Fourier, le pregunto a Tukey
acerca de las tcnicas que conoca para calcular la transformada de Fourier.
Tukey le planteo a Garwin esencialmente lo que condujo al famoso algoritmo
Cooley-Tukey.
Garwin fue al centro de computo de IBM Investigacin en Altos Yorktown
para tener tcnicas de programacin. James W. Cooley era un miembro
relativamente nuevo del personal en IBM Investigacin y para su admisin se
le dio el problema para que lo resolviera ya que l era el nico que no tenia nada
importante que hacer. Con la insistencia de Garwin, Cooley rpidamente logro un
programa de computadora y Garwin regreso a su trabajo con la expectativa que
tenia de este proyecto y con el propsito de olvidarse de el. Sin embargo, las
copias pedidas del programa y una descripcin comenzaron ha acumularse, y
Cooley se tuvo que poner a escribir en un papel sobre el algoritmo. En 1965
Cooley y Tukey publicaron el ahora famoso "Un Algoritmo para el Clculo en
Computadora de las Series Complejas de Fourier" en los Clculos Matemticos.
Sin la tenacidad de Garwin, es posible que la transformada rpida de
Fourier todava fuera relativamente desconocida hoy. El trmino es relativamente
usado porque despus Cooley y Tukey publicaron sus hallazgos, reportes de otra
gente que usaban tcnicas similares comenzaron a ser conocidos. P. Rudnick del
Instituto Oceanogrfico en La Jolla, California inform que l usaba una tcnica
similar y que l haba publicado su idea en 1942 por Danielson y Lanczos. Esta
publicacin es tomado como referencia por Runge y como fuente de sus mtodos.
Estas dos publicaciones, junto con las notas de conferencia de Runge y Knig,
describen esencialmente las ventajas computacionales del algoritmo de la FFT
como lo conocemos hoy.
L. H. Thomas de IBM Watson Laboratorios tambin usaba una tcnica muy
parecida a la publicada por Cooley y Tukey. El implic que simplemente tenia que
ir a la biblioteca y buscar un mtodo para hacer clculos de series de Fourier, un
libro por Stumpff. Thomas generaliz los conceptos presentados por Stumpff y
derivo una tcnica similar a la que conocemos ahora como la transformada rpida
de Fourier.
Otra lnea de desarrollo tambin condujo al algoritmo equivalente de
Thomas. En 1937, Yates desarroll un algoritmo para calcular la interaccin de 2n
experimentos factoriales.
41
2.1 FORMULACIN DE LA MATRIZ
Considerando la transformada discreta de Fourier (1-16):

N 1
X ( n) = x0 ( k )e j 2nk / N n = 0,1,....., N 1 (2 1)
k =0

Donde remplazamos kT por k y n/NT por n por conveniencia de notacin.


Notamos que la Eq. (2-1) describe el clculo computacional de N ecuaciones. Por
ejemplo, si N = 4 y si dejamos:

W = e j 2 / N (2 2)
Entonces la Eq. (2-1) puede escribirse como:

X ( 0) = x ( 0)W 0 + x (1)W 0 + x ( 2)W 0 + x ( 3)W 0


0 0 0 0
X (1) = x0 ( 0)W 0 + x0 (1)W 1 + x0 ( 2)W 2 + x0 ( 3)W 3

X ( 2) = x0 ( 0)W 0 + x0 (1)W 2 + x0 ( 2)W 4 + x0 ( 3)W 6

X ( 3) = x ( 0)W 0 + x (1)W 3 + x ( 2)W 6 + x ( 3)W 9 (2 3)


0 0 0 0

Las ecuaciones (2-3) pueden ser fcilmente representadas en forma matricial:

X (0) W 0 W 0 W 0 W 0 x0 (0)

X (1) W 0 W 1 W 2 W 3 x0 (1)
X ( 2) = 0 ( 2 4)
W W 2 W 4 W 6 x0 (2)
X (3) W 0 W 3 W 6 W 9 x (3)
0

O ms compactamente como:

X ( n ) = W nk x0 ( k ) (2 5)
Examinando la Eq. (2-4) revela que W y x0 (k ) posiblemente son complejos,
entonces N2 multiplicaciones complejas y (N)(N-1) sumas complejas, son
necesarias para el clculo de la matriz requerida. El xito del algoritmo de la FFT
radica en el hecho de que reduce el nmero de multiplicaciones y sumas
necesarias para el clculo de (2-4).

42
2.2 DESARROLLO INTUITIVO
Para ilustrar el algoritmo de la FFT, es conveniente escoger el nmero de
puntos de muestreo de x0 (k ) , de acuerdo a la relacin N = 2 , donde es un
entero. Desarrollos posteriores han hecho a un lado esta restriccin. Retomando
la Eq. (2-4) resultada de escoger N = 4 = 2 = 22 ; por lo tanto, podemos aplicar la
FFT para el clculo de la Eq. (2-4).
El primer paso para el desarrollo del algoritmo de la FFT para este ejemplo
es escribir la Eq. (2-4) como:

X (0) 1 1 1 1 x0 (0)

( )
1 W 2 W 3 x (1)
0
X 1 1 W
= (2 6)
X (2) 1 W 2 W 0 W x0 (2)
2

3 W 2 W1
X (3) 1 W x0 (3)

La matriz de la Eq. (2-6) es derivada de la Eq. (2-4) para usar la relacin


W nk = W nk mod(N) . En la que [nk mod(N)] es el residuo de la divisin de nk por N; si
N = 4, n = 2, y k = 3 entonces:

W6 = W2 (2 7)
Ya que:

j 2
W nk = W 6 = exp ( 6) = exp[ j 3 ]
4
j 2 nk mod ( N )
= exp[ j ] = exp ( 2) = W 2 = W (2 8)
4

El segundo paso en el desarrollo es factorizar la matriz cuadrada (2-6) como


sigue:

X (0) 1 W 0 0 0 1 0 W 0 0 x0 (0)

X (2) 1 W 1 0 W 0 x0 (1)
2
0 0 0
X (1) = 0 0 ( 2 9)
1 W 1 1 0 W 2 0 x0 ( 2 )

X (3) 0 0 1 W 3 0 1 0 W 2 x0 (3)

El mtodo de factorizacin esta basado en la teora del algoritmo de la FFT, el


cual muestra que la multiplicacin de las dos matrices cuadradas (2-9) da como
43
resultado la matriz cuadrada de la Eq. (2-6) con excepcin de que las filas 1 y 2
han sido intercambiadas (las filas estn numeradas 0, 1, 2, y 3). Note que el
intercambio ha sido tomado en cuenta en la Eq. (2-9) para reescribir el vector
columna X(n); permitiendo el intercambio de filas en el vector que ser denotado
por:

X (0)

X ( 2)
X ( n) = (2 10)
X 1
( )
X (3)

Esta factorizacin es la llave para la eficiencia del algoritmo de la FFT.


Habiendo aceptado el hecho de que la Eq. (2-9) es correcta, aunque los
resultados estn desacomodados, debemos examinar el nmero de
multiplicaciones requeridas para el clculo de la ecuacin. Primero ponemos:

x1(0)
0 0( )
x 0
1 0 W0

x1(1) 0 1 0 W 0 x0 (1)
= (2 11)
x ( 2
1 1) 0 W2 0 x0 (2)
x (3) 0 1 0 W 2 x0 (3)
1

Esto es, el vector columna x1(k) es igual al producto de las dos matrices a la
derecha de la Eq. (2-9).
El elemento x1(0) es calculado por una multiplicacin compleja y una suma
compleja (W 0 no esta reducido a la unidad para desarrollar un resultado
generalizado).

x1 (0) = x0 (0) + W 0 x0 (2) (2 12)


El elemento x1(1) tambin esta determinado por una multiplicacin
compleja y una suma compleja. Solo una suma compleja es requerida para
calcular x1(2). Esto se debe al hecho de que W 0 = W 2 ; de aqu:

x ( 2) = x ( 0) + W 2 x ( 2)
1 0 0
= x ( 0) W 0 x ( 2) (2 13)
0 0

Donde la multiplicacin compleja W 0 x 0 ( 2) ya ha sido calculada en la


determinacin de x1(0) (Eq. 2-12). Por el mismo razonamiento, x1(3) es calculado

44
por solo una suma compleja y sin multiplicaciones. El vector intermedio x1(k) es
determinado entonces por 4 sumas complejas y 2 multiplicaciones complejas.
Completando el clculo de la Eq. (2-9):

X (0) x2 (0) 1 W 0 0 0 1( )
x 0

X (2) x2 (1) 1 W 2 0 x1(1)
X (1) = x (2) =
0
(2 14)
2 0 0 1 W 1 x1(2)
X (3) x (3) 0 0 1 W 3 x1(3)
2

El trmino x2(0) esta determinado por una multiplicacin compleja y una suma
compleja:

x2 ( 0) = x1 ( 0) + W 0 x1 (1) ( 2 15)

El elemento x2(1) es calculado por una suma debido a que W 0 = W 2 . Por


razones similares, x2(2) esta determinado por una multiplicacin compleja y una
suma compleja, y x2(3) por una sola suma.
El computo de X(n) por definicin de la Eq. (2-9) requiere un total de 4
multiplicaciones complejas y 8 sumas complejas. El clculo de X(n) por la
Eq. (2 - 4) necesita de 16 multiplicaciones complejas y 12 sumas complejas. Note
que el proceso de factorizacin de la matriz introduce ceros dentro de los factores
de las matrices y, como resultado, reduce el nmero de multiplicaciones
requeridas. Para este ejemplo, el proceso de factorizacin reduce el nmero de
multiplicaciones en un factor de dos. El tiempo de clculo computacional esta
gobernado por el nmero de multiplicaciones requeridas.
Para N = 2 el algoritmo de la FFT es entonces simplemente un
procedimiento para factorizar una matriz N x N en matrices tales que cada uno
de los factores de las matrices tengan la propiedad especial de minimizar el
nmero de sumas complejas y multiplicaciones complejas. Si extendemos los
resultados del ejemplo anterior, notaremos que la FFT necesita N / 2 = 4
multiplicaciones complejas y N = 8 sumas complejas, mientras que el mtodo
directo [Eq. (2-4)] requiere N2 multiplicaciones complejas y N(N-1) sumas
complejas. Si asumimos que el tiempo de computo es proporcional al nmero de
multiplicaciones, entonces la taza aproximada del mtodo directo de la FFT en
tiempo de computo esta dada por:

N2
N / 2 = 2N
(2 16)

En el cual para N = 1024 = 210 es una reduccin del tiempo de computo de ms


de 200 a 1. La Fig. 2-1 ilustra la relacin entre el nmero de multiplicaciones

45
requeridas usando el algoritmo de la FFT comparado con el nmero de
multiplicaciones usando el mtodo directo.

El procedimiento de factorizacin de la matriz introduce una discrepancia.


Retomando que el clculo de la Eq. (2-9) produce X(n) en vez de X(n); esto es:

X (0) X (0)

X ( 2) X (1)
X ( n) = en vez de X (n) = (2 17)
X (1) X 2
( )
X (3) X (3)

Esta reestructuracin es inherente en el proceso de factorizacin de la matriz y es


un problema menor porque es fcil generalizar una tcnica para reacomodar X(n)
y obtener X(n).
Reescribiendo X(n) remplazando el argumento n con sus equivalentes
binarios:

46
X (0) X (00)

X ( 2) X (10)
X (1) obtenemos X (01) (2 18)

X (3) X (11)

Observe que si los argumentos binarios de la Eq. (2-18) son remplazados o


invertidos entonces:

X (00) X (00)

X (10) X (01)
X ( n) = remplazado a X (10) = X ( n) (2 19)
X (01)

X (11) X (11)

Con esto es fcil desarrollar un resultado generalizado para un reacomodamiento


de la FFT.
Para N mayor de 4, es difcil describir el proceso de factorizacin de la
matriz anlogo a la ecuacin (2-9). Por esta razn nosotros interpretamos la
Eq. (2 - 9) en forma grfica. Usando esta formulacin grfica nosotros podemos
describir suficientes generalidades para desarrollar un diagrama de flujo para un
programa de computadora.

47
2.3 DIAGRAMAS DE MARIPOSA
Nosotros convertimos la Eq. (2-9) en un diagrama de mariposa ilustrado en
la Fig. 2-2. Como se muestra, nosotros representamos el vector de datos o arreglo
x 0 (k) por una columna vertical de nodos a la izquierda del diagrama de mariposa.
El segundo arreglo vertical de nodos es el vector x1 (k ) calculado en la Eq. (2-11),
y el siguiente arreglo vertical corresponde al vector x 2 (k ) = X(n) , Eq. (2-14). En
general, existirn arreglos computacionales donde N = 2 .

El diagrama de mariposa es interpretado como sigue. Cada nodo es


introducido por dos lneas slidas que representan trayectorias de transmisin
desde nodos previos. Una trayectoria transmite o conduce una cantidad desde un
nodo en un arreglo, multiplica la cantidad por W p , y los resultados entran en el
nodo del siguiente arreglo. El factor W p aparece cerca de la punta de flecha de la
trayectoria de transmisin; la ausencia de este factor implica que W p = 1 . Los
resultados entrantes en un nodo desde las dos trayectorias de transmisin son
adicionalmente combinados.
Para ilustrar la interpretacin del diagrama de mariposa, considere el nodo
x1(2) en la Fig. 2-2. Segn las reglas para interpretar el diagrama de mariposa,

x1 ( 2 ) = x0 ( 0) + W 2 x0 ( 2 ) ( 2 20)
que es simplemente la Eq. (2-13). Cada nodo del diagrama de mariposa se
expresa similarmente.
El diagrama de mariposa es entonces un mtodo conciso para representar
los clculos requeridos en la matriz factorizada del algoritmo de la FFT (2-9). Cada
columna calculada del diagrama corresponde a una matriz factorizada; arreglos
verticales de N puntos cada (N = 2 ) son requeridos. La utilizacin de esta

48
representacin grfica nos permite describir fcilmente el proceso de factorizacin
de la matriz para una N grande.
Nosotros mostramos en la Fig. 2-3 el diagrama de mariposa para N = 16.
Con un diagrama de mariposa de este tamao, es posible desarrollar propiedades
generales en lo que concierne al proceso de factorizacin de la matriz y as
proveer de una estructura para desarrollar un diagrama de flujo del programa de
computadora de la FFT.

2.4 NODOS DUALES


La inspeccin de la Fig. 2-3 revela que en cada arreglo nosotros podemos
encontrar siempre dos nodos cuyas trayectorias de transmisin de entrada surjan
del mismo par de nodos en el arreglo previo. Por ejemplo, nodos x1(0) y x1(8) son
calculados en trminos de los nodos x0(0) y x0(8). Note que los nodos x0(0) y
x0(8) no entran en el clculo de ningn otro nodo. Nosotros definimos dos nodos
tales como un par de nodos duales.
El clculo de un par de nodos duales es independiente de otros nodos, es
posible desempear en lugar de calcular. Para ilustrarlo, note que desde la
Fig. 2 - 3 nosotros podemos calcular simultneamente x1(0) y x1(8) en trminos
de x0(0) y x0(8) y regresar los resultados a las ubicaciones de almacenaje
anteriormente ocupadas por x0(0) y x0(8). Los requerimientos de almacenaje se
limitan slo entonces a el arreglo de datos x0(k). Como cada arreglo es calculado,
los resultados son regresados a este arreglo.

49
ESPACIAMIENTO ENTRE NODOS DUALES
Nosotros ahora vamos a estudiar el espaciamiento (medido
verticalmente en trminos del ndice k) entre un par de nodos duales. La discusin
siguiente se refiere a la Fig. 2-3. Primero, en el arreglo l = 1, un par de nodos
duales, x1(0); x1(8), estn separados por k = 8 = N / 2l = N / 21 . En el arreglo l = 2,
un par de nodos duales, x2(8); x2(12), estn separados por k = 4 = N / 2l = N / 22
. Similarmente, un par de nodos duales, x3(4); x3(6), en el arreglo l = 3 estn
separados por k = 2 = N / 2l = N / 23 , y en el arreglo l = 4, un par de nodos duales,
x4(8); x4(9), estn separados por k = 1 = N / 2l = N / 24 .
Generalizando estos resultados, nosotros observamos que el
espaciamiento entre nodos en el arreglo l esta dado por N / 2l . As, si nosotros
(
consideramos un nodo en particular xl (k ) , entonces su nodo dual es xl k + N / 2l . )
Esta propiedad nos permite fcilmente identificar un par de nodos duales.

50
.

51
CLCULO DE NODOS DUALES
El clculo de un par de nodos duales requiere slo de una multiplicacin
compleja. Para aclarar este punto, considere el nodo x 2(8) y su dual x2(12),
ilustrados en la Fig. 2-3. Las trayectorias de transmisin surgen desde el nodo
x1(12) son multiplicadas por W 4 y W 12 con anterioridad a la entrada de los nodos
x2(8) y x2(12), respectivamente. Esto es importante para notar que W 4 = W 12 y
que solo se requiere de una multiplicacin desde que los mismos datos x 1(12) se
multiplican por estos trminos. En general, si el factor de peso en un nodo es W p
, entonces el factor de peso de su nodo dual es W p+N/2 . Porque W p = - W p+N/2 ,
solo se requiere de una multiplicacin en el clculo de un par de nodos duales. El
clculo de cualquier par de nodos duales esta dado por el par de ecuaciones:

( )
xl ( k ) = xl 1 ( k ) + W p xl 1 k + N / 2 l

( )
xl k + N / 2 l = xl 1 ( k ) W p xl 1 (k + N / 2 )l
(2 21)
En el clculo de un arreglo, normalmente comenzamos con el nodo k = 0 y
secuencialmente trabajamos bajo el arreglo, calculando el par de ecuaciones
(2 - 21) . Como se estableci anteriormente, cualquier nodo dual en el l th arreglo
esta siempre abajo de N / 2l en el arreglo. El espaciamiento es N / 2l , entonces
siguiendo esto debemos de saltar cada N / 2l nodo. Para ilustrar este punto,
consideremos el arreglo l = 2 en la Fig. 2-4. Si comenzamos con el nodo k = 0,
entonces, el nodo dual se ubicar en k = N / 22 = 4 lo cual puede ser verificado por
la inspeccin de Fig. 2-4. Procediendo bajo este arreglo, notamos que el nodo
dual se ubicar siempre abajo de 4 en el arreglo hasta que lleguemos a 4 nodos.
En este punto nosotros hemos colocado una entrada de nodos anteriormente
encontrados; esto es, estos nodos son los duales para los nodos k = 0, 1, 2, y 3.
Es necesario saltar de nuevo los nodos k = 4, 5, 6, y 7. Los nodos 8, 9, 10, y 11
siguen la convencin original de los nodos duales siendo localizados 4 abajo en
el arreglo. En general, si trabajamos desde la cima bajo el arreglo l, entonces
calcularemos la ecuacin (2-21) para los primeros N / 2l nodos, saltar al siguiente
N / 2l , etc. Sabemos que hay que detener los saltos cuando alcancemos un ndice
de nodo mayor de N-1.

52
2.5 DETERMINACIN DE WP
Basados en el procedimiento anterior, nosotros hemos definido las
propiedades de cada arreglo con excepcin del valor de p en la Eq. (2-21). El valor
de p se determina de la siguiente manera:

1. Escribiendo el ndice k en forma binaria con bits.


2. Escalando o recorriendo este nmero binario -l bits a la derecha y llenando
en la nueva posicin abierta de bit a la izquierda con ceros.
3. Invirtiendo el orden de los bits. Esta inversin de bits es el trmino p.

Para ilustrar este procedimiento, nos referiremos a la Fig. 2-4 y


consideraremos el nodo x3(8).
Ya que = 4, k = 8, y l = 3, entonces k en binario es 1000. Si recorremos este
nmero -l = 4-3 = 1 lugares a la derecha y llenamos con ceros; el resultado es
0100.
Entonces si invertimos el orden de los bits obtendremos 0010 o el entero 2. El
valor de p es entonces 2.
Si consideramos un procedimiento para implementar esta operacin de
inversin de bits. Sabemos que un nmero binario, tiene a 4 a 3 a 2 a1 y puede ser
escrito en base 10 como a4 23 + a3 22 + a2 21 + a1 20 . El nmero de inversin
de bit que tratamos de describir esta dado por a1 23 + a2 22 + a3 21 + a4 20 . Si
describimos una tcnica para determinar los bits binarios a 4, a3, a2, y a1,
entonces definiremos una operacin de inversin de bits.
Ahora asumimos que M es un nmero binario igual a a 4 a 3 a 2 a1 . Dividimos
M por 2, truncamos, y multiplicamos el resultado truncado por 2. Entonces
[ ]
calculamos a4 a3 a2a1 2(a4 a3 a2 ) . Si el bit a1 es 0, entonces esta diferencia ser
de cero porque la divisin por 2, el truncamiento, y la subsecuente multiplicacin
por 2 no altera M. Sin embargo, si el bit a1 es 1, el truncamiento cambiara el valor
de M y la anterior expresin de diferencia no ser cero. Observamos que con esta
tcnica podemos determinar si el bit a1 es 0 o 1.
Podemos identificar el bit a2 de una manera similar. La expresin de
[ ]
diferencia apropiada es a4 a3 a2 2( a4 a3 ) . Si esta diferencia es cero, entonces
a2 es cero.
Los bits a3 y a4 son determinados similarmente.

53
54
2.6 REORDENACIN DE DATOS DE LA FFT
El paso final en el clculo de la FFT es acomodar los resultados anlogos
a la Eq. (2-19). Retomando el procedimiento para ordenar el vector X(n) para
escribir n en binario e invertirlo o desplazarlo. Mostramos en la Fig. 2-5 los
resultados de esta operacin de inversin de bits; que son los trminos x 4(k) y
x4(i) que han sido simplemente intercambiados donde i es el entero obtenido por
la inversin de bits del entero k.
Notamos que una situacin similar existe para el concepto de nodo dual
cuando reacomodamos la salida del arreglo. Si procedemos en el arreglo,
intercambiando x(k) con su apropiada x(i), eventualmente encontraremos un nodo
que ha sido intercambiado previamente. Por ejemplo, en la Fig. 2-5, el nodo k = 0
permanece en su lugar, los nodos k =1, 2 y 3 son intercambiados con los nodos
8, 4, y 12, respectivamente. El siguiente nodo a considerar es el nodo 4, pero este
es un nodo que previamente ha sido intercambiado con el nodo 2. Para eliminar
la posibilidad de considerar un nodo previamente intercambiado, simplemente
verificamos si i (el entero obtenido por la inversin de bits de k) es menor que k.
Si es as, implica que el nodo fue intercambiado en una operacin previa.
Con esta prueba podemos garantizar un procedimiento correcto de ordenacin.

55
56
EJEMPLO 2.1
Encontrar la transformada rpida de Fourier de la siguiente secuencia:

x0 [0] = 1, x0 [1] = 2, x0 [2] = 3, x0 [3] = 4,


x0 [4] = 5, x0 [5] = 6, x0 [6] = 7, x0 [7] = 8
N = 8 = 2 = 3
N
Numero de Saltos = l
2
l = Numero de arreglos = = Numero de bits.

57
Para resolver la FFT es necesario incrementar k hasta que:

N
k+ l
= N 1
2
Para resolver este ejemplo se utilizar un contador llamado k1 el cual
iniciar con cero y se reinicializar, cada que adquiera el valor del nmero de
saltos; esto es con el fin de provocar el salto y de modificar el valor de k, ya que
el valor de k cambiar con cada salto a:

N
k = k anterior + l
2
p
(
x l ( k ) = x l 1 ( k ) + W x l 1 k + 2Nl )

Formulas Empleadas
( ) (
x l k + 2Nl = x l 1 ( k ) W x l 1 k + 2Nl
p
)

58
l=1
N 8 8
Numero de Saltos = l
= 1
= =4
2 2 2

k = 0, k1 = 0
x1 (0) = x0 (0) + W p x0 (4)
x1 (4) = x0 (0) W p x0 (4)
k = 1, k1 = 1
x1 (1) = x0 (1) + W p x0 (5)
x1 (5) = x0 (1) W p x0 (5)
k = 2, k1 = 2
x1 (2) = x0 (2) + W p x0 (6)
x1 (6) = x0 (2) W p x0 (6)
k = 3, k1 = 3
x1 (3) = x0 (3) + W p x0 (7)
x1 (7) = x0 (3) W p x0 (7)

l=2
N 8 8
Numero de Saltos = l
= 2
= =2
2 2 4

k = 0, k1 = 0
x2 (0) = x1 (0) + W p x1 (2)
x2 (2) = x1 (0) W p x1 (2)
k = 1, k1 = 1
x2 (1) = x1 (1) + W p x1 (3)
x2 (3) = x1 (1) W p x1 (3)

59
}
k = 2, k 1 = 2 Como k 1 = Nmero de saltos se reinicializa, y k adquiere el valor de:

N
k = k anterior + l
= 2+2 = 4
2
k = 4, k1 = 0
x2 (4) = x1 (4) + W p x1 (6)
x2 (6) = x1 (4) W p x1 (6)
k = 5, k1 = 1
x2 (5) = x1 (5) + W p x1 (7)
x2 (7) = x1 (5) W p x1 (7)

l=3
N 8 8
Numero de Saltos = l
= 3
= =1
2 2 8

k = 0, k1 = 0
x3 ( 0) = x2 ( 0) + W p x2 (1)
x3 (1) = x2 ( 0) W p x2 (1)

}
k = 1, k 1 = 1 Como k 1 = Nmero de saltos se reinicializa, y k adquiere el valor de:

N
k = k anterior + l
= 1+ 1 = 2
2
k = 2 , k1 = 0
x3 ( 2) = x2 ( 2) + W p x2 ( 3)
x3 ( 3) = x2 ( 2) W p x2 ( 3)

}
k = 3, k 1 =1 Como k 1 = Nmero de saltos se reinicializa, y k adquiere el valor de:

60
N
k = k anterior + l
= 3+1= 4
2
k = 4 , k1 = 0
x3 ( 4) = x2 ( 4) + W p x2 (5)
x3 (5) = x2 ( 4) W p x2 (5)

}
k = 5, k 1 = 1 Como k 1 = Nmero de saltos se reinicializa, y k adquiere el valor de:

N
k = k anterior + l
= 5+1= 6
2
k = 6, k1 = 0
x3 ( 6) = x2 ( 6) + W p x2 ( 7)
x3 ( 7) = x2 ( 6) W p x2 ( 7)

61
DETERMINACIN DE WP

l=1
j 2 / N
W =e , = 3
1. k = 0 en bits k = 000
2. Recorriendo - l = 3-1 = 2 bits k = - - 0
y llenando con ceros k = 000
3.Si invertimos el orden de los bits k = 000
y convertimos este valor a decimal
obtendremos el valor de p = 0
=1
0
W
x1 ( 0) = x0 ( 0) + W x0 ( 4) = 1 + 5W = 1 + 5W = 6
p p 0

x1 ( 4) = x0 ( 0) W x0 ( 4) = 1 5W = 1 5W = 4
p p 0

1. k = 1 en bits k = 001
2. Recorriendo - l = 3-1 = 2 bits k = - - 0
y llenando con ceros k = 000
3.Si invertimos el orden de los bits k = 000
y convertimos este valor a decimal
obtendremos el valor de p = 0
=1
0
W
x1 (1) = x0 (1) + W x0 (5) = 2 + 6W = 2 + 6W = 8
p p 0

x1 (5) = x0 (1) W x0 (5) = 2 6W = 2 6W = 4


p p 0

62
1. k = 2 en bits k = 010
2. Recorriendo - l = 3-1 = 2 bits k = - - 0
y llenando con ceros k = 000
3.Si invertimos el orden de los bits k = 000
y convertimos este valor a decimal
obtendremos el valor de p = 0
=1
0
W
x1 ( 2) = x0 ( 2) + W x0 ( 6) = 3 + 7W = 3 + 7W = 10
p p 0

x1 ( 6) = x0 ( 2) W x0 ( 6) = 3 7W = 3 7W = 4
p p 0

1. k = 3 en bits k = 011
2. Recorriendo - l = 3-1 = 2 bits k = - - 0
y llenando con ceros k = 000
3.Si invertimos el orden de los bits k = 000
y convertimos este valor a decimal
obtendremos el valor de p = 0
=1
0
W
x1 ( 3) = x0 ( 3) + W x0 ( 7) = 4 + 8W = 4 + 8W = 12
p p 0

x1 ( 7) = x0 ( 3) W x0 ( 7) = 4 8W = 4 8W = 4
p p 0

63
l=2
1. k = 0 en bits k = 000
2. Recorriendo - l = 3- 2 = 1 bits k = -00
y llenando con ceros k = 000
3.Si invertimos el orden de los bits k = 000
y convertimos este valor a decimal
obtendremos el valor de p = 0
=1
0
W
x2 ( 0) = x1 ( 0) + W x1 ( 2) = 6 + 10W = 6 + 10W = 16
p p 0

x2 ( 2) = x1 ( 0) W x1 ( 2) = 6 10W = 6 10W = 4
p p 0

1. k = 1 en bits k = 001
2. Recorriendo - l = 3- 2 = 1 bits k = -00
y llenando con ceros k = 000
3.Si invertimos el orden de los bits k = 000
y convertimos este valor a decimal
obtendremos el valor de p = 0
=1
0
W
x2 (1) = x1 (1) + W x1 ( 3) = 8 + 12W = 8 + 12W = 20
p p 0

x2 ( 3) = x1 (1) W x1 ( 3) = 8 12W = 8 12W = 4


p p 0

64
1. k = 4 en bits k = 100
2. Recorriendo - l = 3- 2 = 1 bits k = -10
y llenando con ceros k = 010
3.Si invertimos el orden de los bits k = 010
y convertimos este valor a decimal
obtendremos el valor de p = 2

(e j 2 / N
) ( ) (e
e j 2 /8 = j / 4
)=
2 2 2
= =
2
W
= cos( 90) j sen( 90) = j
j 2 / 4 j / 2 j 90
e =e =e
x2 ( 4) = x1 ( 4) + W x1 ( 6) = 4 4W = 4 4W = 4 4( j ) =
p p 2

4 + 4 j
x2 ( 6) = x1 ( 4) W x1 ( 6) = 4 + 4W = 4 + 4W = 4 + 4( j ) =
p p 2

4 4 j

1. k = 5 en bits k = 101
2. Recorriendo - l = 3- 2 = 1 bits k = -10
y llenando con ceros k = 010
3.Si invertimos el orden de los bits k = 010
y convertimos este valor a decimal
obtendremos el valor de p = 2

(e j 2 / N
) ( = e j 2 / 8 =) (e j / 4
)=
2 2 2
=
2
W
= cos( 90) j sen( 90) = j
j 2 / 4 j / 2 j 90
e =e =e
x2 (5) = x1 (5) + W x1 ( 7) = 4 4W = 4 4W = 4 4( j ) =
p p 2

4 + 4 j
x2 ( 7) = x1 (5) W x1 ( 7) = 4 + 4W = 4 + 4W = 4 + 4( j ) =
p p 2

4 4 j

65
l=3
1. k = 0 en bits k = 000
2. Recorriendo - l = 3- 3 = 0 bits k = 000
y llenando con ceros k = 000
3.Si invertimos el orden de los bits k = 000
y convertimos este valor a decimal
obtendremos el valor de p = 0
=1
0
W
x3 ( 0) = x2 ( 0) + W x2 (1) = 16 + 20W = 16 + 20W = 36
p p 0

x3 (1) = x2 ( 0) W x2 (1) = 16 20W = 16 20W = 4


p p 0

1. k = 2 en bits k = 010
2. Recorriendo - l = 3- 3 = 0 bits k = 010
y llenando con ceros k = 010
3.Si invertimos el orden de los bits k = 010
y convertimos este valor a decimal
obtendremos el valor de p = 2

(e j 2 / N
) ( ) (e
e j 2 /8 = j / 4
)=
2 2 2
= =
2
W
= cos( 90) j sen( 90) = j
j 2 / 4 j / 2 j 90
e =e =e
x3 ( 2) = x2 ( 2) + W x2 ( 3) = 4 4W = 4 4W = 4 4( j ) =
p p 2

4 + 4 j
x3 ( 3) = x2 ( 2) W x2 ( 3) = 4 + 4W = 4 + 4W = 4 + 4( j ) =
p p 2

4 4 j

66
1. k = 4 en bits k = 100
2. Recorriendo - l = 3- 3 = 0 bits k = 100
y llenando con ceros k = 100
3.Si invertimos el orden de los bits k = 001
y convertimos este valor a decimal
obtendremos el valor de p = 1

(e j 2 / N
) ( )
e j 2 /8 = e =
1 1
j / 4
= =
1
W
= cos( 45) j sen( 45) = 0.7071067812 j 0.7071067812
j 45
e
x3 ( 4) = x2 ( 4) + W x2 (5) = 4 + 4 j + ( 4 + 4 j )W = 4 + 4 j + ( 4 + 4 j )W =
p p 1

4 + 4 j + ( 4 + 4 j )( 0.7071067812 j 0.7071067812) = 4 + 4 j + 5.656854249 j =


4 + 9.656854249 j
x3 (5) = x2 ( 4) W x2 (5) = 4 + 4 j ( 4 + 4 j )W = 4 + 4 j ( 4 + 4 j )W =
p p 1

4 + 4 j ( 4 + 4 j )( 0.7071067812 j 0.7071067812) = 4 + 4 j 5.656854249 j =


4 1656854249
. j

1. k = 6 en bits k = 110
2. Recorriendo - l = 3- 3 = 0 bits k = 110
y llenando con ceros k = 110
3.Si invertimos el orden de los bits k = 011
y convertimos este valor a decimal
obtendremos el valor de p = 3

(e j 2 / N
) ( ) (
e j 2 /8 = )
e j / 4 =
3 3 3
= =
3
W
= cos(135) j sen(135) = 0.7071067812 j 0.7071067812
j 3 / 4 j 135
e =e
x3 ( 6) = x2 ( 6) + W x2 ( 7) = 4 4 j + ( 4 4 j )W = 4 4 j + ( 4 4 j )W =
p p 3

4 4 j + ( 4 4 j )( 0.7071067812 j 0.7071067812 ) = 4 4 j + 5.656854249 j =


4 + 1656854249
. j
x3 ( 7) = x2 ( 6) W x2 ( 7) = 4 4 j ( 4 4 j )W = 4 4 j ( 4 4 j )W =
p p 3

4 4 j ( 4 4 j )( 0.7071067812 j 0.7071067812 ) = 4 4 j 5.656854249 j =


4 9.656854249 j

Con esto finalizamos el clculo de la FFT, ya que los resultados estn


dados por el arreglo x3(k); sin embargo estos resultados estn desordenados por
lo cual procederemos a ordenarlos:

67
REORDENACIN DE DATOS DE LA FFT

RESULTADOS FINALES
x(0) = 36 x ( 4 ) = 4
x(1) = 4 + 9.656854249 j x(5) = 4 1656854249
. j
x ( 2 ) = 4 + 4 j x( 6) = 4 4 j
x(3) = 4 + 1656854249
. j x( 7) = 4 9.656854249 j

68
2.7 DIAGRAMA DE FLUJO DEL PROGRAMA
EN COMPUTADORA DE LA FFT

Usando las propiedades discutidas del diagrama de mariposa de la FFT,


podemos desarrollar fcilmente un diagrama de flujo para programar el algoritmo
en una computadora. Sabemos de discusiones previas que primero tenemos que
calcular el arreglo l = 1 comenzando con el nodo k = 0 y trabajando bajo el arreglo.
En cada nodo k calculamos el par de ecuaciones (2-21) donde p es determinado
por el procedimiento descrito. Continuando bajo el arreglo que calcula el par de
ecuaciones (2-21) hasta alcanzar una regin de nodos que debe de ser saltada.
Saltamos los nodos apropiados y continuamos hasta que tengamos calculado el
conjunto entero. Entonces procedemos a calcular los arreglos restantes usando
los mismos procedimientos. Finalmente tenemos que ordenar el arreglo final para
obtener los resultados deseados. La Fig. 2-6 ilustra un diagrama de flujo para
programar el algoritmo de la FFT en computadora.
La caja 1 describe los datos necesarios de entrada. El vector de datos x0(k)
se asume que es complejo y se indica como k = 0, 1, .........., N - 1. Si x0(k) es
real, entonces la parte imaginaria deber colocarse como cero. El nmero de
puntos muestra N debe satisfacer la relacin N = 2 , donde es un valor entero.
La inicializacin de los diversos parmetros del programa se realiza en la
caja 2. El parmetro l es el nmero de arreglos que deben ser considerados.
Comenzamos con el arreglo l = 1. El espaciamiento entre nodos duales es dado
por el parmetro N2; para el arreglo l = 1, N2 = N/2 y es inicializado como tal. El
parmetro NU1 es el desplazamiento a la derecha requerido cuando se determina
el valor de p en la Eq. (2-21); NU1 es inicializado como - 1. El ndice k del arreglo
es inicializado como k = 0; as trabajaremos desde el inicio y progresivamente bajo
el arreglo.
La caja 3 verifica que el arreglo l calculado sea mayor que . Si s, entonces
el programa ramifica a la caja 13 a ordenar los resultados calculados por la
inversin de bits. Si todos los arreglos no han sido calculados, entonces
procedemos a la caja 4.
La caja 4 introduce un contador I = 1. Este contador monitorea el nmero
de nodos duales que se han considerado. Recordando que es necesario para
saltar ciertos nodos a fin de asegurarnos que nodos anteriormente considerados
no sean encontrados por segunda ocasin. El contador I es el control para
determinar cuando el programa debe de saltar.
Las cajas 5 y 6 desempean el clculo de la Eq. (2-21). Las variables k y l
han sido inicializadas con 0 y 1, respectivamente, el nodo inicial considerado es
el primer nodo del primer arreglo. Para determinar el factor p de este nodo, hay
que recordar que primero debemos escalar o recorrer el nmero binario k a la
derecha - l bits. Para realizar esto, debemos calcular el valor entero de
k / 2 l = k / 2NU1 y colocar el resultado en M como se muestra en la caja 5. Segn
69
el procedimiento para determinar p, debemos invertir los bits de M donde M es
representado por = NU bits. La funcin IBR(M) denotada en la caja 5 es una
rutina de funcin especial para la inversin de bits.
La caja 6 es el clculo de la Eq. (2-21). Nosotros calculamos el producto
W x(k + N2) y se asigna el resultado a una ubicacin temporal de almacenaje.
p

Continuamos agregando y restando este trmino segn la Eq. (2-21). El resultado


es la salida del nodo dual.
Entonces procedemos bajo el arreglo al siguiente nodo. Como se muestra
en la caja 7, k es incrementada en 1.
Para evitar el reclculo de un nodo dual que se ha considerado
anteriormente, checamos la caja 8 para determinar si el contador I es igual a N2.
Para el arreglo 1, el nmero de nodos que pueden ser considerados
consecutivamente sin saltar es igual a N / 2 = N2 . La caja 8 determina esta
condicin. Si I no es igual a N2, entonces procedemos bajo el arreglo e
incrementamos el contador I como se muestra en la caja 9. Recordando que
tenemos ya incrementada k en la caja 7. Las cajas 5 y 6 se repiten entonces para
un nuevo valor de k.
Si I = N2 en la caja 8, entonces sabremos que hemos alcanzado un nodo
anteriormente considerado. Entonces saltamos N2 nodos colocando k = k + N2 .
Porque k ya ha sido incrementada en 1 en la caja 7, es suficiente para saltar los
nodos anteriormente considerados por incrementar k en N2.
Antes de que desempeemos los clculos requeridos indicados por las
cajas 5 y 6 para el nuevo nodo k = k + N2 , debemos primero verificar que no
hallamos excedido el tamao del arreglo. Como se muestra en la caja 11, si k es
menor que N - 1 (recordando que los ndices de k van desde 0 a N - 1), entonces
resetearemos el contador I a 1 en la caja 4 y se repetir en las cajas 5 y 6.
Si k > N - 1 en la caja 11, sabremos que debemos proceder al siguiente
arreglo. Como se muestra en la caja 12, l se indica por 1. El nuevo espaciamiento
N2 es simplemente N2 / 2 (recordando que el espaciamiento es N / 2l ). NU1 es
decrementado en 1 (NU1 es igual a - l), y k es reseteada a cero. Entonces
checamos la caja 3 para ver si todos los arreglos han sido calculados. Si es as,
entonces procedemos a ordenar los resultados finales. Esta operacin es
desempeada por la caja 13 mediante la 17.
La caja 13 hace la reversin de bits del entero k para obtener el entero i.
Nuevamente usamos la funcin de reversin de bits IBR(k). Recordando que al
ordenar la FFT simplemente intercambiamos x(k) y x(i). Esta manipulacin es
realizada por las operaciones indicadas en la caja 15. Sin embargo, es necesario
que la caja 15 entre antes para determinarlas, como se muestra en la caja 14, si i
es menor o igual a k. Este paso es necesario para evitar alterar los nodos
anteriormente ordenados.
La caja 16 determina cuando todos los nodos han sido ordenados y la caja
17 es simplemente un ndice para k.
En la caja 18, describimos la lgica de la funcin de reversin de bits IBR(k).

70
Cuando uno procede a implementar el diagrama de flujo de la Fig. 2-6 en
un programa de computadora, es necesario considerar a las variables x(k) y W p
como nmeros complejos y ellos deben manejarse consiguientemente como tales.

71
2.8 PROGRAMA PARA REALIZAR LA FFT
DESCRIPCIN
Este programa fue elaborado en Turbo C++ Ver. 1.0 con el propsito de
auxiliar al estudiante de procesamiento digital de seales en el aprendizaje de
dicho tema; este programa esta estructurado para que el estudiante comprenda
el proceso de nodos duales y diagramas de mariposa que conllevan a la FFT.
Existen diferentes tipos de software para realizar la FFT, uno de ellos es el
MATLAB que realiza este proceso entre otros. El Matlab utiliza una funcin
llamada fft(x) y tiene la ventaja de aceptar una gran cantidad de muestras para ser
procesadas; lo cual no puede hacerse con este programa por estar limitado por el
arreglo de datos, otra ventaja que tenemos al utilizar Matlab es que podemos abrir
un archivo de datos para su proceso.
El programa trabaja de la siguiente manera:

Pide al usuario que introduzca el nmero de muestras (el cual deber ser una
potencia de dos).
Pide al usuario que introduzca el valor de las muestras.
Despliega los resultados obtenidos.
Despliega la grfica de los valores reales.
Despliega la grfica de los valores imaginarios.
Despliega la grfica del valor absoluto.
Despliega la grfica de la fase.

Para realizar este programa se necesita tener Turbo C++ Ver. 1.0 y un
monitor VGA color.

72
NOTA. Si empleamos una versin de C++ superior el programa podra marcar
errores o advertencias al compilarlo.
Para el modo grfico el programa esta diseado para trabajar con la
resolucin de 640x480 pixeles y desplegar las grficas en color; si
empleamos un monitor SVGA o un UVGA no tendremos problema alguno
siempre y cuando el monitor sea de color; si el monitor es monocromtico
como el programa tiene instrucciones de color lo que suceder es que
nuestra pantalla al desplegar la grfica se pondr toda gris o negra.
Si se desea modificar el programa de tal manera que no ocurra esto es
necesario modificar las instrucciones de setcolor, de floodfillstyle y las de
floodfill. Tambin se puede modificar el programa para que se pueda usar
otro tipo de monitor (CGA u otro); pero hay que tener cuidado ya que si
dejamos as las coordenadas la grfica saldr incompleta o corrida.

DESCRIPCIN DE LA FUNCIN fft DEL MATLAB

La fft(x) es la transformada discreta de Fourier de un vector x, calculada


con el algoritmo de la transformada rpida de Fourier (FFT). Si X es una matriz, la
fft(X) es la FFT de cada columna de la matriz.
La fft(x,n) es el ensimo punto de la FFT. Si la longitud de x es menor que
n, se llena x con ceros hasta llegar a la longitud de n. Si la longitud de x es mayor
que n, la secuencia de x es truncada. Cuando x es una matriz, la longitud de las
columnas son ajustadas de la misma manera.
La funcin de la fft emplea una base 2 en el algoritmo de la transformada
rpida de Fourier si la longitud de la secuencia es una potencia de 2, y un algoritmo
ms lento de base mixta si esta condicin no se cumple.
Cuando la longitud de la secuencia es una potencia de 2, una velocidad alta
del algoritmo base 2 de la transformada rpida de Fourier es empleada. La base
2 de la rutina de la FFT es optimizada para realizar la FFT real si la secuencia de
entrada es puramente real, de otro modo calcula la FFT compleja.
Cuando la longitud de la secuencia no es exactamente una potencia de 2,
un algoritmo de potencia no dos busca los factores primos de la longitud de la
secuencia y calcula la base mixta de la transformada discreta de Fourier de
secuencias cortas.
El tiempo de clculo de la FFT varia de acuerdo con la longitud de la
secuencia. Las secuencias de la FFT cuyas longitudes tienen muchos factores
primos se calculan rpidamente.
Las secuencias cuyas longitudes son los nmeros primos se reduce a un
crudo (y lento) algoritmo de la DFT. Por esta razn es generalmente mejor
permanecer con potencias de dos para las FFTs al menos de que otras
circunstancias lo dicten esto no podr hacerse.

73
DESCRIPCIN DE LA FUNCIN fft2 DEL MATLAB

La fft2(X) y la ifft2(X) calculan la FFT de 2 dimensiones y su inversa. Los


resultados son del mismo tamao que X.
La fft2(X,m,n) trunca X o rellena X con ceros para crear un arreglo de m
por n antes de hacer la transformada. Los resultados son m por n.
Esta calcula la FFT unidimensional de cada columna X, entonces cada
rengln es el resultado. El tiempo requerido de clculo para la fft2(X) depende
fuertemente del nmero de factores primos en [m,n] = size(X). Esto es ms rpido
cuando m y n son potencias de 2.

74
P ROGRAMA F UENTE
/*FFT.CPP*/
#include <math.h>
#include <iostream.h>
#include <complex.h>
#include <conio.h>
#include <stdio.h>
#include <graphics.h>
#include <stdlib.h>
#define N 35
#define PI 3.141592654
void ibr(void);
void bits(void);
void graficos(void);
void ejes(void);
void ejes2(void);
void dibujo_real(void);
void dibujo_imaginario(void);
void absoluto(void);
void fase(void);
void ejes_num(void);
int n1,gd,gm,q,b[N][N],d[N][N],cont,gama,n,a,l,k,h,j,salto,k1,cont2[N],r,e;
double w;
complex x[N][N],hh,wp,xx[N];
float zz[N],aa[N],bb[N],z[N],y[N],temp,max,num;

char p[10];

void main(void)
{
a0:
clrscr();
gotoxy(13,10);printf("EL NUMERO DE MUESTRAS DEBE DE SER UNA
POTENCIA DE DOS");
gotoxy(27,12);printf("DAME EL NUMERO DE MUESTRAS");
gotoxy(34,14);printf("(0<N<64) = ");scanf("%d",&n);
if ((n<=0)||(n>32)||(n!=2)&&(n!=4)&&(n!=8)&&(n!=16)&&(n!=32))
goto a0;
gotoxy(25,25);printf("<Presione Enter Para Continuar>");getche();
if (n==2)
gama = 1;
if (n==4)
gama = 2;
if (n==8)
gama = 3;
75
if (n==16)
gama = 4;
if (n==32)
gama = 5;
clrscr();
gotoxy(23,1);printf("INTRODUCE EL VALOR DE LAS MUESTRAS");
for(k=0;k<=n-1;k++)
{
gotoxy(36,k+3);printf("x[%d] = ",k);cin>>x[0][k];
}
gotoxy(25,25);printf("<Presione Enter Para Continuar>");getche();
bits();
h = gama - 1;
for(l=1;l<=gama;l++)
{
salto = n/pow(2,l);
j = gama - l;
k1 = 0;
for(k=0;k+salto<=n-1;k++)
{
if(k1==salto)
{
k1 = 0;
k = k+salto;
}
ibr();
x[l][k] = x[l-1][k] + wp*x[l-1][k+salto];
x[l][k+salto] = x[l-1][k] - wp*x[l-1][k+salto];
k1++;
}
}
clrscr();
for(k=0;k<=n-1;k++)
{
for(a=0;a<=gama-1;a++)
{
cont = d[k][h-a]*pow(2,a);
cont2[k] = cont2[k] + cont;
}
}
for(k=0;k<=n-1;k++)
{
xx[k] = x[gama][cont2[k]]; /*ORDENACION*/
}
gotoxy(30,1);printf("RESULTADOS OBTENIDOS");
for(k=0;k<=n-1;k++)
76
{
gotoxy(29,k+3);cout<<"x["<<k<<"] = "<<xx[k];
}
gotoxy(25,25);printf("<Presione Enter Para Continuar>");getche();
graficos();
settextjustify(CENTER_TEXT,CENTER_TEXT);
settextstyle(TRIPLEX_FONT,HORIZ_DIR,1);
setcolor(10);
outtextxy(35,5,"Re");
setcolor(15);
ejes();
dibujo_real();ejes_num();
cleardevice();
settextjustify(CENTER_TEXT,CENTER_TEXT);
settextstyle(TRIPLEX_FONT,HORIZ_DIR,1);
setcolor(10);
outtextxy(35,5,"Im");
setcolor(15);
ejes();
dibujo_imaginario();ejes_num();
cleardevice();
settextjustify(CENTER_TEXT,CENTER_TEXT);
settextstyle(TRIPLEX_FONT,HORIZ_DIR,1);
setcolor(10);
outtextxy(25,5,"X(n)");
setlinestyle(0,0,3);
line(5,0,5,15);
line(45,0,45,15);
setlinestyle(0,0,0);
setcolor(15);
ejes();
absoluto();ejes_num();
cleardevice();
settextjustify(CENTER_TEXT,CENTER_TEXT);
settextstyle(TRIPLEX_FONT,HORIZ_DIR,1);
setcolor(10);
outtextxy(25,5,"0(w)");
setcolor(15);
ejes2();
fase();
}

void bits(void)
{
for(k=0;k<=n-1;k++)
{
77
a = k;
for(l=0;l<=gama-1;l++)
{
d[k][l] = a % 2;
a = a/2;
}
}
}

void ibr(void)
{
for(a=0;a<=gama-1;a++)
{
cont = d[k][h-a+j]*pow(2,a);
b[l][k] = b[l][k] + cont;
w = (-2*PI*b[l][k])/n;
hh = complex(0,w);
wp = exp(hh);
}
}

void graficos(void)
{
gd=VGA;
gm=VGAHI;
initgraph(&gd,&gm,"\\tc\\bgi");
}

void ejes(void)
{
setcolor(15);
line(60,0,60,480);
line(60,240,640,240);
setlinestyle(0,0,3);
line(640,240,630,230);
line(640,240,630,250);
line(630,230,630,250);
line(60,0,70,10);
line(60,0,50,10);
line(50,10,70,10);
floodfill(59,5,WHITE);
floodfill(61,5,WHITE);
floodfill(635,239,WHITE);
floodfill(635,241,WHITE);
settextjustify(CENTER_TEXT,CENTER_TEXT);
settextstyle(TRIPLEX_FONT,HORIZ_DIR,1);
78
setcolor(10);
outtextxy(632,218,"n");
q=60;setcolor(15);
setlinestyle(0,0,0);
settextjustify(CENTER_TEXT,LEFT_TEXT);
settextstyle(DEFAULT_FONT,HORIZ_DIR,1);
outtextxy(320,479,"Presione Enter Para Continuar");
q=20;
while(q<=196)
{
line(55,q,65,q);
q+=44;
}
q=284;
while(q<=640)
{
line(55,q,65,q);
q+=44;
}
q=60;n1=0;
while(q<640)
{
line(q,235,q,245);
num = n1+1;
itoa(num,p,10);
q+=580/n;n1++;
outtextxy(q,257,p);
}
}

void ejes_num(void)
{
itoa(max,p,10);
settextstyle(DEFAULT_FONT,HORIZ_DIR,1);
setcolor(15);
outtextxy(40,20,p);
itoa(-max,p,10);
setcolor(15);
outtextxy(35,460,p);
getche();
}

void dibujo_real(void)
{
settextjustify(CENTER_TEXT,CENTER_TEXT);
settextstyle(TRIPLEX_FONT,HORIZ_DIR,2);
79
setcolor(2);
outtextxy(320,10,"VALORES REALES DE LA FUNCION");
for(n1=0;n1<=n-1;n1++)
{
aa[n1] = real(xx[n1]);
}
for(r=0;r<=n-1;r++)
for(e=r+1;e<=n+1;e++)
if (aa[r]<aa[e])
{
temp = aa[r];
aa[r] = aa[e];
aa[e] = temp;
}
max = aa[0];
for(n1=0;n1<n;n1++)
{
setcolor(14);
circle(60+(n1*(580/n)),240-(real(xx[n1])*(220/max)),2);
setfillstyle(1,14);
floodfill(60+(n1*(580/n)),240-(real(xx[n1])*(220/max)),14);
line(60+(n1*(580/n)),240,60+(n1*(580/n)),240-(real(xx[n1])*(220/max)));
}
}

void dibujo_imaginario(void)
{
settextjustify(CENTER_TEXT,CENTER_TEXT);
settextstyle(TRIPLEX_FONT,HORIZ_DIR,2);
setcolor(2);
outtextxy(320,10,"VALORES IMAGINARIOS DE LA FUNCION");
for(n1=0;n1<=n-1;n1++)
{
bb[n1] = imag(xx[n1]);
}
for(r=0;r<=n-1;r++)
for(e=r+1;e<=n+1;e++)
if (bb[r]<bb[e])
{
temp = bb[r];
bb[r] = bb[e];
bb[e] = temp;
}
max = bb[0];
for(n1=0;n1<n;n1++)
{
80
setcolor(14);
circle(60+(n1*(580/n)),240-(imag(xx[n1])*(220/max)),2);
setfillstyle(1,14);
floodfill(60+(n1*(580/n)),240-(imag(xx[n1])*(220/max)),14);
line(60+(n1*(580/n)),240,60+(n1*(580/n)),240-(imag(xx[n1])*(220/max)));
}
}

void absoluto(void)
{
settextjustify(CENTER_TEXT,CENTER_TEXT);
settextstyle(TRIPLEX_FONT,HORIZ_DIR,2);
setcolor(2);
outtextxy(320,10,"VALOR ABSOLUTO DE LA FUNCION");
for(n1=0;n1<n;n1++)
{
z[n1]=abs(xx[n1]);
for(q=0;q<=n-1;q++)
{
zz[q] = z[q];
}
for(r=0;r<=n-1;r++)
for(e=r+1;e<=n+1;e++)
if (zz[r]<zz[e])
{
temp = zz[r];
zz[r] = zz[e];
zz[e] = temp;
}
max = zz[0];
setcolor(14);
circle(60+(n1*(580/n)),240-(z[n1]*(220/max)),2);
setfillstyle(1,14);
floodfill(60+(n1*(580/n)),240-(z[n1]*(220/max)),14);
line(60+(n1*(580/n)),240,60+(n1*(580/n)),240-(z[n1]*(220/max)));
}
}

void fase(void)
{
settextjustify(CENTER_TEXT,CENTER_TEXT);
settextstyle(TRIPLEX_FONT,HORIZ_DIR,2);
setcolor(2);
outtextxy(320,10,"FASE DE LA FUNCION");
for(n1=0;n1<=n-1;n1++)
{
81
if (real(xx[n1])==0)
{
setcolor(14);
circle(60+(n1*(580/n)),20,2);
setfillstyle(1,14);
floodfill(60+(n1*(580/n)),20,14);
line(60+(n1*(580/n)),240,60+(n1*(580/n)),20);
}
else
{
y[n1]=imag(xx[n1])/real(xx[n1]);
z[n1]=(atan(y[n1])*180)/PI;
setcolor(14);
circle(60+(n1*(580/n)),240-(z[n1]*2.5),2);
setfillstyle(1,14);
floodfill(60+(n1*(580/n)),240-(z[n1]*2.5),14);
line(60+(n1*(580/n)),240,60+(n1*(580/n)),240-(z[n1]*2.5));
}
}
getche();
closegraph();
}

void ejes2(void)
{
setcolor(15);
line(60,0,60,480);
line(60,240,640,240);
setlinestyle(0,0,3);
line(640,240,630,230);
line(640,240,630,250);
line(630,230,630,250);
line(60,0,70,10);
line(60,0,50,10);
line(50,10,70,10);
floodfill(59,5,WHITE);
floodfill(61,5,WHITE);
floodfill(635,239,WHITE);
floodfill(635,241,WHITE);
settextjustify(CENTER_TEXT,CENTER_TEXT);
settextstyle(TRIPLEX_FONT,HORIZ_DIR,1);
setcolor(10);
outtextxy(632,218,"n");
setcolor(15);
setlinestyle(0,0,0);
q=460;
82
while(q>=284)
{
line(55,q,65,q);
q=q-44;
}
q=196;
while(q>=20)
{
line(55,q,65,q);
q=q-44;
}
q=60;n1=0;
while(q<640)
{
line(q,235,q,245);
num = n1+1;
itoa(num,p,10);
q+=580/n;n1++;
settextstyle(DEFAULT_FONT,HORIZ_DIR,1);
outtextxy(q,257,p);
}
settextjustify(LEFT_TEXT,LEFT_TEXT);
settextstyle(DEFAULT_FONT,HORIZ_DIR,1);
outtextxy(23,464,"-90");
outtextxy(23,420,"-72");
outtextxy(23,376,"-54");
outtextxy(23,332,"-36");
outtextxy(23,288,"-18");
outtextxy(31,200,"18");
outtextxy(31,156,"36");
outtextxy(31,112,"54");
outtextxy(31,68,"72");outtextxy(31,24,"90");
settextjustify(CENTER_TEXT,LEFT_TEXT);
outtextxy(320,479,"Presione Enter Para Continuar");
}

83
EJEMPLO 2.2
Para ilustrar el funcionamiento de este programa tomaremos la secuencia
que calculamos en el ejemplo 2.1.

84
85
86
87
88
2.9 LA TRANSFORMADA RPIDA INVERSA
DE FOURIER

El procedimiento que se utiliza para resolver la FIFT es el mismo que se


utiliza para la FFT, con las siguientes excepciones:

Las muestras son complejas; estas muestras son el resultado de la FFT.


W = e j2 /N.
Los resultados finales (ya ordenados) tienen que ser multiplicados por 1/N.

EJEMPLO 2.3
Encontrar la transformada rpida inversa de Fourier de la siguiente
secuencia:

x0 ( 0) = 36 x 0 ( 4 ) = 4
x0 (1) = 4 + 9.656854249 j x0 (5) = 4 1656854249
. j
x 0 ( 2 ) = 4 + 4 j x0 (6) = 4 4 j
x0 ( 3) = 4 + 1656854249
. j x0 (7) = 4 9.656854249 j

N = 8 = 2 = 3
N
Numero de Saltos = l
2
l = Numero de arreglos = = Numero de bits.

89
Para resolver la FIFT es necesario incrementar k hasta que:

N
k+ l
= N 1
2
Para resolver este ejemplo se utilizar un contador llamado k 1 el cual
iniciar con cero y se reinicializar, cada que adquiera el valor del nmero de
saltos; esto es con el fin de provocar el salto y de modificar el valor de k, ya que
el valor de k cambiar con cada salto a:

N
k = k anterior + l
2
p
(
x l ( k ) = x l 1 ( k ) + W x l 1 k + 2Nl )

Formulas Empleadas
( ) (
x l k + 2Nl = x l 1 ( k ) W x l 1 k + 2Nl
p
)

90
l=1
N 8 8
Numero de Saltos = l
= 1
= =4
2 2 2

k = 0, k1 = 0
x1 (0) = x0 (0) + W p x0 (4)
x1 (4) = x0 (0) W p x0 (4)
k = 1, k1 = 1
x1 (1) = x0 (1) + W p x0 (5)
x1 (5) = x0 (1) W p x0 (5)
k = 2, k1 = 2
x1 (2) = x0 (2) + W p x0 (6)
x1 (6) = x0 (2) W p x0 (6)
k = 3, k1 = 3
x1 (3) = x0 (3) + W p x0 (7)
x1 (7) = x0 (3) W p x0 (7)

l=2
N 8 8
Numero de Saltos = l
= 2
= =2
2 2 4

k = 0, k1 = 0
x2 (0) = x1 (0) + W p x1 (2)
x2 (2) = x1 (0) W p x1 (2)
k = 1, k1 = 1
x2 (1) = x1 (1) + W p x1 (3)
x2 (3) = x1 (1) W p x1 (3)

91
}
k = 2, k 1 = 2 Como k 1 = Nmero de saltos se reinicializa, y k adquiere el valor de:

N
k = k anterior + l
= 2+2 = 4
2
k = 4, k1 = 0
x2 (4) = x1 (4) + W p x1 (6)
x2 (6) = x1 (4) W p x1 (6)
k = 5, k1 = 1
x2 (5) = x1 (5) + W p x1 (7)
x2 (7) = x1 (5) W p x1 (7)

l=3
N 8 8
Numero de Saltos = l
= 3
= =1
2 2 8

k = 0, k1 = 0
x3 ( 0) = x2 ( 0) + W p x2 (1)
x3 (1) = x2 ( 0) W p x2 (1)

}
k = 1, k 1 = 1 Como k 1 = Nmero de saltos se reinicializa, y k adquiere el valor de:

N
k = k anterior + l
= 1+ 1 = 2
2
k = 2 , k1 = 0
x3 ( 2) = x2 ( 2) + W p x2 ( 3)
x3 ( 3) = x2 ( 2) W p x2 ( 3)

}
k = 3, k 1 =1 Como k 1 = Nmero de saltos se reinicializa, y k adquiere el valor de:

92
N
k = k anterior + l
= 3+1= 4
2
k = 4 , k1 = 0
x3 ( 4) = x2 ( 4) + W p x2 (5)
x3 (5) = x2 ( 4) W p x2 (5)

}
k = 5, k 1 = 1 Como k 1 = Nmero de saltos se reinicializa, y k adquiere el valor de:

N
k = k anterior + l
= 5+1= 6
2
k = 6, k1 = 0
x3 ( 6) = x2 ( 6) + W p x2 ( 7)
x3 ( 7) = x2 ( 6) W p x2 ( 7)

93
DETERMINACIN DE WP

l=1
j 2 / N
W =e , = 3
1. k = 0 en bits k = 000
2. Recorriendo - l = 3-1 = 2 bits k = - - 0
y llenando con ceros k = 000
3.Si invertimos el orden de los bits k = 000
y convertimos este valor a decimal
obtendremos el valor de p = 0
=1
0
W
x1 ( 0) = x0 ( 0) + W x0 ( 4) = 36 + ( 4)W = 36 + ( 4)W = 32
p p 0

x1 ( 4) = x0 ( 0) W x0 ( 4) = 36 ( 4)W = 36 ( 4)W = 40
p p 0

1. k = 1 en bits k = 001
2. Recorriendo - l = 3-1 = 2 bits k = - - 0
y llenando con ceros k = 000
3.Si invertimos el orden de los bits k = 000
y convertimos este valor a decimal
obtendremos el valor de p = 0
=1
0
W
x1 (1) = x0 (1) + W x0 (5) = 4 + 9.656854249 j + ( 4 1656854249 j )W =
p p
.
4 + 9.656854249 j + ( 4 1656854249 j ) W = 8 + 8 j
0
.
x1 (5) = x0 (1) W x0 (5) = 4 + 9.656854249 j ( 4 1656854249 j )W =
p p
.
4 + 9.656854249 j ( 4 1656854249 j )W = 11.3137085 j
0
.

94
1. k = 2 en bits k = 010
2. Recorriendo - l = 3-1 = 2 bits k = - - 0
y llenando con ceros k = 000
3.Si invertimos el orden de los bits k = 000
y convertimos este valor a decimal
obtendremos el valor de p = 0
=1
0
W
x1 ( 2) = x0 ( 2) + W x0 ( 6) = 4 + 4 j + ( 4 4 j )W =
p p

4 + 4 j + ( 4 4 j ) W = 8
0

x1 ( 6) = x0 ( 2) W x0 ( 6) = 4 + 4 j ( 4 4 j )W =
p p

4 + 4 j ( 4 4 j ) W = 8 j
0

1. k = 3 en bits k = 011
2. Recorriendo - l = 3-1 = 2 bits k = - - 0
y llenando con ceros k = 000
3.Si invertimos el orden de los bits k = 000
y convertimos este valor a decimal
obtendremos el valor de p = 0
=1
0
W
x1 ( 3) = x0 ( 3) + W x0 ( 7) = 4 + 1656854249 j + ( 4 9.656854249 j )W =
p p
.
4 + 1..656854249 j + ( 4 9.656854249 j )W = 8 8 j
0

x1 ( 7) = x0 ( 3) W x0 ( 7) = 4 + 1656854249 j ( 4 9.656854249 j )W =
p p
.
4 + 1656854249 j ( 4 9.656854249 j )W = 11.3137085 j
0
.

95
l=2
1. k = 0 en bits k = 000
2. Recorriendo - l = 3- 2 = 1 bits k = -00
y llenando con ceros k = 000
3.Si invertimos el orden de los bits k = 000
y convertimos este valor a decimal
obtendremos el valor de p = 0
=1
0
W
x2 ( 0) = x1 ( 0) + W x1 ( 2) = 32 + ( 8)W = 32 + ( 8)W = 24
p p 0

x2 ( 2) = x1 ( 0) W x1 ( 2) = 32 ( 8)W = 32 ( 8)W = 40
p p 0

1. k = 1 en bits k = 001
2. Recorriendo - l = 3- 2 = 1 bits k = -00
y llenando con ceros k = 000
3.Si invertimos el orden de los bits k = 000
y convertimos este valor a decimal
obtendremos el valor de p = 0
=1
0
W
x2 (1) = x1 (1) + W x1 ( 3) = 8 + 8 j + ( 8 8 j )W =
p p

8 + 8 j + ( 8 8 j )W = 16
0

x2 ( 3) = x1 (1) W x1 ( 3) = 8 + 8 j ( 8 8 j )W =
p p

8 + 8 j ( 8 8 j )W = 16 j
0

96
1. k = 4 en bits k = 100
2. Recorriendo - l = 3- 2 = 1 bits k = -10
y llenando con ceros k = 010
3.Si invertimos el orden de los bits k = 010
y convertimos este valor a decimal
obtendremos el valor de p = 2

(e j 2 / N
) ( e j 2 /8 =) (e ) = j / 4
2 2 2
= =
2
W
= cos( 90) + j sen( 90) = j
j 2 / 4 j / 2
=e =e
j 90
e
x2 ( 4) = x1 ( 4) + W x1 ( 6) = 40 + (8 j )W = 40 + (8 j )W =
p p 2

40 + 8 j ( j ) = 40 8 = 32
x2 ( 6) = x1 ( 4) W x1 ( 6) = 40 (8 j )W = 40 (8 j )W =
p p 2

40 8 j ( j ) = 40 + 8 = 48

1. k = 5 en bits k = 101
2. Recorriendo - l = 3- 2 = 1 bits k = -10
y llenando con ceros k = 010
3.Si invertimos el orden de los bits k = 010
y convertimos este valor a decimal
obtendremos el valor de p = 2

(e j 2 / N
) ( e j 2 /8 = ) (e ) = j / 4
2 2 2
= =
2
W
= cos( 90) + j sen( 90) = j
j 2 / 4 j / 2
=e =e
j 90
e
x2 (5) = x1 (5) + W x1 ( 7) = 113137085 j + (113137085 j )W =
p p
. .
j + (113137085 j )W = 113137085 j + 113137085 j( j ) =
2
113137085
. . . .
113137085
. + 113137085
. j
x2 ( 7) = x1 (5) W x1 ( 7) = 113137085 j (113137085 j )W =
p p
. .
j (113137085 j )W = 113137085 j 113137085 j( j ) =
2
113137085
. . . .
113137085
. + 113137085
. j

97
l=3
1. k = 0 en bits k = 000
2. Recorriendo - l = 3- 3 = 0 bits k = 000
y llenando con ceros k = 000
3.Si invertimos el orden de los bits k = 000
y convertimos este valor a decimal
obtendremos el valor de p = 0
=1
0
W
x3 ( 0) = x2 ( 0) + W x2 (1) = 24 + ( 16)W = 24 + ( 16)W =
p p 0

24 16 = 8
x3 (1) = x2 ( 0) W x2 (1) = 24 ( 16)W = 24 ( 16)W =
p p 0

24 + 16 = 40

1. k = 2 en bits k = 010
2. Recorriendo - l = 3- 3 = 0 bits k = 010
y llenando con ceros k = 010
3.Si invertimos el orden de los bits k = 010
y convertimos este valor a decimal
obtendremos el valor de p = 2

(e j 2 / N
) ( ) (e ) =
e j 2 /8 = j / 4
2 2 2
= =
2
W
= cos( 90) + j sen( 90) = j
j 2 / 4 j / 2
=e =e
j 90
e
x3 ( 2) = x2 ( 2) + W x2 ( 3) = 40 + (16 j )W = 40 + (16 j )W =
p p 2

40 + 16 j ( j ) = 40 16 = 24
x3 ( 3) = x2 ( 2) W x2 ( 3) = 40 (16 j )W = 40 (16 j )W =
p p 2

40 16 j ( j ) = 40 + 16 = 56

98
1. k = 4 en bits k = 100
2. Recorriendo - l = 3- 3 = 0 bits k = 100
y llenando con ceros k = 100
3.Si invertimos el orden de los bits k = 001
y convertimos este valor a decimal
obtendremos el valor de p = 1

(e j 2 / N
) ( )
e j 2 /8 = e =
1 1
j / 4
= =
1
W
= cos( 45) + j sen( 45) = 0.7071067812 + j 0.7071067812
j 45
e
x3 ( 4) = x2 ( 4) + W x2 (5) = 32 + ( 113137085 + 113137085 j )W =
p p
. .
32 + ( 113137085 + 113137085 j )W = 32 +
1
. .
( 113137085
. + 113137085
. j )( 0.7071067812 + j 0.7071067812) = 32 16 = 16
x3 (5) = x2 ( 4) W x2 (5) = 32 ( 113137085 + 113137085 j )W =
p p
. .
32 ( 113137085 + 113137085 j )W = 32
1
. .
( 113137085
. + 113137085
. j )( 0.7071067812 + j 0.7071067812) = 32 + 16 = 48

1. k = 6 en bits k = 110
2. Recorriendo - l = 3- 3 = 0 bits k = 110
y llenando con ceros k = 110
3.Si invertimos el orden de los bits k = 011
y convertimos este valor a decimal
obtendremos el valor de p = 3

(e j 2 / N
) ( ) (
e j 2 /8 = )
e j / 4 =
3 3 3
= =
3
W
= cos(135) + j sen(135) = 0.7071067812 + j 0.7071067812
j 3 / 4
=e
j 135
e
x3 ( 6) = x2 ( 6) + W x2 ( 7) = 48 + (113137085 + 113137085 j )W = 48 +
p p
. .
(113137085
. + 113137085
. j )W = 48 +
3

(113137085
. + 113137085
. j )( 0.7071067812 + j 0.7071067812 ) =
48 16 = 32
x3 ( 7) = x2 ( 6) W x2 ( 7) = 48 (113137085 + 113137085 j )W = 48
p p
. .
(113137085
. + 113137085
. j )W = 48
3

(113137085
. + 113137085
. j )( 0.7071067812 + j 0.7071067812 ) =
48 + 16 = 64

99
Con esto finalizamos el clculo de la FIFT, ya que los resultados estn
dados por el arreglo x3(k); sin embargo estos resultados estn desordenados por
lo cual procederemos a ordenarlos:

REORDENACIN DE DATOS DE LA FIFT

RESULTADOS ORDENADOS
x( 0) = 8 x( 4) = 40
x(1) = 16 x(5) = 48
x( 2) = 24 x( 6) = 56
x( 3) = 32 x( 7) = 64

Finalmente, el ltimo paso para resolver este problema es multiplicar cada


uno de los resultados por 1/N = 1/8 = 0.125. As obtendremos:

100
RESULTADOS FINALES
x( 0) = 1 x( 4) = 5
x(1) = 2 x(5) = 6
x( 2) = 3 x( 6) = 7
x( 3) = 4 x( 7) = 8

101
2.10 PROGRAMA PARA REALIZAR LA
TRANSFORMADA RPIDA INVERSA DE
FOURIER
DESCRIPCIN
Este programa fue elaborado en Turbo C++ Ver. 1.0 con el propsito de
auxiliar al estudiante de procesamiento digital de seales en el aprendizaje de
dicho tema; este programa esta estructurado para que el estudiante comprenda
el proceso de nodos duales y diagramas de mariposa que conllevan a la FIFT.
Existen diferentes tipos de software para realizar la FIFT, uno de ellos es el
MATLAB que realiza este proceso entre otros. El Matlab utiliza una funcin
llamada ifft(x) y tiene la ventaja de aceptar una gran cantidad de muestras para
ser procesadas; lo cual no puede hacerse con este programa por estar limitado
por el arreglo de datos, otra ventaja que tenemos al utilizar Matlab es que
podemos abrir un archivo de datos para su proceso.
El programa trabaja de la siguiente manera:

Pide al usuario que introduzca el nmero de muestras (el cual deber ser una
potencia de dos).
Pide al usuario que introduzca el valor de las muestras.
Despliega los resultados obtenidos.
Despliega la grfica de los resultados obtenidos.

Para realizar este programa se necesita tener Turbo C++ Ver. 1.0 y un
monitor VGA color.
NOTA. Si empleamos una versin de C++ superior el programa podra marcar
errores o advertencias al compilarlo.
Para el modo grfico el programa esta diseado para trabajar con la
resolucin de 640x480 pixeles y desplegar las grficas en color; si
empleamos un monitor SVGA o un UVGA no tendremos problema alguno
siempre y cuando el monitor sea de color; si el monitor es monocromtico
como el programa tiene instrucciones de color lo que suceder es que
nuestra pantalla al desplegar la grfica se pondr toda gris o negra.
Si se desea modificar el programa de tal manera que no ocurra esto es
necesario modificar las instrucciones de setcolor, de floodfillstyle y las de
floodfill. Tambin se puede modificar el programa para que se pueda usar
otro tipo de monitor (CGA u otro); pero hay que tener cuidado ya que si
dejamos as las coordenadas la grfica saldr incompleta o corrida.

102
DESCRIPCIN DE LA FUNCIN ifft DEL MATLAB

La ifft(x) es la transformada rpida inversa de Fourier del vector x.


La ifft(x,n) es el ensimo punto de la FFT inversa.
El algoritmo de la ifft(x) es el mismo que para el algoritmo de la fft(x),
excepto por el cambio de signo y un factor de escala de n = length(x). As el tiempo
de ejecucin es ms rpido cuando n es una potencia de 2 y lento cuando n es
una separacin larga de factores.

DESCRIPCIN DE LA FUNCIN ifft2 DEL MATLAB

La ifft2(X) retorna la transformada rpida inversa de Fourier bidimensional


de la matriz X.
La ifft2(X,m,n) es la transformada inversa de m por n.
El algoritmo para la ifft2(X) es el mismo que para la fft2(X) excepto por el cambio
de signo y los factores de escala de [m,n] = size(X). El tiempo de ejecucin es ms
rpido cuando m y n son potencias de 2 y ms lento cuando es una separacin
larga de factores.

103
P ROGRAMA F UENTE
/*IFFT.CPP*/
#include <math.h>
#include <iostream.h>
#include <complex.h>
#include <conio.h>
#include <stdio.h>
#include <graphics.h>
#include <stdlib.h>
#define N 35
#define PI 3.141592654
void ibr(void);
void bits(void);
void graficos(void);
void ejes(void);
void real(void);
void ejes_num(void);
int n1,gd,gm,q,b[N][N],d[N][N],cont,gama,n,a,l,k,h,j,salto,k1,cont2[N],r,e;
double re[N],im[N],w,y;
complex x[N][N],hh,wp,xx[N];
float max,temp,bb[N],num;
char p[10];

void main(void)
{
a0:
clrscr();
gotoxy(13,10);printf("EL NUMERO DE MUESTRAS DEBE DE SER UNA
POTENCIA DE DOS");
gotoxy(27,12);printf("DAME EL NUMERO DE MUESTRAS");
gotoxy(34,14);printf("(0<N<64) = ");scanf("%d",&n);
if ((n<=0)||(n>32)||(n!=2)&&(n!=4)&&(n!=8)&&(n!=16)&&(n!=32))
goto a0;
gotoxy(25,25);printf("<Presione Enter Para Continuar>");getche();
if (n==2)
gama = 1;
if (n==4)
gama = 2;
if (n==8)
gama = 3;
if (n==16)
gama = 4;
if (n==32)
gama = 5;
clrscr();
104
gotoxy(23,1);printf("INTRODUCE EL VALOR DE LAS MUESTRAS");
for(k=0;k<=n-1;k++)
{
gotoxy(25,k+3);printf("h(Re)[%.d] = ",k);scanf("%lf",&re[k]);
gotoxy(50,k+3);printf("h(Im)[%.d] = ",k);scanf("%lf",&im[k]);
x[0][k] = complex(re[k],im[k]);
}
gotoxy(25,25);printf("<Presione Enter Para Continuar>");getche();
bits();
h = gama - 1;
for(l=1;l<=gama;l++)
{
salto = n/pow(2,l);
j = gama - l;
k1 = 0;
for(k=0;k+salto<=n-1;k++)
{
if(k1==salto)
{
k1 = 0;
k = k+salto;
}
ibr();
x[l][k] = x[l-1][k] + wp*x[l-1][k+salto];
x[l][k+salto] = x[l-1][k] - wp*x[l-1][k+salto];
k1++;
}
}
clrscr();
for(k=0;k<=n-1;k++)
{
for(a=0;a<=gama-1;a++)
{
cont = d[k][h-a]*pow(2,a);
cont2[k] = cont2[k] + cont;
}
}
y = n;
for(k=0;k<=n-1;k++)
{
xx[k] = (1/y)*x[gama][cont2[k]]; /*ORDENACION*/
}
gotoxy(30,1);printf("RESULTADOS OBTENIDOS");
for(k=0;k<=n-1;k++)
{
gotoxy(36,k+3);printf("x[%d] = %.0f",k,real(xx[k]));
105
}
gotoxy(25,25);printf("<Presione Enter Para Continuar>");getche();
graficos();
ejes();
real();
ejes_num();
}

void bits(void)
{
for(k=0;k<=n-1;k++)
{
a = k;
for(l=0;l<=gama-1;l++)
{
d[k][l] = a % 2;
a = a/2;
}
}
}

void ibr(void)
{
for(a=0;a<=gama-1;a++)
{
cont = d[k][h-a+j]*pow(2,a);
b[l][k] = b[l][k] + cont;
w = (2*PI*b[l][k])/n;
hh = complex(0,w);
wp = exp(hh);
}
}

void graficos(void)
{
gd=VGA;
gm=VGAHI;
initgraph(&gd,&gm,"\\tc\\bgi");
}

void ejes(void)
{
setcolor(15);
line(60,0,60,480);
line(60,240,640,240);
setlinestyle(0,0,3);
106
line(640,240,630,230);
line(640,240,630,250);
line(630,230,630,250);
line(60,0,70,10);
line(60,0,50,10);
line(50,10,70,10);
floodfill(59,5,WHITE);
floodfill(61,5,WHITE);
floodfill(635,239,WHITE);
floodfill(635,241,WHITE);
settextjustify(CENTER_TEXT,CENTER_TEXT);
settextstyle(TRIPLEX_FONT,HORIZ_DIR,1);
setcolor(10);
outtextxy(25,5,"h(kt)");
outtextxy(632,218,"n");
q=60;setcolor(15);
setlinestyle(0,0,0);
settextjustify(CENTER_TEXT,LEFT_TEXT);
settextstyle(DEFAULT_FONT,HORIZ_DIR,1);
outtextxy(320,479,"Presione Enter Para Continuar");
q=20;
while(q<=196)
{
line(55,q,65,q);
q+=44;
}
q=284;
while(q<=640)
{
line(55,q,65,q);
q+=44;
}
q=60;n1=0;
while(q<640)
{
line(q,235,q,245);
num = n1+1;
itoa(num,p,10);
q+=580/n;n1++;
outtextxy(q,257,p);
}
}

void ejes_num(void)
{
itoa(max,p,10);
107
settextstyle(DEFAULT_FONT,HORIZ_DIR,1);
setcolor(15);
outtextxy(40,20,p);
itoa(-max,p,10);
setcolor(15);
outtextxy(35,460,p);
getche();
closegraph();
}

void real(void)
{
settextjustify(CENTER_TEXT,CENTER_TEXT);
settextstyle(TRIPLEX_FONT,HORIZ_DIR,3);
setcolor(2);
outtextxy(320,10,"VALORES OBTENIDOS DE LA TRIF");
for(n1=0;n1<=n-1;n1++)
{
bb[n1] = real(xx[n1]);
}
for(r=0;r<=n-1;r++)
for(e=r+1;e<=n+1;e++)
if (bb[r]<bb[e])
{
temp = bb[r];
bb[r] = bb[e];
bb[e] = temp;
}
max = bb[0];
for(n1=0;n1<n;n1++)
{
setcolor(14);
circle(60+(n1*(580/n)),240-(real(xx[n1])*(220/max)),2);
setfillstyle(1,14);
floodfill(60+(n1*(580/n)),240-(real(xx[n1])*(220/max)),14);
line(60+(n1*(580/n)),240,60+(n1*(580/n)),240-(real(xx[n1])*(220/max)));
}
}

108
EJEMPLO 2.4
Para ilustrar el funcionamiento de este programa tomaremos la secuencia
que calculamos en el ejemplo 2.3.

109
110
CAPTULO 3
LA TRANSFORMADA Z

3.0 INTRODUCCIN
La transformada Z provee al ingeniero con un poderoso mtodo para el
anlisis de sistemas discretos lineales invariantes en el tiempo. Un sistema
discreto en tiempo puede ser representado por una ecuacin diferencial
relacionando las seales de entrada y salida en el dominio del tiempo. La
transformada Z provee de un mtodo para el anlisis de sistemas discretos en
tiempo en el dominio de la frecuencia, el cual es generalmente ms eficiente que
el anlisis en el dominio del tiempo. La eficiencia en la realizacin del anlisis de
sistemas usando el mtodo de la transformada Z puede llegar a ser evidente
cuando el concepto de funcin de transferencia del sistema H(z) sea descrito.
Veremos que esa respuesta en frecuencia de un sistema discreto en tiempo puede
ser fcilmente determinada evaluando la funcin de transferencia en el circulo
unitario en el plano Z.

Figura 3.1 Proceso de la transformada Z.


David J. DeFatta, "Digital Signal Processing"

111
3.1 LA TRANSFORMADA Z
Considere la secuencia de tiempo discreto x(nT), para n = 0, 1, 2,..... Esta
secuencia se considero de dos lados, el ndice n esta definido para ambos valores
positivo y negativo. Los dos lados de la transformada Z de esta secuencia estn
definidos como:

X ( z ) = Z [ x( nT )] = x(nT )z n
(31.)
n =

Podemos interpretar a zn como un operador de retardo, esto es, un retardo de


nT segundos para cada elemento en la secuencia x(nT) esto es equivalente a la
multiplicacin de la transformada Z por zn . Por lo tanto, la transformada Z de
secuencias de duracin finita puede ser encontrado por la aplicacin directa de la
Eq. 3.1, donde la muestra x(nT) es el coeficiente de zn en las potencias de
expansin de las series de X(z).
Ms formalmente, z es una variable compleja esta puede asumir cualquier
valor en el plano complejo z en que la serie infinita converge. En forma polar z
puede ser expresada como Z = re jwT , donde se debe de notar que en el circulo
unitario en el plano Z r = 1, esto es, para z = 1 , la transformada Z es equivalente
a la transformada discreta de Fourier (DFT).
Las secuencias causales forman la base de la mayora de los sistemas
fsicos, el lado derecho de la transformada Z se enfatizar, esto es, secuencias
para que el ndice de tiempo n se define nicamente para valores positivos. En
esta forma tenemos:

X ( z ) = Z [ x( nT )] = x( nT ) z n (3.2)
n=0

112
3.2 PROPIEDADES DE LA TRANSFORMADA Z
Las secuencias causales sern enfatizadas, estas forman la base del
procesamiento de sistemas de seales de tiempo real; esto es, la respuesta
del sistema esta determinada como las muestras que llegan en un flujo continuo
con un periodo de muestreo T (segundos/muestra).
Para el caso donde X(z) es una funcin racional de z, esto es, una relacin
de polinomios en z, podemos definir la transformada en trminos de las races del
sistema. Las races del polinomio numerador se refieren como los ceros de X(z),
y las races del polinomio denominador se refieren como los polos de X(z).

3.2.1 REGIN DE CONVERGENCIA (ROC)


Si x(nT) tiene una transformada Z, entonces la magnitud de X(z) debe de
ser finita.
Ahora definiremos la regin de convergencia (ROC) para poner todas
las zs en el plano z complejo para que la magnitud de X(z) sea finita.
Representando z en la forma polar, nosotros requerimos que:


X ( z) = x(nT )z
n =
n
x(nT ) r
n =
n

1
=
n =
x( nT ) r n + x( nT ) r n
n=0

= x( nT ) r n + x( nT ) r n < (3.3)
n =1 n=0

Para que la suma infinita de la Eq. 3.1 sea absolutamente sumable, cada una de
las dos sumas de la Eq. 3.3 debe ser finita. Para que las sumas de la ecuacin
3.3 sean finitas, nosotros encontramos tres constantes positivas R 1, R2, y M. Para
secuencias causales debemos satisfacer la condicin x(nT) MR1n para n 0,
y para secuencias no causales debemos satisfacer la condicin x(nT) MRn2 para
n < 0. La serie de potencias negativas de la variable compleja z converge afuera
de un crculo de radio R1, y la serie de potencias positivas de z converge adentro
de un crculo de radio R2. En la sustitucin de estos trminos en la Eq. 3.3,
obtenemos:

113

n n n n

n =
x ( nT ) z n
M R2 r + R1 r
n =1 n=0
(3.4)

Ahora observamos que las sumas en la Eq. 3.4 son finitas si y solo si r/R 2 < 1
para la primera suma y R1/r < 1 en la segunda suma, esto es, la Eq. 3.1 converge
absolutamente para toda z en el anillo de convergencia R1 < z < R2 .
Ahora procederemos a describir la ROC para secuencias causales y no
causales. En una reexaminacin de la Eq. 3.1 la transformada Z es una serie de
potencias donde ambas potencias negativas y positivas son involucradas. Esto
puede ser visto por la expresin de X(z) en la forma:
1
X ( z ) = x( nT ) z n + x(nT )z n
= X 1( z) + X 2 ( z) (3.5)
n=0 n =

Figura 3.2 Regin de convergencia (ROC): (a) secuencia del lado derecho:
z > R1 ; (b) secuencia del lado izquierdo: z < R2 ; (c) secuencia de los dos lados:
R1 < z < R2 .
David J. DeFatta, "Digital Signal Processing"

Para secuencias causales, las potencias de z son negativas y x(nT) no es


cero solo en la regin 0 N1 n < , donde N1 es un entero. Para este caso, la
ROC para X(z) existe en todas partes afuera de un crculo de radio R 1 donde el
valor de R1 depende de la localizacin de los polos de X(z). Si los polos de X(z)
estn adentro del circulo unitario en el plano z, el sistema es tambin estable. As,
para este caso la ROC para X(z) en el plano complejo z se muestra en la Fig. 3.2a.
Nos referimos a estas secuencias como las secuencias del lado derecho.
Deber de notarse que la transformada Z de secuencias causales son nicas, esto
es, dada X(z), nosotros podemos encontrar x(nT) por la transformada Z inversa.
Para secuencias no causales, las potencias de z son positivas, y x(nT) no
es cero en la regin - < n < N2 < 0. Para este caso, la ROC existe en todas
partes adentro de un circulo de radio R2, donde R2 depende de los polos de X(z).
Las secuencias no causales existen para valores positivos de n, las futuras

114
muestras se asume que estarn disponibles. Generalmente, esta condicin no
ocurre en el procesamiento de sistemas de seales de tiempo real; sin embargo,
puede ser realizada por el uso de una demora de tiempo. Las secuencias no
causales son de inters en problemas de anlisis de sistemas. Para este caso la
ROC para X(z) se muestra en la Fig. 3.2b. Nos referimos a estas secuencias como
las secuencias del lado izquierdo.
Cuando la secuencia adquiere ambos valores positivo y negativo para n,
esta ROC esta dada por la Eq. 3.4, esto es, R1 < z < R2 , donde R2 R1. Esto es,
la ROC resulta en un anillo de convergencia, como se ilustra en la Fig. 3.2c.
Estas secuencias estn referidas como secuencias de los dos lados. Los lmites
interiores del circulo en trminos de potencias negativas de z estn fuera del
origen. Los lmites exteriores del circulo en trminos de potencias positivas de z
estn fuera de grandes valores de z .
En resumen, para secuencias causales la ROC es exterior a un crculo
pasando continuamente el polo ms lejano al origen en el plano z. Tambin, los
no polos de X(z) pueden ocurrir dentro de la ROC la transformada Z no converge
en un polo.
La secuencia es tambin estable, entonces todos los polos yacen dentro del
circulo unitario y la ROC incluye al crculo unitario. Para secuencias no causales
de los dos lados, la ROC debe de estar limitada por polos, esto es, tenemos un
anillo de convergencia. Tambin, si la ROC no se extiende a cero o a infinito, la
secuencia es de los dos lados.
La ROC es de inters a el anlisis de sistemas cuando hay necesidad
de saber la regin en que la transformada Z es definida para la secuencia general
de los dos lados. La mayora de los sistemas de procesamiento de seales son
causales.
Si nosotros consideramos primordialmente el lado derecho de la transformada Z
esta restriccin nos permitir enfocarnos en sistemas de tiempo real realizables,
esto es, sistemas que dependieron en el pasado de los valores de entrada y salida
as como tambin de los valores actuales de entrada. Finalmente, es de resaltar
que si la secuencia discreta es causal, la ROC es implcita; esto es, la ROC esta
fuera de un crculo centrado en el origen del plano z.

TABLA 3.1
REGIN DE CONVERGENCIA DE LA TRANSFORMADA Z
SECUENCIA TRANSFORMADA ROC
Dos Lados X1(z) + X2(z) R1 < z < R2, (para R1 < R2)
Lado Derecho X1(z) z > R1
Lado Izquierdo X2(z) z < R2

115
TABLA 3.2
TRANSFORMADAS Z DE FUNCIONES MUESTREADAS EN TIEMPO
No. x(nT) X(z) Regin de
(n 0) Convergencia
1 ( nT ) 1 z <
(Todo el plano z)
2 (nT ) z z >1
z 1
3 nT zT z >1
( z 1) 2

4 a nT z z > aT
z aT
5 e anT z z > e aT
z e aT
6 ne anT ze aT z > e aT
(z e )
aT 2

7 sen nT z sen T z >1


z 2 z cos T + 1
2

8 cos nT z( z cos T ) z >1


z 2 z cos T + 1
2

9 r nT sen nT r T z sen T z>r


T

z 2 2r T z cos T + r 2 T

10 r nT cos nT (
z z r T cosT ) z>r
T

z 2 2r T z cosT + r 2 T

11 e anT sen nT ze aT sen T z > e aT


z 2e aT z cosT + e 2 aT
2

12 e anT cos nT (
z z e aT cosT ) z > e aT
z 2 2e aT z cosT + e 2 aT

116
3.2.2 LINEALIDAD
Dadas las transformadas Z de x(n) y y(n) son denotadas por X(z) y Y(z),
entonces:

Z[ax(n) + by(n)] = aX ( z) + bY ( z) (3.6)


La Eq. 3.6 condiciona esto dada la transformada de la suma de dos
secuencias multiplicadas por constantes arbitrarias, sus transformadas pueden
tambin ser encontrados por la suma de sus correspondientes transformadas
multiplicadas por las constantes arbitrarias. La ROC para la transformada de una
suma de secuencias es la interseccin de la ROC de las transformadas de las dos
secuencias.

3.2.3 PROPIEDAD DE RETARDO


El teorema del retardo para una secuencia causal puede ser expresado como:

1
Z[ x(nT iT )] = z i X ( z ) + z i x(mT ) z m , i0
m = i

= z i X ( z ) + x( iT ) + x( iT + T ) z 1
+ + x( T ) z (i 1) (3.7)
Donde i es un retardo arbitrario entero.
Comprobacin: De la definicin de transformada Z de un lado de
secuencias causales, la transformada Z de una secuencia retrasada puede ser
expresada por:

Z [ x( nT iT )] = x( nT iT ) z n
n=0

Haciendo a m = n - i, obtenemos:

117

Z [ x( nT iT )] = x(mT )z mi

m = i
1
= z i x( mT ) z m + z i x( mT ) z m
m= 0 m = i
1
= z i X ( z ) + z i x( mT ) z m
m = i

Esta propiedad es til cuando consideramos un sistema con condiciones iniciales


de no cero. Para el caso cuando x(nT) = 0, n < 0, esto es, para condiciones
iniciales de cero tenemos:

Z[ x(nT iT )] = z i X ( z) (38
.)

Esta propiedad se aplica extensamente a la transformacin de ecuaciones


diferenciales a el dominio z cuando las condiciones iniciales son cero.

3.2.4 ESCALAMIENTO EN TIEMPO POR


UNA SECUENCIA EXPONENCIAL
COMPLEJA
Se puede demostrar que multiplicando una secuencia x(nT) por una secuencia de
exponencial compleja n , donde = re jT , correspondiente a una rotacin cclica
de los polos y ceros en el plano z. Este reescalamiento del plano z es expresado
por:

[ ]
Z n x ( nT ) = X 1 z ( ) ( 3.9)

118
3.2.5 DIFERENCIACIN DE X(z) O
MULTIPLICACIN DE x(nT) POR (nT)
Esta propiedad afirma que si x(nT) es multiplicado por el ndice de tiempo (nT) el
resultado es equivalente a la derivada de la transformada Z de x(nT) multiplicada
por ( Tz) , esto es:

Z [( nT ) x( nT )] = Tz
d
X ( z) (310
. )
dz

3.2.6 PROPIEDAD DE CONVOLUCIN


Ahora consideraremos la transformada Z de la convolucin suma, esto es:


Z[ y(nT )] = Z[h(nT ) x(nT )] = Z x(nT mT )h(mT )
m=

= Z x(mT )h(nT mT ) = X ( z ) H ( z ) (311
. )
m=

Por lo tanto, la transformada Z de la convolucin suma es igual a el producto de


la transformada Z de la secuencia de entrada x(n) y la secuencia impulso h(n).
Comprobacin: La transformada Z de la convolucin suma esta dada por:


n
Y ( z) = x( mT )h( nT mT ) z
n = m =

Haciendo i = n - m, obtenemos:


Y ( z) = x(mT )h(iT )z (
i = m =
i + m)




= x(mT )z
i = m =
m
h(iT ) z

i


= X ( z ) h(iT ) z i = X ( z ) H ( z )
i =

119
La ecuacin 3.11 muestra que la convolucin lineal de dos seales
discretas es igual a el producto de las transformadas Z.

3.2.7 TEOREMA DEL VALOR INICIAL


Si x(nT) es una seal causal, entonces el valor inicial de la seal esta dada por:

x ( 0) = lim X ( z ) (312
. )
z

Comprobacin:


lim X ( z ) = lim x( nT ) z n
z z
n=0

= x( 0) z 0 + x(1) z 1 + x( 2) z 2 + = x( 0)

Esto es, todos los trminos en la sumatoria excepto x(0T) se aproximan a cero
como z se aproxima a infinito.

3.2.8 TEOREMA DEL VALOR FINAL


Si x(nT) es causal y estable con una transformada Z X(z), entonces el teorema del
valor final esta dado por:

n z 1
(
lim x( nT ) = lim 1 z 1 X ( z )) (313
. )

( )
En orden para el lmite de 1 z 1 X( z) a existir como una aproximacin de z a la
unidad, debemos tener a z = 1 incluida en la ROC, el sistema debe ser estable, y
por lo tanto todos los polos del sistema deben estar adentro del circulo unitario.

3.3 LA TRANSFORMADA Z INVERSA


Ahora investigaremos los mtodos de obtencin de la transformada Z inversa, esto
es, obtener la secuencia en tiempo discreto x(nT) dada X(z).

120
Los tres mtodos bsicos que se emplean para recobrar la secuencia
original de la transformada Z son:

1. La integral de la inversin compleja.


2. Expansin de fracciones parciales.
3. Inversin por divisin.

Figura 3.3 La transformada Z inversa.


David J. DeFatta, "Digital Signal Processing"

3.3.1 INTEGRAL DE LA INVERSIN


COMPLEJA
La integral de la inversin de la transformada Z puede ser derivada de la
Eq. 3.1 y usando el teorema de la integral de Cauchy de la teora de las variables
complejas. Multiplicando ambos lados de la Eq. 3.1 por zm 1 y entonces integrando
alrededor de un contorno cerrado en el plano z, tenemos que:

X ( z)z dz = x( nT ) z m n 1dz
m 1

C C n=0

De acuerdo al teorema de la integral de Cauchy, si el camino de integracin est


dentro de la ROC, y si la ROC incluye al crculo unitario, la serie x(nT) es
absolutamente convergente. Es entonces valido para intercambiar la
sumatoria y la integracin, resultando:

X ( z ) z m1dz = x( nT ) z m n 1dz
C n=0 C

Si la trayectoria de integracin rodea al origen entonces, de acuerdo al teorema


de la integral de Cauchy, la integral del lado derecho es cero excepto para m = n,
donde para este caso la integral se reduce a 2j. Finalmente obtenemos la integral
de inversin de la transformada Z:

x(nT ) = Z 1[ X ( z )] =
1
X ( z ) z n 1dz (314
. )
2j C

121
La Eq. 3.14 representa un contorno C, dentro del cual X(z) es analtica, esto es,
dejar los polos del sistema pi, estar adentro del contorno cerrado C. Para
transformadas Z racionales, el contorno de integracin esta dado por la Eq. 3.14
pudiendo ser evaluada usando el teorema de los residuos de Cauchy, el cual es
un resultado fundamental obtenido de la teora de variable compleja. Primero
definimos X0(z) como una funcin racional con el denominador expandido en un
producto de factores de los polos:

N ( z)
X 0 ( z ) = X ( z ) z n 1 = N (315
. )
(z p )
mi
i
i =1

Donde N es un entero positivo representando el nmero total de polos y m i es el


orden del polo. Entonces por el teorema de los residuos obtenemos para los polos
adentro del contorno de integracin:

x( nT ) = Re s[ X 0 ( z )]
N

z = pi
n0 (316
. )
i =1

Donde para polos simples, esto es, m = 1, el residuo de X0(z) de pi esta dado por:

[
Re s[ X 0 ( z )] = lim ( z pi ) X 0 ( z )
z = pi z pi
]
= ( z pi ) X 0 ( z ) z = p (317
. )
i

Para un orden de polo mth, (m = 2, 3, .....) el residuo esta dado por:

Re s[ X 0 ( z )] =
z = pi
1 d m1
[
lim m1 ( z pi ) X 0 ( z )
(m 1)! z pi dz
m
]
=
1 d m1
(m 1)! dz m 1 (
m
[
z pi ) X 0 ( z ) ] z = pi
(318
. )

Para los polos de X(z) afuera del contorno de integracin, la suma de los residuos
de X0(z) esta dada por:

x( nT ) = Re s[ X 0 ( z )]
N

z = pi
n<0 (319
. )
i =1

Se debe de notar que para el caso donde X0(z) tiene un polo simple en el origen
donde n = 0, x(0) se determina independientemente. Tambin hay que notar que
los trminos en la transformada Z inversa estn determinados por los polos de la

122
funcin de la transformada, con los ceros afectando solo la magnitud de los
trminos.

3.3.2 INVERSIN POR FRACCIONES


PARCIALES
Considere una funcin racional H(z) dada por:

A0 z m + A1z m1 + A2 z m 2 + + AM
H ( z) = (3.20)
( z p1 )( z p2 )..... ( z p N )
Los coeficientes del polinomio de H(z) se asumen reales, todos los polos y ceros
complejos ocurrirn en pares conjugados complejos, donde zi y pi son los ceros y
polos de la funcin racional (relacin de polinomios).
Para distintos polos la funcin H(z) se expande en la forma:

C1 C2 C
H ( z) = + + + N 1 (3.21)
z p1 z p2 z pn

Multiplicando ambos lados de H(z) por (z - pi) resulta en la ecuacin del residuo:

Ci = ( z pi ) H ( z) z = p i = 1,2,....., N (3.22)
i

La cual da el valor del coeficiente para cualquier polo distinto real o complejo.

123
3.3.3 INVERSIN POR DIVISIN
De la Eq. 3.2 la transformada Z del lado derecho puede ser expandida en una
serie infinita en potencias de z-1 como sigue:

H ( z ) = h( 0T ) + h( T ) z 1 + + h( kT ) z k + + h( nT ) z n +

As, los valores de h(nT) en cualquier instante de tiempo son los coeficientes de
zk . Si H(z) esta dado como una relacin de dos polinomios, los coeficientes
h(0T), h(T), ....., h(nT) pueden ser obtenidos por divisin sinttica del numerador
por el denominador como sigue:

A0 + A1z 1 + A2 z 2 + + AM z M
H ( z) =
1 + B1z 1 + B2 z 2 + + BN z N
= h(0T ) + h(T ) z 1 + h(2T ) z 2 + (3.23)
Por lo tanto, los valores de la secuencia que representan a la transformada Z
inversa son h(nT) para n 0. De la Eq. 3.28 puede verse que la expansin no
resulta en una solucin de forma cerrada. En vez de esto, la transformada Z
inversa obtenida por este mtodo resulta en una secuencia de nmeros. A menos
que la secuencia sea lo bastante simple para deducir una solucin de forma
cerrada, este mtodo no parece tener mucho valor. Sin embargo, provee
conocimiento en el significado de la transformada Z, y en algunos casos una forma
abierta puede ser suficiente.

3.3.4 TEOREMA DE LA CONVOLUCIN


COMPLEJA
La transformada Z del producto de dos secuencias esta dado por:

U ( z ) = x ( nT ) y ( nT ) z n
n=0

X(z) es la transformada Z de x(nT), y Y(z) es la transformada Z de y(nT), tenemos


de la Eq. 3.14 que:

124
1
x( nT ) = X ( v )v n 1dv
2j C
1
y( nT ) = Y ( z ) z n 1dz
2j C

Donde z e y son variables complejas. Entonces el producto de dos secuencias


puede ser expresado en la forma:

1 1 n 1
x( nT ) y( nT ) = ( ) ( )
2j C 2j C
n 1
X v Y z v dv z dz

Finalmente, la transformada Z de x(nT)y(nT) produce:

1 z
U ( z) = X ( v )Y v 1dv (3.24)
2j C v

La Eq. 3.24 es el teorema de la convolucin compleja, donde el contorno de


integracin es un contorno cerrado adentro la superposicin de la ROC para X(v)
y Y(z/v).
Para ver que la Eq. 3.24 tiene la forma de una convolucin, hay que realizar las
siguientes substituciones:

v = e j y z = re j

Donde la trayectoria de integracin es un circulo, y notando que dv = je j d , la


Eq. 3.24 entonces se hace:

2
r
( )
U re j =
1
2 X ( e )Y e d
j ( ) j
(3.25)
0

La cual es reconocida como la integral de convolucin de dos transformadas de


Fourier.
Un caso importante especial de la Eq. 3.24 es obtenido cuando
x(nT ) = y(nT ) y la trayectoria de integracin es el circulo unitario. Haciendo la
substitucin de z = e j , donde dz = je j d y = T , obtendremos:

y (nT ) =
1
( )
Y ( z )Y z 1 z 1dz =
1
( ) (3.26)
2
Y e
j
2
d
n=0 2j C 2 0

La Eq. 3.26 es una forma de la relacin de Parseval. Esta relacin iguala a la


energa en la seal a la energa en el espectro. Es de resaltar que Y(z) se asume
125
que tiene polos adentro del crculo unitario, entonces Y(1/z) tiene polos afuera del
crculo unitario. Para sistemas estables la integral de la Eq. 3.26 es nica evaluada
para polos adentro del circulo unitario en la plano z.
La respuesta del sistema Y(z) a una secuencia de impulso unitario es la
funcin de transferencia H(z), entonces la Eq. 3.26 puede ser expresada en
trminos de H(z). El resultado de la expresin de la Eq. 3.26 como una suma
infinita de cuadrados de la respuesta del impulso unitario puede aplicarse para
obtener la varianza del ruido computacional debido al punto fijo finito de longitud
aritmtica de palabra.

3.4 ANLISIS DE SISTEMAS DISCRETOS


EN TIEMPO

El anlisis de sistemas discretos en tiempo se centra alrededor del concepto de la


funcin de transferencia del sistema. En la propiedad de convolucin se demostr
como la funcin de transferencia H(z) relaciona la respuesta del sistema a una
excitacin X(z), esto es:

Y ( z) = X ( z) H ( z) (3.27)
Cuando la excitacin es un impulso unitario (nT ) , entonces X( z) = 1 y Y( z) = H( z)
.
As, la transformada Z inversa de la funcin de transferencia H(z) produce la
respuesta del sistema al impulso unitario, esto es:

h(nT ) = Z 1[ H ( z)] (3.28)

126
3.5 ESTABILIDAD DEL SISTEMA
De la Eq. 3.16 la respuesta a un impulso unitario de un filtro puede ser expresada
como:

h( nT ) = Re s[ H ( z )] pin 1
z = pi
i =1

j
Donde pi = re
i , esto es, ri y i especifican la magnitud y la localizacin angular de
los polos adentro del circulo unitario y N es el nmero de polos adentro del circulo
unitario. Como un resultado, una condicin necesaria y suficiente para que la
anterior sumatoria converga es que |pi| < 1, para i = 1, 2, ....., N. Por lo tanto, si el
sistema es causal, la respuesta del sistema permanecer limitada si los polos de
la funcin de transferencia estn todos adentro del crculo unitario. Formalmente,
podemos afirmar que un sistema lineal discreto invariante en el tiempo con la
respuesta a un impulso unitario h(nT) es estable si y solo si:

h(nT ) <
n=0
(3.29)

Finalmente, el criterio de estabilidad puede ser evaluado por el descubrimiento de


los polos de la funcin de transferencia.

127
CAPTULO 4
DISEO DE FILTROS DIGITALES DE
RESPUESTA AL IMPULSO FINITO

4.0 INTRODUCCIN
En algunas aplicaciones, se requiere cambiar las amplitudes relativas de
los componentes de frecuencia de una seal o quizs eliminar por completo
algunos de ellos. A este proceso se le llama filtrado.
Los filtros digitales de respuesta al impulso finito (FIR) tambin son
conocidos como filtros no recursivos. Los filtros de respuesta al impulso finito (FIR)
su nombre lo obtienen de la siguiente propiedad: una seal impulso (p. ej. la
secuencia de muestras {1,0,0,0,. ..}) se alimenta de los resultados de un filtro FIR
en una salida la cual decae a cero despus de un nmero finito de iteraciones. (La
respuesta al impulso es de una importancia fundamental en el procesamiento de
seales y la ingeniera elctrica porque puede usarse completamente para
caracterizar la respuesta en frecuencia de un sistema para cualquier seal de
entrada.).
Para los filtros FIR la respuesta del filtro depende solo de la presente y
pasada muestras de entrada, mientras que para los filtros IIR si nT es tomada
como el tiempo presente, la respuesta presente es una funcin de los N valores
presentes y pasados de la excitacin adems de la respuesta de los valores
pasados.

128
4.1 CARACTERSTICAS DE LOS FILTROS
DIGITALES FIR
Algunas ventajas y desventajas de los filtros FIR comparados con sus
contrapartes los IIR son las siguientes:

1. Los filtros FIR pueden ser diseados con una fase lineal exacta. La fase lineal
es importante, debido a que en algunas aplicaciones la distorsin de fase
causada por la no linealidad de fase puede degradar el desempeo del
sistema, por ejemplo, procesamiento de voz, transmisin de datos, y
procesamiento de correlacin.
2. Los filtros FIR no recursivos son inherentemente estables, esto es, la respuesta
del filtro al impulso es de longitud finita y por lo tanto limitada.
3. El ruido de cuantizacin debido a la precisin aritmtica finita puede hacerse
despreciable para implementaciones no recursivas.
4. Los problemas de exactitud de los coeficientes inherente a el pronunciado
corte de los filtros IIR pueden hacerse menos severos para implementaciones
de igual corte en los filtros FIR.
5. Los filtros FIR pueden ser eficientemente empleados en sistemas multitareas
DSP.
6. Una desventaja de los filtros FIR comparados con los filtros IIR es que un orden
de filtro apreciablemente alto es requerido para lograr una respuesta de
magnitud especifica, con lo cual se requiriere ms almacenaje para el
coeficiente del filtro.

129
4.2 PROPIEDADES DE LOS FILTROS FIR

4.2.1 F ASE L INEAL DE LOS F ILTROS

La funcin de transferencia de un filtro FIR causal esta dada por:


N 1
H ( z ) = h( n ) z n (4.1)
n=0

Donde h(n) es la respuesta al impulso del filtro. La ecuacin de diferencias de un


filtro FIR es obtenida tomando la transformada Z inversa de la Eq. 4.1, esto es:
N 1
y( nT ) = h( n) x(iT nT ) (4.2)
n=0

La cual puede ser reconocida como la sumatoria de la convolucin. Note que la


respuesta al impulso finito es idntica a los coeficientes del filtro.
De la Eq. 4.1 la transformada de Fourier de la secuencia finita h(n) esta
dada por:
N 1

( )
H e jT = h( n)e jnT = H e jT e j ( ) ( ) (4.3)
n=0

Y la respuesta de magnitud y de fase estn definidas como:

M ( ) = H e jT( )
( ) = tan 1
Im H e jT ( ) (4.4)
Re H e ( jT
)
Ahora definiremos las funciones de retardo de fase y de retardo de grupo (tiempo)
de un filtro como sigue:

( ) d ( )
p = y g = (4.5)
d

Donde el retardo de grupo esta definido como el retardo de la respuesta del filtro
como una funcin de a una seal. Los filtros para los cuales p y g son

130
constantes, esto es, independientemente de la frecuencia, se refiere como una
constante de retardo de tiempo o filtros de fase lineal.
Por lo tanto, para que la respuesta de fase sea lineal se requiere:

( ) = < < (4.6)


Donde es una constante de retardo de fase en muestras. De las Eqs. 4.3, 4.4, y
4.6 la respuesta de fase puede ser expresada como:

N 1
h( n) sen(nT )
( ) = = tan 1 n=0
N 1 (4.7)
h(n) cos(nT )
n=0

N 1

h(n) sen(nT )
tan( ) = n=0
N 1 (4.8)
h(n) cos(nT )
n=0

Finalmente, obtenemos:
N 1

h(n) sen( nT ) = 0
n=0
(4.9)

Se puede mostrar que una solucin a la Eq. 4.9 esta dada por:

( N 1)T
= (4.10)
2

h(n) = h[( N 1 n)] para 0 < n < N 1 (4.11)


Por lo tanto, los filtros FIR tendrn constantes de retardo de fase y de grupo si las
condiciones de la Eqs. 4.10 y 4.11 son satisfechas. De la propiedad de simetra
de la Eq. 4.11, podemos ver que la Eq. 4.1 resultar en un polinomio imagen de
espejo.
Considerando las condiciones de simetra de la respuesta al impulso para N impar
y par. De la Eq. 4.10 es un entero para N impar y la respuesta al impulso es
simtrica respecto al punto muestra (N - 1) / 2. Esto implica que el retardo del filtro
es un nmero entero de muestras. Para N par, podemos ver que ser un nmero
131
no entero, el retardo del filtro es un nmero no entero de muestras. Una secuencia
de impulsos de un filtro tpico para N impar y par se muestra en la Fig. 4.1. De la
Fig. 4.1 podemos ver que el centro de simetra de la respuesta al impulso para N
par no se encuentra en el centro entre los coeficientes (N - 2) / 2 y N / 2, y para
N impar en (N - 1) / 2. Las funciones que demuestran este tipo de coeficientes de
simetra son generalmente referidas como polinomios de imagen de espejo.
En aplicaciones donde solo la constante de retardo de grupo es deseable,
puede mostrarse que la respuesta al impulso es de la forma:

h( n) = h( N 1 n) (4.12)
La respuesta al impulso dada por la Eq. 4.12 es antisimtrica respecto al centro
de la secuencia de respuesta al impulso descrita.

132
4.2.2 R ESPUESTA EN F RECUENCIA DE LOS
F ILTROS FIR DE F ASE L INEAL
La respuesta en frecuencia para filtros causales de fase lineal con N impar puede
ser obtenida por la expresin de la Eq. 4.3 como:

( N 3) / 2
N 1 j ( N 1) T / 2
He ( jT
) = h(n)e jnT
+ h
2
e
n=0
N 1
+ h(n)e
n = ( N +1) / 2
jnT
(4.13)

De la Eq. 4.11, substituyendo m = N - 1 - n, cambiando los limites de la sumatoria,


y finalmente haciendo m = n, la ltima sumatoria se hace:

N 1 ( N 3) / 2
h(n)e jnT =
n = ( N +1) / 2
h(n)e
n=0
j ( N 1 n ) T
(4.14)

Substituyendo la Eq. 4.14 en la Eq. 4.13, obtenemos:

( N 3) / 2
(
H e jT =) h(n)[e jnT
+ e j ( N 1 n ) T + h]
N 1 j ( N 1) T / 2
2
e (4.15)
n=0

Factorizando e j (N1) T /2 en la Eq. 4.15 y haciendo k = ( N - 1) / 2 - n obtenemos:

( N 1) / 2 N 1 jkT N 1
( )
H e jT = e j ( N 1) T / 2 h k e + e jkT + h (

2
) (4.16)
k =1 2

La Eq. 4.16 puede ser ahora simplificada a la forma:

( N 1) / 2
(
H e jT
)=e j ( N 1) T / 2
a( k ) cos kT = e
j ( N 1) T / 2
M ( )
k =0
N 1 N 1
a( 0) = h a ( k ) = 2 h k (4.17)
2 2

La Eq. 4.17 define la respuesta en frecuencia de un filtro FIR causal con fase lineal
variable. Se debe de notar que la funcin coseno es real y representa la respuesta
en frecuencia.
La funcin de respuesta de fase ( ) = (N 1) T / 2 representa la constante de
retardo de (N 1) / 2 unidades en tiempo de muestreo. Deber tambin enfatizarse
133
que cuando la funcin de respuesta en frecuencia M() llega a ser negativa,
radianes debern agregarse a la funcin de respuesta de fase ().
Usando una derivacin similar, de la respuesta en frecuencia, las funciones
para el caso simtrico con N par y los dos casos de antisimtria resultan en las
funciones de respuesta en frecuencia dadas en la tabla 4.1.
Para considerar la respuesta en frecuencia de la respuesta al impulso de
un sistema no causal. Nuevamente consideraremos el caso para la respuesta a
un impulso simtrico con N impar, donde para el caso no causal h(n) = h(-n), la
cual corresponde a una fase de filtro cero. La respuesta en frecuencia esta dada
por:

H ( z ) = h( n) z n
M

n = M
1
= h( n) z n + h( 0) + h( n) z n
M

n = M n =1

= h( n) z n + h( 0) + h( n) z n
M M

n =1 n =1

[
= h( 0) + h( n) z n + z n ]
M

n =1

Si evaluamos H(z) para z = e jT , obtenemos:

( )
M M
H e jT = h( 0) + 2h( n) cos nT = a ( n) cos nT (4.18)
n =1 n=0

TABLA 4.1
RESPUESTA EN FRECUENCIA DE LA CONSTANTE DE RETARDO DE FILTROS NO RECURSIVOS
h(nT) N (
H e j T )
Simtrica Impar ( N 1) / 2
e j ( N 1) T / 2 a
k =0
k cos kT

Simtrica Par N /2
1
e j ( N 1) T / 2 bk cos k T
k =1 2
Asimtrica Impar ( N 1) / 2
e [ ( )
j N 1 T / 2 / 2 ]
a
k =1
k sen kT

Asimtrica Par N /2
1
e [ ( )
j N 1 T / 2 / 2 ]

k =1
bk sen k T
2
Donde ( N 1)T N 1 N
: a0 = h a k = 2h k T bk = 2h k T
2
2
2

Donde:

134
a ( 0) = h( 0)
a ( n ) = 2 h( n ) n = 1,2,.........., ( N 1) / 2
M = ( N 1) / 2

La Eq. 4.18 representa la respuesta en frecuencia de un sistema no causal. Para


obtener la respuesta en frecuencia deseada de un sistema causal, es necesario
retardar la respuesta al impulso de un sistema no causal (N -1) / 2 muestras. Este
retardo corresponde al cambio de fase de e j (N1) T /2 , el cual es equivalente a la
Eq. 4.17. Note que para este caso la respuesta en frecuencia es compleja,
considerando para el sistema no causal una fase de filtro cero la respuesta en
frecuencia es puramente real.

4.3 MTODO DE LAS SERIES DE FOURIER


PARA EL DISEO DE FILTROS FIR
La respuesta en frecuencia de un filtro digital es peridica con periodo igual a la
frecuencia de muestreo F. Del anlisis de las series de Fourier sabemos que
cualquier funcin peridica puede expresarse como una combinacin lineal de
exponenciales complejas. Por lo tanto, la respuesta en frecuencia deseada de un
filtro digital FIR puede ser representada por las series de Fourier.

(
H e j 2fT = ) h ( n )e d
j 2 fnT
(4.19)
n =

Donde los coeficientes de Fourier hd(n) son los deseados a la respuesta de la


secuencia del impulso del filtro, los cuales pueden ser determinados de:

F /2

H (e )e
1
hd (n) = j 2 fT j 2 fnT
df (4.20)
F F /2

Si en la Eq. 4.19 substituimos e jT = z , obtenemos la funcin de transferencia del


filtro digital, esto es:

H ( z) = h ( n) z
n =
d
n
(4.21)

Observe estos dos problemas de implementacin con la Eq. 4.21; esto es, la
funcin de transferencia representa un filtro digital no causal de duracin infinita.
Una duracin finita de un filtro causal puede ser obtenida por el truncamiento de
135
la respuesta al impulso de duracin infinita y multiplicando la respuesta resultante
del impulso de duracin finita por z (N1) /2 . Para N impar obtenemos:

( N 1) / 2 ( N 1) / 2
H ( z ) = z ( N 1) / 2 h d( )n z n
= z ( N 1) / 2
h 0 + (
d ( ) hd ( n) z + z
n n
) (4.22)
n = ( N 1) / 2 n =1

Podemos ver de la Eq. 4.22 que la causalidad se trajo multiplicando la funcin de


transferencia por el factor de retardo (vea la Eq. 4.10). Esta modificacin no
afecta la amplitud de respuesta del filtro; sin embargo, el truncamiento brusco de
las series de Fourier resulta en oscilaciones en la banda de paso y en la banda de
rechazo. Estas oscilaciones son debido a la lenta convergencia de las series de
Fourier, particularmente cerca de los puntos de discontinuidad. Este efecto se
conoce como el fenmeno de Gibbs. Se mostrar que las oscilaciones
indeseables pueden ser reducidas por la multiplicacin de los coeficientes de
respuesta al impulso deseados por una funcin ventana apropiada.
La magnitud (amplitud) de la respuesta de un filtro FIR puede ser obtenida
de la Eq. 4.22 substituyendo z = e jT , esto es:

( N 1) / 2
M ( ) = hd ( 0) + 2 h (n) cosnT
n =1
d (4.23)

Donde M() esta tambin dado en la tabla 4.1 para el caso de N impar simtrica;
sin embargo, la respuesta al impulso dada en la Eq. 4.23 es no causal. La relacin
entre la respuesta al impulso causal y no causal (coeficientes del filtro) se muestra
en la Fig. 4.2.

Evaluando la respuesta en frecuencia de la Eq. 4.23 como una funcin de


la banda de paso y de la frecuencia de muestreo, para una familia N creciente
demuestra el comportamiento de las oscilaciones en la banda de paso y en la
banda de rechazo; esto es, como la longitud de h d(n) se incrementa, la amplitud
de las oscilaciones disminuye. Sin embargo, la amplitud del rizo cerca la
discontinuidad tiende a permanecer sin cambio (oscilaciones de Gibbs).

136
4.3.1 F UNCIONES VENTANA

El truncamiento de las series de Fourier produce los filtros FIR con oscilaciones
indeseables en la banda de paso y en la banda de rechazo, las cuales resultan de
la lenta convergencia de las series de Fourier. Para reducir estas oscilaciones,
una clase particular de funciones son usadas para modificar los coeficientes de
Fourier (respuesta al impulso). Esta limitacin en tiempo de las funciones de peso
se refiere generalmente como funciones ventana. El truncamiento de las series
infinitas de Fourier es equivalente a la multiplicacin de los coeficientes con la
ventana rectangular:

N 1
1 para n
a R ( n) = 2 (4.24)
0 en otro punto

Obteniendo:

h( n) = hd ( n)a R ( n) (4.25)
La multiplicacin en el dominio del tiempo corresponde a la convolucin en el
dominio de la frecuencia, un criterio de diseo de los filtros FIR es encontrar una
funcin ventana finita cuya transformada de Fourier tiene un nivel bajo en los
lbulos laterales con respecto al pico del lbulo principal.
Del teorema de la convolucin compleja tenemos:

2 F

( ) H(e ) A(e )d
1
HA e jT
= j T( j )T
(4.26)
2F 0

( )
Por lo tanto, HA e jT es una convolucin circular de la respuesta en frecuencia
deseada con la transformada de Fourier de la funcin ventana. Como un resultado,
la discontinuidad en la respuesta en frecuencia deseada se hace en las bandas
(
de transicin de HA e jT . )
Adems, puede mostrarse que el ancho de la banda de transicin es una funcin
de la longitud N de la funcin ventana.
Como se muestra arriba, una tcnica para el diseo de los filtros digitales
FIR es multiplicar la respuesta al impulso deseada hd por una clase de funciones
en el dominio del tiempo conocidas como funciones ventana; por lo tanto, en
general tenemos:

h( n) = hd ( n)a( n) (4.27)

137
F UNCIN DE LA VENTANA R ECTANGULAR

La funcin de la ventana rectangular esta dada por la Eq. 4.24. El espectro R(n)
puede ser obtenido de la Eq. 4.19 como:

( N 1) / 2 N 1

(
AR e jT =) e jnT = e j ( N 1)T / 2 e jnT
n = ( N 1) / 2 n=0
jNT jNT / 2
1 e e e jNT / 2
= e j ( N 1) T / 2 =
1 e jT e jT / 2 e jT / 2
sen(NT / 2)
= (4.28)
sen(T / 2)

El nivel ms alto (primero) del lbulo lateral es de aproximadamente 13 dB abajo


del pico del lbulo principal y el rolloff es de 6 dB por octava. Consideramos la
respuesta en frecuencia para una ventana rectangular causal, esto es:

N 1
sen(NT / 2)
( )
AR e jNT = e jnT = e j ( N 1) T / 2
sen(T / 2)
(4.29)
n=0

Como se esperaba, la respuesta de la fase lineal esta dada por


( ) = (N 1) T / 2 , mientras que la respuesta al impulso de un sistema no
causal resulta en una fase de filtro cero.

138
F UNCIN VENTANA DE HAMMING

La funcin de la ventana de Hamming esta dada por:

2n N 1
0.54 + 0.46 cos para n
a H ( n) = N 1 2 (4.30)
0
en otro punto

El espectro de la ventana de Hamming puede ser obtenido notando que:

2n
a H ( n) = a R ( n) 0.54 + 0.46 cos (4.31)
N 1

De la Eq. 4.31 entonces obtenemos:

sen(NT / 2) sen[NT / 2 N / ( N 1)]


( )
AH e jT = 0.54
sen(T / 2)
+ 0.46
sen[T / 2 / ( N 1)]
sen[NT / 2 + N / ( N 1)]
+ 0.46 (4.32)
sen[T / 2 + / ( N 1)]

Donde el nivel ms alto del lbulo lateral es de aproximadamente -43 dB y el rolloff


del lbulo lateral es de 6 dB/octava. Note que la funcin ventana es no causal, los
trminos en la Eq. 4.32 son todos positivos. Para la ventana causal el segundo y
el tercer trmino son negativos, la cual es usada de esta forma para el
procesamiento de la transformada discreta de Fourier. La Eq. 4.32 se conoce
tambin como la convolucin de los tres puntos en el dominio de la frecuencia,
donde los coeficientes de la convolucin son 0.46, 0.54, 0.46, respectivamente.

139
F UNCIN VENTANA DE BLACKMAN

La funcin no causal de la ventana de Blackman esta dada por:

2n 4n N 1
0.42 + 0.5 cos + 0.08 cos para n <
a B ( n) = N 1 N 1 2 (4.33)
0
en otro punto

Se puede demostrar que el espectro de la ventana de Blackman tiene su nivel


ms alto de lbulo lateral abajo de -58 dB del pico del lbulo principal.

F UNCIN VENTANA DE K AISER

Para las ventanas anteriores el ancho del lbulo principal es inversamente


proporcional a N, esto es, aumentando la longitud de la ventana disminuye el
ancho del lbulo principal, lo cual resulta en un decremento en la banda de
transicin del filtro. Sin embargo, la mnima atenuacin en la banda de rechazo es
independiente de la longitud de la ventana y es una funcin de la ventana
seleccionada. Por lo tanto, para lograr la atenuacin deseada en la banda de
rechazo el diseador debe de encontrar una ventana que se encuentre en las
especificaciones de diseo. Se debe tambin enfatizar que las ventanas con bajos
niveles en los lbulos laterales tienen anchos ms amplios en el lbulo principal
que requieren de un aumento en el orden N del filtro para lograr el ancho de
transicin deseado.
Las ventanas de Kaiser tienen un parmetro variable, , el cual puede
variarse para controlar el nivel del lbulo lateral con respecto al pico del lbulo
principal. Similar a las otras ventanas el ancho del lbulo principal puede ser
variado ajustando la longitud de la ventana, lo cual ajusta a su vez el ancho de
transicin del filtro. Por lo tanto, los filtros digitales FIR pueden ser eficientemente
diseados usando la funcin de la ventana de Kaiser.
Del procedimiento discutido puede verse que una propiedad deseable de
una funcin ventana es que la funcin sea de duracin limitada en el dominio del
tiempo y que la transformada de Fourier se aproxime mejor a una funcin limitada
en banda, esto es, que tenga una mxima energa en el lbulo principal para una
amplitud pico de lbulo lateral dada. Las funciones esferoidales avanzadas tienen
esta propiedad deseada en un sentido ptimo; sin embargo, la forma de estas
funciones es complicada y por lo tanto difcil de calcular. Una aproximacin simple
a estas funciones ha sido desarrollada por Kaiser en trminos de cero orden
modificando las funciones de Bessel en el primer trmino, esto es, I0(x). Esta
funcin ventana esta dada por:

140
I0 ( ) N 1
para n
a K (n) = I 0 ( ) 2 (4.34)
0
en otro punto

Donde es una variable independiente empiricamente determinada por Kaiser. El


parmetro esta expresado por:

0.5
2n 2
= 1 (4.35)
N 1

La modificacin de la funcin de Bessel en el primer trmino, I0(x), puede ser


calculada de su expansin a series de potencias dada por:

( ) + (0.25x )
2 2 2 3
1 x k 0.25x 2 0.25x 2
I0 ( x) = 1 + = 1 + + + (4.36)
k ! 2
n =1 (1!)2 (2!)2 (3!)2
Esta serie converge rpidamente y puede ser calculada para cualquier exactitud
deseada, donde 25 trminos son suficientes para mayor precisin en el resultado.
El espectro de la ventana de Kaiser puede ser obtenido de:

( N 1) / 2 ( N 1) / 2
a K (n)e jnT = a K (0) + 2
n = ( N 1) / 2
a (n) cosnT
n =1
K (4.37)

141
Considerando las especificaciones de diseo del filtro pasa bajas de la
Fig. 4.3a, donde el actual rizo en la banda de paso (Ap) y la mnima atenuacin
en la banda de rechazo (As) en decibeles estn dados por:

1+ p
Ap = 20 log10 (4.38)
1 p

As = 20 log10 ( s ) ( 4.39)
El ancho de la banda de transicin esta dado por:

F = f s f p ( 4.40)

142
4.3.2 DISEO DE F ILTROS FIR USANDO LA
F UNCIN DE LA VENTANA DE K AISER

El siguiente procedimiento de diseo es derivado del trabajo hecho por Kaiser y


Antoniou pudiendo ser usado para el diseo de filtros digitales FIR usando el
mtodo de las series de Fourier (ventana). Se demostrara que el procedimiento
puede ser usado para el diseo de filtros pasa bajas (LP), pasa altas (HP), pasa
banda (BP), y rechaza banda (BS) para la duracin de la respuesta al impulso de
N coeficientes impares.

ESPECIFICACIONES DE DISEO

1. Tipo de filtro: LP, HP, BP, BS.


2. Frecuencias criticas en la banda de paso y en la banda de rechazo en Hz:
LP/HP: fp y fs
BP/BS: fp1, fp2, fs1, y fs2 (ver Fig. 4.3).
3. Rizo en la banda de paso y mnima atenuacin en la banda de rechazo en
decibeles positivos: Ap y As.
4. Frecuencia de muestreo en Hz: F.
5. Orden del filtro N impar.

143
P ROCEDIMIENTO DE DISEO

1. Determine de acuerdo con las Eqs. 4.38 y 4.39, donde el actual parmetro
de diseo puede ser determinado de:

= min( p , s ) (4.41)

Donde de las Eqs. 4.38 y 4.39 obtenemos:

10 p 1
0.05 A

s = 100.05 A s
p = (4.42)
10 p + 1
0.05 A

2. Determine el parmetro de la ecuacin emprica de diseo.

0 para As 21

= 0.5842( As 21) + 0.07886( As 21) para 21 < As 50 (4.43)
0.4


01102
. ( As 8.7) para As > 50

3. Determine el parmetro D de la ecuacin emprica de diseo.

0.9222 para As 21

D = As 7.95 (4.44)
14.36 para As > 21

4. Calcule el orden del filtro para un valor bajo impar de N.

FD
N +1 (4.45)
F

5. Calcule la respuesta al impulso modificada usando las Eqs. 4.27, 4.34, y 4.51,
esto es:

N 1
h( n ) = a K ( n )hd ( n ) para n (4.46)
2

6. La funcin de transferencia esta dada por:

( N 1) / 2
(
H ( z ) = z ( N 1) / 2 h( 0) + 2 h( n) z n + z n ) (4.47)
n=0

144
Donde:

h(0) = a K (0)hd (0)


h(n) = a K (n)hd (n) (4.48)
La respuesta en magnitud puede ser obtenida de la Eq. 4.47, esto es:

( N 1) / 2
M ( ) = h( 0) + 2 h(n) cos(2fnT )
n =1
(4.49)

La cual es equivalente a la Eq. 4.23; sin embargo, para este caso h(n)
representa la respuesta al impulso modificada.

4.3.3 ECUACIONES GENERALES DE DISEO DE


F ILTROS FIR

Ahora consideraremos las ecuaciones de diseo para filtros digitales FIR pasa
bajas, pasa altas, pasa banda y rechaza banda.

F ILTROS FIR P ASA BAJAS

2 f c sen( 2nf c / F )
para n > 0
F 2nf c / F
hd ( n) = (4.50)
2 fc para n = 0
F

Donde:

(
f c = 0.5 f p + f s ) F = f s f p (4.51)

145
F ILTROS FIR P ASA A LTAS

2 f c sen( 2nf c / F )
para n > 0
F 2nf c / F
hd ( n) = (4.52)
1 2 f c para n = 0
F

Donde:

(
f c = 0.5 f p + f s ) F = f p f s (4.53)

F ILTROS FIR P ASA BANDA

1
[
n sen(2nf c 2 / F ) sen(2nf c1 / F ) ] para n > 0
hd (n) = (4.54)
2 ( f c 2 f c1 ) para n = 0
F

Donde:

F F
f c1 = f p 1 f c2 = f p2 +
2 2
F1 = f p1 f s1 F2 = f s 2 f p 2 (4.55)
F = min[ F1 , F2 ]

146
F ILTROS FIR R ECHAZA BANDA

1
[
n sen(2nf c1 / F ) sen(2nf c 2 / F ) ] para n > 0
hd (n) = (4.56)
2 ( f c1 f c 2 ) + 1 para n = 0
F

Donde:

F F
f c1 = f p 1 + f c2 = f p2
2 2
F1 = f s1 f p1 F2 = f p 2 f s 2 (4.57)
F = min[ F1 , F2 ]

147
4.4 PROGRAMA DE DISEO DE FILTROS
DIGITALES FIR
DESCRIPCIN
El proyecto consiste en un programa que simula los filtros digitales de
respuesta al impulso finito (FIR) en sus cuatro tipos (Pasa Bajas, Pasa Altas, Pasa
Banda y Rechaza Banda), con cuatro tipos de ventana (Rectangular, Hamming,
Blackman y Kaiser).
En el programa se pueden observar o comparar los cambios que sufren los
filtros digitales FIR al cambiar uno o varios de sus parmetros, como son:
frecuencias de paso y de rechazo y atenuaciones en la banda de paso y de
rechazo; as como tambin el tipo de ventana.
En el programa estn definidas las funciones seno, pulso y tringulo; estas
seales estn previamente discretizadas para posteriormente convolucionar las
muestras de dichas seales con los coeficientes ya ventaneados de los filtros; y
as obtener la respuesta del filtro a dicha seal.
El programa tiene una proteccin por si el usuario introduce una atenuacin
en la banda de rechazo que no corresponda a la ventana escogida, indicndole
cual es el mximo que atena dicha ventana.
El programa tambin le permite al usuario escoger el periodo y la amplitud
en el caso de las funciones pulso y tringulo y en el caso de la funcin seno la
amplitud y la frecuencia.
Este programa fue elaborado en Turbo C Ver. 2.0 y requiere de un monitor
VGA color y de 4 MB de memoria RAM.

148
4.4.1 FUNCIONES DEL MATLAB QUE INTERVIENEN
EN EL PROCESO DE FILTRADO

LA FUNCIN BUTTER

Diseo de un filtro digital Butterworth.


[B, A] = BUTTER(N, Wn) disea un filtro digital butterworth pasa bajas de ensimo
orden y retorna los coeficientes del filtro en una longitud de N+1 vectores B y A.
La frecuencia de corte Wn debe tener el siguiente rango 0.0 < Wn < 1.0, con 1.0
correspondiendo a la mitad del valor de la muestra.
Si Wn es un vector de dos elementos, Wn = [W1 W2], BUTTER retorna un
orden 2N de filtro pasa banda con una banda de paso W1 < W < W2.
[B, A] = BUTTER(N, Wn, 'high') diseo de un filtro pasa altas.
[B, A] = BUTTER(N, Wn, 'stop') es un filtro rechaza banda si Wn = [W1 W2].
Cuando se usa con tres elementos a la izquierda, como en
[Z, P, K] = BUTTER(...), los ceros y polos son retornados en una longitud N de
vectores columna Z y P, y la ganancia en una escala K.
Cuando usamos cuatro elementos a la izquierda, como en
[A, B, C, D] = BUTTER(...), el espacio entre matrices es retornado.

LA FUNCIN CHEBY1

Diseo de filtros digitales Chebyshev de tipo 1.


[B, A] = CHEBY1(N, R, Wn) disea un filtro digital Chebyshev pasa bajas de
ensimo orden con R decibeles de rizo en la banda de paso.
CHEBY1 retorna los coeficientes del filtro en una longitud de N+1 vectores B y A.
La frecuencia de corte Wn debe de estar en el siguiente rango 0.0 < Wn < 1.0, con
1.0 correspondiendo a la mitad del valor de la muestra. Usando R = 0.5 como un
punto de partida, si tu estas inseguro al escoger R.
Si Wn es un vector de dos elementos, Wn = [W1 W2], CHEBY1 retorna un
orden 2N de filtro pasa banda con una banda de paso de W1 < W < W2.
[B, A] = CHEBY1(N, R, Wn, 'high') disea un filtro pasa altas.
[B, A] = CHEBY1(N, R, Wn, 'stop') es un filtro rechaza banda si Wn = [W1 W2].
Cuando usamos tres elementos a la izquierda, como en
[Z, P, K] = CHEBY1(...), los ceros y polos son retornados en una longitud N de
vectores columna Z y P, y la ganancia en una escala K.
Cuando usamos cuatro elementos a la izquierda como en
[A, B, C, D] = CHEBY1(...), el espacio entre matrices es retornado.

149
LA FUNCIN CHEBY2

Diseo de un filtro digital Chebyshev de tipo 2.


[B, A] = CHEBY2(N, R, Wn) disea un filtro digital Chebyshev pasa bajas de
ensimo orden con un rizo en la banda de rechazo de R decibeles.
CHEBY2 retorna los coeficientes del filtro en una longitud de N+1 vectores B y A.
La frecuencia de corte Wn debe de estar en el siguiente rango 0.0 < Wn < 1.0, con
1.0 correspondiendo a la mitad del valor de la muestra. Usando R = 20 como un
punto de partida, si tu estas inseguro al escoger R.
Si Wn es un vector de dos elementos, Wn = [W1 W2], CHEBY2 retorna un
orden 2N de filtro pasa banda con una banda de paso de W1 < W < W2.
[B, A] = CHEBY2(N, R, Wn, 'high') disea un filtro pasa altas.
[B, A] = CHEBY2(N, R, Wn, 'stop') es un filtro rechaza banda si Wn = [W1 W2].
Cuando usamos tres elementos a la izquierda, como en
[Z, P, K] = CHEBY2(...), los ceros y polos son retornados en una longitud N de
vectores columna Z y P, y la ganancia en una escala K.
Cuando usamos cuatro elementos a la izquierda como en
[A, B, C, D] = CHEBY2(...), el espacio entre matrices es retornado.

LA FUNCIN FREQZ

Transformada Z respuesta en frecuencia de un filtro digital. Cuando N es


un entero, [H, W] = FREQZ(B, A, N) retorna los N puntos frecuencia del vector W
y los N puntos complejos de la respuesta en frecuencia del vector G del filtro B/A:

B( z ) b(1) + b(2) z 1 +..........+b(nb + 1) z nb


( )
H e jw =
A( z )
=
1 + a(2) z 1 +..........+a(na + 1) z na

Dados los coeficientes de numerador y un denominador en los vectores B y A. La


respuesta en frecuencia es evaluada a N puntos igualmente espaciados alrededor
de la mitad de la parte superior del circulo unitario. Para graficar la magnitud y la
fase de un filtro:

[h, w] = freqz(b, a, n);


mag = abs(h), phase = angle(h);
semilogy(w, mag), plot(w, phase)

FREQZ(B, A, N, 'whole') usa N puntos alrededor de todo el circulo unitario.


FREQZ(B, A, W) retorna la respuesta en frecuencia de las frecuencias designadas
en el vector W, normalmente entre 0 y .

150
LA FUNCIN YULEWALK

Diseo de filtros recursivos usando el mtodo de los mnimos cuadrados.


[B, A] = YULEWALK(N, F, M) encontraremos el ensimo orden de un filtro
recursivo cuyos coeficientes B y A son proporcionados por el filtro:

B( z ) b(1) + b( 2) z 1 +..........+b( n) z ( n 1)
( )
H e jw
=
A( z )
=
1 + a( 2) z 1 +..........+ a( n) z ( n 1)

Igualmente la magnitud de la respuesta en frecuencia esta dada por los vectores


F y M.
Los vectores F y M especifican la frecuencia y la magnitud de los puntos de
ruptura para el filtro dicho que PLOT(F, M) mostrar la grfica de la respuesta en
frecuencia deseada. Las frecuencias en F deben estar entre 0.0 y 1.0, con 1.0
correspondiendo a la mitad del valor de la muestra. Estas deben de estar
incrementando su orden y comenzar con 0.0 y finalizar con 1.0.

LA FUNCIN FILTER

Y = FILTER(B, A, X) filtra los datos en el vector X con el filtro descrito por


los vectores A y B para crear los datos filtrados en Y. El filtro es un "Cambio Directo
a la Forma II" implementado a la a la ecuacin estandar de diferencias:

y(n) = b(1) x(n) + b(2) x(n 1)+.....+b(nb + 1) x(n nb)


a(2) y(n 1).....a(na + 1) y(n na )

[Y, Zf] = FILTER(B, A, X, Zi) da el acceso a las condiciones iniciales y finales, Zi y


Zf, de los retardos.

151
P ROGRAMA F UENTE
/* FILTROS DIGITALES FIR DE ORDEN IMPAR */

#include <math.h>
#include <conio.h>
#include <graphics.h>
#define N 760
#define PI 3.141592654
#define TRUE 1

/* M E N U S */

void LP(void);
void HP(void);
void BP(void);
void BS(void);
void signal_lp_rectangular(void);
void signal_lp_hamming(void);
void signal_lp_blackman(void);
void signal_lp_kaiser(void);
void signal_hp_rectangular(void);
void signal_hp_hamming(void);
void signal_hp_blackman(void);
void signal_hp_kaiser(void);
void signal_bp_rectangular(void);
void signal_bp_hamming(void);
void signal_bp_blackman(void);
void signal_bp_kaiser(void);
void signal_bs_rectangular(void);
void signal_bs_hamming(void);
void signal_bs_blackman(void);
void signal_bs_kaiser(void);

/* T I P O D E F I L T R O */

void pasa_bajas(void);
void pasa_altas(void);
void pasa_banda(void);
void rechaza_banda(void);

/* T I P O D E V E N T A N A */

void rectangular(void);
void hamming(void);
void blackman(void);
152
void kaiser(void);

/* P R E S E N T A C I O N */

void presentacion(void);

/* R E S P U E S T A E N F R E C U E N C I A */

void respuesta_frecuencia(void);

/* E J E S */

void ejes(void);
void ejes2(void);
void ejes3(void);
void ejes_convolucion1(void);
void ejes_convolucion2(void);

/* G R A F I C O S */

void graficos(void);

/* G R A F I C A */

void grafica(void);

/* S E A L E S */

void pulso_c(void);
void seno(void);
void triangular(void);

/* F U N C I O N E S */

void sen(void);
void pulso(void);
void triangulo(void);
void senal(void);

/* C O N V O L U C I O N */

void convolucion(void);
void dibujo(void);

float hPb[N],h[N],alfa,f,ak[N],ap,as,fs1,fs2,fp1,fp2,d,dp,ds,y,x,aaa,fc,df;
float w,d,df1,df2,fc1,fc2,ord,fmin,n1,fc11,fc22,beta[N],aa,ibeta[N],M[N];
153
float aw,fs,fp,ar[N],ah[N],ab[N],i,k,j,yy[N],sum[N],signal[N],cont,a,t,ff;
int n,c,n2,gd,gm,color,u,xx,q,tt;
double nn,hh,ii,ialfa;
char ch,cl,p[20];

/********** M E N U P R I N C I P A L **********/

void main(void)
{
presentacion();
while(TRUE)
{
clrscr();
gotoxy(33,8);printf("TIPO DE FILTRO");
gotoxy(31,10);printf("1.- Pasa Bajas.");
gotoxy(31,11);printf("2.- Pasa Altas.");
gotoxy(31,12);printf("3.- Pasa Banda.");
gotoxy(31,13);printf("4.- Rechaza Banda.");
gotoxy(31,14);printf("S.- Salir.");
gotoxy(31,16);printf("Pulse su opcin...");
ch=getche();
switch(ch)
{
case '1':
LP();
break;
case '2':
HP();
break;
case '3':
BP();
break;
case '4':
BS();
break;
case 'S':
exit(0);
case 's':
exit(0);
default:
;
}
}
}

void presentacion(void)
154
{
graficos();
rectangle(0,0,639,479);
rectangle(10,10,629,469);
setfillstyle(1,1);
floodfill(320,240,WHITE);
settextjustify(CENTER_TEXT,CENTER_TEXT);
settextstyle(TRIPLEX_FONT,HORIZ_DIR,7);
outtextxy(320,150,"FILTROS DIGITALES");
outtextxy(320,210,"FIR");
outtextxy(320,270,"DE ORDEN IMPAR");
settextjustify(LEFT_TEXT,LEFT_TEXT);
settextstyle(DEFAULT_FONT,HORIZ_DIR,1);
outtextxy(465,460,"9/07/1998.");
outtextxy(465,445,"Alberto Landa Paleo.");
settextjustify(CENTER_TEXT,LEFT_TEXT);
setcolor(14);
outtextxy(320,479,"Presione Enter Para Continuar");
getche();
closegraph();
}

void graficos(void)
{
gd=VGA;
gm=VGAHI;
initgraph(&gd,&gm,"\\tc\\bgi");
}

/********** M E N U L O W P A S S **********/

void LP(void)
{
while(TRUE)
{
clrscr();
gotoxy(32,8);printf("TIPO DE VENTANA");
gotoxy(32,10);printf("1.- Rectangular.");
gotoxy(32,11);printf("2.- Hamming.");
gotoxy(32,12);printf("3.- Blackman.");
gotoxy(32,13);printf("4.- Kaiser.");
gotoxy(32,14);printf("S.- Salir.");
gotoxy(31,16);printf("Pulse su opcin...");
ch=getche();
switch(ch)
{
155
case '1':
signal_lp_rectangular();
return;
case '2':
signal_lp_hamming();
return;
case '3':
signal_lp_blackman();
return;
case '4':
signal_lp_kaiser();
return;
case 'S':
exit(0);
case 's':
exit(0);
default:
;
}
}
}

/********** M E N U H I G H P A S S **********/

void HP(void)
{
while(TRUE)
{
clrscr();
gotoxy(32,8);printf("TIPO DE VENTANA");
gotoxy(32,10);printf("1.- Rectangular.");
gotoxy(32,11);printf("2.- Hamming.");
gotoxy(32,12);printf("3.- Blackman.");
gotoxy(32,13);printf("4.- Kaiser.");
gotoxy(32,14);printf("S.- Salir.");
gotoxy(31,16);printf("Pulse su opcin...");
ch=getche();
switch(ch)
{
case '1':
signal_hp_rectangular();
return;
case '2':
signal_hp_hamming();
return;
case '3':
156
signal_hp_blackman();
return;
case '4':
signal_hp_kaiser();
return;
case 'S':
exit(0);
case 's':
exit(0);
default:
;
}
}
}

/********** M E N U B A N D P A S S **********/

void BP(void)
{
while(TRUE)
{
clrscr();
gotoxy(32,8);printf("TIPO DE VENTANA");
gotoxy(32,10);printf("1.- Rectangular.");
gotoxy(32,11);printf("2.- Hamming.");
gotoxy(32,12);printf("3.- Blackman.");
gotoxy(32,13);printf("4.- Kaiser.");
gotoxy(32,14);printf("S.- Salir.");
gotoxy(31,16);printf("Pulse su opcin...");
ch=getche();
switch(ch)
{
case '1':
signal_bp_rectangular();
return;
case '2':
signal_bp_hamming();
return;
case '3':
signal_bp_blackman();
return;
case '4':
signal_bp_kaiser();
return;
case 'S':
exit(0);
157
case 's':
exit(0);
default:
;
}
}
}

/********** M E N U B A N D S T O P **********/

void BS(void)
{
while(TRUE)
{
clrscr();
gotoxy(32,8);printf("TIPO DE VENTANA");
gotoxy(32,10);printf("1.- Rectangular.");
gotoxy(32,11);printf("2.- Hamming.");
gotoxy(32,12);printf("3.- Blackman.");
gotoxy(32,13);printf("4.- Kaiser.");
gotoxy(32,14);printf("S.- Salir.");
gotoxy(31,16);printf("Pulse su opcin...");
ch=getche();
switch(ch)
{
case '1':
signal_bs_rectangular();
return;
case '2':
signal_bs_hamming();
return;
case '3':
signal_bs_blackman();
return;
case '4':
signal_bs_kaiser();
return;
case 'S':
exit(0);
case 's':
exit(0);
default:
;
}
}
}
158
/********** F I L T R O P A S A B A J A S **********/

void pasa_bajas(void)
{
/* CLCULO DE UN FILTRO PASA BAJAS */
clrscr();
/* CAPTURA DE LOS VALORES PROPUESTOS */
for(n2=0;n2<=22;n2++)
{
gotoxy(28+n2,2);printf("%c",205);
}
gotoxy(27,2);printf("%c",201);gotoxy(51,2);printf("%c",187);
gotoxy(27,3);printf("INTRODUCCION DE VALORES");
for(n2=0;n2<=22;n2++)
{
gotoxy(28+n2,4);printf("%c",205);
}
gotoxy(27,4);printf("%c",200);gotoxy(51,4);printf("%c",188);
gotoxy(31,5);printf("FRECUENCIA DE PASO");
gotoxy(34,6);printf("Fp (Hz) = ");scanf("%f",&fp);
Fs:
gotoxy(29,7);printf("FRECUENCIA DE RECHAZO");
gotoxy(32,8);printf("Fp<Fs (Hz) = ");scanf("%f",&fs);
if (fs<=fp)
{
gotoxy(32,8);delline();
goto Fs;
}
f = 3*fs;
gotoxy(29,9);printf("FRECUENCIA DE MUESTREO");
gotoxy(32,10);printf("F = (3*fs) = %.0f",f);
a0:
gotoxy(20,11);printf("ATENUACION EN dB EN LA BANDA DE RECHAZO");
gotoxy(35,12);printf("As(dB) = ");scanf("%f",&as);
if((ch=='1')&&(as>13))
{
gotoxy(17,14);printf("LA VENTANA RECTANGULAR NO ATENUA MAS DE
13 dB");getche();
gotoxy(17,14);delline();
gotoxy(35,12);delline();
goto a0;
}
if((ch=='2')&&(as>43))
{

159
gotoxy(19,14);printf("LA VENTANA HAMMING NO ATENUA MAS DE 43
dB");getche();
gotoxy(19,14);delline();
gotoxy(35,12);delline();
goto a0;
}
if((ch=='3')&&(as>58))
{
gotoxy(19,14);printf("LA VENTANA BLACKMAN NO ATENUA MAS DE 58
dB");getche();
gotoxy(19,14);delline();
gotoxy(35,12);delline();
goto a0;
}
if((ch=='4')&&(as>65))
{
gotoxy(20,14);printf("LA VENTANA KAISER NO ATENUA MAS DE 65
dB");getche();
gotoxy(20,14);delline();
gotoxy(35,12);delline();
goto a0;
}
gotoxy(25,13);printf("ATENUACION EN LA BANDA DE PASO");
gotoxy(35,14);printf("Ap(dB) = ");scanf("%f",&ap);
/* CLCULO DE DELTA */
x=-0.05*as;
/* Delta s */
ds=pow(10,x);
y=0.05*ap;
w=pow(10,y);
/* Delta p */
dp=(w-1)/(w+1);
/* Clculo de D */
if (as<=21)
{
d=0.92222;
}
if (as>21)
{
d=(as-7.95)/14.36;
}
/* Clculo de delta f */
df=fs-fp;
/* Clculo del orden */
ord=((f*d)/df)+1;
n=ceil(ord);
160
c = n % 2;
switch(c)
{
case 0:
ord=n+1;
gotoxy(37,16);printf("ORDEN");
gotoxy(37,17);printf("N = %.0f",ord);
gotoxy(25,25);printf("<Presione Enter Para Continuar>");getche();
break;
case 1:
ord=n;
gotoxy(37,16);printf("ORDEN");
gotoxy(37,17);printf("N = %.0f",ord);
gotoxy(25,25);printf("<Presione Enter Para Continuar>");getche();
break;
}
fc=0.5*(fp+fs);
/* CLCULO DE LOS COEFICIENTES PARA UN FILTRO PASA BAJAS */
clrscr();
gotoxy(21,1);printf("COEFICIENTES PARA UN FILTRO PASA BAJAS");
hPb[0]=2*(fc/f);
gotoxy(30,3);printf("HPB[0] = %f",hPb[0]);
n2=1;
for(n1=1;n1<=((ord-1)/2);n1++)
{
fc11=sin((2*PI*n1*fc)/f);
fc22=(2*PI*n1*fc)/f;
hPb[n1]=((2*fc)/f)*(fc11/fc22);
gotoxy(30,3+n2);printf("HPB[%.0f] = %f",n1,hPb[n1]);
n2++;
}
gotoxy(25,25);printf("<Presione Enter Para Continuar>");getche();
}

/********** F I L T R O P A S A A L T A S **********/

void pasa_altas(void)
{
/* CLCULO DE UN FILTRO PASA ALTAS */
clrscr();
/* CAPTURA DE LOS VALORES PROPUESTOS */
for(n2=0;n2<=22;n2++)
{
gotoxy(28+n2,2);printf("%c",205);
}
gotoxy(27,2);printf("%c",201);gotoxy(51,2);printf("%c",187);
161
gotoxy(27,3);printf("INTRODUCCION DE VALORES");
for(n2=0;n2<=22;n2++)
{
gotoxy(28+n2,4);printf("%c",205);
}
gotoxy(27,4);printf("%c",200);gotoxy(51,4);printf("%c",188);
gotoxy(29,5);printf("FRECUENCIA DE RECHAZO");
gotoxy(34,6);printf("Fs (Hz) = ");scanf("%f",&fs);
Fp:
gotoxy(31,7);printf("FRECUENCIA DE PASO");
gotoxy(32,8);printf("Fs<Fp (Hz) = ");scanf("%f",&fp);
if (fp<=fs)
{
gotoxy(32,8);delline();
goto Fp;
}
f = 3*fp;
gotoxy(29,9);printf("FRECUENCIA DE MUESTREO");
gotoxy(32,10);printf("F = (3*fp) = %.0f",f);
a0:
gotoxy(20,11);printf("ATENUACION EN dB EN LA BANDA DE RECHAZO");
gotoxy(35,12);printf("As(dB) = ");scanf("%f",&as);
if((ch=='1')&&(as>13))
{
gotoxy(17,14);printf("LA VENTANA RECTANGULAR NO ATENUA MAS DE
13 dB");getche();
gotoxy(17,14);delline();
gotoxy(35,12);delline();
goto a0;
}
if((ch=='2')&&(as>43))
{
gotoxy(19,14);printf("LA VENTANA HAMMING NO ATENUA MAS DE 43
dB");getche();
gotoxy(19,14);delline();
gotoxy(35,12);delline();
goto a0;
}
if((ch=='3')&&(as>58))
{
gotoxy(19,14);printf("LA VENTANA BLACKMAN NO ATENUA MAS DE 58
dB");getche();
gotoxy(19,14);delline();
gotoxy(35,12);delline();
goto a0;
}
162
if((ch=='4')&&(as>65))
{
gotoxy(20,14);printf("LA VENTANA KAISER NO ATENUA MAS DE 65
dB");getche();
gotoxy(20,14);delline();
gotoxy(35,12);delline();
goto a0;
}
gotoxy(25,13);printf("ATENUACION EN LA BANDA DE PASO");
gotoxy(35,14);printf("Ap(dB) = ");scanf("%f",&ap);
/* CLCULO DE DELTA */
x=-0.05*as;
/* Delta s */
ds=pow(10,x);
y=0.05*ap;
w=pow(10,y);
/* Delta p */
dp=(w-1)/(w+1);
/* Clculo de D */
if (as<=21)
{
d=0.92222;
}
if (as>21)
{
d=(as-7.95)/14.36;
}
/* Clculo de delta f */
df=fp-fs;
/* Clculo del orden */
ord=((f*d)/df)+1;
n=ceil(ord);
c = n % 2;
switch(c)
{
case 0:
ord=n+1;
gotoxy(37,16);printf("ORDEN");
gotoxy(37,17);printf("N = %.0f",ord);
gotoxy(25,25);printf("<Presione Enter Para Continuar>");getche();
break;
case 1:
ord=n;
gotoxy(37,16);printf("ORDEN");
gotoxy(37,17);printf("N = %.0f",ord);
gotoxy(25,25);printf("<Presione Enter Para Continuar>");getche();
163
break;
}
fc=0.5*(fp+fs);
/* CLCULO DE LOS COEFICIENTES PARA UN FILTRO PASA ALTAS */
clrscr();
gotoxy(21,1);printf("COEFICIENTES PARA UN FILTRO PASA ALTAS");
hPb[0]=1-(2*(fc/f));
gotoxy(30,3);printf("HPA[0] = %f",hPb[0]);
n2=1;
for(n1=1;n1<=((ord-1)/2);n1++)
{
fc11=sin((2*PI*n1*fc)/f);
fc22=(2*PI*n1*fc)/f;
hPb[n1]=-((2*fc)/f)*(fc11/fc22);
gotoxy(30,3+n2);printf("HPA[%.0f] = %f",n1,hPb[n1]);
n2++;
}
gotoxy(25,25);printf("<Presione Enter Para Continuar>");getche();
}

/*********** F I L T R O P A S A B A N D A *********/

void pasa_banda(void)
{
/* CLCULO DE UN FILTRO PASA BANDA */
clrscr();
/* CAPTURA DE LOS VALORES PROPUESTOS */
for(n2=0;n2<=22;n2++)
{
gotoxy(28+n2,2);printf("%c",205);
}
gotoxy(27,2);printf("%c",201);gotoxy(51,2);printf("%c",187);
gotoxy(27,3);printf("INTRODUCCION DE VALORES");
for(n2=0;n2<=22;n2++)
{
gotoxy(28+n2,4);printf("%c",205);
}
gotoxy(27,4);printf("%c",200);gotoxy(51,4);printf("%c",188);
gotoxy(28,5);printf("FRECUENCIA DE RECHAZO 1");
gotoxy(33,6);printf("Fs1 (Hz) = ");scanf("%f",&fs1);
Fp1:
gotoxy(30,7);printf("FRECUENCIA DE PASO 1");
gotoxy(31,8);printf("Fs1<Fp1 (Hz) = ");scanf("%f",&fp1);
if (fp1<=fs1)
{
gotoxy(31,8);delline();
164
goto Fp1;
}
Fp2:
gotoxy(30,9);printf("FRECUENCIA DE PASO 2");
gotoxy(31,10);printf("Fp1<Fp2 (Hz) = ");scanf("%f",&fp2);
if (fp2<=fp1)
{
gotoxy(31,10);delline();
goto Fp2;
}
Fs2:
gotoxy(28,11);printf("FRECUENCIA DE RECHAZO 2");
gotoxy(31,12);printf("Fp2<Fs2 (Hz) = ");scanf("%f",&fs2);
if (fs2<=fp2)
{
gotoxy(31,12);delline();
goto Fs2;
}
f = 3*fs2;
gotoxy(29,13);printf("FRECUENCIA DE MUESTREO");
gotoxy(32,14);printf("F = (3*fs2) = %.0f",f);
a0:
gotoxy(20,15);printf("ATENUACION EN dB EN LA BANDA DE RECHAZO");
gotoxy(35,16);printf("As(dB) = ");scanf("%f",&as);
if((ch=='1')&&(as>13))
{
gotoxy(17,18);printf("LA VENTANA RECTANGULAR NO ATENUA MAS DE
13 dB");getche();
gotoxy(17,18);delline();
gotoxy(35,16);delline();
goto a0;
}
if((ch=='2')&&(as>43))
{
gotoxy(19,18);printf("LA VENTANA HAMMING NO ATENUA MAS DE 43
dB");getche();
gotoxy(19,18);delline();
gotoxy(35,16);delline();
goto a0;
}
if((ch=='3')&&(as>58))
{
gotoxy(19,18);printf("LA VENTANA BLACKMAN NO ATENUA MAS DE 58
dB");getche();
gotoxy(19,18);delline();
gotoxy(35,16);delline();
165
goto a0;
}
if((ch=='4')&&(as>65))
{
gotoxy(20,18);printf("LA VENTANA KAISER NO ATENUA MAS DE 65
dB");getche();
gotoxy(20,18);delline();
gotoxy(35,16);delline();
goto a0;
}
gotoxy(25,17);printf("ATENUACION EN LA BANDA DE PASO");
gotoxy(35,18);printf("Ap(dB) = ");scanf("%f",&ap);
/* CLCULO DE DELTA */
x=-0.05*as;
/* Delta s */
ds=pow(10,x);
y=0.05*ap;
w=pow(10,y);
/* Delta p */
dp=(w-1)/(w+1);
/* Clculo de D */
if (as<=21)
{
d=0.92222;
}
if (as>21)
{
d=(as-7.95)/14.36;
}
/* Clculo de delta f */
df1=fp1-fs1;
df2=fs2-fp2;
if (df1<=df2)
fmin=df1;
if (df1>df2)
fmin=df2;
/* Clculo del orden */
ord=((f*d)/fmin)+1;
n=ceil(ord);
c = n % 2;
switch(c)
{
case 0:
ord=n+1;
gotoxy(37,20);printf("ORDEN");
gotoxy(37,21);printf("N = %.0f",ord);
166
gotoxy(25,25);printf("<Presione Enter Para Continuar>");getche();
break;
case 1:
ord=n;
gotoxy(37,20);printf("ORDEN");
gotoxy(37,21);printf("N = %.0f",ord);
gotoxy(25,25);printf("<Presione Enter Para Continuar>");getche();
break;
}
fc1=fp1-(fmin/2);
fc2=fp2+(fmin/2);
/* CLCULO DE LOS COEFICIENTES PARA UN FILTRO PASA BANDA */
clrscr();
gotoxy(21,1);printf("COEFICIENTES PARA UN FILTRO PASA BANDA");
hPb[0]=(2/f)*(fc2-fc1);
gotoxy(30,3);printf("HPb[0] = %f",hPb[0]);
n2=1;
for(n1=1;n1<=((ord-1)/2);n1++)
{
fc11=sin((2*PI*n1*fc2)/f);
fc22=sin((2*PI*n1*fc1)/f);
hPb[n1]=(1/(n1*PI))*(fc11-fc22);
gotoxy(30,3+n2);printf("HPb[%.0f] = %f",n1,hPb[n1]);
n2++;
}
gotoxy(25,25);printf("<Presione Enter Para Continuar>");getche();
}

/*********** F I L T R O R E C H A Z A B A N D A ***********/

void rechaza_banda(void)
{
/* CLCULO DE UN FILTRO RECHAZA BANDA */
clrscr();
/* CAPTURA DE LOS VALORES PROPUESTOS */
for(n2=0;n2<=22;n2++)
{
gotoxy(28+n2,2);printf("%c",205);
}
gotoxy(27,2);printf("%c",201);gotoxy(51,2);printf("%c",187);
gotoxy(27,3);printf("INTRODUCCION DE VALORES");
for(n2=0;n2<=22;n2++)
{
gotoxy(28+n2,4);printf("%c",205);
}
gotoxy(27,4);printf("%c",200);gotoxy(51,4);printf("%c",188);
167
gotoxy(30,5);printf("FRECUENCIA DE PASO 1");
gotoxy(33,6);printf("Fp1 (Hz) = ");scanf("%f",&fp1);
Fs1:
gotoxy(28,7);printf("FRECUENCIA DE RECHAZO 1");
gotoxy(31,8);printf("Fp1<Fs1 (Hz) = ");scanf("%f",&fs1);
if (fs1<=fp1)
{
gotoxy(31,8);delline();
goto Fs1;
}
Fs2:
gotoxy(28,9);printf("FRECUENCIA DE RECHAZO 2");
gotoxy(31,10);printf("Fs1<Fs2 (Hz) = ");scanf("%f",&fs2);
if (fs2<=fs1)
{
gotoxy(31,10);delline();
goto Fs2;
}
Fp2:
gotoxy(30,11);printf("FRECUENCIA DE PASO 2");
gotoxy(31,12);printf("Fs2<Fp2 (Hz) = ");scanf("%f",&fp2);
if (fp2<=fs2)
{
gotoxy(31,12);delline();
goto Fp2;
}
f = 3*fp2;
gotoxy(29,13);printf("FRECUENCIA DE MUESTREO");
gotoxy(32,14);printf("F = (3*fp2) = %.0f",f);
a0:
gotoxy(20,15);printf("ATENUACION EN dB EN LA BANDA DE RECHAZO");
gotoxy(35,16);printf("As(dB) = ");scanf("%f",&as);
if((ch=='1')&&(as>13))
{
gotoxy(17,18);printf("LA VENTANA RECTANGULAR NO ATENUA MAS DE
13 dB");getche();
gotoxy(17,18);delline();
gotoxy(35,16);delline();
goto a0;
}
if((ch=='2')&&(as>43))
{
gotoxy(19,18);printf("LA VENTANA HAMMING NO ATENUA MAS DE 43
dB");getche();
gotoxy(19,18);delline();
gotoxy(35,16);delline();
168
goto a0;
}
if((ch=='3')&&(as>58))
{
gotoxy(19,18);printf("LA VENTANA BLACKMAN NO ATENUA MAS DE 58
dB");getche();
gotoxy(19,18);delline();
gotoxy(35,16);delline();
goto a0;
}
if((ch=='4')&&(as>65))
{
gotoxy(20,18);printf("LA VENTANA KAISER NO ATENUA MAS DE 65
dB");getche();
gotoxy(20,18);delline();
gotoxy(35,16);delline();
goto a0;
}
gotoxy(25,17);printf("ATEBUACION EN LA BANDA DE PASO");
gotoxy(35,18);printf("Ap(dB) = ");scanf("%f",&ap);
/* CLCULO DE DELTA */
x=-0.05*as;
/* Delta s */
ds=pow(10,x);
y=0.05*ap;
w=pow(10,y);
/* Delta p */
dp=(w-1)/(w+1);
/* CLCULO DE D */
if (as<=21)
{
d=0.92222;
}
if (as>21)
{
d=(as-7.95)/14.36;
}
/* Clculo de delta f */
df1=fs1-fp1;
df2=fp2-fs2;
if (df1<=df2)
fmin=df1;
if (df1>df2)
fmin=df2;
/* Clculo del orden */
ord=((f*d)/fmin)+1;
169
n=ceil(ord);
c = n % 2;
switch(c)
{
case 0:
ord=n+1;
gotoxy(37,20);printf("ORDEN");
gotoxy(37,21);printf("N = %.0f",ord);
gotoxy(25,25);printf("<Presione Enter Para Continuar>");getche();
break;
case 1:
ord=n;
gotoxy(37,20);printf("ORDEN");
gotoxy(37,21);printf("N = %.0f",ord);
gotoxy(25,25);printf("<Presione Enter Para Continuar>");getche();
break;
}
fc1=fp1+(fmin/2);
fc2=fp2-(fmin/2);
/* CLCULO DE LOS COEFICIENTES PARA UN FILTRO RECHAZA
BANDA */
clrscr();
gotoxy(19,1);printf("COEFICIENTES PARA UN FILTRO RECHAZA BANDA");
hPb[0]=((2/f)*(fc1-fc2))+1;
gotoxy(30,3);printf("HRb[0] = %f",hPb[0]);
n2=1;
for(n1=1;n1<=((ord-1)/2);n1++)
{
fc11=sin((2*PI*n1*fc1)/f);
fc22=sin((2*PI*n1*fc2)/f);
hPb[n1]=(1/(n1*PI))*(fc11-fc22);
gotoxy(30,3+n2);printf("HRb[%.0f] = %f",n1,hPb[n1]);
n2++;
}
gotoxy(25,25);printf("<Presione Enter Para Continuar>");getche();
}

/********** C O N V O L U C I O N ***********/

void convolucion(void)
{
clrscr();
gotoxy(11,1);printf("RESULTADOS OBTENIDOS DEL FILTRADO EN EL
DOMINIO DEL TIEMPO");
for(k=0;k<ord/2;k++)
{
170
for(i=0;i<ord/2;i++)
{
j=k-i;
if (j<0)
signal[j]=0;
yy[k] = h[i]*signal[j];
sum[k]=sum[k]+yy[k];
}
gotoxy(35,k+3);printf("y[%.0f] = %.2f",k,sum[k]);
}
gotoxy(25,25);printf("<Presione Enter Para Continuar>");getche();
graficos();
if((cl=='2')||(cl=='3'))
{
ejes_convolucion2();
}
if(cl=='1')
{
ejes_convolucion1();
}
dibujo();
}

void ejes_convolucion1(void)
{
line(60,0,60,480);
line(60,240,640,240);
q=60;
while(q<640)
{
line(q,235,q,245);
q+=20;
}
q=480;
while(q>0)
{
line(55,q,65,q);
q-=20;
}
setlinestyle(0,0,3);
line(60,0,70,10);
line(60,0,50,10);
line(70,10,50,10);
floodfill(59,5,15);
floodfill(61,5,15);
line(640,240,630,230);
171
line(640,240,630,250);
line(630,230,630,250);
floodfill(635,239,15);
floodfill(635,241,15);
settextjustify(CENTER_TEXT,CENTER_TEXT);
settextstyle(TRIPLEX_FONT,HORIZ_DIR,1);
setcolor(10);
outtextxy(632,217,"k");
outtextxy(90,5,"Y(k)");
settextjustify(CENTER_TEXT,RIGHT_TEXT);
settextstyle(DEFAULT_FONT,HORIZ_DIR,1);
setcolor(14);
outtextxy(320,1,"SEAL FILTRADA EN EL DOMINIO DEL TIEMPO");
setcolor(15);
settextjustify(LEFT_TEXT,LEFT_TEXT);
settextstyle(DEFAULT_FONT,HORIZ_DIR,1);
/* E J E X */
outtextxy(77,257,"1");
outtextxy(97,257,"2");
outtextxy(117,257,"3");
outtextxy(137,257,"4");
outtextxy(157,257,"5");
outtextxy(177,257,"6");
outtextxy(197,257,"7");
outtextxy(217,257,"8");
outtextxy(237,257,"9");
outtextxy(253,257,"10");
outtextxy(273,257,"11");
outtextxy(293,257,"12");
outtextxy(313,257,"13");
outtextxy(333,257,"14");
outtextxy(353,257,"15");
outtextxy(373,257,"16");
outtextxy(393,257,"17");
outtextxy(413,257,"18");
outtextxy(433,257,"19");
outtextxy(453,257,"20");
outtextxy(473,257,"21");
outtextxy(493,257,"22");
outtextxy(513,257,"23");
outtextxy(533,257,"24");
outtextxy(553,257,"25");
outtextxy(573,257,"26");
outtextxy(593,257,"27");
outtextxy(613,257,"28");
/* E J E Y */
172
outtextxy(20,465,"-5.5");
outtextxy(20,445,"-5.0");
outtextxy(20,425,"-4.5");
outtextxy(20,405,"-4.0");
outtextxy(20,385,"-3.5");
outtextxy(20,365,"-3.0");
outtextxy(20,345,"-2.5");
outtextxy(20,325,"-2.0");
outtextxy(20,305,"-1.5");
outtextxy(20,285,"-1.0");
outtextxy(20,265,"-0.5");
outtextxy(28,225,"0.5");
outtextxy(28,205,"1.0");
outtextxy(28,185,"1.5");
outtextxy(28,165,"2.0");
outtextxy(28,145,"2.5");
outtextxy(28,125,"3.0");
outtextxy(28,105,"3.5");
outtextxy(28,85,"4.0");
outtextxy(28,65,"4.5");
outtextxy(28,45,"5.0");
outtextxy(28,25,"5.5");
settextjustify(CENTER_TEXT,LEFT_TEXT);
outtextxy(320,479,"Presione Enter Para Continuar");
}

void ejes_convolucion2(void)
{
line(60,0,60,480);
line(60,240,640,240);
q=60;
while(q<640)
{
line(q,235,q,245);
q+=20;
}
q=480;
while(q>0)
{

line(55,q,65,q);
q-=20;
}
setlinestyle(0,0,3);
line(60,0,70,10);
line(60,0,50,10);
173
line(70,10,50,10);
floodfill(59,5,15);
floodfill(61,5,15);
line(640,240,630,230);
line(640,240,630,250);
line(630,230,630,250);
floodfill(635,239,15);
floodfill(635,241,15);
settextjustify(CENTER_TEXT,CENTER_TEXT);
settextstyle(TRIPLEX_FONT,HORIZ_DIR,1);
setcolor(10);
outtextxy(632,217,"k");
outtextxy(90,5,"Y(k)");
settextjustify(CENTER_TEXT,RIGHT_TEXT);
settextstyle(DEFAULT_FONT,HORIZ_DIR,1);
setcolor(14);
outtextxy(320,1,"SEAL FILTRADA EN EL DOMINIO DEL TIEMPO");
setcolor(15);
settextjustify(LEFT_TEXT,LEFT_TEXT);
settextstyle(DEFAULT_FONT,HORIZ_DIR,1);
/* E J E X */
tt = t;
itoa(tt,p,10);
outtextxy(257,257,p);
itoa(tt*2,p,10);
outtextxy(457,257,p);
/* E J E Y */
outtextxy(20,465,"-5.5");
outtextxy(20,445,"-5.0");
outtextxy(20,425,"-4.5");
outtextxy(20,405,"-4.0");
outtextxy(20,385,"-3.5");
outtextxy(20,365,"-3.0");
outtextxy(20,345,"-2.5");
outtextxy(20,325,"-2.0");
outtextxy(20,305,"-1.5");
outtextxy(20,285,"-1.0");
outtextxy(20,265,"-0.5");
outtextxy(28,225,"0.5");
outtextxy(28,205,"1.0");
outtextxy(28,185,"1.5");
outtextxy(28,165,"2.0");
outtextxy(28,145,"2.5");
outtextxy(28,125,"3.0");
outtextxy(28,105,"3.5");
outtextxy(28,85,"4.0");
174
outtextxy(28,65,"4.5");
outtextxy(28,45,"5.0");
outtextxy(28,25,"5.5");
settextjustify(CENTER_TEXT,LEFT_TEXT);
outtextxy(320,479,"Presione Enter Para Continuar");
}

void dibujo(void)
{
for(k=0;k<ord/2;k++)
{
setcolor(14);
circle(60+(k*20),240-(sum[k]*40),2);
setfillstyle(1,14);
floodfill(60+(k*20),240-(sum[k]*40),14);
line(60+(k*20),240,60+(k*20),240-(sum[k]*40));
}
getche();
closegraph();
}

/********** V E N T A N A R E C T A N G U L A R **********/

void rectangular(void)
{
clrscr();
gotoxy(21,1);printf("COEFICIENTES DE LA VENTANA RECTANGULAR");
n2=3;
for(n1=0;n1<=(ord-1)/2;n1++)
{
ar[n1]=1;
gotoxy(31,n2);printf("Ar[%.0f] = %f",n1,ar[n1]);
n2++;
}
gotoxy(25,25);printf("<Presione Enter Para Continuar>");getche();
clrscr();
/* CLCULO DE LOS COEFICIENTES VENTANEADOS */
gotoxy(28,1);printf("COEFICIENTES VENTANEADOS");
n2=3;
for(n1=0;n1<=(ord-1)/2;n1++)
{
h[n1]=hPb[n1]*ar[n1];
gotoxy(31,n2);printf("H[%.0f] = %f",n1,h[n1]);
n2++;
}
gotoxy(25,25);printf("<Presione Enter Para Continuar>");getche();
175
senal();
convolucion();
respuesta_frecuencia();
graficos();
ejes();
grafica();
getche();
closegraph();
for(k=0;k<=100;k++)
{
signal[k] = 0;sum[k] = 0;yy[k] = 0;
}
}

/********** V E N T A N A H A M M I N G ***********/

void hamming(void)
{
clrscr();
gotoxy(23,1);printf("COEFICIENTES DE LA VENTANA HAMMING");
n2=3;
for(n1=0;n1<=(ord-1)/2;n1++)
{
ah[n1]=0.54+(0.46*cos((2*PI*n1)/(ord-1)));
gotoxy(30,n2);printf("Ah[%.0f] = %f",n1,ah[n1]);
n2++;
}
gotoxy(25,25);printf("<Presione Enter Para Continuar>");getche();
clrscr();
/* CLCULO DE LOS COEFICIENTES VENTANEADOS */
gotoxy(28,1);printf("COEFICIENTES VENTANEADOS");
n2=3;
for(n1=0;n1<=(ord-1)/2;n1++)
{
h[n1]=hPb[n1]*ah[n1];
gotoxy(31,n2);printf("H[%.0f] = %f",n1,h[n1]);
n2++;
}
gotoxy(25,25);printf("<Presione Enter Para Continuar>");getche();
senal();
convolucion();
respuesta_frecuencia();
graficos();
ejes();
grafica();
getche();
176
closegraph();
for(k=0;k<=100;k++)
{
signal[k] = 0;sum[k] = 0;yy[k] = 0;
}
}

/********** V E N T A N A B L A C K M A N **********/

void blackman(void)
{
clrscr();
gotoxy(22,1);printf("COEFICIENTES DE LA VENTANA BLACKMAN");
n2=3;
for(n1=0;n1<=(ord-1)/2;n1++)
{
ab[n1]=0.42+(0.5*cos((2*PI*n1)/(ord-1)))+(0.08*cos((4*PI*n1)/(ord-1)));
gotoxy(31,n2);printf("Ab[%.0f] = %f",n1,ab[n1]);
n2++;
}
gotoxy(25,25);printf("<Presione Enter Para Continuar>");getche();
clrscr();
/* CLCULO DE LOS COEFICIENTES VENTANEADOS */
gotoxy(28,1);printf("COEFICIENTES VENTANEADOS");
n2=3;
for(n1=0;n1<=(ord-1)/2;n1++)
{
h[n1]=hPb[n1]*ab[n1];
gotoxy(31,n2);printf("H[%.0f] = %f",n1,h[n1]);
n2++;
}
gotoxy(25,25);printf("<Presione Enter Para Continuar>");getche();
senal();
convolucion();
respuesta_frecuencia();
graficos();
ejes();
grafica();
getche();
closegraph();
for(k=0;k<=100;k++)
{
signal[k] = 0;sum[k] = 0;yy[k] = 0;
}
}

177
/********** V E N T A N A K A I S E R ***********/

void kaiser(void)
{
if (as>21)
goto a1;
alfa=0;
goto a2;
a1:
if (as>50)
goto a3;
alfa = (0.5842*pow((as-21),0.4))+(0.07886*(as-21));
goto a2;
a3:
alfa=0.1102*(as-8.7);
a2:
for(n1=0;n1<=(ord-1)/2;n1++)
{
beta[n1] = alfa*pow((1-pow(((2*n1)/(ord-1)),2)),0.5);
}
nn=1;
for(aa=1;aa<=26;aa++)
{
nn=nn*aa;
hh=pow(((1/nn)*pow((alfa/2),aa)),2);
ii=ii+hh;
}
ialfa=1+ii;
for(n1=0;n1<=(ord-1)/2;n1++)
{
nn=1;
ii=0;
for(aa=1;aa<=26;aa++)
{
nn=nn*aa;
hh=pow(((1/nn)*pow((beta[n1]/2),aa)),2);
ii=ii+hh;
}
ibeta[n1]=1+ii;
}
clrscr();
/* CLCULO DE LOS COEFICIENTES DE LA VENTANA KAISER */
gotoxy(23,1);printf("COEFICIENTES DE LA VENTANA KAISER");
n2=3;
for(n1=0;n1<=(ord-1)/2;n1++)
{
178
ak[n1]=ibeta[n1]/ialfa;
gotoxy(31,n2);printf("Ak[%.0f] = %f",n1,ak[n1]);
n2++;
}
gotoxy(25,25);printf("<Presione Enter Para Continuar>");getche();
clrscr();
/* CLCULO DE LOS COEFICIENTES VENTANEADOS */
gotoxy(28,1);printf("COEFICIENTES VENTANEADOS");
n2=3;
for(n1=0;n1<=(ord-1)/2;n1++)
{
h[n1]=hPb[n1]*ak[n1];
gotoxy(31,n2);printf("H[%.0f] = %f",n1,h[n1]);
n2++;
}
gotoxy(25,25);printf("<Presione Enter Para Continuar>");getche();
senal();
convolucion();
respuesta_frecuencia();
graficos();
ejes();
grafica();
getche();
closegraph();
for(k=0;k<=100;k++)
{
signal[k] = 0;sum[k] = 0;yy[k] = 0;
}
}

/********** R E S P U E S T A E N F R E C U E N C I A **********/

void respuesta_frecuencia(void)
{
n2=0;
clrscr();
for(w=0;w<=0.5;w+=0.00125)
{
aaa=0;
for(aa=1;aa<=(ord-1)/2;aa++)
{
ii=h[aa]*cos(2*PI*w*aa);
aaa=aaa+ii;
}
M[n2]=20*log10(fabs(h[0]+(2*aaa)));
n2++;
179
}
}

/********** E J E S **********/

void ejes(void)
{
rectangle(50,50,590,430);
/* E J E Y */
outtextxy(36,47,"0");
line(45,145,55,145);
outtextxy(20,142,"-20");
line(45,240,55,240);
outtextxy(20,237,"-40");
line(45,335,55,335);
outtextxy(20,332,"-60");
outtextxy(20,427,"-80");
/* E J E X */
line(158,45,158,55);
outtextxy(147,35,"0.1");
line(266,45,266,55);
outtextxy(255,35,"0.2");
line(374,45,374,55);
outtextxy(363,35,"0.3");
line(482,45,482,55);
outtextxy(471,35,"0.4");
outtextxy(579,35,"0.5");
settextjustify(CENTER_TEXT,CENTER_TEXT);
settextstyle(DEFAULT_FONT,HORIZ_DIR,2);
setcolor(2);
outtextxy(320,450,"FRECUENCIA (NORMALIZADA)");
outtextxy(50,30,"dB");
settextjustify(CENTER_TEXT,LEFT_TEXT);
settextstyle(DEFAULT_FONT,HORIZ_DIR,1);
setcolor(15);outtextxy(320,479,"Presione Enter Para Continuar");
settextjustify(CENTER_TEXT,RIGHT_TEXT);
setcolor(14);outtextxy(320,1,"RESPUESTA EN FRECUENCIA DEL FILTRO");
}

/********** G R A F I C A **********/

void grafica(void)
{
for(n2=0;n2<=400;n2++)
{
aw=M[n2]*4.75;
180
setcolor(4);
circle(50+(n2*1.35),50-aw,2);
setfillstyle(1,4);
floodfill(50+(n2*1.35),50-aw,4);
}
}

/********** MENU SIGNAL_LP_RECTANGULAR **********/

void signal_lp_rectangular(void)
{
while(TRUE)
{
clrscr();
gotoxy(33,8);printf("TIPO DE SEAL");
gotoxy(31,10);printf("1.- Seno (sen ft).");
gotoxy(31,11);printf("2.- Pulso.");
gotoxy(31,12);printf("3.- Triangular.");
gotoxy(31,13);printf("S.- Salir.");
gotoxy(31,15);printf("Pulse su opcin...");
cl=getche();
switch(cl)
{
case '1':
seno();
pasa_bajas();
rectangular();
return;
case '2':
pulso_c();
pasa_bajas();
rectangular();
return;
case '3':
triangular();
pasa_bajas();
rectangular();
return;
case 'S':
exit(0);
case 's':
exit(0);
default:
;
}
}
181
}

/********** MENU SIGNAL_LP_HAMMING **********/

void signal_lp_hamming(void)
{
while(TRUE)
{
clrscr();
gotoxy(33,8);printf("TIPO DE SEAL");
gotoxy(31,10);printf("1.- Seno (sen ft).");
gotoxy(31,11);printf("2.- Pulso.");
gotoxy(31,12);printf("3.- Triangular.");
gotoxy(31,13);printf("S.- Salir.");
gotoxy(31,15);printf("Pulse su opcin...");
cl=getche();
switch(cl)
{
case '1':
seno();
pasa_bajas();
hamming();
return;
case '2':
pulso_c();
pasa_bajas();
hamming();
return;
case '3':
triangular();
pasa_bajas();
hamming();
return;
case 'S':
exit(0);
case 's':
exit(0);
default:
;
}
}
}

/********** MENU SIGNAL_LP_BLACKMAN **********/

void signal_lp_blackman(void)
182
{
while(TRUE)
{
clrscr();
gotoxy(33,8);printf("TIPO DE SEAL");
gotoxy(31,10);printf("1.- Seno (sen ft).");
gotoxy(31,11);printf("2.- Pulso.");
gotoxy(31,12);printf("3.- Triangular.");
gotoxy(31,13);printf("S.- Salir.");
gotoxy(31,15);printf("Pulse su opcin...");
cl=getche();
switch(cl)
{
case '1':
seno();
pasa_bajas();
blackman();
return;
case '2':
pulso_c();
pasa_bajas();
blackman();
return;
case '3':
triangular();
pasa_bajas();
blackman();
return;
case 'S':
exit(0);
case 's':
exit(0);
default:
;
}
}
}

/********** MENU SIGNAL_LP_KAISER **********/

void signal_lp_kaiser(void)
{
while(TRUE)
{
clrscr();
gotoxy(33,8);printf("TIPO DE SEAL");
183
gotoxy(31,10);printf("1.- Seno (sen ft).");
gotoxy(31,11);printf("2.- Pulso.");
gotoxy(31,12);printf("3.- Triangular.");
gotoxy(31,13);printf("S.- Salir.");
gotoxy(31,15);printf("Pulse su opcin...");
cl=getche();
switch(cl)
{
case '1':
seno();
pasa_bajas();
kaiser();
return;
case '2':
pulso_c();
pasa_bajas();
kaiser();
return;
case '3':
triangular();
pasa_bajas();
kaiser();
return;
case 'S':
exit(0);
case 's':
exit(0);
default:
;
}
}
}

/********** MENU SIGNAL_HP_RECTANGULAR **********/

void signal_hp_rectangular(void)
{
while(TRUE)
{
clrscr();
gotoxy(33,8);printf("TIPO DE SEAL");
gotoxy(31,10);printf("1.- Seno (sen ft).");
gotoxy(31,11);printf("2.- Pulso.");
gotoxy(31,12);printf("3.- Triangular.");
gotoxy(31,13);printf("S.- Salir.");
gotoxy(31,15);printf("Pulse su opcin...");
184
cl=getche();
switch(cl)
{
case '1':
seno();
pasa_altas();
rectangular();
return;
case '2':
pulso_c();
pasa_altas();
rectangular();
return;
case '3':
triangular();
pasa_altas();
rectangular();
return;
case 'S':
exit(0);
case 's':
exit(0);
default:
;
}
}
}

/********** MENU SIGNAL_HP_HAMMING **********/

void signal_hp_hamming(void)
{
while(TRUE)
{
clrscr();
gotoxy(33,8);printf("TIPO DE SEAL");
gotoxy(31,10);printf("1.- Seno (sen ft).");
gotoxy(31,11);printf("2.- Pulso.");
gotoxy(31,12);printf("3.- Triangular.");
gotoxy(31,13);printf("S.- Salir.");
gotoxy(31,15);printf("Pulse su opcin...");
cl=getche();
switch(cl)
{
case '1':
seno();
185
pasa_altas();
hamming();
return;
case '2':
pulso_c();
pasa_altas();
hamming();
return;
case '3':
triangular();
pasa_altas();
hamming();
return;
case 'S':
exit(0);
case 's':
exit(0);
default:
;
}
}
}

/********** MENU SIGNAL_HP_BLACKMAN **********/

void signal_hp_blackman(void)
{
while(TRUE)
{
clrscr();
gotoxy(33,8);printf("TIPO DE SEAL");
gotoxy(31,10);printf("1.- Seno (sen ft).");
gotoxy(31,11);printf("2.- Pulso.");
gotoxy(31,12);printf("3.- Triangular.");
gotoxy(31,13);printf("S.- Salir.");
gotoxy(31,15);printf("Pulse su opcin...");
cl=getche();
switch(cl)
{
case '1':
seno();
pasa_altas();
blackman();
return;
case '2':
pulso_c();
186
pasa_altas();
blackman();
return;
case '3':
triangular();
pasa_altas();
blackman();
return;
case 'S':
exit(0);

case 's':
exit(0);
default:
;
}
}
}

/********** MENU SIGNAL_HP_KAISER **********/

void signal_hp_kaiser(void)
{
while(TRUE)
{
clrscr();
gotoxy(33,8);printf("TIPO DE SEAL");
gotoxy(31,10);printf("1.- Seno (sen ft).");
gotoxy(31,11);printf("2.- Pulso.");
gotoxy(31,12);printf("3.- Triangular.");
gotoxy(31,13);printf("S.- Salir.");
gotoxy(31,15);printf("Pulse su opcin...");
cl=getche();
switch(cl)
{
case '1':
seno();
pasa_altas();
kaiser();
return;
case '2':
pulso_c();
pasa_altas();
kaiser();
return;
case '3':
187
triangular();
pasa_altas();
kaiser();
return;
case 'S':
exit(0);
case 's':
exit(0);
default:
;
}
}
}

/********** MENU SIGNAL_BP_RECTANGULAR **********/

void signal_bp_rectangular(void)
{
while(TRUE)
{
clrscr();
gotoxy(33,8);printf("TIPO DE SEAL");
gotoxy(31,10);printf("1.- Seno (sen ft).");
gotoxy(31,11);printf("2.- Pulso.");
gotoxy(31,12);printf("3.- Triangular.");
gotoxy(31,13);printf("S.- Salir.");
gotoxy(31,15);printf("Pulse su opcin...");
cl=getche();
switch(cl)
{
case '1':
seno();
pasa_banda();
rectangular();
return;
case '2':
pulso_c();
pasa_banda();
rectangular();
return;
case '3':
triangular();
pasa_banda();
rectangular();
return;
188
case 'S':
exit(0);
case 's':
exit(0);
default:
;
}
}
}

/********** MENU SIGNAL_BP_HAMMING **********/

void signal_bp_hamming(void)
{
while(TRUE)
{
clrscr();
gotoxy(33,8);printf("TIPO DE SEAL");
gotoxy(31,10);printf("1.- Seno (sen ft).");
gotoxy(31,11);printf("2.- Pulso.");
gotoxy(31,12);printf("3.- Triangular.");
gotoxy(31,13);printf("S.- Salir.");
gotoxy(31,15);printf("Pulse su opcin...");
cl=getche();
switch(cl)
{
case '1':
seno();
pasa_banda();
hamming();
return;
case '2':
pulso_c();
pasa_banda();
hamming();
return;
case '3':
triangular();
pasa_banda();
hamming();
return;
case 'S':
exit(0);
case 's':
exit(0);
default:
189
;
}
}
}

/********** MENU SIGNAL_BP_BLACKMAN **********/

void signal_bp_blackman(void)
{
while(TRUE)
{
clrscr();
gotoxy(33,8);printf("TIPO DE SEAL");
gotoxy(31,10);printf("1.- Seno (sen ft).");
gotoxy(31,11);printf("2.- Pulso.");
gotoxy(31,12);printf("3.- Triangular.");
gotoxy(31,13);printf("S.- Salir.");
gotoxy(31,15);printf("Pulse su opcin...");
cl=getche();
switch(cl)
{
case '1':
seno();
pasa_banda();
blackman();
return;
case '2':
pulso_c();
pasa_banda();
blackman();
return;
case '3':
triangular();
pasa_banda();
blackman();
return;
case 'S':
exit(0);
case 's':
exit(0);
default:
;
}
}
}

190
/********** MENU SIGNAL_BP_KAISER **********/

void signal_bp_kaiser(void)
{
while(TRUE)
{
clrscr();
gotoxy(33,8);printf("TIPO DE SEAL");
gotoxy(31,10);printf("1.- Seno (sen ft).");
gotoxy(31,11);printf("2.- Pulso.");
gotoxy(31,12);printf("3.- Triangular.");
gotoxy(31,13);printf("S.- Salir.");
gotoxy(31,15);printf("Pulse su opcin...");
cl=getche();
switch(cl)
{
case '1':
seno();
pasa_banda();
kaiser();
return;
case '2':
pulso_c();
pasa_banda();
kaiser();
return;
case '3':
triangular();
pasa_banda();
kaiser();
return;
case 'S':
exit(0);
case 's':
exit(0);
default:
;
}
}
}

/********** MENU SIGNAL_BS_RECTANGULAR **********/

void signal_bs_rectangular(void)
{
while(TRUE)
191
{
clrscr();
gotoxy(33,8);printf("TIPO DE SEAL");
gotoxy(31,10);printf("1.- Seno (sen ft).");
gotoxy(31,11);printf("2.- Pulso.");
gotoxy(31,12);printf("3.- Triangular.");
gotoxy(31,13);printf("S.- Salir.");
gotoxy(31,15);printf("Pulse su opcin...");
cl=getche();
switch(cl)
{
case '1':
seno();
rechaza_banda();
rectangular();
return;
case '2':
pulso_c();
rechaza_banda();
rectangular();
return;
case '3':
triangular();
rechaza_banda();
rectangular();
return;
case 'S':
exit(0);
case 's':
exit(0);
default:
;
}
}
}

/********** MENU SIGNAL_BS_HAMMING **********/

void signal_bs_hamming(void)
{
while(TRUE)
{
clrscr();
gotoxy(33,8);printf("TIPO DE SEAL");
gotoxy(31,10);printf("1.- Seno (sen ft).");
gotoxy(31,11);printf("2.- Pulso.");
192
gotoxy(31,12);printf("3.- Triangular.");
gotoxy(31,13);printf("S.- Salir.");
gotoxy(31,15);printf("Pulse su opcin...");
cl=getche();
switch(cl)
{
case '1':
seno();
rechaza_banda();
hamming();
return;
case '2':
pulso_c();
rechaza_banda();
hamming();
return;
case '3':
triangular();
rechaza_banda();
hamming();
return;
case 'S':
exit(0);
case 's':
exit(0);
default:
;
}
}
}

/********** MENU SIGNAL_BS_BLACKMAN **********/

void signal_bs_blackman(void)
{
while(TRUE)
{
clrscr();
gotoxy(33,8);printf("TIPO DE SEAL");
gotoxy(31,10);printf("1.- Seno (sen ft).");
gotoxy(31,11);printf("2.- Pulso.");
gotoxy(31,12);printf("3.- Triangular.");
gotoxy(31,13);printf("S.- Salir.");
gotoxy(31,15);printf("Pulse su opcin...");
cl=getche();
switch(cl)
193
{
case '1':
seno();
rechaza_banda();
blackman();
return;
case '2':
pulso_c();
rechaza_banda();
blackman();
return;
case '3':
triangular();
rechaza_banda();
blackman();
return;
case 'S':
exit(0);
case 's':
exit(0);
default:
;
}
}
}

/********** MENU SIGNAL_BS_KAISER **********/

void signal_bs_kaiser(void)
{
while(TRUE)
{
clrscr();
gotoxy(33,8);printf("TIPO DE SEAL");
gotoxy(31,10);printf("1.- Seno (sen ft).");
gotoxy(31,11);printf("2.- Pulso.");
gotoxy(31,12);printf("3.- Triangular.");
gotoxy(31,13);printf("S.- Salir.");
gotoxy(31,15);printf("Pulse su opcin...");
cl=getche();
switch(cl)
{
case '1':
seno();
rechaza_banda();
kaiser();
194
return;
case '2':
pulso_c();
rechaza_banda();
kaiser();
return;

case '3':
triangular();
rechaza_banda();
kaiser();
return;
case 'S':
exit(0);
case 's':
exit(0);
default:
;
}
}
}

void seno(void)
{
clrscr();
frec:
gotoxy(35,9);printf("FRECUENCIA");
gotoxy(34,11);printf("f(1-10) = ");scanf("%f",&ff);
if((ff<1)||(ff>10))
{
gotoxy(34,11);delline();
goto frec;
}
ampli:
gotoxy(36,13);printf("AMPLITUD");
gotoxy(35,15);printf("A(1-5) = ");scanf("%f",&a);
if((a<1)||(a>5))
{
gotoxy(35,15);delline();
goto ampli;
}
gotoxy(25,25);printf("<Presione Enter Para Continuar>");getche();
graficos();
ejes2();
sen();
getche();
195
closegraph();
}

void pulso_c(void)
{
clrscr();
period:
gotoxy(36,9);printf("PERIODO");
gotoxy(35,11);printf("T(1-5) = ");scanf("%f",&t);
if((t<1)||(t>5))
{
gotoxy(35,11);delline();
goto period;
}
amp:
gotoxy(36,13);printf("AMPLITUD");
gotoxy(35,15);printf("A(1-5) = ");scanf("%f",&a);
if((a<1)||(a>5))
{
gotoxy(35,15);delline();
goto amp;
}
gotoxy(25,25);printf("<Presione Enter Para Continuar>");getche();
graficos();
ejes3();
pulso();
getche();
closegraph();
}

void triangular(void)
{
clrscr();
period:
gotoxy(36,9);printf("PERIODO");
gotoxy(35,11);printf("T(1-5) = ");scanf("%f",&t);
if((t<1)||(t>5))
{
gotoxy(35,11);delline();
goto period;
}
amp:
gotoxy(36,13);printf("AMPLITUD");
gotoxy(35,15);printf("A(1-5) = ");scanf("%f",&a);
if((a<1)||(a>5))
{
196
gotoxy(35,15);delline();
goto amp;
}
gotoxy(25,25);printf("<Presione Enter Para Continuar>");getche();
graficos();
ejes3();
triangulo();
getche();
closegraph();
}

void ejes2(void)
{
line(50,240,640,240);
line(50,0,50,480);
setcolor(2);
settextjustify(CENTER_TEXT,CENTER_TEXT);
settextstyle(TRIPLEX_FONT,HORIZ_DIR,3);
outtextxy(25,10,"A");
outtextxy(630,250,"f");
settextjustify(CENTER_TEXT,RIGHT_TEXT);
settextstyle(DEFAULT_FONT,HORIZ_DIR,1);
setcolor(14);outtextxy(320,1,"SEAL DE ENTRADA");
setcolor(15);
/* E J E X */
settextjustify(LEFT_TEXT,CENTER_TEXT);
settextstyle(DEFAULT_FONT,HORIZ_DIR,1);
for(u=90;u<=540;u+=90)
{
line(50+u,235,50+u,245);
}
outtextxy(133,250,"90");
outtextxy(219,250,"180");
outtextxy(309,250,"270");
outtextxy(399,250,"360");
outtextxy(489,250,"450");
outtextxy(579,250,"540");
/* E J E Y */
settextjustify(LEFT_TEXT,RIGHT_TEXT);
settextstyle(DEFAULT_FONT,HORIZ_DIR,1);
for(u=45;u<=225;u+=45)
{
line(45,240+u,55,240+u);
line(45,240-u,55,240-u);
}
outtextxy(36,12,"5");
197
outtextxy(36,57,"4");
outtextxy(36,102,"3");
outtextxy(36,147,"2");
outtextxy(36,192,"1");
outtextxy(36,237,"0");
outtextxy(28,282,"-1");
outtextxy(28,327,"-2");
outtextxy(28,372,"-3");
outtextxy(28,417,"-4");
outtextxy(28,462,"-5");
settextjustify(CENTER_TEXT,LEFT_TEXT);
outtextxy(320,479,"Presione Enter Para Continuar");
}

void sen(void)
{
for(xx=0;xx<=590;xx++)
{
y = a*sin((ff*3.141592654*xx)/180);
u = y*45;
setfillstyle(1,15);
circle(xx+50,240-u,2);
floodfill(xx+50,240-u,15);
}
}

void ejes3(void)
{
line(50,240,640,240);
line(50,0,50,480);
setcolor(2);
settextjustify(CENTER_TEXT,CENTER_TEXT);
settextstyle(TRIPLEX_FONT,HORIZ_DIR,3);
outtextxy(25,10,"A");
outtextxy(630,265,"T");
settextstyle(DEFAULT_FONT,HORIZ_DIR,1);
settextjustify(CENTER_TEXT,RIGHT_TEXT);
setcolor(14);outtextxy(320,1,"SEAL DE ENTRADA");
setcolor(15);
/* E J E X */
settextjustify(LEFT_TEXT,CENTER_TEXT);
settextstyle(DEFAULT_FONT,HORIZ_DIR,1);
for(u=58;u<=580;u+=58)
{
line(50+u,235,50+u,245);
}
198
outtextxy(105,250,"1");
outtextxy(163,250,"2");
outtextxy(221,250,"3");
outtextxy(279,250,"4");
outtextxy(337,250,"5");
outtextxy(395,250,"6");
outtextxy(453,250,"7");
outtextxy(511,250,"8");
outtextxy(569,250,"9");
outtextxy(623,250,"10");
/* E J E Y */
settextjustify(LEFT_TEXT,RIGHT_TEXT);
settextstyle(DEFAULT_FONT,HORIZ_DIR,1);
for(u=45;u<=225;u+=45)
{
line(45,240+u,55,240+u);
line(45,240-u,55,240-u);
}
outtextxy(36,12,"5");
outtextxy(36,57,"4");
outtextxy(36,102,"3");
outtextxy(36,147,"2");
outtextxy(36,192,"1");
outtextxy(36,237,"0");
outtextxy(28,282,"-1");
outtextxy(28,327,"-2");
outtextxy(28,372,"-3");
outtextxy(28,417,"-4");
outtextxy(28,462,"-5");
settextjustify(CENTER_TEXT,LEFT_TEXT);
outtextxy(320,479,"Presione Enter Para Continuar");
}

void pulso(void)
{
xx = 50;
for(u=0;u<=10;u++)
{
line(xx,240,xx,240-(45*a));
line(xx,240-(45*a),xx+(29*t),240-(45*a));
line(xx+(29*t),240-(45*a),xx+(29*t),240);
line(xx+(29*t),240,xx+(29*2*t),240);
xx = xx + (29*2*t);
}
}

199
void triangulo(void)
{
xx = 50;
for(u=0;u<=10;u++)
{
line(xx,240,xx+(29*t),240-(45*a));
line(xx+(29*t),240-(45*a),xx+(29*2*t),240);
xx = xx + (29*2*t);
}
}

void senal(void)
{
if(cl=='1')
{
for(k=0;k<ord;k++)
{
signal[k] = a*sin((ff*3.141592654*k)/180);
}
}
if(cl=='2')
{
k=0;
for(cont=0;cont<t/2;cont+=(0.1*t))
{
signal[k] = (1*a);
k++;
}
k=5;
for(cont=t/2;cont<t;cont+=(0.1*t))
{
signal[k] = 0;
k++;
}
k=10;
for(cont=t;cont<(3*t)/2;cont+=(0.1*t))
{
signal[k] = (1*a);
k++;
}
k=15;
for(cont=(3*t)/2;cont<(2*t);cont+=(0.1*t))

{
signal[k] = 0;
k++;
200
}
k=20;
for(cont=(2*t);cont<(5*t)/2;cont+=(0.1*t))
{
signal[k] = (1*a);
k++;
}
k=25;
for(cont=(5*t)/2;cont<(3*t);cont+=(0.1*t))
{
signal[k] = 0;
k++;
}
k=30;
for(cont=(3*t);cont<(7*t)/2;cont+=(0.1*t))
{
signal[k] = (1*a);
k++;
}
k=35;
for(cont=(7*t)/2;cont<(4*t);cont+=(0.1*t))
{
signal[k] = 0;
k++;
}
k=40;
for(cont=(4*t);cont<(9*t)/2;cont+=(0.1*t))
{
signal[k] = (1*a);
k++;
}
k=45;
for(cont=(9*t)/2;cont<(5*t);cont+=(0.1*t))
{
signal[k] = 0;
k++;
}
k=50;
for(cont=(5*t);cont<(11*t)/2;cont+=(0.1*t))
{
signal[k] = (1*a);
k++;
}
k=55;
for(cont=(11*t)/2;cont<(6*t);cont+=(0.1*t))
{
201
signal[k] = 0;
k++;
}
k=60;
for(cont=(6*t);cont<(13*t)/2;cont+=(0.1*t))
{
signal[k] = (1*a);
k++;
}
k=65;
for(cont=(13*t)/2;cont<(7*t);cont+=(0.1*t))
{
signal[k] = 0;
k++;
}
k=70;
for(cont=(7*t);cont<(15*t)/2;cont+=(0.1*t))
{
signal[k] = (1*a);
k++;
}
k=75;
for(cont=(15*t)/2;cont<(8*t);cont+=(0.1*t))
{
signal[k] = 0;
k++;
}
k=80;
for(cont=(8*t);cont<(17*t)/2;cont+=(0.1*t))
{
signal[k] = (1*a);
k++;
}
k=85;
for(cont=(17*t)/2;cont<(9*t);cont+=(0.1*t))
{
signal[k] = 0;
k++;
}
k=90;
for(cont=(9*t);cont<(19*t)/2;cont+=(0.1*t))
{
signal[k] = (1*a);
k++;
}
k=95;
202
for(cont=(19*t)/2;cont<(10*t);cont+=(0.1*t))
{

signal[k] = 0;
k++;
}
}
if(cl=='3')
{
k=0;
for(cont=0;cont<t/2;cont+=(0.1*t))
{
signal[k] = (a/(t/2))*cont;
k++;
}
k=5;
for(cont=t/2;cont<t;cont+=(0.1*t))
{
signal[k] = -(a/(t/2))*(cont-1);
k++;
}
k=10;
for(cont=t;cont<(3*t)/2;cont+=(0.1*t))
{
signal[k] = (a/(t/2))*(cont-1);
k++;
}
k=15;
for(cont=(3*t)/2;cont<(2*t);cont+=(0.1*t))
{
signal[k] = -(a/(t/2))*(cont-2);
k++;
}
k=20;
for(cont=(2*t);cont<(5*t)/2;cont+=(0.1*t))
{
signal[k] = (a/(t/2))*(cont-2);
k++;
}
k=25;
for(cont=(5*t)/2;cont<(3*t);cont+=(0.1*t))
{
signal[k] = -(a/(t/2))*(cont-3);
k++;
}
k=30;
203
for(cont=(3*t);cont<(7*t)/2;cont+=(0.1*t))
{
signal[k] = (a/(t/2))*(cont-3);
k++;
}
k=35;
for(cont=(7*t)/2;cont<(4*t);cont+=(0.1*t))
{
signal[k] = -(a/(t/2))*(cont-4);
k++;
}
k=40;
for(cont=(4*t);cont<(9*t)/2;cont+=(0.1*t))
{
signal[k] = (a/(t/2))*(cont-4);
k++;
}
k=45;
for(cont=(9*t)/2;cont<(5*t);cont+=(0.1*t))
{
signal[k] = -(a/(t/2))*(cont-5);
k++;
}
k=50;
for(cont=(5*t);cont<(11*t)/2;cont+=(0.1*t))
{
signal[k] = (a/(t/2))*(cont-5);
k++;
}
k=55;
for(cont=(11*t)/2;cont<(6*t);cont+=(0.1*t))
{
signal[k] = -(a/(t/2))*(cont-6);
k++;
}
k=60;
for(cont=(6*t);cont<(13*t)/2;cont+=(0.1*t))
{
signal[k] = (a/(t/2))*(cont-6);
k++;
}
k=65;
for(cont=(13*t)/2;cont<(7*t);cont+=(0.1*t))
{
signal[k] = -(a/(t/2))*(cont-7);
k++;
204
}
k=70;
for(cont=(7*t);cont<(15*t)/2;cont+=(0.1*t))
{
signal[k] = (a/(t/2))*(cont-7);
k++;
}
k=75;
for(cont=(15*t)/2;cont<(8*t);cont+=(0.1*t))
{
signal[k] = -(a/(t/2))*(cont-8);
k++;
}
k=80;
for(cont=(8*t);cont<(17*t)/2;cont+=(0.1*t))
{
signal[k] = (a/(t/2))*(cont-8);
k++;
}
k=85;
for(cont=(17*t)/2;cont<(9*t);cont+=(0.1*t))
{
signal[k] = -(a/(t/2))*(cont-9);
k++;
}
k=90;
for(cont=(9*t);cont<(19*t)/2;cont+=(0.1*t))
{
signal[k] = (a/(t/2))*(cont-9);
k++;
}
k=95;
for(cont=(19*t)/2;cont<(10*t);cont+=(0.1*t))
{
signal[k] = -(a/(t/2))*(cont-10);
k++;
}
}
}

205
4.5 APLICACIONES DEL PROCESAMIENTO
DIGITAL DE SEALES
El campo de aplicacin del procesamiento digital de seales en los ltimos
aos se ha acrecentado de manera significativa gracias a las tcnicas de
integracin a muy grande escala (VLSI), a la versatilidad de los circuitos
integrados, a la gran velocidad de procesamiento de la computadora y a la
reduccin de costos. Por lo que el procesamiento digital de seales se aplica en
casi todos los campos de la ciencia y de la ingeniera, tales como: el
procesamiento de audio, el video, la biomdica, las comunicaciones, los sistemas
de control, los sistemas de radar, la fsica, la telemetra, la oceanografa, etc.
En los sistemas de telecomunicaciones el procesamiento digital de seales
es muy importante; ya que es un factor que permite tener sistemas de mayor
precisin, a altas velocidades y con una alta confiabilidad.
El procesamiento digital de seales tambin nos permite simular los
sistemas en una computadora; con lo cual el diseador tiene un criterio ms
amplio al realizar un sistema, escogiendo los parmetros ptimos.
Se puede eliminar ruido y distorsin en las seales, atenuar ciertos rangos
de frecuencia por medio de filtros digitales con cortes de frecuencia muy precisos
y abruptos, se pueden analizar los espectros en frecuencia de las seales por
medio de la transformada rpida de Fourier (FFT), se puede trabajar con sistemas
digitales multicanalizados, en las centrales telefnicas digitales para poder
detectar y corregir fallas, en la transmisin digital de seales de video.
En los sistemas de audio el procesamiento digital de seales abarca lo que
es grabacin, almacenaje y reproduccin.
Por medio del procesamiento digital de seales se puede hacer
reverberacin artificial, igualacin espectral y divisores de frecuencia en forma
digital.
El Compact Disc (CD) y el Digital Compact Cassette (DCC) son productos
que existen en el mercado, en los cuales se aplica el procesamiento digital de
seales.
Un ejemplo en que se incluye filtrado lineal invariante en el tiempo es en
los sistemas de audio. Estos sistemas vienen equipados por lo general con un
filtro que le permite al oyente modificar las cantidades relativas de energa de baja
frecuencia (graves) y la energa de alta frecuencia (agudos).
Tambin, en sistemas de audio de alta fidelidad, es comn incluir un filtro en el
preamplificador para compensar las caractersticas de respuesta en frecuencia de
las bocinas.
Los circuitos ecualizadores estn diseados para compensar la respuesta en
frecuencia de las bocinas y de la habitacin donde se encuentran, y consisten de
dos etapas conectadas en cascada: una etapa de control y una etapa
ecualizadora.

206
Los filtros diferenciadores son tiles para acentuar las transiciones rpidas
de una seal, y una aplicacin en la que se emplean a menudo es en la
intensificacin de los bordes en el procesamiento de imgenes.
Por ejemplo, si el ruido de superficie en una grabacin de audio est en una
banda de frecuencia ms alta que la msica o la voz en la grabacin, puede
eliminarse mediante un filtro selectivo en frecuencia. Otra aplicacin importante
de los filtros selectivos en frecuencia es en los sistemas de comunicaciones.
La base para los sistemas de modulacin en amplitud (AM) es la
transmisin simultnea de informacin originada en muchas fuentes diferentes,
poniendo la informacin de cada canal en una banda de frecuencia separada y
extrayendo los canales individuales o bandas en el receptor empleando filtros
selectivos en frecuencia. Los filtros selectivos en frecuencia para separacin de
canales individuales y los filtros conformadores de frecuencia para el ajuste de la
calidad de tono forman una parte importante de cualquier radio domstico o
receptor de televisin.
Es comn emplear filtros de tiempo discreto en el anlisis de secuencias de
datos econmicos tales como el ndice del mercado de valores.
El filtrado de secuencias de datos econmicos tambin se usa para suavizar los
datos para eliminar las fluctuaciones aleatorias (que son por lo general de alta
frecuencia) sobrepuestas a los datos significativos.
El sistema de suspensin del automvil est destinado por lo general a
filtrar las rpidas variaciones en el movimiento del auto debidas a la superficie del
camino (es decir, para actuar como un filtro pasa bajas).
Es comn aplicar un filtro de promedio mvil a muchos indicadores
econmicos para atenuar las fluctuaciones de corto plazo en relacin con las
tendencias de largo plazo.

207
4.6 FILTRADO DIGITAL
P ROYECTOS REALIZADOS EN LOS 10 LTIMOS AOS
(Informacin Obtenida de Internet [http://www.gc.ssr.upm.es/inves/fildig.html])

TITULO: "Comportamiento de estructuras de mnimo ruido de cuantificacin


frente a estructuras clsicas de filtros digitales".
TITULO: "Diseo de filtros programables realizados mediante estructuras de
filtros de onda digitales".
TITULO: "Paquete Software para el diseo de filtros FIR realizados con
aritmtica finita".
TITULO: "Diseo de interpoladores multietapa basados en filtros digitales IIR
de tipo polifsico y fase aproximadamente lineal".
TITULO: "Diseo por ordenador de filtros digitales recursivos de N bandas con
respuesta de fase no lineal, y su utilizacin para la realizacin de
interpoladores y decimadores".
TITULO: "Diseo de un decimador multietapa basado en filtros digitales de
onda del tipo polifsico IIR".
TITULO: "Anlisis de sensibilidad y ruido de cuantificacin en filtros digitales
de onda".
TITULO: "Anlisis comparativo de ruido de cuantificacin en estructuras FIR
de fase lineal".
TITULO: "Implementacin de filtros de condensadores conmutados con
estructura de realimentacin mltiple".
TITULO: "Anlisis de efectos de cuantificacin en estructuras FIR de
descomposicin en subbandas".
TITULO: "Diseo e implementacin de filtros digitales en celosa y en
escalera".
TITULO: "Programa de diseo de filtros digitales IIR realizados con aritmtica
infinita".

208
CONCLUSIONES
El principio de los mtodos de Fourier para el anlisis de seales es
descomponer las mismas en sumatorias de componentes senoidales.
El procesamiento digital de seales se basa en una categora de tcnicas
que analizan seales provenientes de una amplia gama de fuentes, tales como
voz, satlites meteorolgicos, monitores ssmicos y pruebas nucleares. Las
seales son convertidas en datos digitales y analizadas empleando varios
algoritmos, tales como la Transformada Rpida de Fourier (FFT).
Una vez que la seal ha sido reducida a nmeros, sus componentes pueden ser
aislados y analizados ms fcilmente que en forma analgica. El procesamiento
digital de seales es utilizado en campos tales como biomedicina, sonar, radar,
sismologa y comunicaciones de voz y datos.
El proceso de filtrado consiste en cambiar las amplitudes relativas de los
componentes de frecuencia de una seal o quizs eliminar por completo algunos
de ellos; esto se realiza analgicamente con un circuito que contiene varios
componentes (resistencias, capacitores, bobinas, etc.). Para realizar un filtro lo
ms cercano a lo ideal el orden del filtro deber ser muy grande y por lo tanto el
costo y el tamao aumentaran significativamente debido a la cantidad de
componentes que se necesitaran para armar dicho filtro.
El filtrado digital es lo mismo que el filtrado analgico, con la diferencia de
que la seal se debe de muestrear; los filtros digitales no son muy costosos ya
que se pueden realizar en forma fsica con multiplicadores, registros de estado,
compuertas, etc.
Los filtros digitales tambin se pueden realizar mediante el diseo e
implementacin de un programa en computadora que realice el proceso de
filtrado, resolviendo de esta manera el problema del tamao del filtro que tenamos
en los filtros analgicos; adems los filtros digitales tienen la ventaja de ser ms
exactos que los analgicos.
El programa desarrollado en este trabajo ayuda ha comprender el
comportamiento de los filtros digitales de respuesta al impulso finito (FIR); ya que
nos permite observar y comparar los cambios que sufren los filtros digitales FIR al
cambiar uno o varios de sus parmetros.
Para simular el proceso de filtrado se pueden seguir dos procedimientos:

1. Transformar las muestras de las seales de entrada al dominio de la frecuencia


y multiplicarlas con las muestras de la respuesta en frecuencia del filtro.
2. Dejar las muestras de las seales de entrada en el dominio del tiempo y
convolucionarlas con las muestras ventaneadas del filtro.
209
El desarrollo de este trabajo le permite al estudiante contar con un material
didctico para comprender mejor los procesos de transformada discreta y
transformada discreta inversa; manejando ejemplos resueltos matemticamente y
con la ayuda de los programas.
Los libros de procesamiento digital de seales no tienen ejemplos de como
se resuelve la FFT matemticamente; as que para resolver este problema se
incluyen ejemplos de este proceso, as como tambin un programa en C++ donde
se puede visualizar la implementacin de los diagramas de mariposa y de los
nodos duales para la obtencin de la FFT.
Existen paquetes como el matlab que manejan libreras de procesamiento
digital de seales, en donde las instrucciones son rpidas y prcticas; en las
cuales se manejan clculos para sistemas de una y de dos dimensiones,
efectundose as un proceso real, ya que en la prctica manejamos dos o tres
dimensiones y una velocidad alta de proceso.
Este trabajo proporciona las bases necesarias para la comprensin de
temas de procesamiento digital de seales ms avanzados como son los filtros
adaptivos, los predictores, etc.

210
APNDICE A
FRMULA DE EULER

Para obtener la frmula de Euler, comencemos con la siguiente expresin:

g = cos + j sen ( A.1)

Donde es real y j = 1. Diferenciando, tenemos:

dg
d = j ( cos + j sen ) = jg

Como puede verse por (A.1). Las variables en la ltima ecuacin pueden
separarse, produciendo:
dg
g = jd

Integrando, tenemos:

ln g = j + K ( A.2)
Donde K es una constante de integracin. En (A.1) vemos que g = 1 cuando =
0, lo que debe ser vlido para (A.2). Es decir:

ln1 = 0 = 0 + K

O bien K = 0. Por tanto, tenemos:

ln g = j

O bien:

g = e j ( A.3)
Comparando (A.1) con (A.3), veremos que:

211
e j = cos + j sen ( A.4)
La cual se conoce como frmula de Euler. Se encuentra una forma alterna
reemplazando por - como sigue:

e j = cos( ) + j sen( )

La cual equivale a:

e j = cos j sen ( A.5)


Es evidente que (A.4) y (A.5) son conjugados.
La frmula de Euler nos proporciona medios para obtener frmulas alternas
de cos y sen . Por ejemplo, sumando (A.4) y (A.5) y dividiendo el resultado
entre 2, tenemos:

e j + e j
cos = ( A.6)
2

De modo semejante, restando (A.4) y (A.5) y dividiendo el resultado entre 2j,


tenemos:

e j e j
sen = ( A.7)
2j

212
APNDICE B
OBTENCIN DE LAS ECUACIONES GENERALES
DE DISEO DE LOS FILTROS FIR

Una de las frmulas que emplearemos para obtener las ecuaciones


generales de diseo de los filtros FIR es la siguiente:

sen x
Sa ( x ) = ( B.1)
x

De la frmula anterior obtenemos la siguiente propiedad:

sen x
lim Sa( x) = lim
x 0 x 0 x
=1 ( B.2)

DEMOSTRACIN
Nosotros sabemos que la ecuacin de la serie del sen x est dada por:

1 3 1 5 1 7
sen x = x x + x x + ( B.3)
3! 5! 7!

Substituyendo (B.3) en (B.2) tenemos:

sen x x 1 x3 1 x5
lim = lim lim + lim
x0 x x0 x x 0 3! x x 0 5! x

1 x7 1 1
lim + = lim1 lim x 2 + lim x 4
x0 7! x x0 x 0 3! x 0 5!

1
lim 7! x
6
+ = 1 0 + 0 0 + = 1
x0

El mtodo que emplearemos para obtener las ecuaciones de diseo de los


filtros FIR es la frmula de las series de Fourier expresada por:

213
F /2

H (e )e
1
hd (n) = j 2 fT j 2 fnT
df ( B.4)
F F /2

214
FILTRO PASA BAJAS
De la Fig. B.1 (a) obtenemos la siguiente expresin:

1 para f f c

(
H e j 2 fT
) = F ( B.5)
0 para f c < f
2

Substituyendo (B.5) en (B.4) tenemos:

fc

hd ( n) =
1
e df =
1 1
[ ] 1 1
[ ]
j 2 fnT fc
e j 2fnT = e j 2f cnT e j 2f cnT =
F fc
F j 2nT fc F j 2nT
1 1 2f 2 f sen( 2f c nT ) 2 f c sen( 2nf c / F )
c 2 j sen( 2f c nT ) = c =
F j 2nT 2 f c F 2f c nT F 2nf c / F
2 f sen( 2nf c / F )
hd ( n) = c para n > 0
F 2nf c / F

sen( 2nfc / F )
De la frmula anterior tenemos que el = Sa( 2nfc / F ) ; por lo tanto
2nfc / F
para n = 0 se aplica la expresin (B.2) dndonos como resultado lo siguiente:

2 fc
hd ( n) = para n = 0
F

As; tenemos que para un filtro pasa bajas los coeficientes de diseo estn dados
por:

2 f c sen( 2nf c / F )
para n > 0
F 2nf c / F
hd ( n) = ( B.6)
2 fc para n = 0
F

De la Fig. B.1 (a) observamos que:

f p + fs
fc = F = f s f p ( B.7)
2

215
FILTRO PASA ALTAS
De la Fig. B.1 (b) obtenemos la siguiente expresin:

F
1 para f c f
H e ( j 2 fT
) = 2 ( B.8)
0 para f < f c

Substituyendo (B.8) en (B.4) tenemos:

F /2 fc

hd ( n) =
1
e
1
e df =
1 1
[ ]
j 2 fnT j 2 fnT F /2
df + e j 2fnT +
F fc
F F /2
F j 2nT fc

j 2 F2 n F1 j 2 f c n
[ ]
1
1 1 fc 1 1
e j 2fnT = e e F
+
F j 2nT F /2 F j 2nT
1 j 2f cn F1 j 2 n
[ ]
F 1
1 1 1
e e 2 F
= e jn e j 2f cn / F + e j 2f cn / F e jn =
F j 2nT F j 2nT
1 F 1 2f 1
2 j sen(n) c 2 j sen( 2nf c / F ) =
F j 2n F 2 f c j 2nT
sen( n ) 2 f c sen( 2nf c / F ) 2 f sen( 2nf c / F )
= 0 c
n F 2nf c / F F 2nf c / F
2 f sen( 2nf c / F )
hd ( n) = c para n > 0
F 2nf c / F

sen(n )
De la frmula anterior tenemos que el = Sa(n ) y el
n
sen( 2nfc / F )
= Sa( 2nfc / F ) ; por lo tanto para n = 0 se aplica la expresin (B.2)
2nfc / F
dndonos como resultado lo siguiente:

2 fc
hd ( n) = 1 para n = 0
F

As; tenemos que para un filtro pasa altas los coeficientes de diseo estn dados
por:

216
2 f c sen( 2nf c / F )
para n > 0
F 2nf c / F
hd ( n) = ( B.9)
1 2 f c para n = 0
F

De la Fig. B.1 (b) observamos que:

f p + fs
fc = F = f p f s ( B.10)
2

FILTRO PASA BANDA


De la Fig. B.1 (c) obtenemos la siguiente expresin:


0 para f < f c1

(
H e j 2fT ) = 1 para f c1 f f c 2 ( B.11)
F
0 para f c 2 < f
2

Substituyendo (B.11) en (B.4) tenemos:

fc2 f c1
1 1 1 1
[ ] 1 1
[ ]
f c1
hd (n) = e df + e df =
j 2 fnT j 2 fnT fc2
e j 2fnT + e j 2fnT =
F f c1
F fc2
F j 2nT f c1 F j 2nT fc2

1

1
F j 2nT
[
e j 2f c 2 nT e j 2f c1nT + ] 1
F j 2nT
1
[ ]
e j 2f c1nT e j 2f c 2 nT =

1

1
F j 2nT
[ ]
e j 2f c 2 n / F e j 2f c1n / F + e j 2f c1n / F e j 2f c 2 n / F =

1 2 f c2 1 1 2f 1
2 j sen( 2nf c 2 / F ) c1 2 j sen( 2nf c1 / F ) =
F 2 f c 2 j 2nT F 2 f c1 j 2nT
2 f c 2 sen( 2nf c 2 / F ) 2 f c1 sen( 2nf c1 / F )
=
F 2nf c 2 / F F 2nf c1 / F

n
1
[sen( 2nf c 2 / F ) sen( 2nf c1 / F ) ]
hd (n) =
1
n
[
sen( 2nf c 2 / F ) sen( 2nf c1 / F ) para n > 0 ]
217
sen( 2nfc2 / F )
De la frmula anterior tenemos que el = Sa( 2nfc2 / F ) y el
2nfc2 / F
sen( 2nfc1 / F )
= Sa( 2nfc1 / F ) ; por lo tanto para n = 0 se aplica la expresin (B.2)
2nfc1 / F
dndonos como resultado lo siguiente:

2
hd ( n ) = ( f c 2 f c1 ) para n = 0
F

As; tenemos que para un filtro pasa banda los coeficientes de diseo estn dados
por:

1
[ ]
n sen(2nf c 2 / F ) sen(2nf c1 / F ) para n > 0
hd (n) = ( B.12)
2 ( f c 2 f c1 ) para n = 0
F

De la Fig. B.1 (c) observamos que:

F1 = f p1 f s1 F2 = f s 2 f p 2
F = min[ F1 , F2 ] ( B.13)
F F
f c1 = f p 1 f c2 = f p2 +
2 2

FILTRO RECHAZA BANDA


De la Fig. B.1 (d) obtenemos la siguiente expresin:


1 para f f c1

(
H e j 2fT ) = 0 para f c1 < f < f c 2 ( B.14)
F
1 para f c 2 f
2

Substituyendo (B.14) en (B.4) tenemos:

218
F /2 f c1 fc2

hd ( n) =
1
e df +
1
e df +
1
e df =
1 1
[ ]
j 2 fnT j 2 fnT j 2 fnT F /2
e j 2fnT +
F fc2
F f c1
F F /2
F j 2nT fc2

1 j 2 F2 n F1
1 1
[ ] 1 1
[ ] 1
f c1 fc2
e j 2fnT + e j 2fnT = e e j 2 f c 2 n / F +
F j 2nT f c1 F j 2nT F /2 F j 2nT
1 1 j 2f c1n F1 j 2 f c 1n / F 1 1 j 2f c 2 n F1 j 2 n / F
F
e e + e e 2
=
F j 2nT F j 2 nT
1 F 1 2 f c2 1
2 j sen( n ) 2 j sen( 2nf c 2 / F ) +
F j 2n F 2 f c 2 j 2nT
1 2 f c1 1 sen( n )
2 j sen( 2nf c1 / F ) = +
F 2 f c1 j 2nT n
2 f c1 sen( 2nf c1 / F ) 2 f c 2 sen( 2nf c 2 / F )
=
F 2nf c1 / F F 2nf c 2 / F

0+
n
1
[ sen( 2nf c1 / F ) sen( 2nf c 2 / F ) ]
hd ( n) =
1
n
[
sen( 2nf c1 / F ) sen( 2nf c 2 / F ) para n > 0 ]
sen( 2nfc1 / F )
De la frmula anterior tenemos que el = Sa( 2nfc1 / F ) , el
2nfc1 / F
sen( 2nfc2 / F ) sen(n)
= Sa( 2nfc2 / F ) y el = Sa(n) ; por lo tanto para n = 0 se
2nfc2 / F n
aplica la expresin (B.2) dndonos como resultado lo siguiente:

2
hd ( n ) = ( f c1 f c 2 ) + 1 para n = 0
F

As; tenemos que para un filtro rechaza banda los coeficientes de diseo estn
dados por:

1
[
n sen(2nf c1 / F ) sen(2nf c 2 / F ) para n > 0 ]
hd (n) = ( B.15)
2 ( f c1 f c 2 ) + 1 para n = 0
F

De la Fig. B.1 (d) observamos que:

219
F1 = f p1 f s1 F2 = f s 2 f p 2
F = min[ F1 , F2 ] ( B.16)
F F
f c1 = f p 1 f c2 = f p2 +
2 2

220
APNDICE C
CONVOLUCIN DISCRETA

La convolucin discreta esta definida por la sumatoria:


N 1
y( kT ) = x(iT )h[( k i )T ] (C.1)
i =0

Donde x(kT) y h(kT) son ambas funciones peridicas con periodo N:

x( kT ) = x[( k + rN )T ] r = 0,1,2,.....
h( kT ) = h[( k + rN )T ] r = 0,1,2,..... (C.2)
Por conveniencia de notacin, la convolucin discreta es normalmente escrita
como:

y( kT ) = x( kT ) h( kT ) (C.3)
Para examinar la ecuacin de la convolucin discreta, consideremos las
ilustraciones de la Fig. C-1. Ambas funciones x(kT) y h(kT) son peridicas con
periodo N = 4.
De la Eq. (C.1) las funciones x(iT) y h[(k-i)T] son requeridas. La funcin h(-iT) es
la imagen de h(iT) sobre los ejes ordinarios como se ilustra en la Fig. C-2(a); la
funcin h[(k-i)T] es simplemente la funcin h(-iT) trasladada por el valor kT. La
Fig. C - 2(b) ilustra h[(k-i)T] para un traslado de 2T. La Eq. (C.1) es evaluada para
cada traslado de kT realizando las multiplicaciones y las sumas requeridas.

221
222
LA CONVOLUCIN DISCRETA EN FORMA
GRFICA
El proceso de la convolucin discreta es ilustrado grficamente en la Fig. C-
3.
Las muestras de x(kT) y h(kT) son denotadas por puntos y cruces,
respectivamente. La Fig. 7-3(a) ilustra el clculo deseado para k = 0. El valor de
cada punto es multiplicado por el valor de las cruces las cuales ocurren en el
mismo valor de abscisa; estos productos se suman con los N = 4 valores discretos
indicados. El clculo de la Eq. (C.1) es evaluado grficamente para k = 1 en la
Fig. C-3(b); la multiplicacin y la sumatoria es con los N puntos indicados. Las
figuras C-3(c) y (d) ilustran el clculo de la convolucin para k = 2 y k = 3,
respectivamente. Note que para k = 4 [Fig. C-3(e)], los trminos multiplicados y
sumados son idnticos a los de la Fig. C-3 (a). Esto es de esperarse porque ambas
x(kT) y h(kT) son peridicas con un perodo de cuatro trminos. Por lo tanto:

y( kT ) = y[( k + rN )T ] r = 0,1,2,..... (C.4)


Los pasos para el clculo grfico de la convolucin discreta difieren de los
de la convolucin continua slo en que la integracin es reemplazada por una
suma. Para la convolucin discreta estos pasos son: (1) doblamiento o inversin,
(2) desplazamiento o traslado, (3) multiplicacin, y (4) sumatoria. Como en la
convolucin de funciones continuas, cualquiera de las dos secuencias x(kT) o
h(kT) puede seleccionarse para el desplazamiento. La Eq. (C.1) puede escribirse
equivalentemente como:
N 1
y( kT ) = x[( k i )T ]h(iT ) (C.5)
i =0

223
224
CONVOLUCIN DISCRETA DE FORMAS DE
ONDA DE DURACIN FINITA
Considere las funciones x(t) y h(t) como se ilustra en la Fig. C-4(a).
Deseamos convolucionar estas dos funciones en la forma continua y en la forma
discreta, y para comparar estos resultados. La convolucin continua y(t) de las
dos funciones se muestra tambin en la Fig. C-4(a). Para evaluar la convolucin
discreta, muestreamos ambas x(t) y h(t) con un intervalo de muestreo T y
asumimos que las dos funciones muestreadas son peridicas con periodo N.
Como se ilustra en la Fig. C-4(b), el perodo se ha elegido como N = 9 y ambas
funciones x(kT) y h(kT) estn representadas por P = Q = 6 muestras; las muestras
restantes que definen el perodo se les asigna el valor de cero. La Fig. C-4(b)
tambin ilustra la convolucin discreta y(kT) para el periodo de N = 9; para esta
seleccin de N, la convolucin discreta es un acercamiento muy pobre a la
continua porque la limitacin de periodicidad resulta en una superposicin del
periodo de respuesta deseado. Esto es, no escogimos un perodo suficientemente
grande para que el resultado de la convolucin de un perodo que no interfiera o
se superponga al resultado de la convolucin del perodo logrado. Es obvio que si
deseamos que la convolucin discreta se aproxime a la convolucin continua
entonces es necesario que el perodo se elija para que no haya superposicin.
Escogiendo el perodo segn la relacin:

N = P + Q 1 (C.6)
Esta situacin se ilustra en la Fig. C-4(c) donde N = P + Q - 1 = 11.
Note que para esta seleccin de N no hay superposicin en el resultado de la
convolucin.
La Eq. (C-6) esta basada en el hecho de que la convolucin de una funcin
representada por P muestras y una funcin representada por Q muestras es una
funcin descrita por P + Q - 1 muestras.
No hay ventaja en elegir N > P + Q - 1; como se muestra en la Fig. C-4(d),
para N = 15 los valores que no son cero de la convolucin discreta son idnticos
a los de la Fig. C-4(c). Mientras N se elija segn la Eq. (C.6), la convolucin
discreta resulta en una funcin peridica donde cada perodo se aproxima a los
resultados de la convolucin continua.
La Fig. C-4(c) ilustra el hecho de que los resultados de la convolucin
discreta tienen una escala diferente a los de la convolucin continua. Esta
constante de escalamiento es T; modificando la Eq. (C.1) de la convolucin
discreta obtenemos:
N 1
y( kT ) = T x(iT )h[( k i )T ] (C.7)
i =0

225
La relacin (C.7) es simplemente la integral de la convolucin continua para
funciones limitadas en tiempo evaluadas por integracin rectangular. As, para las
funciones de longitud finita en tiempo, la convolucin discreta se aproxima a la
convolucin continua dentro del error introducido por la integracin rectangular.
Como se ilustra en la Fig. C-4(e), si el intervalo de muestreo T se hace lo
suficientemente pequeo, entonces el error introducido por la Eq. (C.7) de la
convolucin discreta es despreciable.

226
TEOREMA DE LA CONVOLUCIN
DISCRETA
Anlogamente a la teora de la transformada de Fourier, una de las ms
importantes propiedades de la transformada discreta de Fourier es exhibida
por la transformada discreta de Fourier de la Eq. (C.1). La transformacin discreta
de Fourier de la convolucin de la Eq. (C.1) produce el teorema de la convolucin
discreta el cual es expresado como:
N 1
n n
x(iT )h[( k i )T ] X NT H NT
i =0
(C.8)

Para establecer este resultado, substituimos (1-17) en el lado izquierdo de (C.8):

N 1 N 1 N 1 N 1
n j 2ni / N 1 m
x(iT )h[( k i )T ] =
1
i =0 i =0 N

n=0
X e
NT N
H NT e
m= 0
j 2 m ( k i ) / N
=

1 N 1 N 1
n m j 2mk / N 1 N 1 j 2in / N j 2im/ N
N
X NT H NT e
n = 0 m= 0
e
N i =0
e

(C.9)

El trmino entre corchetes en (C.9) es simplemente la relacin de ortogonalidad


(1-19) y es igual a N si m = n; por lo tanto:
N 1 N 1
n n
x(iT )h[( k i )T ] =
1
i =0 N
X NT H NT e
n=0
j 2 nk / N
(C.10)

Por lo tanto, la transformada discreta de Fourier de la convolucin de dos


funciones peridicas muestreadas con periodo N es igual a el producto de las
transformadas discretas de Fourier de las funciones peridicas.

227
PROGRAMA PARA REALIZAR LA
CONVOLUCIN DISCRETA
DESCRIPCIN
Este programa fue elaborado en Turbo C Ver. 2.0 con el propsito de
auxiliar al estudiante de procesamiento digital de seales en el aprendizaje de
dicho tema; este programa esta estructurado para que el estudiante comprenda
el proceso que conlleva a la convolucin.
Existen diferentes tipos de software para realizar la convolucin, uno de ellos es
el MATLAB que realiza este proceso entre otros. El Matlab utiliza una funcin
llamada conv(a, b) y tiene la ventaja de aceptar una gran cantidad de muestras
para ser procesadas; lo cual no puede hacerse con este programa por estar
limitado por el arreglo de datos, otra ventaja que tenemos al utilizar Matlab es que
podemos abrir un archivo de datos para su proceso.
El programa trabaja de la siguiente manera:

Pide al usuario que introduzca el nmero de muestras para x(kT).


Pide al usuario que introduzca el nmero de muestras para h(kT).
Despliega la mejor aproximacin (Nmero de muestras con que realizara el
proceso de la convolucin).
Pide al usuario que introduzca el valor de las muestras de x(kT).
Pide al usuario que introduzca el valor de las muestras de h(kT).
Despliega los resultados obtenidos.
Despliega la grfica de los resultados obtenidos.

Para realizar este programa se necesita tener Turbo C Ver. 2.0 y un


monitor VGA color.
NOTA. Si empleamos una versin de C++ el programa podra marcar errores o
advertencias al compilarlo.
Para el modo grfico el programa esta diseado para trabajar con la
resolucin de 640x480 pixeles y desplegar las grficas en color; si
empleamos un monitor SVGA o un UVGA no tendremos problema alguno
siempre y cuando el monitor sea de color; si el monitor es monocromtico
como el programa tiene instrucciones de color lo que suceder es que
nuestra pantalla al desplegar la grfica se pondr toda gris o negra.
Si se desea modificar el programa de tal manera que no ocurra esto es
necesario modificar las instrucciones de setcolor, de floodfillstyle y las de
floodfill. Tambin se puede modificar el programa para que se pueda usar
otro tipo de monitor (CGA u otro); pero hay que tener cuidado ya que si
dejamos as las coordenadas la grfica saldr incompleta o corrida.

228
LA FUNCIN conv DEL MATLAB

c = conv(a, b) convoluciona los vectores a y b.


Alternativamente, c = conv(a, b) puede usarse con el propsito de multiplicar
polinomios cuyos coeficientes son los elementos a y b entonces, algebraicamente,
esto es la misma operacin.
El teorema de la convolucin muestra, speramente, que convolucionar dos
secuencias es lo mismo que multiplicar sus transformadas de Fourier.

229
P ROGRAMA F UENTE
/*PROGRAMA QUE REALIZA LA CONVOLUCION DISCRETA DE
FOURIER*/
#include <graphics.h>
#include <conio.h>
#include <math.h>
#include <stdlib.h>
#define N 1000

int gd,gm;
float p,q,n,i,k,j,y[N],x[N],h[N],a[N],h[N],num,e,r,temp,aa[N],n1,max;
char pp[10];

graficos()
{
gd=VGA;
gm=VGAHI;
initgraph(&gd,&gm,"");
}

clculos()
{
a0:
clrscr();
gotoxy(21,11);printf("DAME EL NUMERO DE MUESTRAS PARA x(kT).");
gotoxy(35,12);printf("P(>0) = ");scanf("%f",&p);
if (p<=0)
goto a0;
a1:
gotoxy(21,13);printf("DAME EL NUMERO DE MUESTRAS PARA h(kT).");
gotoxy(35,14);printf("Q(>0) = ");scanf("%f",&q);
if (q<=0)
{
gotoxy(35,14);delline();
goto a1;
}
gotoxy(25,25);printf("<Presione Enter Para Continuar>");getche();
n=p+q-1;
clrscr();
gotoxy(27,11);printf("LA MEJOR APROXIMACION ES:");
gotoxy(37,12);printf("N = %.0f",n);
gotoxy(25,25);printf("<Presione Enter Para Continuar>");getche();
clrscr();
gotoxy(16,1);printf("INTRODUCE LOS VALORES DE LAS MUESTRAS
PARA x(kT).");
230
for(k=0;k<n;k++)
{
gotoxy(35,k+3);printf("x[%.0f] = ",k);scanf("%f",&x[k]);
}
gotoxy(25,25);printf("<Presione Enter Para Continuar>");getche();
clrscr();
gotoxy(16,1);printf("INTRODUCE LOS VALORES DE LAS MUESTRAS
PARA h(kT).");
for(k=0;k<n;k++)
{
gotoxy(35,k+3);printf("h[%.0f] = ",k);scanf("%f",&h[k]);
}
gotoxy(25,25);printf("<Presione Enter Para Continuar>");getche();
clrscr();
gotoxy(30,1);printf("RESULTADOS OBTENIDOS");
for(k=0;k<n;k++)
{
for(i=0;i<n;i++)
{
j=k-i;
if (j<0)
h[j]=0;
y[k] = x[i]*(h[j]);
a[k]=a[k]+y[k];
}
gotoxy(35,k+3);printf("y[%.0f] = %.2f",k,a[k]);
}
gotoxy(25,25);printf("<Presione Enter Para Continuar>");getche();
}

ejes()
{
setcolor(15);
line(60,0,60,480);
line(60,240,640,240);
setlinestyle(0,0,3);
line(640,240,630,230);
line(640,240,630,250);
line(630,230,630,250);
line(60,0,70,10);
line(60,0,50,10);
line(50,10,70,10);
floodfill(59,5,WHITE);
floodfill(61,5,WHITE);
floodfill(635,239,WHITE);
floodfill(635,241,WHITE);
231
settextjustify(CENTER_TEXT,CENTER_TEXT);
settextstyle(TRIPLEX_FONT,HORIZ_DIR,1);
setcolor(10);
outtextxy(90,5,"Y(k)");
outtextxy(632,218,"n");
q=60;setcolor(15);
setlinestyle(0,0,0);
settextjustify(CENTER_TEXT,LEFT_TEXT);
settextstyle(DEFAULT_FONT,HORIZ_DIR,1);
outtextxy(320,479,"Presione Enter Para Continuar");
q=20;
while(q<=196)
{
line(55,q,65,q);
q+=44;
}
q=284;
while(q<=640)
{
line(55,q,65,q);
q+=44;
}
q=60;n1=0;
while(q<640)
{
line(q,235,q,245);
num = n1+1;
itoa(num,pp,10);
q+=580/n;n1++;
setcolor(15);
outtextxy(q,257,pp);
}
}

ejes_num()
{
itoa(max,pp,10);
settextstyle(DEFAULT_FONT,HORIZ_DIR,1);
setcolor(15);
outtextxy(40,20,pp);
itoa(-max,pp,10);
setcolor(15);
outtextxy(35,460,pp);
getche();
closegraph();
}
232
dibujo()
{
for(n1=0;n1<=n-1;n1++)
{
aa[n1] = a[n1];
}
for(r=0;r<=n-1;r++)
for(e=r+1;e<=n+1;e++)
if (aa[r]<aa[e])
{
temp = aa[r];
aa[r] = aa[e];
aa[e] = temp;
}
max = aa[0];
for(k=0;k<n;k++)
{
setcolor(14);
circle(60+(k*(580/n)),240-(a[k]*(220/max)),2);
setfillstyle(1,14);
floodfill(60+(k*(580/n)),240-(a[k]*(220/max)),14);
line(60+(k*(580/n)),240,60+(k*(580/n)),240-(a[k]*(220/max)));
}
settextjustify(CENTER_TEXT,CENTER_TEXT);
settextstyle(TRIPLEX_FONT,HORIZ_DIR,2);
outtextxy(350,10,"FORMA GRAFICA DE LOS RESULTADOS");
}

main()
{
clculos();
graficos();
ejes();
dibujo();
ejes_num();
}

233
EJEMPLO C.1
Encontrar la convolucin discreta de las siguientes funciones:

234
235
236
GLOSARIO
ALIASING. Traslape de espectros.
A.M. Modulacin en amplitud.
BP. Pasa banda.
BS. Rechaza banda.
CAUSAL. Fsicamente realizable.
DFT. Transformada discreta de Fourier.
DIFT. Transformada discreta inversa de Fourier.
DSP. Procesador digital de seales. Un circuito programable
para procesamiento de sonidos, utilizado en mdems y
tarjetas de sonido. Las tarjetas de sonido utilizan el DSP
para controlar una gama de resoluciones de sonido,
formatos y filtros que alteran el sonido sin requerir
circuitos independientes para cada uno, mientras que
los mdems utilizan el DSP para controlar varios
protocolos de modulacin.
ECUALIZADOR. Es un dispositivo que esta diseado para compensar la
respuesta en frecuencia de las bocinas y de la
habitacin donde se encuentran, y consiste de dos
etapas conectadas en cascada: una etapa de control y
una etapa ecualizadora.
FENMENO DE GIBBS. La implicacin de este fenmeno es que la
aproximacin de la serie de Fourier truncada de una
seal discontinua, en general exhibir rizos de alta
frecuencia y sobrepasos cerca de las discontinuidades
y si tal aproximacin se usa en la prctica, se debe
escoger un valor de N bastante grande para garantizar
que la energa total en estos rizos sea insignificante.
FFT. Transformada rpida de Fourier.
FIFT. Transformada rpida inversa de Fourier.
FILTRADO. Es el cambio de las amplitudes relativas de los
componentes de frecuencia de una seal o la
eliminacin de algunos de ellos.
FILTROS Son aquellos en los que la salida del filtro es una
DIFERENCIADORES. aproximacin de derivada de su entrada.

237
FILTROS SELECTIVOS Son aquellos que permiten el paso de seales sin
EN FRECUENCIA. distorsin en una o en un conjunto de bandas de
frecuencia, y atenan o eliminan totalmente seales en
el resto de las bandas de frecuencia.
FIR. Filtro digital de respuesta al impulso finito.
HP. Pasa altas.
IIR. Filtro digital de respuesta al impulso infinito.
LP. Pasa bajas.
MATLAB. Es un medio ambiente computacional para alto
rendimiento en el clculo numrico y su visualizacin.
Matlab contiene anlisis numrico, clculo de matrices,
procesamiento de seales, y un ambiente grfico fcil
de usar donde problemas y soluciones son expresados
matemticamente.
NO CAUSAL. Fsicamente no realizable.
TEOREMA DE Una seal de banda limitada a B Hz (es decir, una seal
MUESTREO. cuya transformada de Fourier es igual a cero para todo
||>2B) queda determinada unvocamente por sus
valores a intervalos uniformes con separacin menor de
1/2B segundos.
El teorema establece que una seal de banda limitada
a B puede reconstruirse a partir de sus muestras
tomadas uniformemente a una razn no menor de 2B
muestras por segundo.
TRANSFORMADA DE Es la representacin en el dominio de la frecuencia de
FOURIER. una determinada funcin, la transformada de Fourier en
el dominio de la frecuencia contiene exactamente la
misma informacin que la representacin en el dominio
del tiempo.

238
BIBLIOGRAFA
1. B. P. Lathi, "Sistemas de Comunicacin", Ed. McGraw-Hill, Mxico, 1991.
2. Alan V. Oppenheim, Alan S. Willsky, "Seales y Sistemas", Ed. Prentice Hall,
Mxico, 1990.
3. David J. DeFatta, Joseph G. Lucas, "Digital Signal Processing", Ed. Wiley,
New York,1988.
4. Herbert Schildt, "Programacin en Turbo C", Ed. McGraw-Hill, Espaa, 1990.
5. Keith Weiskamp, Loren Heinry, "Grficas Poderosas con Turbo C++", Ed.
Noriega, Mxico, 1994.
6. David E. Johnson, "Anlisis Bsico de Circuitos Elctricos", Ed. Prentice Hall,
Mxico, 1991.
7. E. Oran Brigham, "The Fast Fourier Transform", Ed. Prentice Hall, New York,
1988.
8. Alan Freedman, "Diccionario de Computacin", Ed. McGraw-Hill, Espaa,
1993.
9. Wayne Tomasi, "Sistemas de Comunicaciones Electrnicas", Ed. Prentice
Hall, Mxico, 1996.
10. Internet (http://www.gc.ssr.upm.es/inves/fildig.html).
11. J. Javier Garca-Badell, "Turbo C", Ed. Macrobit, Mxico, 1991.
12. "MATLAB High-Performance Numeric Computation and Visualization
Software", Gua de Referencia.

239

También podría gustarte