diff options
author | Erich Eckner <git@eckner.net> | 2019-09-25 15:51:55 +0200 |
---|---|---|
committer | Erich Eckner <git@eckner.net> | 2019-09-25 15:51:55 +0200 |
commit | 6dc078214273bf20c778728d612a1a120fa9a708 (patch) | |
tree | 5470b361d39fbe97a353e6912b49cf2e3ee39946 | |
parent | a4b77d1c0d4065e9ff1b5daf66e8e6ede4f2074f (diff) | |
download | epost-6dc078214273bf20c778728d612a1a120fa9a708.tar.xz |
berechneAutokorrelation2d sollte nicht Betragsquadrate bilden, sonder korrekt quadrieren!
-rw-r--r-- | epost.lps | 119 | ||||
-rw-r--r-- | epostunit.pas | 155 | ||||
-rw-r--r-- | werteunit.pas | 114 |
3 files changed, 289 insertions, 99 deletions
@@ -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; |