summaryrefslogtreecommitdiff
path: root/fftunit.inc
diff options
context:
space:
mode:
authorErich Eckner <git@eckner.net>2017-07-21 10:39:43 +0200
committerErich Eckner <git@eckner.net>2017-07-21 10:39:43 +0200
commitdf7061ed77b9c7e412e4bb068b2eda81025cff70 (patch)
tree80b72b0ccf980aade4b52783b3dd97968c570d61 /fftunit.inc
parent2798b395bc067293d3a7d338a792224da17854e3 (diff)
downloadunits-df7061ed77b9c7e412e4bb068b2eda81025cff70.tar.xz
fftunit: getrenntes Einlesen von Real- und Imaginaerteilen jetzt auch von Pointer und fuer doAlleResIms und doAlleResSmi (braucht man fuer voll-komplexe fft2d)
Diffstat (limited to 'fftunit.inc')
-rw-r--r--fftunit.inc64
1 files changed, 34 insertions, 30 deletions
diff --git a/fftunit.inc b/fftunit.inc
index 7f5cc34..8d465f6 100644
--- a/fftunit.inc
+++ b/fftunit.inc
@@ -10,7 +10,7 @@ begin
{$IFDEF fftNormierung}
lenFak:=1/sqrt(len);
{$ENDIF}
- case ino of
+ case inO of
doRes:
for i:=0 to len-1 do begin
{$IFDEF tFFTCooleyTukey}
@@ -32,7 +32,7 @@ begin
{$ENDIF}
end;
doAlleResSmi:
- for i:=0 to hlen + (len and $1) - 1 do begin
+ for i:=0 to hLen + (len and $1) - 1 do begin
{$IFDEF tFFTCooleyTukey}
res[perm[i]]:=(q+i*schritt)^ {$IFDEF fftNormierung} * lenFak{$ENDIF};
ims[perm[i]]:=(q+(2*len-1-i)*schritt)^ * inv {$IFDEF fftNormierung} * lenFak{$ENDIF};
@@ -44,33 +44,33 @@ begin
doResIms: begin
res[0]:=q^ {$IFDEF fftNormierung} * lenFak{$ENDIF}; // perm[0]=0
ims[0]:=0;
- for i:=1 to hlen + (len and $1) - 1 do begin
+ for i:=1 to hLen + (len and $1) - 1 do begin
{$IFDEF tFFTCooleyTukey}
res[perm[i]]:=(q+i*schritt)^ {$IFDEF fftNormierung} * lenFak{$ENDIF};
- ims[perm[i]]:=(q+(i+hlen)*schritt)^ * inv {$IFDEF fftNormierung} * lenFak{$ENDIF};
+ ims[perm[i]]:=(q+(i+hLen)*schritt)^ * inv {$IFDEF fftNormierung} * lenFak{$ENDIF};
res[perm[len-i]]:=res[perm[i]];
ims[perm[len-i]]:=-ims[perm[i]];
{$ELSE}
res[i]:=(q+i*schritt)^ {$IFDEF fftNormierung} * lenFak{$ENDIF};
- ims[i]:=(q+(i+hlen)*schritt)^ * inv {$IFDEF fftNormierung} * lenFak{$ENDIF};
+ ims[i]:=(q+(i+hLen)*schritt)^ * inv {$IFDEF fftNormierung} * lenFak{$ENDIF};
res[len-i]:=res[i];
ims[len-i]:=-ims[i];
{$ENDIF}
end;
if not odd(len) then begin
{$IFDEF tFFTCooleyTukey}
- res[1]:=(q+hlen*schritt)^ {$IFDEF fftNormierung} * lenFak{$ENDIF}; // perm[hlen]=1
+ res[1]:=(q+hLen*schritt)^ {$IFDEF fftNormierung} * lenFak{$ENDIF}; // perm[hLen]=1
ims[1]:=0;
{$ELSE}
- res[hlen]:=(q+hlen*schritt)^ {$IFDEF fftNormierung} * lenFak{$ENDIF};
- ims[hlen]:=0;
+ res[hLen]:=(q+hLen*schritt)^ {$IFDEF fftNormierung} * lenFak{$ENDIF};
+ ims[hLen]:=0;
{$ENDIF}
end;
end;
doResSmi: begin
res[0]:=q^ {$IFDEF fftNormierung} * lenFak{$ENDIF}; // perm[0]=0
ims[0]:=0;
- for i:=1 to hlen + (len and $1) - 1 do begin
+ for i:=1 to hLen + (len and $1) - 1 do begin
{$IFDEF tFFTCooleyTukey}
res[perm[i]]:=(q+i*schritt)^ {$IFDEF fftNormierung} * lenFak{$ENDIF};
ims[perm[i]]:=(q+(len-i)*schritt)^ * inv {$IFDEF fftNormierung} * lenFak{$ENDIF};
@@ -85,11 +85,11 @@ begin
end;
if not odd(len) then begin
{$IFDEF tFFTCooleyTukey}
- res[1]:=(q+hlen*schritt)^ {$IFDEF fftNormierung} * lenFak{$ENDIF}; // perm[hlen]=1
+ res[1]:=(q+hLen*schritt)^ {$IFDEF fftNormierung} * lenFak{$ENDIF}; // perm[hLen]=1
ims[1]:=0;
{$ELSE}
- res[hlen]:=(q+hlen*schritt)^ {$IFDEF fftNormierung} * lenFak{$ENDIF};
- ims[hlen]:=0;
+ res[hLen]:=(q+hLen*schritt)^ {$IFDEF fftNormierung} * lenFak{$ENDIF};
+ ims[hLen]:=0;
{$ENDIF}
end;
end;
@@ -102,7 +102,7 @@ end;
{$ENDIF}
{$IFDEF fftunitGetrenntLaden}
-//procedure tFFTAlgorithmus.laden(invers: boolean; qRe,qIm: tExtendedArray);
+//procedure tFFTAlgorithmus.laden(invers: boolean; qRe,qIm: pSingle; schritt: longint);
var
i,inv: longint;
{$IFDEF fftNormierung}
@@ -113,15 +113,17 @@ begin
{$IFDEF fftNormierung}
lenFak:=1/sqrt(len);
{$ENDIF}
- case ino of
- doGetrennt:
+ case inO of
+ doGetrennt,doAlleResIms,doAlleResSmi:
+ // Real- und Imaginärteile sind _immer_ in gleicher Reihenfolge;
+ // die ggf. verdrehte Dimension ist senkrecht dazu! (benötigt für fft2d)
for i:=0 to len-1 do begin
{$IFDEF tFFTCooleyTukey}
- res[perm[i]]:=qRe[i] {$IFDEF fftNormierung} * lenFak{$ENDIF};
- ims[perm[i]]:=qIm[i] * inv {$IFDEF fftNormierung} * lenFak{$ENDIF};
+ res[perm[i]]:=(qRe+i*schritt)^ {$IFDEF fftNormierung} * lenFak{$ENDIF};
+ ims[perm[i]]:=(qIm+i*schritt)^ * inv {$IFDEF fftNormierung} * lenFak{$ENDIF};
{$ELSE}
- res[i]:=qRe[i] {$IFDEF fftNormierung} * lenFak{$ENDIF};
- ims[i]:=qIm[i] * inv {$IFDEF fftNormierung} * lenFak{$ENDIF};
+ res[i]:=(qRe+i*schritt)^ {$IFDEF fftNormierung} * lenFak{$ENDIF};
+ ims[i]:=(qIm+i*schritt)^ * inv {$IFDEF fftNormierung} * lenFak{$ENDIF};
{$ENDIF}
end;
else
@@ -136,7 +138,7 @@ var
i,inv: longint;
begin
inv:=1-2*byte(invers);
- case outo of
+ case outO of
doRes:
for i:=0 to len-1 do
(z+i*schritt)^:=res[i];
@@ -152,21 +154,21 @@ begin
end;
doResIms: begin
z^:=res[0];
- for i:=1 to hlen + (len and $1) - 1 do begin
+ for i:=1 to hLen + (len and $1) - 1 do begin
(z+i*schritt)^:=res[i];
- (z+(i+hlen)*schritt)^:=ims[i] * inv;
+ (z+(i+hLen)*schritt)^:=ims[i] * inv;
end;
if not odd(len) then
- (z+hlen*schritt)^:=res[hlen];
+ (z+hLen*schritt)^:=res[hLen];
end;
doResSmi: begin
z^:=res[0];
- for i:=1 to hlen + (len and $1) - 1 do begin
+ for i:=1 to hLen + (len and $1) - 1 do begin
(z+i*schritt)^:=res[i];
(z+(len-i)*schritt)^:=ims[i] * inv;
end;
if not odd(len) then
- (z+hlen*schritt)^:=res[hlen];
+ (z+hLen*schritt)^:=res[hLen];
end;
doBetr:
for i:=0 to len-1 do
@@ -181,16 +183,18 @@ end;
{$ENDIF}
{$IFDEF fftunitGetrenntSpeichern}
-//procedure tFFTAlgorithmus.speichern(invers: boolean; zRe,zIm: tExtendedArray);
+//procedure tFFTAlgorithmus.speichern(invers: boolean; zRe,zIm: pSingle; schritt: longint);
var
i,inv: longint;
begin
inv:=1-2*byte(invers);
- case outo of
- doGetrennt:
+ case outO of
+ doGetrennt,doAlleResIms,doAlleResSmi:
+ // Real- und Imaginärteile sind _immer_ in gleicher Reihenfolge;
+ // die ggf. verdrehte Dimension ist senkrecht dazu! (benötigt für fft2d)
for i:=0 to len-1 do begin
- zRe[i]:=res[i];
- zIm[i]:=ims[i] * inv;
+ (zRe+i*schritt)^:=res[i];
+ (zIm+i*schritt)^:=ims[i] * inv;
end;
else
fehler('Diese Outputordnung ist in dieser Methode nicht implementiert!');;