diff options
author | Erich Eckner <git@eckner.net> | 2017-09-27 16:08:18 +0200 |
---|---|---|
committer | Erich Eckner <git@eckner.net> | 2017-09-27 16:08:18 +0200 |
commit | 73e0e547f3609a699c03f28e52dfd97c82430ced (patch) | |
tree | adebeb1baa1c30e00bc82871193ea9ae89d7aa75 /epostunit.pas | |
parent | 3134f1577261c561eea75ccf40c7aa51fe4f40eb (diff) | |
download | epost-73e0e547f3609a699c03f28e52dfd97c82430ced.tar.xz |
fft2d jetzt auch invers und mit mehr Kontrolle über Datenordnungen
Diffstat (limited to 'epostunit.pas')
-rw-r--r-- | epostunit.pas | 66 |
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; |