summaryrefslogtreecommitdiff
path: root/epostunit.pas
diff options
context:
space:
mode:
authorErich Eckner <git@eckner.net>2017-09-27 16:08:18 +0200
committerErich Eckner <git@eckner.net>2017-09-27 16:08:18 +0200
commit73e0e547f3609a699c03f28e52dfd97c82430ced (patch)
treeadebeb1baa1c30e00bc82871193ea9ae89d7aa75 /epostunit.pas
parent3134f1577261c561eea75ccf40c7aa51fe4f40eb (diff)
downloadepost-73e0e547f3609a699c03f28e52dfd97c82430ced.tar.xz
fft2d jetzt auch invers und mit mehr Kontrolle über Datenordnungen
Diffstat (limited to 'epostunit.pas')
-rw-r--r--epostunit.pas66
1 files changed, 51 insertions, 15 deletions
diff --git a/epostunit.pas b/epostunit.pas
index 6800a7d..519f029 100644
--- a/epostunit.pas
+++ b/epostunit.pas
@@ -4392,26 +4392,31 @@ end;
function tWerte.berechneFFT2d(sT: boolean; f: tMyStringList; threads: longint; Warn: tWarnstufe): boolean;
var
- Zeit,pvFehler: extended;
- dos: array[0..4] of tFFTDatenordnung;
+ Zeit,pvFehler: extended;
+ dos: array[0..4] of tFFTDatenordnung;
// FFT1 in -> out,
// FFT2 in -> out,
// Ende (= Benutzervorgabe)
- fensters: array[boolean] of tSin2Fenster;
- s: string;
- b,spiegeln: boolean;
- bekannteBefehle: tMyStringList;
+ fensters: array[boolean] of tSin2Fenster;
+ s: string;
+ b,spiegeln,invers: boolean;
+ bekannteBefehle: tMyStringList;
begin
result:=false;
warteAufBeendigungDesLeseThreads;
Zeit:=now;
- if istKomplex then
- dos[4]:=doAlleResIms
- else
+ if istKomplex then begin
+ dos[0]:=doAlleResIms;
+ dos[4]:=doAlleResIms;
+ end
+ else begin
+ dos[0]:=doRes;
dos[4]:=doBetrQdr;
+ end;
for b:=false to true do
fensters[b]:=tSin2Fenster.create;
spiegeln:=false;
+ invers:=false;
bekannteBefehle:=tMyStringList.create;
repeat
if not f.metaReadln(s,true) then begin
@@ -4424,7 +4429,21 @@ begin
bekannteBefehle.clear;
if istDasBefehl('Ende',s,bekannteBefehle,false) then break;
if istDasBefehl('Nachbereitung:',s,bekannteBefehle,true) then begin
- if not strToFftDo(dos[4],s) then exit;
+ if not strToFftDo(dos[4],s) then begin
+ for b:=false to true do
+ fensters[b].free;
+ bekannteBefehle.free;
+ exit;
+ end;
+ continue;
+ end;
+ if istDasBefehl('Eingangsordnung:',s,bekannteBefehle,true) then begin
+ if not strToFftDo(dos[0],s) then begin
+ for b:=false to true do
+ fensters[b].free;
+ bekannteBefehle.free;
+ exit;
+ end;
continue;
end;
bekannteBefehle.add('''x-Fenster: ...''');
@@ -4441,6 +4460,10 @@ begin
spiegeln:=true;
continue;
end;
+ if istDasBefehl('invers',s,bekannteBefehle,false) then begin
+ invers:=true;
+ continue;
+ end;
bekannteBefehle.sort;
gibAus('Verstehe Option '''+s+''' nicht bei Erstellung einer zweidimensionalen FFT!'#10'Ich kenne:'#10+bekannteBefehle.text,3);
for b:=false to true do
@@ -4454,18 +4477,31 @@ begin
if istKomplex xor (dos[4] in [doAlleResIms, doAlleResSmi]) then begin
gibAus('Eine 2d-FFT gibt genau dann alle Real- und Imaginärteile aus, wenn die Eingabe komplex ist!',3);
+ writeln(istKomplex);
+ writeln(dos[4]);
exit;
end;
if istKomplex then begin
- dos[0]:=doAlleResIms;
+ if dos[0]<>doAlleResIms then begin
+ gibAus('Eine vollkomplexe 2d-FFT kann nicht auf die Eingangsordnung '+fftDoToStr(dos[0])+' angewendet werden!',3);
+ exit;
+ end;
dos[1]:=doAlleResIms;
dos[2]:=doAlleResIms;
dos[3]:=dos[4];
end
+ else if invers then begin
+ if dos[4]<>doRes then begin
+ gibAus('Momentan kann eine (halbkomplexe,) inverse 2d-FFT keine Nachbereitung '+fftDoToStr(dos[4])+' erzeugen!',3);
+ exit;
+ end;
+ dos[2]:=dos[0];
+ dos[1]:=dos[4];
+ dos[3]:=dos[4];
+ end
else begin
- dos[0]:=doRes;
- dos[2]:=doRes;
+ dos[2]:=dos[0];
if dos[4]=doResIms then begin
dos[1]:=doResIms;
dos[3]:=doResIms;
@@ -4490,14 +4526,14 @@ begin
gibAus('... fertig! '+timetostr(now-Zeit),3);
end;
gibAus('berechne t-FFT ...',3);
- if not fft(threads,true,false,dos[0],dos[1],fensters[true],0,pvFehler,Warn) then begin
+ if not fft(threads,true,invers,dos[0],dos[1],fensters[true],0,pvFehler,Warn) then begin
gibAus('Es traten Fehler auf!',3);
exit;
end;
gibAus(' (Parseval-Fehler = '+floatToStr(pvFehler)+')',3);
gibAus('... fertig! '+timetostr(now-Zeit),3);
gibAus('berechne x-FFT ...',3);
- if not fft(threads,false,false,dos[2],dos[3],fensters[false],0,pvFehler,Warn) then begin
+ if not fft(threads,false,invers,dos[2],dos[3],fensters[false],0,pvFehler,Warn) then begin
gibAus('Es traten Fehler auf!',3);
exit;
end;