Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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
Ing. Ernesto Mercado Escutia que me asesor para elaborar este trabajo.
Le agradezco al Instituto Politcnico Nacional, mi alma mater por darme la
A.L.P.
NDICE
INTRODUCCIN 1
Diagrama de flujo 15
Programa fuente 16
Diagrama de flujo 34
Programa fuente 35
Programa fuente 75
4.3 Mtodo de las series de Fourier para el diseo de filtros FIR 135
CONCLUSIONES 209
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
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 =
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:
k =
N 1
= h( kT ) (t kT ) (1 3)
k =0
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:
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
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
N 1
n = h( kT )e j 2kn / N n = 0, 1, 2,... (1 10)
k =0
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
9
e j 2k ( r + N ) / N = e j 2kr / N e j 2k
= e j 2kr / N (1 13)
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
N 1
G( NT
n
) = g( kT )e j 2nk / N n = 0, 1,........, N 1 (1 16)
k =0
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.
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
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).
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
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 ] =
(-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[ 225] + j sen[ 225]) + ( 4 + 4 j )( cos[ 450] + j sen[ 450]) +
1
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.
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
N 1
X ( n) = x0 ( k )e j 2nk / N n = 0,1,....., N 1 (2 1)
k =0
W = e j 2 / N (2 2)
Entonces la Eq. (2-1) puede escribirse como:
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)
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
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)
X (0)
X ( 2)
X ( n) = (2 10)
X 1
( )
X (3)
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).
x ( 2) = x ( 0) + W 2 x ( 2)
1 0 0
= x ( 0) W 0 x ( 2) (2 13)
0 0
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)
N2
N / 2 = 2N
(2 16)
45
requeridas usando el algoritmo de la FFT comparado con el nmero de
multiplicaciones usando el mtodo directo.
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)
46
X (0) X (00)
X ( 2) X (10)
X (1) obtenemos X (01) (2 18)
X (3) X (11)
X (00) X (00)
X (10) X (01)
X ( n) = remplazado a X (10) = X ( n) (2 19)
X (01)
X (11) X (11)
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 .
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.
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:
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:
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
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
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
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
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
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
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.
73
DESCRIPCIN DE LA FUNCIN fft2 DEL MATLAB
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
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:
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
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
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.
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 =
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).
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"
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
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
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:
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
Z[ x(nT iT )] = z i X ( z) (38
.)
[ ]
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
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=
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.
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.
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.
120
Los tres mtodos bsicos que se emplean para recobrar la secuencia
original de la transformada Z son:
X ( z)z dz = x( nT ) z m n 1dz
m 1
C C n=0
X ( z ) z m1dz = x( nT ) z m n 1dz
C n=0 C
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
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
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.
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.
124
1
x( nT ) = X ( v )v n 1dv
2j C
1
y( nT ) = Y ( z ) z n 1dz
2j C
1 1 n 1
x( nT ) y( nT ) = ( ) ( )
2j C 2j C
n 1
X v Y z v dv z dz
1 z
U ( z) = X ( v )Y v 1dv (3.24)
2j C v
v = e j y z = re j
2
r
( )
U re j =
1
2 X ( e )Y e d
j ( ) j
(3.25)
0
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
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:
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)
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
( )
H e jT = h( n)e jnT = H e jT e j ( ) ( ) (4.3)
n=0
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:
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) (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)
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)
( 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
( 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
( 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
( )
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
(
H e j 2fT = ) h ( n )e d
j 2 fnT
(4.19)
n =
F /2
H (e )e
1
hd (n) = j 2 fT j 2 fnT
df (4.20)
F F /2
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
( 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.
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)
N 1
sen(NT / 2)
( )
AR e jNT = e jnT = e j ( N 1) T / 2
sen(T / 2)
(4.29)
n=0
138
F UNCIN VENTANA DE HAMMING
2n N 1
0.54 + 0.46 cos para n
a H ( n) = N 1 2 (4.30)
0
en otro punto
2n
a H ( n) = a R ( n) 0.54 + 0.46 cos (4.31)
N 1
139
F UNCIN VENTANA DE BLACKMAN
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
140
I0 ( ) N 1
para n
a K (n) = I 0 ( ) 2 (4.34)
0
en otro punto
0.5
2n 2
= 1 (4.35)
N 1
( ) + (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
ESPECIFICACIONES DE DISEO
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)
10 p 1
0.05 A
s = 100.05 A s
p = (4.42)
10 p + 1
0.05 A
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
0.9222 para As 21
D = As 7.95 (4.44)
14.36 para As > 21
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
( N 1) / 2
(
H ( z ) = z ( N 1) / 2 h( 0) + 2 h( n) z n + z n ) (4.47)
n=0
144
Donde:
( 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.
Ahora consideraremos las ecuaciones de diseo para filtros digitales FIR pasa
bajas, pasa altas, pasa banda y rechaza banda.
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)
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
LA FUNCIN CHEBY1
149
LA FUNCIN CHEBY2
LA FUNCIN FREQZ
150
LA FUNCIN YULEWALK
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)
LA FUNCIN FILTER
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);
}
}
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
}
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:
;
}
}
}
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:
;
}
}
}
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:
;
}
}
}
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:
;
}
}
}
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:
;
}
}
}
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:
;
}
}
}
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:
;
}
}
}
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:
;
}
}
}
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
;
}
}
}
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:
;
}
}
}
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:
;
}
}
}
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:
;
}
}
}
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:
;
}
}
}
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])
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:
210
APNDICE A
FRMULA DE EULER
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
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 + e j
cos = ( A.6)
2
e j e j
sen = ( A.7)
2j
212
APNDICE B
OBTENCIN DE LAS ECUACIONES GENERALES
DE DISEO DE LOS FILTROS FIR
sen x
Sa ( x ) = ( B.1)
x
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!
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
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
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
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
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
f p + fs
fc = F = f p f s ( B.10)
2
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
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
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
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
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
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
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:
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)
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)
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:
228
LA FUNCIN conv DEL MATLAB
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