summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErich Eckner <git@eckner.net>2019-10-18 16:14:44 +0200
committerErich Eckner <git@eckner.net>2019-10-18 16:14:44 +0200
commit66000f787560c38678cb24c96543560b58d6cebb (patch)
tree7531ee1deabb0576959a800df4866616b9b3ca21
parente5457f7f50db8b629808349380c8f0a403b4a4f1 (diff)
downloadepost-66000f787560c38678cb24c96543560b58d6cebb.tar.xz
Radontransformation nun per fft (momentan noch nicht 100% ok)
-rw-r--r--epost.lpr6
-rw-r--r--epost.lps126
-rw-r--r--epostunit.pas177
-rw-r--r--typenunit.pas12
-rw-r--r--werteunit.inc58
-rw-r--r--werteunit.pas16
6 files changed, 245 insertions, 150 deletions
diff --git a/epost.lpr b/epost.lpr
index aa0cf9e..bd06af2 100644
--- a/epost.lpr
+++ b/epost.lpr
@@ -190,8 +190,10 @@ begin
aufraeumen;
halt(1);
end;
- wertes[j].berechneRadonTransformation(syntaxTest,inf,maxThreads,wertes[i]);
- continue;
+ if wertes[j].berechneRadonTransformation(syntaxTest,inf,maxThreads,wertes[i],Warnstufe) then
+ continue;
+ aufraeumen;
+ halt(1);
end;
if istDasBefehl('erzeuge Dummy-Werte',s,bekannteBefehle,true) then begin
b1:=startetMit('gefüllt',s);
diff --git a/epost.lps b/epost.lps
index 012990a..e533602 100644
--- a/epost.lps
+++ b/epost.lps
@@ -7,8 +7,9 @@
<Unit0>
<Filename Value="epost.lpr"/>
<IsPartOfProject Value="True"/>
- <TopLine Value="693"/>
- <CursorPos Y="728"/>
+ <IsVisibleTab Value="True"/>
+ <TopLine Value="187"/>
+ <CursorPos X="17" Y="196"/>
<UsageCount Value="202"/>
<Loaded Value="True"/>
</Unit0>
@@ -22,10 +23,9 @@
<Unit2>
<Filename Value="epostunit.pas"/>
<IsPartOfProject Value="True"/>
- <IsVisibleTab Value="True"/>
<EditorIndex Value="2"/>
- <TopLine Value="1974"/>
- <CursorPos Y="2003"/>
+ <TopLine Value="6102"/>
+ <CursorPos X="50" Y="6129"/>
<UsageCount Value="201"/>
<Loaded Value="True"/>
</Unit2>
@@ -33,6 +33,8 @@
<Filename Value="werteunit.pas"/>
<IsPartOfProject Value="True"/>
<EditorIndex Value="5"/>
+ <TopLine Value="713"/>
+ <CursorPos Y="729"/>
<UsageCount Value="200"/>
<Loaded Value="True"/>
</Unit3>
@@ -40,8 +42,8 @@
<Filename Value="typenunit.pas"/>
<IsPartOfProject Value="True"/>
<EditorIndex Value="10"/>
- <TopLine Value="1009"/>
- <CursorPos X="5" Y="1032"/>
+ <TopLine Value="498"/>
+ <CursorPos X="4" Y="516"/>
<UsageCount Value="200"/>
<Loaded Value="True"/>
</Unit4>
@@ -73,8 +75,8 @@
<Filename Value="werteunit.inc"/>
<IsPartOfProject Value="True"/>
<EditorIndex Value="6"/>
- <TopLine Value="19"/>
- <CursorPos X="65" Y="32"/>
+ <TopLine Value="173"/>
+ <CursorPos X="15" Y="202"/>
<UsageCount Value="200"/>
<Loaded Value="True"/>
</Unit8>
@@ -84,7 +86,7 @@
<EditorIndex Value="7"/>
<TopLine Value="86"/>
<CursorPos X="26" Y="115"/>
- <UsageCount Value="65"/>
+ <UsageCount Value="74"/>
<Loaded Value="True"/>
</Unit9>
<Unit10>
@@ -92,27 +94,27 @@
<IsPartOfProject Value="True"/>
<EditorIndex Value="8"/>
<CursorPos X="3" Y="2"/>
- <UsageCount Value="61"/>
+ <UsageCount Value="70"/>
<Loaded Value="True"/>
</Unit10>
<Unit11>
<Filename Value="fileunit.pas"/>
<EditorIndex Value="-1"/>
<CursorPos Y="204"/>
- <UsageCount Value="192"/>
+ <UsageCount Value="191"/>
</Unit11>
<Unit12>
<Filename Value="../units/mystringlistunit.pas"/>
<EditorIndex Value="-1"/>
<TopLine Value="712"/>
<CursorPos X="22" Y="735"/>
- <UsageCount Value="92"/>
+ <UsageCount Value="91"/>
</Unit12>
<Unit13>
<Filename Value="../units/lowlevelunit.pas"/>
<EditorIndex Value="1"/>
- <TopLine Value="386"/>
- <CursorPos X="27" Y="403"/>
+ <TopLine Value="68"/>
+ <CursorPos X="46" Y="87"/>
<UsageCount Value="101"/>
<Loaded Value="True"/>
</Unit13>
@@ -127,48 +129,48 @@
<EditorIndex Value="-1"/>
<TopLine Value="190"/>
<CursorPos X="22" Y="195"/>
- <UsageCount Value="96"/>
+ <UsageCount Value="95"/>
</Unit15>
<Unit16>
<Filename Value="/usr/lib/fpc/src/rtl/inc/objpash.inc"/>
<EditorIndex Value="-1"/>
<TopLine Value="176"/>
<CursorPos X="23" Y="194"/>
- <UsageCount Value="2"/>
+ <UsageCount Value="1"/>
</Unit16>
<Unit17>
<Filename Value="/usr/lib/fpc/src/rtl/unix/bunxovlh.inc"/>
<EditorIndex Value="-1"/>
<TopLine Value="61"/>
<CursorPos X="10" Y="99"/>
- <UsageCount Value="7"/>
+ <UsageCount Value="6"/>
</Unit17>
<Unit18>
<Filename Value="/usr/lib/fpc/src/rtl/unix/baseunix.pp"/>
<UnitName Value="BaseUnix"/>
<EditorIndex Value="-1"/>
<TopLine Value="61"/>
- <UsageCount Value="7"/>
+ <UsageCount Value="6"/>
</Unit18>
<Unit19>
<Filename Value="/usr/lib/fpc/src/rtl/unix/bunxovl.inc"/>
<EditorIndex Value="-1"/>
<TopLine Value="414"/>
<CursorPos X="20" Y="434"/>
- <UsageCount Value="7"/>
+ <UsageCount Value="6"/>
</Unit19>
<Unit20>
<Filename Value="/usr/lib/fpc/src/rtl/linux/bunxsysc.inc"/>
<EditorIndex Value="-1"/>
<TopLine Value="16"/>
- <UsageCount Value="7"/>
+ <UsageCount Value="6"/>
</Unit20>
<Unit21>
<Filename Value="/usr/lib/fpc/src/rtl/unix/bunxh.inc"/>
<EditorIndex Value="-1"/>
<TopLine Value="74"/>
<CursorPos X="15" Y="102"/>
- <UsageCount Value="7"/>
+ <UsageCount Value="6"/>
</Unit21>
<Unit22>
<Filename Value="/usr/lib/fpc/src/packages/fcl-image/src/fpimage.pp"/>
@@ -176,152 +178,154 @@
<EditorIndex Value="-1"/>
<TopLine Value="10"/>
<CursorPos X="3" Y="30"/>
- <UsageCount Value="7"/>
+ <UsageCount Value="6"/>
</Unit22>
<Unit23>
<Filename Value="../units/protokollunit.pas"/>
<EditorIndex Value="-1"/>
<TopLine Value="18"/>
<CursorPos X="3" Y="18"/>
- <UsageCount Value="41"/>
+ <UsageCount Value="40"/>
</Unit23>
<Unit24>
<Filename Value="../fpGUI/src/corelib/render/software/agg_2D.pas"/>
<EditorIndex Value="-1"/>
<TopLine Value="2116"/>
<CursorPos X="2" Y="2134"/>
- <UsageCount Value="6"/>
+ <UsageCount Value="5"/>
</Unit24>
<Unit25>
<Filename Value="../units/randomunit.pas"/>
<EditorIndex Value="-1"/>
<CursorPos X="19" Y="11"/>
- <UsageCount Value="6"/>
+ <UsageCount Value="5"/>
</Unit25>
<Unit26>
<Filename Value="epost.lpi"/>
<EditorIndex Value="-1"/>
- <UsageCount Value="8"/>
+ <UsageCount Value="7"/>
<DefaultSyntaxHighlighter Value="XML"/>
</Unit26>
</Units>
<JumpHistory Count="30" HistoryIndex="29">
<Position1>
- <Filename Value="werteunit.pas"/>
- <Caret Line="955" Column="134" TopLine="929"/>
+ <Filename Value="epostunit.pas"/>
+ <Caret Line="735" Column="62" TopLine="724"/>
</Position1>
<Position2>
- <Filename Value="werteunit.pas"/>
- <Caret Line="981" Column="55" TopLine="963"/>
+ <Filename Value="epostunit.pas"/>
+ <Caret Line="761" Column="79" TopLine="734"/>
</Position2>
<Position3>
<Filename Value="epostunit.pas"/>
- <Caret Line="2349" Column="132" TopLine="2335"/>
+ <Caret Line="757" Column="78" TopLine="740"/>
</Position3>
<Position4>
- <Filename Value="epostunit.pas"/>
- <Caret Line="6508" Column="51" TopLine="6502"/>
+ <Filename Value="werteunit.pas"/>
+ <Caret Line="36" Column="17" TopLine="19"/>
</Position4>
<Position5>
<Filename Value="epostunit.pas"/>
- <Caret Line="6098" Column="3" TopLine="6080"/>
+ <Caret Line="788" TopLine="768"/>
</Position5>
<Position6>
<Filename Value="epostunit.pas"/>
- <Caret Line="6508" Column="37" TopLine="6502"/>
+ <Caret Line="792" Column="2" TopLine="730"/>
</Position6>
<Position7>
<Filename Value="epostunit.pas"/>
- <Caret Line="6098" Column="3" TopLine="6080"/>
+ <Caret Line="6136" Column="29" TopLine="6118"/>
</Position7>
<Position8>
<Filename Value="epostunit.pas"/>
- <Caret Line="234" Column="22" TopLine="216"/>
+ <Caret Line="6128" TopLine="6119"/>
</Position8>
<Position9>
<Filename Value="epostunit.pas"/>
- <Caret Line="240" Column="53" TopLine="216"/>
+ <Caret Line="6130" Column="58" TopLine="6112"/>
</Position9>
<Position10>
<Filename Value="epostunit.pas"/>
- <Caret Line="6099" Column="70" TopLine="6070"/>
+ <Caret Line="6080" Column="39" TopLine="6070"/>
</Position10>
<Position11>
<Filename Value="epostunit.pas"/>
- <Caret Line="6100" Column="61" TopLine="6071"/>
+ <Caret Line="6130" Column="71" TopLine="6112"/>
</Position11>
<Position12>
<Filename Value="epostunit.pas"/>
- <Caret Line="6157" Column="36" TopLine="6129"/>
</Position12>
<Position13>
<Filename Value="epostunit.pas"/>
- <Caret Line="6334" Column="68" TopLine="6306"/>
+ <Caret Line="99" TopLine="112"/>
</Position13>
<Position14>
<Filename Value="epostunit.pas"/>
- <Caret Line="7681" TopLine="7649"/>
+ <Caret Line="6078" Column="110" TopLine="6069"/>
</Position14>
<Position15>
<Filename Value="epostunit.pas"/>
+ <Caret Line="187" Column="123" TopLine="171"/>
</Position15>
<Position16>
<Filename Value="epostunit.pas"/>
- <Caret Line="7684" TopLine="7649"/>
+ <Caret Line="6149" Column="20" TopLine="6133"/>
</Position16>
<Position17>
<Filename Value="epostunit.pas"/>
+ <Caret Line="6126" TopLine="6112"/>
</Position17>
<Position18>
<Filename Value="epostunit.pas"/>
- <Caret Line="234" Column="22" TopLine="205"/>
+ <Caret Line="6129" Column="24" TopLine="6112"/>
</Position18>
<Position19>
<Filename Value="epostunit.pas"/>
- <Caret Line="240" Column="53" TopLine="211"/>
+ <Caret Line="181" Column="29" TopLine="165"/>
</Position19>
<Position20>
<Filename Value="epostunit.pas"/>
- <Caret Line="6099" Column="70" TopLine="6070"/>
+ <Caret Line="5414" Column="32" TopLine="5394"/>
</Position20>
<Position21>
<Filename Value="epostunit.pas"/>
- <Caret Line="6100" Column="61" TopLine="6071"/>
+ <Caret Line="5470" TopLine="5451"/>
</Position21>
<Position22>
- <Filename Value="werteunit.pas"/>
- <Caret Line="981" Column="55" TopLine="963"/>
+ <Filename Value="epostunit.pas"/>
+ <Caret Line="5466" TopLine="5451"/>
</Position22>
<Position23>
- <Filename Value="epostunit.pas"/>
- <Caret Line="6156" Column="36" TopLine="6156"/>
+ <Filename Value="typenunit.pas"/>
+ <Caret Line="516" Column="4" TopLine="498"/>
</Position23>
<Position24>
<Filename Value="epostunit.pas"/>
+ <Caret Line="5465" Column="22" TopLine="5448"/>
</Position24>
<Position25>
<Filename Value="epostunit.pas"/>
- <Caret Line="1968" Column="136" TopLine="1939"/>
+ <Caret Line="6131" Column="37" TopLine="6111"/>
</Position25>
<Position26>
<Filename Value="epostunit.pas"/>
- <Caret Line="1967" Column="10" TopLine="1950"/>
+ <Caret Line="181" Column="29" TopLine="165"/>
</Position26>
<Position27>
<Filename Value="epostunit.pas"/>
- <Caret Line="2003" Column="83" TopLine="1974"/>
+ <Caret Line="5414" Column="32" TopLine="5385"/>
</Position27>
<Position28>
- <Filename Value="typenunit.pas"/>
- <Caret Line="107" Column="27" TopLine="83"/>
+ <Filename Value="epostunit.pas"/>
+ <Caret Line="5479" Column="29" TopLine="5451"/>
</Position28>
<Position29>
<Filename Value="epostunit.pas"/>
- <Caret Line="2003" Column="83" TopLine="1974"/>
+ <Caret Line="6131" Column="52" TopLine="6114"/>
</Position29>
<Position30>
- <Filename Value="typenunit.pas"/>
- <Caret Line="105" Column="31" TopLine="89"/>
+ <Filename Value="werteunit.pas"/>
+ <Caret Line="2601" Column="77" TopLine="2570"/>
</Position30>
</JumpHistory>
<RunParams>
diff --git a/epostunit.pas b/epostunit.pas
index 5c7ebdf..0f28c94 100644
--- a/epostunit.pas
+++ b/epostunit.pas
@@ -148,6 +148,7 @@ type
sWerte: tLLWerteSingle;
genauigkeit: tGenauigkeit;
constructor create(kont: pTKonturenArray; wert: pTWerteArray); overload;
+ constructor create(original: tWerte; gen: tGenauigkeit); overload;
constructor create(original: tWerte; xMin,xMax: longint); overload;
destructor destroy; override;
procedure warteAufBeendigungDesLeseThreads;
@@ -183,7 +184,7 @@ type
function berechneFFT(sT: boolean; f: tMyStringList; threads: longint; warn: tWarnStufe): boolean;
function berechneFFT2d(sT: boolean; f: tMyStringList; threads: longint; warn: tWarnStufe): boolean;
function berechneAutokorrelation2d(sT: boolean; f: tMyStringList; threads: longint; warn: tWarnStufe): boolean;
- function berechneRadonTransformation(sT: boolean; f: tMyStringList; threads: longint; quelle: tWerte): boolean;
+ function berechneRadonTransformation(sT: boolean; f: tMyStringList; threads: longint; quelle: tWerte; warn: tWarnStufe): boolean;
function erzeugeLinearesBild(sT: boolean; var f: tMyStringList; threads: longint): boolean;
function erzeugeAscii(sT: boolean; f: tMyStringList): boolean;
function erzeugeLineout(sT: boolean; f: tMyStringList): boolean;
@@ -491,7 +492,7 @@ type
destructor destroy; override;
procedure stExecute; override;
end;
- tRadonTransformationsThread = class(tLogThread)
+ tRadonTransformationsLineOutThread = class(tLogThread)
qu,zi: tWerte;
xMi,xMa: longint;
constructor create(quelle,ziel: tWerte; xMin,xMax: longint);
@@ -731,6 +732,65 @@ begin
transformationen:=tIdentitaet.create(original.transformationen);
end;
+constructor tWerte.create(original: tWerte; gen: tGenauigkeit);
+var
+ ps: tExtraInfos;
+begin
+ inherited create(original.konturen,original.wertes);
+ original.warteAufBeendigungDesLeseThreads;
+ leseThread:=nil;
+ genauigkeit:=gen;
+ case original.genauigkeit of
+ gSingle:
+ ps:=tExtraInfos.create(original.sWerte.params);
+ gDouble:
+ ps:=tExtraInfos.create(original.dWerte.params);
+ gExtended:
+ ps:=tExtraInfos.create(original.eWerte.params);
+ end{of case};
+ case genauigkeit of
+ gSingle: begin
+ dWerte:=tLLWerteDouble.create(ps);
+ eWerte:=tLLWerteExtended.create(ps);
+ case original.genauigkeit of
+ gSingle:
+ sWerte:=tLLWerteSingle.create(pTLLWerteSingle(@original.sWerte),ps,0,ps.xSteps-1);
+ gDouble:
+ sWerte:=tLLWerteSingle.create(pTLLWerteDouble(@original.dWerte),ps,0,ps.xSteps-1);
+ gExtended:
+ sWerte:=tLLWerteSingle.create(pTLLWerteExtended(@original.eWerte),ps,0,ps.xSteps-1);
+ end{of case};
+ end;
+ gDouble: begin
+ sWerte:=tLLWerteSingle.create(ps);
+ eWerte:=tLLWerteExtended.create(ps);
+ case original.genauigkeit of
+ gSingle:
+ dWerte:=tLLWerteDouble.create(pTLLWerteSingle(@original.sWerte),ps,0,ps.xSteps-1);
+ gDouble:
+ dWerte:=tLLWerteDouble.create(pTLLWerteDouble(@original.dWerte),ps,0,ps.xSteps-1);
+ gExtended:
+ dWerte:=tLLWerteDouble.create(pTLLWerteExtended(@original.eWerte),ps,0,ps.xSteps-1);
+ end{of case};
+ end;
+ gExtended: begin
+ sWerte:=tLLWerteSingle.create(ps);
+ dWerte:=tLLWerteDouble.create(ps);
+ case original.genauigkeit of
+ gSingle:
+ eWerte:=tLLWerteExtended.create(pTLLWerteSingle(@original.sWerte),ps,0,ps.xSteps-1);
+ gDouble:
+ eWerte:=tLLWerteExtended.create(pTLLWerteDouble(@original.dWerte),ps,0,ps.xSteps-1);
+ gExtended:
+ eWerte:=tLLWerteExtended.create(pTLLWerteExtended(@original.eWerte),ps,0,ps.xSteps-1);
+ end{of case};
+ end;
+ end{of case};
+ if original.bezeichner='' then bezeichner:=''
+ else bezeichner:=original.bezeichner+'''';
+ transformationen:=tIdentitaet.create(original.transformationen);
+end;
+
destructor tWerte.destroy;
begin
warteAufBeendigungDesLeseThreads;
@@ -6015,21 +6075,21 @@ begin
result:=true;
end;
-function tWerte.berechneRadonTransformation(sT: boolean; f: tMyStringList; threads: longint; quelle: tWerte): boolean;
+function tWerte.berechneRadonTransformation(sT: boolean; f: tMyStringList; threads: longint; quelle: tWerte; warn: tWarnStufe): boolean;
var
- Zeit: extended;
- winkelSchritte,verschiebungsSchritte: int64;
- s: string;
- bekannteBefehle: tMyStringList;
- i: longint;
- fertig: boolean;
- radonTransformationsThreads: array of tRadonTransformationsThread;
+ Zeit,pvFehler: extended;
+ winkelSchritte: int64;
+ s: string;
+ bekannteBefehle: tMyStringList;
+ i: longint;
+ fertig: boolean;
+ hilfsWerte: tWerte;
+ radonTransformationsLineOutThreads: array of tRadonTransformationsLineOutThread;
begin
result:=false;
warteAufBeendigungDesLeseThreads;
Zeit:=now;
winkelSchritte:=180;
- verschiebungsSchritte:=180;
bekannteBefehle:=tMyStringList.create;
repeat
if not f.metaReadln(s,true) then begin
@@ -6043,10 +6103,6 @@ begin
winkelSchritte:=round(exprToFloat(sT,s));
continue;
end;
- if istDasBefehl('Verschiebungsschritte:',s,bekannteBefehle,true) then begin
- verschiebungsSchritte:=round(exprToFloat(sT,s));
- continue;
- end;
bekannteBefehle.sort;
gibAus('Verstehe Option '''+s+''' nicht bei Erstellung einer Radon-Transformation!'#10'Ich kenne:'#10+bekannteBefehle.text,3);
bekannteBefehle.free;
@@ -6054,29 +6110,66 @@ begin
until false;
bekannteBefehle.free;
- _xSteps:=winkelSchritte;
- _tSiz:=verschiebungsSchritte;
- transformationen:=tRTTransformation.create(quelle.transformationen,winkelSchritte,verschiebungsSchritte);
+ if istKomplex then begin
+ gibAus('Ich kann keine Radontransformation von voll-komplexen Werte machen!',3);
+ exit
+ end;
+
+ if quelle.disk2kontFak('x',1) <> quelle.disk2kontFak('y',1) then
+ gibAus('Warnung: dx ('+floatToStr(quelle.disk2kontFak('x',1))+') und dy ('+floatToStr(quelle.disk2kontFak('y',1))+') unterscheiden sich bei Radontransformation - die Winkel-Achse (horizontal) verläuft nicht linear!',3);
+
+ transformationen:=tRTTransformation.create(quelle.transformationen,winkelSchritte);
+ _xSteps:=transformationen.xSteps;
+ _tSiz:=transformationen.tSiz;
if not sT then begin
+ gibAus('kopiere Werte für Radon-Transformation ...',3);
+ hilfsWerte:=tWerte.create(quelle,gExtended); // quelle zu hilfsWerte kopieren ...
+ hilfsWerte._xSteps:=2*_tSiz+1; // ... und quadratisch ergänzen: Kantenlänge = 2*Diagonale von quelle + 1
+ hilfsWerte._tSiz:=2*_tSiz+1;
+ hilfsWerte.holeRAM(3);
+ hilfsWerte.eWerte.nullenEinfuegen(quelle._xSteps,quelle._tSiz);
+ gibAus('berechne t-FFT für Radon-Transformation ...',3);
+ if not hilfsWerte.fft(threads,true,false,doRes,doResSmi,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);
+ gibAus('berechne x-FFT für Radon-Transformation ...',3);
+ if not hilfsWerte.fft(threads,false,false,doRes,doResSmi,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);
+
holeRAM(3);
- gibAus('berechne Radon-Transformation ...',3);
- setLength(radonTransformationsThreads,threads);
- for i:=0 to length(radonTransformationsThreads)-1 do
- radonTransformationsThreads[i]:=tRadonTransformationsThread.create(
- quelle,
+ gibAus('Lineouts für Radon-Transformation extrahieren ...',3);
+ setLength(radonTransformationsLineOutThreads,threads);
+ for i:=0 to length(radonTransformationsLineOutThreads)-1 do
+ radonTransformationsLineOutThreads[i]:=tRadonTransformationsLineOutThread.create(
+ hilfsWerte,
self,
- round(_xSteps/length(radonTransformationsThreads)*i),
- round(_xSteps/length(radonTransformationsThreads)*(i+1))-1
+ round(_xSteps/length(radonTransformationsLineOutThreads)*i),
+ round(_xSteps/length(radonTransformationsLineOutThreads)*(i+1))-1
);
repeat
fertig:=true;
- for i:=0 to length(radonTransformationsThreads)-1 do
- fertig:=radonTransformationsThreads[i].fertig and fertig;
+ for i:=0 to length(radonTransformationsLineOutThreads)-1 do
+ fertig:=radonTransformationsLineOutThreads[i].fertig and fertig;
if not fertig then
sleep(10);
until fertig;
gibAus('... fertig! '+timetostr(now-Zeit),3);
+ hilfsWerte.free;
+ gibAus('berechne inverse t-FFT für Radon-Transformation ...',3);
+ if not fft(threads,true,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;
result:=true;
end;
@@ -9756,9 +9849,9 @@ begin
gibAus('SkalierungsThread beendet',1);
end;
-// tRadonTransformationsThread *************************************************
+// tRadonTransformationsLineOutThread ******************************************
-constructor tRadonTransformationsThread.create(quelle,ziel: tWerte; xMin,xMax: longint);
+constructor tRadonTransformationsLineOutThread.create(quelle,ziel: tWerte; xMin,xMax: longint);
begin
inherited create;
qu:=quelle;
@@ -9766,46 +9859,46 @@ begin
xMi:=xMin;
xMa:=xMax;
suspended:=false;
- gibAus('RadonTransformationsThread erzeugt: '+intToStr(xMi)+'-'+intToStr(xMa),1);
+ gibAus('RadonTransformationsLineOutThread erzeugt: '+intToStr(xMi)+'-'+intToStr(xMa),1);
end;
-procedure tRadonTransformationsThread.stExecute;
+procedure tRadonTransformationsLineOutThread.stExecute;
var
dX,dY: extended;
begin
- gibAus('RadonTransformationsThread gestartet',1);
+ gibAus('RadonTransformationsLineOutThread gestartet',1);
dX:=(zi._xStop-zi._xStart)/(zi._xSteps-1);
dY:=(zi._tStop-zi._tStart)/(zi._tSiz-1);
case zi.genauigkeit of
gSingle:
case qu.genauigkeit of
gSingle:
- zi.sWerte.radonTransformation(xMi,xMa,dX,dY,pTLLWerteSingle(@qu.sWerte));
+ zi.sWerte.radonTransformationsLineOut(xMi,xMa,dX,dY,pTLLWerteSingle(@qu.sWerte));
gDouble:
- zi.sWerte.radonTransformation(xMi,xMa,dX,dY,pTLLWerteDouble(@qu.dWerte));
+ zi.sWerte.radonTransformationsLineOut(xMi,xMa,dX,dY,pTLLWerteDouble(@qu.dWerte));
gExtended:
- zi.sWerte.radonTransformation(xMi,xMa,dX,dY,pTLLWerteExtended(@qu.eWerte));
+ zi.sWerte.radonTransformationsLineOut(xMi,xMa,dX,dY,pTLLWerteExtended(@qu.eWerte));
end{of case};
gDouble:
case qu.genauigkeit of
gSingle:
- zi.dWerte.radonTransformation(xMi,xMa,dX,dY,pTLLWerteSingle(@qu.sWerte));
+ zi.dWerte.radonTransformationsLineOut(xMi,xMa,dX,dY,pTLLWerteSingle(@qu.sWerte));
gDouble:
- zi.dWerte.radonTransformation(xMi,xMa,dX,dY,pTLLWerteDouble(@qu.dWerte));
+ zi.dWerte.radonTransformationsLineOut(xMi,xMa,dX,dY,pTLLWerteDouble(@qu.dWerte));
gExtended:
- zi.dWerte.radonTransformation(xMi,xMa,dX,dY,pTLLWerteExtended(@qu.eWerte));
+ zi.dWerte.radonTransformationsLineOut(xMi,xMa,dX,dY,pTLLWerteExtended(@qu.eWerte));
end{of case};
gExtended:
case qu.genauigkeit of
gSingle:
- zi.eWerte.radonTransformation(xMi,xMa,dX,dY,pTLLWerteSingle(@qu.sWerte));
+ zi.eWerte.radonTransformationsLineOut(xMi,xMa,dX,dY,pTLLWerteSingle(@qu.sWerte));
gDouble:
- zi.eWerte.radonTransformation(xMi,xMa,dX,dY,pTLLWerteDouble(@qu.dWerte));
+ zi.eWerte.radonTransformationsLineOut(xMi,xMa,dX,dY,pTLLWerteDouble(@qu.dWerte));
gExtended:
- zi.eWerte.radonTransformation(xMi,xMa,dX,dY,pTLLWerteExtended(@qu.eWerte));
+ zi.eWerte.radonTransformationsLineOut(xMi,xMa,dX,dY,pTLLWerteExtended(@qu.eWerte));
end{of case};
end{of case};
- gibAus('RadonTransformationsThread beendet',1);
+ gibAus('RadonTransformationsLineOutThread beendet',1);
end;
// sonstiges *******************************************************************
diff --git a/typenunit.pas b/typenunit.pas
index b776f43..693896d 100644
--- a/typenunit.pas
+++ b/typenunit.pas
@@ -449,9 +449,9 @@ type
end;
tRTTransformation = class (tKoordinatenTransformation)
// repräsentiert die Transformation der Koordinaten bei einer Radontransformation
- winkelSchritte, verschiebeSchritte: int64;
+ winkelSchritte: int64;
constructor create; overload;
- constructor create(vorg: tTransformation; ws,vs: int64);
+ constructor create(vorg: tTransformation; ws: int64);
procedure aktualisiereAchsen; override;
procedure aktualisiereXsTs; override;
// keine Änderung der Positionen, der Werte(skalierung)
@@ -2501,14 +2501,12 @@ constructor tRTTransformation.create;
begin
inherited create;
winkelSchritte:=180;
- verschiebeSchritte:=180;
end;
-constructor tRTTransformation.create(vorg: tTransformation; ws,vs: int64);
+constructor tRTTransformation.create(vorg: tTransformation; ws: int64);
begin
inherited create;
winkelSchritte:=ws;
- verschiebeSchritte:=vs;
fuegeVorgaengerHinzu(vorg);
end;
@@ -2523,7 +2521,7 @@ end;
procedure tRTTransformation.aktualisiereXsTs;
begin
outXSTS['x']:=winkelSchritte;
- outXSTS['y']:=verschiebeSchritte;
+ outXSTS['y']:=round(2*sqrt(inXSTS*inXSTS));
end;
function tRTTransformation.wertZuPositionAufAchse(const l: tLage; x: extended; auszerhalbIstFehler: boolean = true): extended;
@@ -2561,7 +2559,7 @@ end;
function tRTTransformation.dumpParams: string;
begin
- result:='RT: '+intToStr(winkelSchritte)+' x '+intToStr(verschiebeSchritte);
+ result:='RT: '+intToStr(winkelSchritte);
result:=result + ' ' + inherited dumpParams;
end;
diff --git a/werteunit.inc b/werteunit.inc
index 4ee71ce..884edbc 100644
--- a/werteunit.inc
+++ b/werteunit.inc
@@ -170,39 +170,37 @@ begin
end;
{$ENDIF}
-{$IFDEF tLLWerte_radonTransformation}
-//procedure tLLWerte.radonTransformation(xMin,xMax: longint; xStep,yStep: extended; qu: pTLLWerteSingle);
+{$IFDEF tLLWerte_radonTransformationsLineOut}
+//procedure tLLWerte.radonTransformationsLineOut(xMin,xMax: longint; xStep,yStep: extended; qu: pTLLWerteSingle);
var
- oX,oY,iX,iY: longint;
- oYf,cX,sX,iXM,iYM,oXM,oYM,wert: extended;
+ oX,oY,iXG,iYG: int64;
+ cX,sX,iX,iY,iXF,iYF: extended;
begin
- iXM:=(qu^.params.xSteps-1)/2;
- iYM:=(qu^.params.tSiz-1)/2;
- oXM:=(params.xSteps-1)/2;
- oYM:=(params.tSiz-1)/2;
+ // y-doResSmi-georndeter Wert an Stelle (oX,oY) soll gefüllt werden mit
+ // x-&y-doResSmi-geornetem Wert auf der Ursprungsgerade mit Winkel oX*XStep; Position oY*yStep
+ // Wir gehen davon aus, dass das Feld groß genug ist, sodass wir die Mitte nicht erreichen.
for oX:=xMin to xMax do begin
- cX:=cos((oX-oXM)*xStep);
- sX:=sin((oX-oXM)*xStep);
- for oY:=0 to params.tSiz-1 do
- werte[oX+oY*params.xSteps]:=0;
- for iY:=0 to qu^.params.tSiz-1 do
- for iX:=0 to qu^.params.xSteps-1 do begin
- oYf:=((iX-iXM)*sX + (iY-iYM)*cX) / yStep + oYM;
- wert:=qu^.werte[iX + iY*qu^.params.xSteps];
- if oYf<=0 then
- werte[oX]:=
- werte[oX] + wert
- else if oYf >= params.tSiz-1 then
- werte[oX + (params.tSiz-1)*params.xSteps]:=
- werte[oX + (params.tSiz-1)*params.xSteps] + wert
- else begin
- oY:=floor(oYf);
- werte[oX + oY*params.xSteps]:=
- werte[oX + oY*params.xSteps] + wert * (1-oYf+oY);
- werte[oX + (oY+1)*params.xSteps]:=
- werte[oX + (oY+1)*params.xSteps] + wert * (oYf-oY);
- end;
- end;
+ cX:=cos(oX*xStep);
+ sX:=sin(oX*xStep);
+ for oY:=0 to params.tSiz div 2 do begin
+ iX:=oY*yStep*cX;
+ iY:=oY*yStep*sX;
+ iXG:=floor(iX);
+ iXF:=iX-iXG;
+ iYG:=floor(iY);
+ iYF:=iY-iYG;
+ werte[oX+oY*params.xSteps]:=
+ qu^.reBei2DDoResSmi(iXG,iYG)*(1-iXF)*(1-iYF)
+ + qu^.reBei2DDoResSmi(iXG+1,iYG)*iXF*(1-iYF)
+ + qu^.reBei2DDoResSmi(iXG,iYG+1)*(1-iXF)*iYF
+ + qu^.reBei2DDoResSmi(iXG+1,iYG+1)*iXF*iYF;
+ if (oY>0) and (2*oY<params.tSiz) then
+ werte[oX+(params.tSiz-oY)*params.xSteps]:=
+ qu^.imBei2DDoResSmi(iXG,iYG)*(1-iXF)*(1-iYF)
+ + qu^.imBei2DDoResSmi(iXG+1,iYG)*iXF*(1-iYF)
+ + qu^.imBei2DDoResSmi(iXG,iYG+1)*(1-iXF)*iYF
+ + qu^.imBei2DDoResSmi(iXG+1,iYG+1)*iXF*iYF;
+ end;
end;
end;
{$ENDIF}
diff --git a/werteunit.pas b/werteunit.pas
index db14755..27e88ff 100644
--- a/werteunit.pas
+++ b/werteunit.pas
@@ -56,9 +56,9 @@ type
function liesDateien(dateien: tGenerischeInputDateiInfoArray): boolean;
function fft(senkrecht,invers: boolean; algo: tFFTAlgorithmus; fen: tFenster; hg: tExtendedArray; out pvFehler: extended): boolean; overload; inline;
function fft(sMin,sMax: longint; senkrecht,invers: boolean; algo: tFFTAlgorithmus; fen: tFenster; hg: tExtendedArray; out pvFehler: extended): boolean; overload;
- procedure radonTransformation(xMin,xMax: longint; xStep,yStep: extended; qu: pTLLWerteSingle); overload;
- procedure radonTransformation(xMin,xMax: longint; xStep,yStep: extended; qu: pTLLWerteDouble); overload;
- procedure radonTransformation(xMin,xMax: longint; xStep,yStep: extended; qu: pTLLWerteExtended); overload;
+ procedure radonTransformationsLineOut(xMin,xMax: longint; xStep,yStep: extended; qu: pTLLWerteSingle); overload;
+ procedure radonTransformationsLineOut(xMin,xMax: longint; xStep,yStep: extended; qu: pTLLWerteDouble); overload;
+ procedure radonTransformationsLineOut(xMin,xMax: longint; xStep,yStep: extended; qu: pTLLWerteExtended); overload;
procedure spiegle; overload;
procedure spiegle(tMin,tMax: longint); overload;
procedure fft2dNachbearbeitungA(nB: tFFTDatenordnung);
@@ -910,14 +910,14 @@ begin
result:=not (in0 or out0);
end;
-{$DEFINE tLLWerte_radonTransformation}
-procedure tLLWerte.radonTransformation(xMin,xMax: longint; xStep,yStep: extended; qu: pTLLWerteSingle);
+{$DEFINE tLLWerte_radonTransformationsLineOut}
+procedure tLLWerte.radonTransformationsLineOut(xMin,xMax: longint; xStep,yStep: extended; qu: pTLLWerteSingle);
{$INCLUDE werteunit.inc}
-procedure tLLWerte.radonTransformation(xMin,xMax: longint; xStep,yStep: extended; qu: pTLLWerteDouble);
+procedure tLLWerte.radonTransformationsLineOut(xMin,xMax: longint; xStep,yStep: extended; qu: pTLLWerteDouble);
{$INCLUDE werteunit.inc}
-procedure tLLWerte.radonTransformation(xMin,xMax: longint; xStep,yStep: extended; qu: pTLLWerteExtended);
+procedure tLLWerte.radonTransformationsLineOut(xMin,xMax: longint; xStep,yStep: extended; qu: pTLLWerteExtended);
{$INCLUDE werteunit.inc}
-{$UNDEF tLLWerte_radonTransformation}
+{$UNDEF tLLWerte_radonTransformationsLineOut}
procedure tLLWerte.schreibeWert(var f: textFile; x,y: extended; beschriftung: tExtPoint; var letzterWert: extended; entspringen,verschiebung: extended; skalierung: string; kvs: tKnownValues; linienIntegral: tLinienIntegral; cbgv: tCallBackGetValue);
var