From d6ff133fd1ff7c325c7dea5866cd8ee752fb47af Mon Sep 17 00:00:00 2001 From: Erich Eckner Date: Fri, 21 Jul 2017 12:10:10 +0200 Subject: verschiebung neu --- epost.lps | 166 +++++++++++++++++++++++++++++----------------------------- epostunit.pas | 35 ++++++------- werteunit.pas | 45 +++++++++++++--- 3 files changed, 137 insertions(+), 109 deletions(-) diff --git a/epost.lps b/epost.lps index 34dd750..1b09724 100644 --- a/epost.lps +++ b/epost.lps @@ -7,8 +7,7 @@ - - + @@ -24,8 +23,8 @@ - - + + @@ -40,8 +39,8 @@ - - + + @@ -59,7 +58,7 @@ - + @@ -68,7 +67,7 @@ - + @@ -76,7 +75,7 @@ - + @@ -84,34 +83,33 @@ - + - + - - - + + - + - - - + + + @@ -119,48 +117,48 @@ - + - + - + - + - + - + - + @@ -168,155 +166,157 @@ - + - + - + - + - + - + - - + + - - + + - - + + - - + + - - + + + - + - + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + diff --git a/epostunit.pas b/epostunit.pas index 07e921a..64afc65 100644 --- a/epostunit.pas +++ b/epostunit.pas @@ -3802,7 +3802,7 @@ var s: string; b,hintergrundAbziehen: boolean; bekannteBefehle: tMyStringList; - maxPos: tIntPoint; + maxPos,einheitsZelle: tIntPoint; betraege: tWerte; i,j: int64; begin @@ -3885,14 +3885,14 @@ begin gibAus(' (Parseval-Fehler = '+floatToStr(pvFehler)+')',3); for b:=false to true do fensters[b].free; -(* + gibAus('spektrale Beträge ermitteln',3); betraege:=tWerte.create(self,0,_xSteps-1); betraege.fft2dNachbearbeitung(threads,doBetrQdr); - *) + fft2dNachbearbeitung(threads,doAlleResIms); -(* gibAus('tiefe Frequenzen filtern',3); + gibAus('tiefe Frequenzen filtern',3); case genauigkeit of gSingle: sWerte.kantenFilter(betraege.sWerte,xFak,yFak,kfHochpass,true,maxPos); @@ -3900,8 +3900,19 @@ begin dWerte.kantenFilter(betraege.dWerte,xFak,yFak,kfHochpass,true,maxPos); gExtended: eWerte.kantenFilter(betraege.eWerte,xFak,yFak,kfHochpass,true,maxPos); - end{of case}; *) -// betraege.free; + end{of case}; + betraege.free; + + gibAus('zentrieren',3); + einheitsZelle:=berechneEinheitsZelle(maxPos,intPoint(_xSteps,_tSiz div 2)); + case genauigkeit of + gSingle: + sWerte.verschiebe(maxPos,0,einheitsZelle['x']-1,0,einheitsZelle['y']-1,true); + gDouble: + dWerte.verschiebe(maxPos,0,einheitsZelle['x']-1,0,einheitsZelle['y']-1,true); + gExtended: + eWerte.verschiebe(maxPos,0,einheitsZelle['x']-1,0,einheitsZelle['y']-1,true); + end{of case}; gibAus('berechne inverse x-FFT ...',3); if not fft(threads,false,true,doAlleResIms,doAlleResIms,nil,0,pvFehler,wsLasch) then begin @@ -3916,18 +3927,6 @@ begin end; gibAus(' (Parseval-Fehler = '+floatToStr(pvFehler)+')',3); - hintergrund:=0; - for i:=_tSiz div 2 +1 to _tSiz-1 do - for j:=0 to _xSteps-1 do - hintergrund:=hintergrund + sqr(eWerte.werte[j+i*_xSteps]); - - writeln(hintergrund,' ',_xSteps*_tSiz div 2,' ',hintergrund*2/_xSteps/_tSiz); - - pvFehler:=0; - for i:=0 to _tSiz div 2 do - for j:=0 to _xSteps-1 do - pvFehler:=pvFehler + sqr(eWerte.werte[j+i*_xSteps]); - // _tSiz:=_tSiz div 2; // holeRAM(3); diff --git a/werteunit.pas b/werteunit.pas index aabb8fe..f81e864 100644 --- a/werteunit.pas +++ b/werteunit.pas @@ -12,7 +12,7 @@ type pTLLWerteSingle = ^tLLWerteSingle; pTLLWerteDouble = ^tLLWerteDouble; pTLLWerteExtended = ^tLLWerteExtended; - generic tLLWerte = class(tObject) + generic tLLWerte = class(tObject) { Diese Klasse stellt nur die Berechnungsroutinen und ähnliches bereit, nicht jedoch ein (wie auch immer geartetes) Userinterface. @@ -21,7 +21,7 @@ type private procedure sortiereMaxima(var maxima: tIntPointArray); public - werte: array of wgen; + werte: array of wGen; params: tExtraInfos; constructor create(ps: tExtraInfos); overload; constructor create(original: pTLLWerteSingle; ps: tExtraInfos; xMin,xMax: longint); overload; @@ -72,6 +72,7 @@ type procedure kantenFilter(betraege: tLLWerte; xFak,yFak: extended; filterTyp: tKantenFilterTyp); overload; procedure kantenFilter(betraege: tLLWerte; xFak,yFak: extended; filterTyp: tKantenFilterTyp; einseitig: boolean; out maxPos: tIntPoint); overload; procedure fenstereWerte(xMi,xMa,tMi,tMa: int64; xFen,tFen: tFenster; hg: extended); + procedure verschiebe(richtung: tIntPoint; xV,xB,tV,tB: longint; komplex: boolean); end; tLLWerteSingle = specialize tLLWerte; tLLWerteDouble = specialize tLLWerte; @@ -769,8 +770,8 @@ begin close(f); exit; end; - if sizeOf(wgen) = wertGroesze(dateien[i].genauigkeit) then - blockread(f,werte[(j+dateien[i].t0Abs)*params.xSteps],params.xSteps*sizeOf(wgen)) + if sizeOf(wGen) = wertGroesze(dateien[i].genauigkeit) then + blockread(f,werte[(j+dateien[i].t0Abs)*params.xSteps],params.xSteps*sizeOf(wGen)) else begin setLength(sA,params.xSteps); blockread(f,sA[0],params.xSteps*sizeOf(single)); @@ -939,7 +940,7 @@ begin reset(f,1); seek(f,(dateien[i] as tAndorInputDateiInfo).datenStart); tmpI:=wertGroesze(dateien[i].genauigkeit); - if tmpI = sizeOf(wgen) then + if tmpI = sizeOf(wGen) then blockread(f,werte[0],dateien[i].xSteps*dateien[i].tSiz*tmpI) else case dateien[i].genauigkeit of gSingle: @@ -1047,7 +1048,7 @@ begin in0:=true; out0:=true; - case sizeOf(wgen) of + case sizeOf(wGen) of sizeOf(single): for i:=sMin to sMax do begin if not senkrecht and (algo.inOrdnung = doAlleResIms) then @@ -1196,7 +1197,7 @@ end; procedure tLLWerte.spiegle(tMin,tMax: longint); var i,j: longint; - tmp: wgen; + tmp: wGen; begin for i:=tMin to tMax do for j:=0 to params.xSteps div 2 -1 do begin @@ -1405,7 +1406,7 @@ begin ho:=params.tSiz; end; if (ausgaben and __ausgabenMaske) <> 0 then - gibAus('Fordere '+intToStr(floor(ho*br*sizeOf(wgen)/1024/1024))+' MB RAM an ('+intToStr(br)+' x-Schritte mal '+intToStr(ho)+' t-Schritte; bisher '+intToStr(belegterSpeicher div 1024)+' MB belegt). ...',ausgaben); + gibAus('Fordere '+intToStr(floor(ho*br*sizeOf(wGen)/1024/1024))+' MB RAM an ('+intToStr(br)+' x-Schritte mal '+intToStr(ho)+' t-Schritte; bisher '+intToStr(belegterSpeicher div 1024)+' MB belegt). ...',ausgaben); setLength(werte,br*ho); if (ausgaben and __ausgabenMaske) <> 0 then @@ -2055,6 +2056,34 @@ begin (werte[i+j*params.xSteps]-hg)*xFen.werte[i]*tFen.werte[j]; end; +procedure tLLWerte.verschiebe(richtung: tIntPoint; xV,xB,tV,tB: longint; komplex: boolean); +var + xS,tS,x,t,xN,tN,xM,tM: longint; + imPart: boolean; + wert: wGen; +begin + xM:=params.xSteps; + tM:=params.tSiz div (1+byte(komplex)); + if (xV<0) or (xB<0) or (tV<0) or (tB<0) or + (xV>=xM) or (xB>=xM) or (tV>=tM) or (tB>=tM) then + raise exception.create('Fehler: Das Startrechteck ('+intToStr(xV)+'-'+intToStr(xB)+'x'+intToStr(tV)+'-'+intToStr(tB)+') liegt nicht vollsändig in den Daten ('+intToStr(xM)+'x'+intToStr(tM)+').'); + for imPart:=false to komplex do + for xS:=xV to xB do + for tS:=tV to tB do begin + wert:=werte[xS+tS*xM]; + xN:=xS; + tN:=tS; + repeat + x:=xN; + t:=tN; + xN:=(x + richtung['x']) mod xM; + tN:=(t + richtung['y']) mod tM; + werte[x+t*xM]:=werte[xN+tN*xM]; + until (xN=xS) and (tN=tS); + werte[x+t*xM]:=wert; + end; +end; + // tWavelet ******************************************************************** function tWavelet.setzeTyp(s: string): boolean; -- cgit v1.2.3-70-g09d2