summaryrefslogtreecommitdiff
path: root/werteunit.pas
diff options
context:
space:
mode:
authorErich Eckner <git@eckner.net>2017-08-07 10:31:23 +0200
committerErich Eckner <git@eckner.net>2017-08-07 10:31:23 +0200
commit097ae86b2bce4c189bb9f38c3738e8572aaa429b (patch)
tree58a2d479d23958aaef5afb2df5392d787631f9e0 /werteunit.pas
parent2960a3b69a1ea80e32690a26a4e5655d588d1136 (diff)
downloadepost-097ae86b2bce4c189bb9f38c3738e8572aaa429b.tar.xz
macheKomplex und istKomplex neu
Diffstat (limited to 'werteunit.pas')
-rw-r--r--werteunit.pas51
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;