diff options
Diffstat (limited to 'fftunit.inc')
-rw-r--r-- | fftunit.inc | 64 |
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!');; |