diff options
author | Erich Eckner <git@eckner.net> | 2017-08-07 10:31:23 +0200 |
---|---|---|
committer | Erich Eckner <git@eckner.net> | 2017-08-07 10:31:23 +0200 |
commit | 097ae86b2bce4c189bb9f38c3738e8572aaa429b (patch) | |
tree | 58a2d479d23958aaef5afb2df5392d787631f9e0 /werteunit.pas | |
parent | 2960a3b69a1ea80e32690a26a4e5655d588d1136 (diff) | |
download | epost-097ae86b2bce4c189bb9f38c3738e8572aaa429b.tar.xz |
macheKomplex und istKomplex neu
Diffstat (limited to 'werteunit.pas')
-rw-r--r-- | werteunit.pas | 51 |
1 files changed, 41 insertions, 10 deletions
diff --git a/werteunit.pas b/werteunit.pas index d26b65a..81d016d 100644 --- a/werteunit.pas +++ b/werteunit.pas @@ -5,7 +5,8 @@ unit werteunit; interface uses - classes, sysutils, typenunit, math, process, lowlevelunit, matheunit, fftunit; + classes, sysutils, typenunit, math, process, lowlevelunit, matheunit, fftunit, + randomunit; type // tLLWerte ******************************************************************** @@ -62,7 +63,7 @@ type procedure holeRAM(ausgaben: byte); inline; overload; procedure holeRAM(ausgaben: byte; gemaeszTXMinMax: boolean); inline; overload; procedure gibMinMaxDichten(out wMi,wMa: extended; xMin,xMax,tMin,tMax: longint); - function zuPixelWerten(wHoehe,wBreite,xPMi,xMi,tMi,komplex: longint; xZ,yZ: extended; pPWerte: pTExtendedArray; pPAnzahlen: pTLongintArray): boolean; + function zuPixelWerten(wHoehe,wBreite,xPMi,xMi,tMi: longint; xZ,yZ: extended; pPWerte: pTExtendedArray; pPAnzahlen: pTLongintArray): boolean; function findeSchwellwerte(xMi,xMa,tMi,tMa: longint; Schw: extended): tExtPointArray; procedure integriereSingle(qu: pTLLWerteSingle; xMi,xMa,tMi,tMa,xOf,tOf: longint; richtung: tIntegrationsRichtung); procedure integriereDouble(qu: pTLLWerteDouble; xMi,xMa,tMi,tMa,xOf,tOf: longint; richtung: tIntegrationsRichtung); @@ -72,8 +73,9 @@ 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); + procedure verschiebe(richtung: tIntPoint; xV,xB,tV,tB: longint); procedure ermittlePhasenWinkel(xMi,xMa: longint); + procedure macheKomplex(tMi,tMa: int64; kmm: tKomplexMachModus; mT: tMersenneTwister); end; tLLWerteSingle = specialize tLLWerte<single>; tLLWerteDouble = specialize tLLWerte<double>; @@ -1414,10 +1416,11 @@ begin gibAus('... fertig '+timetostr(now-Zeit),ausgaben); end; -function tLLWerte.zuPixelWerten(wHoehe,wBreite,xPMi,xMi,tMi,komplex: longint; xZ,yZ: extended; pPWerte: pTExtendedArray; pPAnzahlen: pTLongintArray): boolean; +function tLLWerte.zuPixelWerten(wHoehe,wBreite,xPMi,xMi,tMi: longint; xZ,yZ: extended; pPWerte: pTExtendedArray; pPAnzahlen: pTLongintArray): boolean; var i,j,k,l, xV,xB,tV,tB: longint; + hLen: int64; b,imPart: boolean; begin result:=false; @@ -1426,13 +1429,14 @@ begin for i:=0 to length(pPAnzahlen^)-1 do pPAnzahlen^[i]:=0; b:=false; - for imPart:=false to komplex>0 do + hLen:=length(werte) div 2; + for imPart:=false to params.istKomplex do for j:=0 to wHoehe-1 do for i:=0 to wBreite-1 do begin xV:=min(params.xSteps-1,max(0,ceil((i+max(0,xPMi)-1/2)/xZ+xMi))); xB:=min(params.xSteps-1,max(0,ceil((i+max(0,xPMi)+1/2)/xZ+xMi-1))); - tV:=min(params.tSiz div (1+byte(komplex>0))-1,max(0,ceil((j-1/2)/yZ+tMi)))+byte(imPart)*komplex; - tB:=min(params.tSiz div (1+byte(komplex>0))-1,max(0,ceil((j+1/2)/yZ+tMi-1)))+byte(imPart)*komplex; + tV:=min(params.tSiz div (1+byte(params.istKomplex))-1,max(0,ceil((j-1/2)/yZ+tMi)))+byte(imPart)*hLen; + tB:=min(params.tSiz div (1+byte(params.istKomplex))-1,max(0,ceil((j+1/2)/yZ+tMi-1)))+byte(imPart)*hLen; if xV>xB then begin if (i>0) or (xPMi>0) then dec(xV) @@ -2056,18 +2060,18 @@ 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); +procedure tLLWerte.verschiebe(richtung: tIntPoint; xV,xB,tV,tB: longint); 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)); + tM:=params.tSiz div (1+byte(params.istKomplex)); 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 imPart:=false to params.istKomplex do for xS:=xV to xB do for tS:=tV to tB do begin wert:=werte[xS+(tS+byte(imPart)*tM)*xM]; @@ -2101,6 +2105,33 @@ begin ); end; +procedure tLLWerte.macheKomplex(tMi,tMa: int64; kmm: tKomplexMachModus; mT: tMersenneTwister); +var + i,j,hLen: int64; + arg: extended; +begin + hLen:=length(werte) div 2; + case kmm of + kmmImNull: + fillChar(werte[hLen+tMi*params.xSteps],(tMa+1-tMi)*params.xSteps*sizeOf(wGen),0); + kmmReNull: begin + move(werte[tMi*params.xSteps],werte[hLen+tMi*params.xSteps],(tMa+1-tMi)*params.xSteps*sizeOf(wGen)); + fillChar(werte[tMi*params.xSteps],(tMa+1-tMi)*params.xSteps*sizeOf(wGen),0); + end; + kmmPhZuf: + for j:=tMi to tMa do + for i:=0 to params.xSteps-1 do begin + arg:=2*pi*mT.random; + werte[i+j*params.xSteps+hLen]:= + werte[i+j*params.xSteps]*sin(arg); + werte[i+j*params.xSteps]:= + werte[i+j*params.xSteps]*cos(arg); + end; + else + raise exception.create('Komplexmachmodus nicht implementiert ('+intToStr(integer(kmm))+')!'); + end{of case}; +end; + // tWavelet ******************************************************************** function tWavelet.setzeTyp(s: string): boolean; |