summaryrefslogtreecommitdiff
path: root/fftunit.inc
diff options
context:
space:
mode:
authorErich Eckner <git@eckner.net>2016-03-04 10:21:27 +0100
committerErich Eckner <git@eckner.net>2016-03-15 13:01:15 +0100
commita0fdff555fdd79a752c4dff3f00ac58c6eb15034 (patch)
treeef792730803e4704246d7b7576188f068f9a7305 /fftunit.inc
parentd1c830304c85a50be6b2fd92ace71463b621c3f3 (diff)
downloadunits-a0fdff555fdd79a752c4dff3f00ac58c6eb15034.tar.xz
fftunit neu
Diffstat (limited to 'fftunit.inc')
-rw-r--r--fftunit.inc199
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}