diff options
Diffstat (limited to 'epostunit.pas')
-rw-r--r-- | epostunit.pas | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/epostunit.pas b/epostunit.pas index 5965bdf..766fdb2 100644 --- a/epostunit.pas +++ b/epostunit.pas @@ -180,6 +180,7 @@ type function berechneIntegral(sT: boolean; f: tMyStringList; threads: longint; quelle: tWerte): boolean; function berechneFFT(sT: boolean; f: tMyStringList; threads: longint; warn: tWarnStufe): boolean; function berechneFFT2d(sT: boolean; f: tMyStringList; threads: longint; warn: tWarnStufe): boolean; + function berechneAutokorrelation2d(sT: boolean; f: tMyStringList; threads: longint; warn: tWarnStufe): boolean; function berechneRadonTransformation(sT: boolean; f: tMyStringList; threads: longint; quelle: tWerte): boolean; function erzeugeLinearesBild(sT: boolean; var f: tMyStringList; threads: longint): boolean; function erzeugeAscii(sT: boolean; f: tMyStringList): boolean; @@ -5851,6 +5852,112 @@ begin result:=true; end; +function tWerte.berechneAutokorrelation2d(sT: boolean; f: tMyStringList; threads: longint; warn: tWarnStufe): boolean; +var + Zeit,pvFehler: extended; + fensters: array[boolean] of tSin2Fenster; + s: string; + b: boolean; + bekannteBefehle: tMyStringList; +begin + result:=false; + warteAufBeendigungDesLeseThreads; + Zeit:=now; + if istKomplex then begin + gibAus('Eine 2d-Autokorrelation braucht (momentan) reelle Werte!',3); + exit; + end; + for b:=false to true do + fensters[b]:=tSin2Fenster.create; + bekannteBefehle:=tMyStringList.create; + repeat + if not f.metaReadln(s,true) then begin + gibAus('Unerwartetes Dateiende!',3); + for b:=false to true do + fensters[b].free; + bekannteBefehle.free; + exit; + end; + bekannteBefehle.clear; + if istDasBefehl('Ende',s,bekannteBefehle,false) then break; + bekannteBefehle.add('''x-Fenster: ...'''); + bekannteBefehle.add('''t-Fenster: ...'''); + if (pos('-Fenster:',s)=2) and (s[1] in ['x','t']) then begin + b:=s[1]='t'; + erstesArgument(s,':'); + if b then fensters[b].rand:=round(kont2diskFak('t',exprToFloat(sT,s))) + else fensters[b].rand:=round(kont2diskFak('x',exprToFloat(sT,s))); + fensters[b].aktiv:=true; + continue; + end; + bekannteBefehle.sort; + gibAus('Verstehe Option '''+s+''' nicht bei Erstellung einer zweidimensionalen Autokorrelation!'#10'Ich kenne:'#10+bekannteBefehle.text,3); + for b:=false to true do + fensters[b].free; + bekannteBefehle.free; + exit; + until false; + bekannteBefehle.free; + fensters[true].breite:=_tSiz-fensters[true].breite; + fensters[false].breite:=_xSteps-fensters[false].breite; + + if odd(_tSiz) then begin + gibAus('Eine 2d-Autokorrelation braucht eine gerade Anzahl an Werten, '+intToStr(_tSiz)+' ist aber ungerade (man könnte das aber auch noch implementieren)!',3); + for b:=false to true do + fensters[b].free; + exit; + end; + if odd(_xSteps) then begin + gibAus('Eine 2d-Autokorrelation braucht eine gerade Anzahl an Werten, '+intToStr(_xSteps)+' ist aber ungerade (man könnte das aber auch noch implementieren)!',3); + for b:=false to true do + fensters[b].free; + exit; + end; + + if sT then begin + result:=true; + for b:=false to true do + fensters[b].free; + exit; + end; + + transformationen:=tFFTTransformation.create(transformationen,true,true,false); + gibAus('berechne t-FFT ...',3); + if not fft(threads,true,false,doRes,doResSmi,fensters[true],nil,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,doRes,doResSmi,fensters[false],nil,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('Quadrieren ...',3); + fft2dNachbearbeitung(threads,doBetrQdr,false); + gibAus('... fertig! '+timetostr(now-Zeit),3); + gibAus('berechne inverse x-FFT ...',3); + if not fft(threads,false,true,doRes,doRes,nil,nil,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 inverse t-FFT ...',3); + if not fft(threads,true,true,doRes,doRes,nil,nil,pvFehler,warn) then begin + gibAus('Es traten Fehler auf!',3); + exit; + end; + gibAus(' (Parseval-Fehler = '+floatToStr(pvFehler)+')',3); + gibAus('... fertig! '+timetostr(now-Zeit),3); + for b:=false to true do + fensters[b].free; + result:=true; +end; + function tWerte.berechneRadonTransformation(sT: boolean; f: tMyStringList; threads: longint; quelle: tWerte): boolean; var Zeit: extended; |