summaryrefslogtreecommitdiff
path: root/fftunit.pas
diff options
context:
space:
mode:
Diffstat (limited to 'fftunit.pas')
-rw-r--r--fftunit.pas82
1 files changed, 51 insertions, 31 deletions
diff --git a/fftunit.pas b/fftunit.pas
index b4b03bf..7b5995f 100644
--- a/fftunit.pas
+++ b/fftunit.pas
@@ -14,9 +14,9 @@ type
tFFTAlgorithmus = class
private
- len,hlen: longint;
+ len,hLen: longint;
res,ims: tExtendedArray;
- ino,outo: tFFTDatenordnung;
+ inO,outO: tFFTDatenordnung;
procedure dumpResIms;
public
constructor create(laenge: longint; inputOrdnung,outputOrdnung: tFFTDatenordnung); overload;
@@ -25,14 +25,20 @@ type
procedure laden(invers: boolean; q: pSingle; schritt: longint); overload; virtual;
procedure laden(invers: boolean; q: pDouble; schritt: longint); overload; virtual;
procedure laden(invers: boolean; q: pExtended; schritt: longint); overload; virtual;
- procedure laden(invers: boolean; qRe,qIm: tExtendedArray); overload; virtual;
+ procedure laden(invers: boolean; qRe,qIm: pSingle; schritt: longint); overload; virtual;
+ procedure laden(invers: boolean; qRe,qIm: pDouble; schritt: longint); overload; virtual;
+ procedure laden(invers: boolean; qRe,qIm: pExtended; schritt: longint); overload; virtual;
procedure ausfuehren; virtual; abstract;
procedure speichern(invers: boolean; z: pSingle; schritt: longint); overload; virtual;
procedure speichern(invers: boolean; z: pDouble; schritt: longint); overload; virtual;
procedure speichern(invers: boolean; z: pExtended; schritt: longint); overload; virtual;
- procedure speichern(invers: boolean; zRe,zIm: tExtendedArray); overload; virtual;
+ procedure speichern(invers: boolean; zRe,zIm: pSingle; schritt: longint); overload; virtual;
+ procedure speichern(invers: boolean; zRe,zIm: pDouble; schritt: longint); overload; virtual;
+ procedure speichern(invers: boolean; zRe,zIm: pExtended; schritt: longint); overload; virtual;
procedure summen(amAnfang: boolean; var energie: extended; var nurNullen: boolean);
function dumpParams: string;
+ property inOrdnung: tFFTDatenordnung read inO;
+ property outOrdnung: tFFTDatenordnung read outO;
end;
tFFTCooleyTukey = class(tFFTAlgorithmus)
@@ -46,7 +52,9 @@ type
procedure laden(invers: boolean; q: pSingle; schritt: longint); overload; override;
procedure laden(invers: boolean; q: pDouble; schritt: longint); overload; override;
procedure laden(invers: boolean; q: pExtended; schritt: longint); overload; override;
- procedure laden(invers: boolean; qRe,qIm: tExtendedArray); overload; override;
+ procedure laden(invers: boolean; qRe,qIm: pSingle; schritt: longint); overload; override;
+ procedure laden(invers: boolean; qRe,qIm: pDouble; schritt: longint); overload; override;
+ procedure laden(invers: boolean; qRe,qIm: pExtended; schritt: longint); overload; override;
procedure ausfuehren; override;
end;
@@ -157,10 +165,10 @@ end;
constructor tFFTAlgorithmus.create(laenge: longint; inputOrdnung,outputOrdnung: tFFTDatenordnung);
begin
inherited create;
- ino:=inputOrdnung;
- outo:=outputOrdnung;
+ inO:=inputOrdnung;
+ outO:=outputOrdnung;
len:=laenge;
- hlen:=laenge div 2;
+ hLen:=laenge div 2;
fillchar(res,sizeOf(res),#0);
setLength(res,0);
fillchar(ims,sizeOf(ims),#0);
@@ -170,10 +178,10 @@ end;
constructor tFFTAlgorithmus.create(original: tFFTAlgorithmus);
begin
inherited create;
- ino:=original.ino;
- outo:=original.outo;
+ inO:=original.inO;
+ outO:=original.outO;
len:=original.len;
- hlen:=original.hlen;
+ hLen:=original.hLen;
fillchar(res,sizeOf(res),#0);
setLength(res,0);
fillchar(ims,sizeOf(ims),#0);
@@ -207,7 +215,11 @@ procedure tFFTAlgorithmus.laden(invers: boolean; q: pExtended; schritt: longint)
{$UNDEF fftunitLaden}
{$DEFINE fftunitGetrenntLaden}
-procedure tFFTAlgorithmus.laden(invers: boolean; qRe,qIm: tExtendedArray);
+procedure tFFTAlgorithmus.laden(invers: boolean; qRe,qIm: pSingle; schritt: longint);
+{$INCLUDE fftunit.inc}
+procedure tFFTAlgorithmus.laden(invers: boolean; qRe,qIm: pDouble; schritt: longint);
+{$INCLUDE fftunit.inc}
+procedure tFFTAlgorithmus.laden(invers: boolean; qRe,qIm: pExtended; schritt: longint);
{$INCLUDE fftunit.inc}
{$UNDEF fftunitGetrenntLaden}
@@ -221,7 +233,11 @@ procedure tFFTAlgorithmus.speichern(invers: boolean; z: pExtended; schritt: long
{$UNDEF fftunitSpeichern}
{$DEFINE fftunitGetrenntSpeichern}
-procedure tFFTAlgorithmus.speichern(invers: boolean; zRe,zIm: tExtendedArray);
+procedure tFFTAlgorithmus.speichern(invers: boolean; zRe,zIm: pSingle; schritt: longint);
+{$INCLUDE fftunit.inc}
+procedure tFFTAlgorithmus.speichern(invers: boolean; zRe,zIm: pDouble; schritt: longint);
+{$INCLUDE fftunit.inc}
+procedure tFFTAlgorithmus.speichern(invers: boolean; zRe,zIm: pExtended; schritt: longint);
{$INCLUDE fftunit.inc}
{$UNDEF fftunitGetrenntSpeichern}
@@ -245,7 +261,7 @@ end;
function tFFTAlgorithmus.dumpParams: string;
begin
- result:=className+': '+intToStr(len)+' ('+intToStr(hlen)+')';
+ result:=className+': '+intToStr(len)+' ('+intToStr(hLen)+')';
end;
{$UNDEF tFFTAlgorithmus}
@@ -261,8 +277,8 @@ begin
setLength(res,len);
setLength(ims,len);
loglen:=round(ln(len)/ln(2));
- setLength(wRe,hlen);
- setLength(wIm,hlen);
+ setLength(wRe,hLen);
+ setLength(wIm,hLen);
setLength(perm,len);
for i:=0 to len-1 do begin
res[i]:=nan;
@@ -271,7 +287,7 @@ begin
for j:=0 to loglen-1 do
perm[i]:=perm[i] or (byte(odd(i shr j)) shl (loglen-1-j));
end;
- for i:=0 to hlen-1 do begin
+ for i:=0 to hLen-1 do begin
wRe[i]:=cos(2*pi*i/len);
wIm[i]:=sin(2*pi*i/len);
end;
@@ -308,36 +324,40 @@ procedure tFFTCooleyTukey.laden(invers: boolean; q: pExtended; schritt: longint)
{$UNDEF fftunitLaden}
{$DEFINE fftunitGetrenntLaden}
-procedure tFFTCooleyTukey.laden(invers: boolean; qRe,qIm: tExtendedArray);
+procedure tFFTCooleyTukey.laden(invers: boolean; qRe,qIm: pSingle; schritt: longint);
+{$INCLUDE fftunit.inc}
+procedure tFFTCooleyTukey.laden(invers: boolean; qRe,qIm: pDouble; schritt: longint);
+{$INCLUDE fftunit.inc}
+procedure tFFTCooleyTukey.laden(invers: boolean; qRe,qIm: pExtended; schritt: longint);
{$INCLUDE fftunit.inc}
{$UNDEF fftunitGetrenntLaden}
procedure tFFTCooleyTukey.ausfuehren;
var
- i,dist,absch,wnum,wstep: longint;
+ i,dist,absch,wNum,wStep: longint;
t1,t2: extended;
begin
dist:=1;
- wstep:=hlen;
+ wStep:=hLen;
while dist<len do begin
absch:=0;
while absch<len do begin
- wnum:=0;
+ wNum:=0;
for i:=0 to dist-1 do begin
// x_links: [absch+j]
// x_rechts: [absch+j+dist]
- t1:=wRe[wnum]*res[absch+i+dist] - wIm[wnum]*ims[absch+i+dist];
- t2:=wRe[wnum]*ims[absch+i+dist] + wIm[wnum]*res[absch+i+dist];
+ t1:=wRe[wNum]*res[absch+i+dist] - wIm[wNum]*ims[absch+i+dist];
+ t2:=wRe[wNum]*ims[absch+i+dist] + wIm[wNum]*res[absch+i+dist];
res[absch+i+dist]:=res[absch+i]-t1;
ims[absch+i+dist]:=ims[absch+i]-t2;
res[absch+i]:=res[absch+i]+t1;
ims[absch+i]:=ims[absch+i]+t2;
- wnum:=wnum+wstep;
+ wNum:=wNum+wStep;
end;
absch:=absch+2*dist;
end;
- wstep:=wstep div 2;
+ wStep:=wStep div 2;
dist:=dist*2;
end;
end;
@@ -368,9 +388,9 @@ begin
end;
preFFT:=tFFTCooleyTukey.create(length(rRe),doGetrennt,doGetrennt);
- preFFT.laden(false,rRe,rIm);
+ preFFT.laden(false,pExtended(@(rRe[0])),pExtended(@(rIm[0])),1);
preFFT.ausfuehren;
- preFFT.speichern(false,sRe,sIm);
+ preFFT.speichern(false,pExtended(@(sRe[0])),pExtended(@(sIm[0])),1);
preFFT.free;
{$IFDEF fftNormierung}
@@ -427,9 +447,9 @@ begin
end;
// a[j] := iFFT(a[j])
- subFFT.laden(true,res,ims);
+ subFFT.laden(true,pExtended(@(res[0])),pExtended(@(ims[0])),1);
subFFT.ausfuehren;
- subFFT.speichern(true,res,ims);
+ subFFT.speichern(true,pExtended(@(res[0])),pExtended(@(ims[0])),1);
for i:=0 to length(res)-1 do begin
res[i]:=res[i];
@@ -444,9 +464,9 @@ begin
end;
// a[j] := iFFT(a[j])
- subFFT.laden(false,res,ims);
+ subFFT.laden(false,pExtended(@(res[0])),pExtended(@(ims[0])),1);
subFFT.ausfuehren;
- subFFT.speichern(false,res,ims);
+ subFFT.speichern(false,pExtended(@(res[0])),pExtended(@(ims[0])),1);
for i:=0 to length(res)-1 do begin
res[i]:=res[i];