home *** CD-ROM | disk | FTP | other *** search
- program fft;
- type
- bigstr = string[12];
- range = array[1..256] of real;
- var
- filename,nstr,fileout :bigstr;
- filnam,fiout :string[8];
- xform :string[25];
- inverse,output :char;
- npoints,invt,d :integer;
- reel,imaginary :range;
-
- procedure readdata(filename:bigstr;var x,y :range;var a:integer);
-
- {range and bigstr are set up in the TYPE identifier
- range = array[1..?] of real
- bigstr = string[12]
- a returns the transform length or file size}
-
- type
- data =
- record
- w,z :real;
- end;
- var
- index :integer;
- xy :array[1..256] of data;
- datafile :file of data;
- begin
- assign(datafile,filename);
- reset(datafile);
- a:=filesize(datafile);
- for index:=1 to a do begin
- read(datafile,xy[index]);
- with xy[index] do begin
- x[index]:=w;
- y[index]:=z;
- end;
- end;
- close(datafile);
- end;
-
- procedure writedata(filename:bigstr;var x,y:range;var a:integer);
- type
- data =
- record
- w,z :real;
- end;
- var
- index :integer;
- xy :array[1..256] of data;
- datafile :file of data;
- begin
- assign(datafile,filename);
- rewrite(datafile);
- for index:=1 to a do begin
- with xy[index] do begin
- w:=x[index];
- z:=y[index];
- end;
- write(datafile,xy[index]);
- end;
- close(datafile);
- end;
-
- procedure fft(inv,n:integer;var re,imag:range);
-
- {range is set up in the TYPE identifier and is = array[1..?] of real
- inv = 1 if direct transform and =-1 for inverse
- n = transform length power of 2}
-
- var
- le,ip,m,i,l,nm1,j,t,le1 :integer;
- ur,ui,tr,ti,tmpr,tmpi,nv2,k :real;
-
- begin
- m:=round(ln(n)/ln(2));
- if abs(m-int(m))=0 then begin
- nv2:=n/2;
- nm1:=n-1;
- j:=1;
- for i:=1 to nm1 do begin
- if i<j then begin
- tmpr:=re[j];tmpi:=imag[j];
- re[j]:=re[i];imag[j]:=imag[i];
- re[i]:=tmpr;imag[i]:=tmpi;
- end;
- k:=nv2;
- while k<j do begin
- j:=round(j-k);
- k:=k/2;
- end;
- j:=round(j+k);
- end;
- for l:=1 to m do begin
- le:=1;
- for t:=1 to l do
- le:=le*2;
- le1:=round(le/2);
- ur:=1;ui:=0;
- for j:=1 to le1 do begin
- i:=j;
- while i<=n do begin
- ip:=i+le1;
- tr:=re[ip]*ur-imag[ip]*ui;ti:=imag[ip]*ur+re[ip]*ui;
- re[ip]:=re[i]-tr;imag[ip]:=imag[i]-ti;
- re[i]:=re[i]+tr;imag[i]:=imag[i]+ti;
- i:=i+le;
- end;
- ur:=cos(pi*j/le1);ui:=-inv*sin(pi*j/le1);
- end;
- end;
- if inv=-1 then begin
- for i:=1 to n do begin
- re[i]:=re[i]/n;
- imag[i]:=imag[i]/n;
- end;
- end;
- end;
- end;
-
- begin
- gotoxy(29,1);writeln('Fast Fourier Transform');
- gotoxy(39,3);writeln('by');
- gotoxy(31,4);writeln('Michael F. Griffin');
- writeln;writeln;writeln;
- gotoxy(19,6);writeln('*----------------------------------------*');
- gotoxy(8,8);writeln('- All file names are assumed to have .DAT as the extension.');
- gotoxy(8,9);writeln('- Output goes to either a file or a printer.');
- writeln;writeln;
- write('Enter data file name w/o extension : ');
- readln(filnam);
- filename:=filnam+'.dat';
- writeln('Input File name ==> : ',filename);
- write('Do you want a direct transform <Y/N>?');
- read(kbd,inverse);writeln;
- if (inverse='Y') or (inverse='y') then begin
- xform:='Direct Fourier Transform';
- invt:=1
- end
- else begin
- xform:='Inverse Fourier Transform';
- invt:=-1
- end;
- write('Do you want the output to a file <Y/N>?');
- read(kbd,output);writeln;
- if (output='Y') or (output='y') then begin
- write('Enter output data file name w/o extension : ');
- readln(fiout);
- fileout:=fiout+'.dat';
- writeln('Output File name ==> : ',fileout);
- end;
- readdata(filename,reel,imaginary,npoints);
- fft(invt,npoints,reel,imaginary);
- if (output='Y') or (output='y') then
- writedata(fileout,reel,imaginary,npoints)
- else begin
- writeln(lst,xform);writeln(lst);
- str(npoints,nstr);
- for d:=1 to npoints do
- writeln(lst,'(',d:length(nstr),')',reel[d],imaginary[d])
- end;
- end.
-
-