summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErich Eckner <git@eckner.net>2019-09-25 15:51:55 +0200
committerErich Eckner <git@eckner.net>2019-09-25 15:51:55 +0200
commit6dc078214273bf20c778728d612a1a120fa9a708 (patch)
tree5470b361d39fbe97a353e6912b49cf2e3ee39946
parenta4b77d1c0d4065e9ff1b5daf66e8e6ede4f2074f (diff)
downloadepost-6dc078214273bf20c778728d612a1a120fa9a708.tar.xz
berechneAutokorrelation2d sollte nicht Betragsquadrate bilden, sonder korrekt quadrieren!
-rw-r--r--epost.lps119
-rw-r--r--epostunit.pas155
-rw-r--r--werteunit.pas114
3 files changed, 289 insertions, 99 deletions
diff --git a/epost.lps b/epost.lps
index 7a89c3e..5f577eb 100644
--- a/epost.lps
+++ b/epost.lps
@@ -24,24 +24,24 @@
<IsPartOfProject Value="True"/>
<IsVisibleTab Value="True"/>
<EditorIndex Value="2"/>
- <TopLine Value="7309"/>
- <CursorPos X="45" Y="7332"/>
+ <TopLine Value="5937"/>
+ <CursorPos X="53" Y="5964"/>
<UsageCount Value="201"/>
<Loaded Value="True"/>
</Unit2>
<Unit3>
<Filename Value="werteunit.pas"/>
<IsPartOfProject Value="True"/>
- <EditorIndex Value="4"/>
- <TopLine Value="1402"/>
- <CursorPos X="25" Y="1403"/>
+ <EditorIndex Value="5"/>
+ <TopLine Value="1276"/>
+ <CursorPos X="19" Y="1281"/>
<UsageCount Value="200"/>
<Loaded Value="True"/>
</Unit3>
<Unit4>
<Filename Value="typenunit.pas"/>
<IsPartOfProject Value="True"/>
- <EditorIndex Value="8"/>
+ <EditorIndex Value="9"/>
<TopLine Value="3640"/>
<CursorPos X="47" Y="3670"/>
<UsageCount Value="200"/>
@@ -50,10 +50,10 @@
<Unit5>
<Filename Value="../units/fftunit.pas"/>
<IsPartOfProject Value="True"/>
- <EditorIndex Value="-1"/>
- <TopLine Value="13"/>
- <CursorPos X="100" Y="13"/>
+ <EditorIndex Value="3"/>
+ <CursorPos X="32" Y="13"/>
<UsageCount Value="201"/>
+ <Loaded Value="True"/>
</Unit5>
<Unit6>
<Filename Value="../units/fftunit.inc"/>
@@ -66,7 +66,7 @@
<Unit7>
<Filename Value="gauszFit.inc"/>
<IsPartOfProject Value="True"/>
- <EditorIndex Value="7"/>
+ <EditorIndex Value="8"/>
<CursorPos X="9" Y="17"/>
<UsageCount Value="201"/>
<Loaded Value="True"/>
@@ -82,18 +82,18 @@
<Unit9>
<Filename Value="../units/optimierung.pas"/>
<IsPartOfProject Value="True"/>
- <EditorIndex Value="5"/>
+ <EditorIndex Value="6"/>
<TopLine Value="86"/>
<CursorPos X="26" Y="115"/>
- <UsageCount Value="41"/>
+ <UsageCount Value="46"/>
<Loaded Value="True"/>
</Unit9>
<Unit10>
<Filename Value="../units/optimierung.inc"/>
<IsPartOfProject Value="True"/>
- <EditorIndex Value="6"/>
+ <EditorIndex Value="7"/>
<CursorPos X="3" Y="2"/>
- <UsageCount Value="37"/>
+ <UsageCount Value="42"/>
<Loaded Value="True"/>
</Unit10>
<Unit11>
@@ -114,12 +114,12 @@
<EditorIndex Value="1"/>
<TopLine Value="121"/>
<CursorPos X="46" Y="139"/>
- <UsageCount Value="99"/>
+ <UsageCount Value="101"/>
<Loaded Value="True"/>
</Unit13>
<Unit14>
<Filename Value="../units/matheunit.pas"/>
- <EditorIndex Value="3"/>
+ <EditorIndex Value="4"/>
<TopLine Value="1194"/>
<CursorPos X="106" Y="1213"/>
<UsageCount Value="101"/>
@@ -210,122 +210,119 @@
</Units>
<JumpHistory Count="30" HistoryIndex="29">
<Position1>
- <Filename Value="werteunit.pas"/>
- <Caret Line="76" Column="59" TopLine="48"/>
+ <Filename Value="epostunit.pas"/>
+ <Caret Line="8177" Column="21" TopLine="8159"/>
</Position1>
<Position2>
- <Filename Value="werteunit.pas"/>
- <Caret Line="1385" Column="96" TopLine="1357"/>
+ <Filename Value="epostunit.pas"/>
</Position2>
<Position3>
- <Filename Value="werteunit.pas"/>
- <Caret Line="1956" Column="32" TopLine="1953"/>
+ <Filename Value="epostunit.pas"/>
+ <Caret Line="317" Column="16" TopLine="288"/>
</Position3>
<Position4>
- <Filename Value="werteunit.pas"/>
- <Caret Line="1957" Column="30" TopLine="1947"/>
+ <Filename Value="epostunit.pas"/>
+ <Caret Line="7208" Column="19" TopLine="7182"/>
</Position4>
<Position5>
<Filename Value="epostunit.pas"/>
- <Caret Line="7287" Column="73" TopLine="7219"/>
</Position5>
<Position6>
<Filename Value="epostunit.pas"/>
- <Caret Line="7206" Column="49" TopLine="7191"/>
+ <Caret Line="196" Column="54" TopLine="168"/>
</Position6>
<Position7>
<Filename Value="epostunit.pas"/>
- <Caret Line="7294" Column="74" TopLine="7272"/>
+ <Caret Line="7232" Column="10" TopLine="7215"/>
</Position7>
<Position8>
<Filename Value="epostunit.pas"/>
- <Caret Line="7198" TopLine="7178"/>
+ <Caret Line="8184" Column="9" TopLine="8169"/>
</Position8>
<Position9>
<Filename Value="epostunit.pas"/>
- <Caret Line="198" Column="72" TopLine="182"/>
+ <Caret Line="8189" Column="18" TopLine="8171"/>
</Position9>
<Position10>
<Filename Value="epostunit.pas"/>
- <Caret Line="7198" Column="75" TopLine="7181"/>
+ <Caret Line="8195" Column="59" TopLine="8177"/>
</Position10>
<Position11>
<Filename Value="werteunit.pas"/>
- <Caret Line="1957" Column="30" TopLine="1947"/>
+ <Caret Line="66" Column="37" TopLine="49"/>
</Position11>
<Position12>
<Filename Value="werteunit.pas"/>
+ <Caret Line="1279" Column="42" TopLine="1262"/>
</Position12>
<Position13>
<Filename Value="werteunit.pas"/>
- <Caret Line="76" Column="81" TopLine="48"/>
+ <Caret Line="1312" Column="52" TopLine="1284"/>
</Position13>
<Position14>
- <Filename Value="../units/lowlevelunit.pas"/>
- <Caret Line="139" Column="46" TopLine="121"/>
+ <Filename Value="werteunit.pas"/>
+ <Caret Line="1317" TopLine="1309"/>
</Position14>
<Position15>
- <Filename Value="epost.lpr"/>
- <Caret Line="537" Column="65" TopLine="519"/>
+ <Filename Value="werteunit.pas"/>
+ <Caret Line="1292" Column="45" TopLine="1276"/>
</Position15>
<Position16>
- <Filename Value="werteunit.pas"/>
- <Caret Line="76" Column="44" TopLine="61"/>
+ <Filename Value="epostunit.pas"/>
+ <Caret Line="8177" Column="76" TopLine="8156"/>
</Position16>
<Position17>
<Filename Value="epostunit.pas"/>
- <Caret Line="7256" Column="22" TopLine="7251"/>
</Position17>
<Position18>
<Filename Value="epostunit.pas"/>
- <Caret Line="7257" Column="7" TopLine="7240"/>
+ <Caret Line="183" Column="39" TopLine="155"/>
</Position18>
<Position19>
<Filename Value="epostunit.pas"/>
- <Caret Line="7261" TopLine="7230"/>
+ <Caret Line="5956" TopLine="5944"/>
</Position19>
<Position20>
<Filename Value="epostunit.pas"/>
- <Caret Line="7258" Column="8" TopLine="7241"/>
+ <Caret Line="196" Column="30" TopLine="180"/>
</Position20>
<Position21>
- <Filename Value="werteunit.pas"/>
- <Caret Line="76" Column="44" TopLine="61"/>
+ <Filename Value="epostunit.pas"/>
+ <Caret Line="5956" Column="18" TopLine="5928"/>
</Position21>
<Position22>
- <Filename Value="werteunit.pas"/>
- <Caret Line="1385" Column="96" TopLine="1381"/>
+ <Filename Value="epostunit.pas"/>
+ <Caret Line="7227" Column="20" TopLine="7210"/>
</Position22>
<Position23>
- <Filename Value="werteunit.pas"/>
- <Caret Line="76" Column="91" TopLine="59"/>
+ <Filename Value="epostunit.pas"/>
+ <Caret Line="8175" Column="17" TopLine="8158"/>
</Position23>
<Position24>
- <Filename Value="werteunit.pas"/>
- <Caret Line="1385" Column="48" TopLine="1357"/>
+ <Filename Value="epostunit.pas"/>
+ <Caret Line="8177" Column="26" TopLine="8158"/>
</Position24>
<Position25>
- <Filename Value="werteunit.pas"/>
- <Caret Line="1981" TopLine="1947"/>
+ <Filename Value="epostunit.pas"/>
+ <Caret Line="8189" Column="24" TopLine="8175"/>
</Position25>
<Position26>
- <Filename Value="werteunit.pas"/>
- <Caret Line="76" Column="43" TopLine="60"/>
+ <Filename Value="epostunit.pas"/>
</Position26>
<Position27>
- <Filename Value="werteunit.pas"/>
- <Caret Line="1385" Column="48" TopLine="1357"/>
+ <Filename Value="epostunit.pas"/>
+ <Caret Line="317" Column="16" TopLine="288"/>
</Position27>
<Position28>
- <Filename Value="werteunit.pas"/>
- <Caret Line="1960" Column="14" TopLine="1952"/>
+ <Filename Value="epostunit.pas"/>
+ <Caret Line="7208" Column="32" TopLine="7194"/>
</Position28>
<Position29>
- <Filename Value="werteunit.pas"/>
+ <Filename Value="epostunit.pas"/>
</Position29>
<Position30>
- <Filename Value="werteunit.pas"/>
- <Caret Line="76" Column="43" TopLine="48"/>
+ <Filename Value="epostunit.pas"/>
+ <Caret Line="196" Column="30" TopLine="168"/>
</Position30>
</JumpHistory>
<RunParams>
diff --git a/epostunit.pas b/epostunit.pas
index 0cc4cbf..37476d1 100644
--- a/epostunit.pas
+++ b/epostunit.pas
@@ -193,6 +193,7 @@ type
procedure ermittlePhasenWinkel(threads: longint);
procedure entspringe(threads: longint; entspringen: tEntspringModus);
procedure fft2dNachbearbeitung(threads: longint; nB: tFFTDatenordnung; znt: boolean);
+ procedure fft2dQuadrieren(threads: longint; hcc,vcc: boolean);
procedure schreibeWert(var f: textFile; p: tExtPoint; var letzterWert: extended; entspringen,verschiebung: extended; skalierung: string; linienIntegral: tLinienIntegral; tmpValues: tKnownValues);
function exprToFloat(sT: boolean; s: string): extended;
function findeZweitdominantestenPunkt(sT: boolean; f: tMyStringList): boolean;
@@ -313,6 +314,13 @@ type
constructor create(xMi,xMa: longint; pWerte: tWerte; endordnung: tFFTDatenordnung);
procedure stExecute; override;
end;
+ tFFT2dQThread = class(tLogThread)
+ xMin,xMax: longint;
+ pW: tWerte;
+ hcc,vcc: boolean;
+ constructor create(xMi,xMa: longint; pWerte: tWerte; hComplConj,vComplConj: boolean);
+ procedure stExecute; override;
+ end;
tTauschThread = class(tLogThread)
tMin,tMax: longint;
pW: tWerte;
@@ -5859,6 +5867,9 @@ var
fensters: array[boolean] of tSin2Fenster;
s: string;
b: boolean;
+ c: char;
+ fftRichtungen: array[boolean] of char;
+ gespiegelt: array[boolean] of boolean;
bekannteBefehle: tMyStringList;
begin
result:=false;
@@ -5868,8 +5879,10 @@ begin
gibAus('Eine 2d-Autokorrelation braucht (momentan) reelle Werte!',3);
exit;
end;
- for b:=false to true do
+ for b:=false to true do begin
fensters[b]:=tSin2Fenster.create;
+ gespiegelt[b]:=false;
+ end;
bekannteBefehle:=tMyStringList.create;
repeat
if not f.metaReadln(s,true) then begin
@@ -5881,14 +5894,18 @@ begin
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;
+ for c in ['x','y','t'] do
+ if istDasBefehl(c+'-Fenster:',s,bekannteBefehle,true) then begin
+ fensters[c<>'x'].rand:=round(kont2diskFak(c,exprToFloat(sT,s)));
+ fensters[c<>'x'].aktiv:=true;
+ continue;
+ end;
+ if istDasBefehl('horizontal gespiegelt',s,bekannteBefehle,false) then begin
+ gespiegelt[false]:=true;
+ continue;
+ end;
+ if istDasBefehl('vertikal gespiegelt',s,bekannteBefehle,false) then begin
+ gespiegelt[true]:=true;
continue;
end;
bekannteBefehle.sort;
@@ -5922,40 +5939,39 @@ begin
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;
+ // sonst transformieren wir Zeilen, die nur Nullen beinhalten, in der 1. inversen FFT
+ if gespiegelt[true] and not gespiegelt[false] then begin
+ fftRichtungen[false]:='x';
+ fftRichtungen[true]:='t';
+ end
+ else begin
+ fftRichtungen[false]:='t';
+ fftRichtungen[true]:='x';
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;
+
+ for b:=false to true do begin
+ gibAus('berechne '+fftRichtungen[b]+'-FFT ...',3);
+ if not fft(threads,fftRichtungen[b]='t',false,doRes,doResSmi,fensters[fftRichtungen[b]='t'],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);
end;
- gibAus(' (Parseval-Fehler = '+floatToStr(pvFehler)+')',3);
- gibAus('... fertig! '+timetostr(now-Zeit),3);
+ for b:=false to true do
+ fensters[b].free;
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);
+ fft2dQuadrieren(threads,not gespiegelt[false],not gespiegelt[true]);
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;
+ for b:=true downto false do begin
+ gibAus('berechne inverse '+fftRichtungen[b]+'-FFT ...',3);
+ if not fft(threads,fftRichtungen[b]='t',true,doResSmi,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);
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;
@@ -7190,6 +7206,42 @@ begin
end;
end;
+procedure tWerte.fft2dQuadrieren(threads: longint; hcc,vcc: boolean);
+var
+ i: longint;
+ FQTs: array of tFFT2dQThread;
+ fertig: boolean;
+begin
+ if istKomplex then
+ fehler('fft2Quadrieren kann (noch) keine voll-komplexen Werte quadrieren!');
+
+ // der "Rand"
+ case genauigkeit of
+ gSingle: sWerte.fft2dQuadrierenA(hcc,vcc);
+ gDouble: dWerte.fft2dQuadrierenA(hcc,vcc);
+ gExtended: eWerte.fft2dQuadrierenA(hcc,vcc);
+ end{of case};
+
+ // der Hauptteil (alles außer erster und mittlerer Zeile/Spalte)
+ setLength(FQTs,threads);
+ for i:=0 to length(FQTs)-1 do
+ FQTs[i]:=tFFT2dQThread.create(
+ round(i*(_xSteps div 2 -1)/length(FQTs))+1,
+ round((i+1)*(_xSteps div 2 -1)/length(FQTs)),
+ self,
+ hcc,
+ vcc);
+ repeat
+ sleep(10);
+ fertig:=true;
+ for i:=0 to length(FQTs)-1 do
+ fertig:=fertig and FQTs[i].fertig;
+ until fertig;
+ for i:=0 to length(FQTs)-1 do
+ FQTs[i].free;
+ gibAus('Alle FFT2dQThreads fertig!',1);
+end;
+
function tWerte.exprToFloat(sT: boolean; s: string): extended;
begin
result:=matheunit.exprToFloat(sT,s,knownValues,@callBackGetValue);
@@ -8121,6 +8173,33 @@ begin
gibAus('... und fertig!',1);
end;
+// tFFT2dQThread ***************************************************************
+
+constructor tFFT2dQThread.create(xMi,xMa: longint; pWerte: tWerte; hComplConj,vComplConj: boolean);
+begin
+ inherited create;
+ xMin:=xMi;
+ xMax:=xMa;
+ pW:=pWerte;
+ hcc:=hComplConj;
+ vcc:=vComplConj;
+ gibAus('FFT2d-Quadrierthread kreiert: '+intToStr(xMin)+'-'+intToStr(xMax),1);
+ suspended:=false;
+end;
+
+procedure tFFT2dQThread.stExecute;
+begin
+ gibAus('FFT2d-Quadrierthread gestartet: '+intToStr(xMin)+'-'+intToStr(xMax)+' ...',1);
+ if pW.istKomplex then
+ fehler('tFFT2dNBThread kann (noch) nicht komplex!');
+ case pW.genauigkeit of
+ gSingle: pW.sWerte.fft2dQuadrierenB(xMin,xMax,hcc,vcc);
+ gDouble: pW.dWerte.fft2dQuadrierenB(xMin,xMax,hcc,vcc);
+ gExtended: pW.eWerte.fft2dQuadrierenB(xMin,xMax,hcc,vcc);
+ end{of case};
+ gibAus('... und fertig!',1);
+end;
+
// tTauschThread ***************************************************************
constructor tTauschThread.create(tMi,tMa: longint; pWerte: tWerte);
diff --git a/werteunit.pas b/werteunit.pas
index eaa400b..02acddf 100644
--- a/werteunit.pas
+++ b/werteunit.pas
@@ -63,6 +63,8 @@ type
procedure fft2dNachbearbeitungB(xMin,xMax: longint; nB: tFFTDatenordnung);
procedure fft2dNachbearbeitungVerdoppeln(nB: tFFTDatenordnung);
procedure fft2dNachbearbeitungKomplex(xMin,xMax: longint; nB: tFFTDatenordnung);
+ procedure fft2dQuadrierenA(hcc,vcc: boolean);
+ procedure fft2dQuadrierenB(xMin,xMax: longint; hcc,vcc: boolean);
procedure tausche(tMin,tMax: longint);
procedure schreibeWert(var f: textFile; x,y: extended; beschriftung: tExtPoint; var letzterWert: extended; entspringen, verschiebung: extended; skalierung: string; kvs: tKnownValues; linienIntegral: tLinienIntegral; cbgv: tCallBackGetValue); overload; inline;
procedure schreibeWert(var f: textFile; xBeschr,yBeschr,wert: extended; skalierung: string; kvs: tKnownValues; cbgv: tCallBackGetValue); overload; inline;
@@ -1274,6 +1276,118 @@ begin
end{of case};
end;
+procedure tLLWerte.fft2dQuadrierenA(hcc,vcc: boolean);
+var
+ i,j,xS2,tS2XS: longint;
+ reRe,imRe,reIm: extended;
+const
+ minusPlus: array[boolean] of extended = (-1,1);
+ zweiNull: array[boolean] of extended = (2,0);
+begin
+ xS2:=params.xSteps div 2;
+ tS2XS:=(params.tSiz div 2) * params.xSteps;
+ // die vier "Ecken" sind rein reell
+ for i:=0 to 1 do
+ for j:=0 to 1 do
+ werte[j*tS2XS + i*xS2]:=
+ sqr(extended(werte[j*tS2XS + i*xS2]));
+
+ // unterste und mittlere Zeile sind reell in t
+ for j:=0 to 1 do
+ for i:=1 to xS2-1 do begin
+ reRe:=werte[i+j*tS2XS];
+ imRe:=werte[params.xSteps-i+j*tS2XS];
+
+ werte[i+j*tS2XS]:= // reRe
+ minusPlus[hcc]*sqr(imRe)+sqr(reRe);
+ werte[params.xSteps-i+j*tS2XS]:= // imRe
+ zweiNull[hcc]*imRe*reRe;
+ end;
+
+ // linke und mittlere Spalte sind reell in x
+ for i:=0 to 1 do
+ for j:=1 to params.tSiz div 2 -1 do begin
+ reRe:=werte[i*xS2+j*params.xSteps];
+ reIm:=werte[i*xS2+(params.tSiz-j)*params.xSteps];
+
+ werte[i*xS2+j*params.xSteps]:= // reRe
+ minusPlus[vcc]*sqr(reIm)+sqr(reRe);
+ werte[i*xS2+(params.tSiz-j)*params.xSteps]:= // reIm
+ zweiNull[vcc]*reIm*reRe;
+ end;
+end;
+
+procedure tLLWerte.fft2dQuadrierenB(xMin,xMax: longint; hcc,vcc: boolean);
+var
+ i,j: longint;
+ reRe,reIm,imRe,imIm: extended;
+begin // bearbeitet nur den Hauptteil (außer erster und mittlerer Zeile/Spalte) nach!
+ case byte(hcc) + 2*byte(vcc) of
+ 0:
+ for i:=xMin to xMax do
+ for j:=1 to params.tSiz div 2 -1 do begin
+ reRe:=werte[i+j*params.xSteps];
+ imRe:=werte[params.xSteps-i+j*params.xSteps];
+ reIm:=werte[i+(params.tSiz-j)*params.xSteps];
+ imIm:=werte[params.xSteps-i+(params.tSiz-j)*params.xSteps];
+
+ werte[i+j*params.xSteps]:= // reRe
+ sqr(imIm)-sqr(imRe)-sqr(reIm)+sqr(reRe);
+ werte[params.xSteps-i+j*params.xSteps]:= // imRe
+ -2*imIm*reIm+2*imRe*reRe;
+ werte[i+(params.tSiz-j)*params.xSteps]:= // reIm
+ -2*imIm*imRe+2*reIm*reRe;
+ werte[params.xSteps-i+(params.tSiz-j)*params.xSteps]:= // imIm
+ 2*imRe*reIm+2*imIm*reRe;
+ end;
+ 1: // horizontal komplex konjugiert
+ for i:=xMin to xMax do
+ for j:=1 to params.tSiz div 2 -1 do begin
+ reRe:=werte[i+j*params.xSteps];
+ imRe:=werte[params.xSteps-i+j*params.xSteps];
+ reIm:=werte[i+(params.tSiz-j)*params.xSteps];
+ imIm:=werte[params.xSteps-i+(params.tSiz-j)*params.xSteps];
+
+ werte[i+j*params.xSteps]:= // reRe
+ -sqr(imIm)+sqr(imRe)-sqr(reIm)+sqr(reRe);
+ werte[params.xSteps-i+j*params.xSteps]:=0; // imRe
+ werte[i+(params.tSiz-j)*params.xSteps]:= // reIm
+ 2*imIm*imRe+2*reIm*reRe;
+ werte[params.xSteps-i+(params.tSiz-j)*params.xSteps]:=0; // imIm
+ end;
+ 2: // vertikal komplex konjugiert
+ for i:=xMin to xMax do
+ for j:=1 to params.tSiz div 2 -1 do begin
+ reRe:=werte[i+j*params.xSteps];
+ imRe:=werte[params.xSteps-i+j*params.xSteps];
+ reIm:=werte[i+(params.tSiz-j)*params.xSteps];
+ imIm:=werte[params.xSteps-i+(params.tSiz-j)*params.xSteps];
+
+ werte[i+j*params.xSteps]:= // reRe
+ -sqr(imIm)-sqr(imRe)+sqr(reIm)+sqr(reRe);
+ werte[params.xSteps-i+j*params.xSteps]:= // imRe
+ 2*imIm*reIm+2*imRe*reRe;
+ werte[i+(params.tSiz-j)*params.xSteps]:=0; // reIm
+ werte[params.xSteps-i+(params.tSiz-j)*params.xSteps]:=0; // imIm
+ end;
+ 3: // horizontal & vertikal komplex konjugiert
+ for i:=xMin to xMax do
+ for j:=1 to params.tSiz div 2 -1 do begin
+ reRe:=werte[i+j*params.xSteps];
+ imRe:=werte[params.xSteps-i+j*params.xSteps];
+ reIm:=werte[i+(params.tSiz-j)*params.xSteps];
+ imIm:=werte[params.xSteps-i+(params.tSiz-j)*params.xSteps];
+
+ werte[i+j*params.xSteps]:= // reRe
+ sqr(imIm)+sqr(imRe)+sqr(reIm)+sqr(reRe);
+ werte[params.xSteps-i+j*params.xSteps]:=0; // imRe
+ werte[i+(params.tSiz-j)*params.xSteps]:=0; // reIm
+ werte[params.xSteps-i+(params.tSiz-j)*params.xSteps]:= // imIm
+ -2*imRe*reIm+2*imIm*reRe;
+ end;
+ end{of case};
+end;
+
procedure tLLWerte.tausche(tMin,tMax: longint);
var
i,j,hLen: longint;