diff options
author | Erich Eckner <git@eckner.net> | 2016-03-04 10:21:27 +0100 |
---|---|---|
committer | Erich Eckner <git@eckner.net> | 2016-03-15 13:01:15 +0100 |
commit | a0fdff555fdd79a752c4dff3f00ac58c6eb15034 (patch) | |
tree | ef792730803e4704246d7b7576188f068f9a7305 /fftunit.inc | |
parent | d1c830304c85a50be6b2fd92ace71463b621c3f3 (diff) | |
download | units-a0fdff555fdd79a752c4dff3f00ac58c6eb15034.tar.xz |
fftunit neu
Diffstat (limited to 'fftunit.inc')
-rw-r--r-- | fftunit.inc | 199 |
1 files changed, 199 insertions, 0 deletions
diff --git a/fftunit.inc b/fftunit.inc new file mode 100644 index 0000000..7f5cc34 --- /dev/null +++ b/fftunit.inc @@ -0,0 +1,199 @@ +{$IFDEF fftunitLaden} +//procedure tFFTAlgorithmus.laden(invers: boolean; const q: single; schritt: longint); +var + i,inv: longint; + {$IFDEF fftNormierung} + lenFak: extended; + {$ENDIF} +begin + inv:=1-2*byte(invers); + {$IFDEF fftNormierung} + lenFak:=1/sqrt(len); + {$ENDIF} + case ino of + doRes: + for i:=0 to len-1 do begin + {$IFDEF tFFTCooleyTukey} + res[perm[i]]:=(q+i*schritt)^ {$IFDEF fftNormierung} * lenFak{$ENDIF}; + ims[perm[i]]:=0; + {$ELSE} + res[i]:=(q+i*schritt)^ {$IFDEF fftNormierung} * lenFak{$ENDIF}; + ims[i]:=0; + {$ENDIF} + end; + doAlleResIms: + for i:=0 to len-1 do begin + {$IFDEF tFFTCooleyTukey} + res[perm[i]]:=(q+i*schritt)^ {$IFDEF fftNormierung} * lenFak{$ENDIF}; + ims[perm[i]]:=(q+(i+len)*schritt)^ * inv {$IFDEF fftNormierung} * lenFak{$ENDIF}; + {$ELSE} + res[i]:=(q+i*schritt)^ {$IFDEF fftNormierung} * lenFak{$ENDIF}; + ims[i]:=(q+(i+len)*schritt)^ * inv {$IFDEF fftNormierung} * lenFak{$ENDIF}; + {$ENDIF} + end; + doAlleResSmi: + 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}; + {$ELSE} + res[i]:=(q+i*schritt)^ {$IFDEF fftNormierung} * lenFak{$ENDIF}; + ims[i]:=(q+(2*len-1-i)*schritt)^ * inv {$IFDEF fftNormierung} * lenFak{$ENDIF}; + {$ENDIF} + end; + 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 + {$IFDEF tFFTCooleyTukey} + res[perm[i]]:=(q+i*schritt)^ {$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}; + 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 + ims[1]:=0; + {$ELSE} + 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 + {$IFDEF tFFTCooleyTukey} + res[perm[i]]:=(q+i*schritt)^ {$IFDEF fftNormierung} * lenFak{$ENDIF}; + ims[perm[i]]:=(q+(len-i)*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+(len-i)*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 + ims[1]:=0; + {$ELSE} + res[hlen]:=(q+hlen*schritt)^ {$IFDEF fftNormierung} * lenFak{$ENDIF}; + ims[hlen]:=0; + {$ENDIF} + end; + end; + doBetr,doBetrQdr: + fehler('Ich brauche mehr als Beträge oder Betragsquadrate um eine FFT auszurechnen!'); + else + fehler('Diese Inputordnung ist in dieser Methode nicht implementiert!');; + end{of case}; +end; +{$ENDIF} + +{$IFDEF fftunitGetrenntLaden} +//procedure tFFTAlgorithmus.laden(invers: boolean; qRe,qIm: tExtendedArray); +var + i,inv: longint; + {$IFDEF fftNormierung} + lenFak: extended; + {$ENDIF} +begin + inv:=1-2*byte(invers); + {$IFDEF fftNormierung} + lenFak:=1/sqrt(len); + {$ENDIF} + case ino of + doGetrennt: + 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}; + {$ELSE} + res[i]:=qRe[i] {$IFDEF fftNormierung} * lenFak{$ENDIF}; + ims[i]:=qIm[i] * inv {$IFDEF fftNormierung} * lenFak{$ENDIF}; + {$ENDIF} + end; + else + fehler('Diese Inputordnung ist in dieser Methode nicht implementiert!');; + end{of case}; +end; +{$ENDIF} + +{$IFDEF fftunitSpeichern} +//procedure tFFTAlgorithmus.speichern(invers: boolean; var z: single; schritt: longint); +var + i,inv: longint; +begin + inv:=1-2*byte(invers); + case outo of + doRes: + for i:=0 to len-1 do + (z+i*schritt)^:=res[i]; + doAlleResIms: + for i:=0 to len-1 do begin + (z+i*schritt)^:=res[i]; + (z+(i+len)*schritt)^:=ims[i] * inv; + end; + doAlleResSmi: + for i:=0 to len-1 do begin + (z+i*schritt)^:=res[i]; + (z+(2*len-1-i)*schritt)^:=ims[i] * inv; + end; + doResIms: begin + z^:=res[0]; + for i:=1 to hlen + (len and $1) - 1 do begin + (z+i*schritt)^:=res[i]; + (z+(i+hlen)*schritt)^:=ims[i] * inv; + end; + if not odd(len) then + (z+hlen*schritt)^:=res[hlen]; + end; + doResSmi: begin + z^:=res[0]; + 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]; + end; + doBetr: + for i:=0 to len-1 do + (z+i*schritt)^:=sqrt(sqr(res[i])+sqr(ims[i])); + doBetrQdr: + for i:=0 to len-1 do + (z+i*schritt)^:=sqr(res[i])+sqr(ims[i]); + else + fehler('Diese Outputordnung ist in dieser Methode nicht implementiert!');; + end{of case}; +end; +{$ENDIF} + +{$IFDEF fftunitGetrenntSpeichern} +//procedure tFFTAlgorithmus.speichern(invers: boolean; zRe,zIm: tExtendedArray); +var + i,inv: longint; +begin + inv:=1-2*byte(invers); + case outo of + doGetrennt: + for i:=0 to len-1 do begin + zRe[i]:=res[i]; + zIm[i]:=ims[i] * inv; + end; + else + fehler('Diese Outputordnung ist in dieser Methode nicht implementiert!');; + end{of case}; +end; +{$ENDIF} |