summaryrefslogtreecommitdiff
path: root/epostunit.pas
diff options
context:
space:
mode:
Diffstat (limited to 'epostunit.pas')
-rw-r--r--epostunit.pas107
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;