summaryrefslogtreecommitdiff
path: root/epostunit.pas
diff options
context:
space:
mode:
Diffstat (limited to 'epostunit.pas')
-rw-r--r--epostunit.pas191
1 files changed, 111 insertions, 80 deletions
diff --git a/epostunit.pas b/epostunit.pas
index a01d135..c629128 100644
--- a/epostunit.pas
+++ b/epostunit.pas
@@ -118,7 +118,8 @@ type
procedure wMinW(miW: extended);
function rMaxW: extended;
procedure wMaxW(maW: extended);
- function istKomplex: boolean;
+ function rIstKomplex: boolean;
+ procedure wIstKomplex(komplex: boolean);
function xScale: extended;
function tScale: extended;
function dichtenParameterErkannt(sT: boolean; s: string; var bekannteBefehle: tMyStringList; threads,xMin,xMax,tMin,tMax: longint): boolean;
@@ -190,6 +191,7 @@ type
property _beta: extended read rBeta write wBeta;
property _minW: extended read rMinW write wMinW;
property _maxW: extended read rMaxW write wMaxW;
+ property istKomplex: boolean read rIstKomplex write wIstKomplex;
end;
tAchse = record
lage: tLage;
@@ -946,7 +948,7 @@ begin
end{of case};
end;
-function tWerte.istKomplex: boolean;
+function tWerte.rIstKomplex: boolean;
begin
case genauigkeit of
gSingle:
@@ -958,6 +960,24 @@ begin
end{of case};
end;
+procedure tWerte.wIstKomplex(komplex: boolean);
+begin
+ if komplex=istKomplex then
+ exit;
+ if komplex then
+ _tSiz:=2*_tSiz
+ else
+ _tSiz:=_tSiz div 2;
+ case genauigkeit of
+ gSingle:
+ sWerte.params.istKomplex:=komplex;
+ gDouble:
+ dWerte.params.istKomplex:=komplex;
+ gExtended:
+ eWerte.params.istKomplex:=komplex;
+ end{of case};
+end;
+
function tWerte.findeAlleDateien(nam: string; var dat: tGenerischeInputDateiInfoArray; vorlage: tGenerischeInputDateiInfo): boolean;
var
err: longint;
@@ -3840,13 +3860,13 @@ end;
function tWerte.extrahierePhase(sT: boolean; f: tMyStringList; threads: longint; Warn: tWarnstufe): boolean;
var
- Zeit,pvFehler,hintergrund,xFak,yFak: extended;
- fensters: array[boolean] of tSin2Fenster;
- s: string;
- b,hintergrundAbziehen: boolean;
- bekannteBefehle: tMyStringList;
- maxPos: tIntPoint;
- betraege: tWerte;
+ Zeit,pvFehler,xFak,yFak: extended;
+ fensters: array[boolean] of tSin2Fenster;
+ s: string;
+ b: boolean;
+ bekannteBefehle: tMyStringList;
+ maxPos: tIntPoint;
+ betraege: tWerte;
begin
result:=false;
Zeit:=now;
@@ -3854,8 +3874,10 @@ begin
gibAus('Phase extrahieren ...',3);
for b:=false to true do
fensters[b]:=tSin2Fenster.create;
- hintergrundAbziehen:=false;
- hintergrund:=0;
+ if not istKomplex then begin
+ gibAus('Ich kann nur aus komplexen Werten die Phase ermitteln!',3);
+ exit;
+ end;
xFak:=1;
yFak:=1;
bekannteBefehle:=tMyStringList.create;
@@ -3879,10 +3901,6 @@ begin
fensters[b].aktiv:=true;
continue;
end;
- if istDasBefehl('Hintergrund abziehen',s,bekannteBefehle,false) then begin
- hintergrundAbziehen:=true;
- continue;
- end;
if istDasBefehl('Abstandsmetrik',s,bekannteBefehle,true) then begin
xFak:=round(kont2diskFak('x',exprToFloat(sT,erstesArgument(s))));
yFak:=round(kont2diskFak('t',exprToFloat(sT,s)));
@@ -3903,24 +3921,14 @@ begin
exit;
end;
- if hintergrundAbziehen then
- case genauigkeit of
- gSingle:
- hintergrund:=sWerte.ermittleHintergrund;
- gDouble:
- hintergrund:=dWerte.ermittleHintergrund;
- gExtended:
- hintergrund:=eWerte.ermittleHintergrund;
- end{of case};
-
gibAus('berechne t-FFT ...',3);
- if not fft(threads,true,false,doRes,doResSmi,fensters[true],hintergrund,pvFehler,Warn) then begin
+ if not fft(threads,true,false,doAlleResIms,doAlleResIms,fensters[true],0,pvFehler,Warn) then begin
gibAus('Es traten Fehler auf!',3);
exit;
end;
gibAus(' (Parseval-Fehler = '+floatToStr(pvFehler)+')',3);
gibAus('berechne x-FFT ...',3);
- if not fft(threads,false,false,doRes,doResSmi,fensters[false],0,pvFehler,Warn) then begin
+ if not fft(threads,false,false,doAlleResIms,doAlleResIms,fensters[false],0,pvFehler,Warn) then begin
gibAus('Es traten Fehler auf!',3);
exit;
end;
@@ -3932,8 +3940,6 @@ begin
betraege:=tWerte.create(self,0,_xSteps-1);
betraege.fft2dNachbearbeitung(threads,doBetrQdr);
- fft2dNachbearbeitung(threads,doAlleResIms);
-
gibAus('tiefe Frequenzen filtern',3);
case genauigkeit of
gSingle:
@@ -3945,6 +3951,8 @@ begin
end{of case};
betraege.free;
+ writeln(tIntPointToStr(maxPos));
+
gibAus('zentrieren '+tIntPointToStr(maxPos),3);
verschiebe(threads,maxPos);
@@ -3955,14 +3963,14 @@ begin
end;
gibAus(' (Parseval-Fehler = '+floatToStr(pvFehler)+')',3);
gibAus('berechne inverse t-FFT ...',3);
- if not fft(threads,true,true,doAlleResIms,doAlleResIms,nil,hintergrund,pvFehler,Warn) then begin
+ if not fft(threads,true,true,doAlleResIms,doAlleResIms,nil,0,pvFehler,Warn) then begin
gibAus('Es traten Fehler auf!',3);
exit;
end;
gibAus(' (Parseval-Fehler = '+floatToStr(pvFehler)+')',3);
- gibAus('Phasenwinkel ermitteln ...',3);
- ermittlePhasenWinkel(threads);
+// gibAus('Phasenwinkel ermitteln ...',3);
+// ermittlePhasenWinkel(threads);
gibAus('... fertig '+timetostr(now-Zeit),3);
result:=true;
@@ -4011,15 +4019,7 @@ begin
exit;
until false;
- _tSiz:=_tSiz*2;
- case genauigkeit of
- gSingle:
- sWerte.params.istKomplex:=true;
- gDouble:
- dWerte.params.istKomplex:=true;
- gExtended:
- eWerte.params.istKomplex:=true;
- end{of case};
+ istKomplex:=true;
if sT then begin
result:=true;
exit;
@@ -5224,44 +5224,68 @@ var
FNTs: array of tFFT2dNBThread;
fertig: boolean;
begin
- if nB in [doAlleResIms,doAlleResSmi] then begin
- _tSiz:=_tSiz*2;
- holeRAM(3);
+ if istKomplex then begin
+ setLength(FNTs,threads);
+ for i:=0 to length(FNTs)-1 do
+ FNTs[i]:=tFFT2dNBThread.create(
+ round(i*(_xSteps-1)/length(FNTs))+1,
+ round((i+1)*(_xSteps-1)/length(FNTs)),
+ self,
+ nB);
+ repeat
+ sleep(10);
+ fertig:=true;
+ for i:=0 to length(FNTs)-1 do
+ fertig:=fertig and FNTs[i].fertig;
+ until fertig;
+ for i:=0 to length(FNTs)-1 do
+ FNTs[i].free;
+ gibAus('Alle FFT2dNBThreads fertig!',1);
+ if not (nB in [doAlleResIms,doAlleResSmi]) then begin
+ istKomplex:=false;
+ holeRAM(3);
+ end;
+ end
+ else begin
+ if nB in [doAlleResIms,doAlleResSmi] then begin
+ istKomplex:=true;
+ holeRAM(3);
+ case genauigkeit of
+ gSingle:
+ sWerte.fft2dNachbearbeitungVerdoppeln(nB);
+ gDouble:
+ dWerte.fft2dNachbearbeitungVerdoppeln(nB);
+ gExtended:
+ eWerte.fft2dNachbearbeitungVerdoppeln(nB);
+ end{of case};
+ exit;
+ end;
+
+ // der "Rand"
case genauigkeit of
- gSingle:
- sWerte.fft2dNachbearbeitungVerdoppeln(nB);
- gDouble:
- dWerte.fft2dNachbearbeitungVerdoppeln(nB);
- gExtended:
- eWerte.fft2dNachbearbeitungVerdoppeln(nB);
+ gSingle: sWerte.fft2dNachbearbeitungA(nB);
+ gDouble: dWerte.fft2dNachbearbeitungA(nB);
+ gExtended: eWerte.fft2dNachbearbeitungA(nB);
end{of case};
- exit;
- end;
-
- // der "Rand"
- case genauigkeit of
- gSingle: sWerte.fft2dNachbearbeitungA(nB);
- gDouble: dWerte.fft2dNachbearbeitungA(nB);
- gExtended: eWerte.fft2dNachbearbeitungA(nB);
- end{of case};
- // der Hauptteil (alles außer erster und mittlerer Zeile/Spalte)
- setLength(FNTs,threads);
- for i:=0 to length(FNTs)-1 do
- FNTs[i]:=tFFT2dNBThread.create(
- round(i*(_xSteps div 2 -1)/length(FNTs))+1,
- round((i+1)*(_xSteps div 2 -1)/length(FNTs)),
- self,
- nB);
- repeat
- sleep(10);
- fertig:=true;
+ // der Hauptteil (alles außer erster und mittlerer Zeile/Spalte)
+ setLength(FNTs,threads);
for i:=0 to length(FNTs)-1 do
- fertig:=fertig and FNTs[i].fertig;
- until fertig;
- for i:=0 to length(FNTs)-1 do
- FNTs[i].free;
- gibAus('Alle FFT2dNBThreads fertig!',1);
+ FNTs[i]:=tFFT2dNBThread.create(
+ round(i*(_xSteps div 2 -1)/length(FNTs))+1,
+ round((i+1)*(_xSteps div 2 -1)/length(FNTs)),
+ self,
+ nB);
+ repeat
+ sleep(10);
+ fertig:=true;
+ for i:=0 to length(FNTs)-1 do
+ fertig:=fertig and FNTs[i].fertig;
+ until fertig;
+ for i:=0 to length(FNTs)-1 do
+ FNTs[i].free;
+ gibAus('Alle FFT2dNBThreads fertig!',1);
+ end;
end;
function tWerte.exprToFloat(sT: boolean; s: string): extended;
@@ -6104,11 +6128,18 @@ end;
procedure tFFT2dNBThread.stExecute;
begin
gibAus('FFT2d-Nachbearbeitungsthread gestartet: '+intToStr(xMin)+'-'+intToStr(xMax)+' ...',1);
- case pW.genauigkeit of
- gSingle: pW.sWerte.fft2dNachbearbeitungB(xMin,xMax,nB);
- gDouble: pW.dWerte.fft2dNachbearbeitungB(xMin,xMax,nB);
- gExtended: pW.eWerte.fft2dNachbearbeitungB(xMin,xMax,nB);
- end{of case};
+ if pW.istKomplex then
+ case pW.genauigkeit of
+ gSingle: pW.sWerte.fft2dNachbearbeitungKomplex(xMin,xMax,nB);
+ gDouble: pW.dWerte.fft2dNachbearbeitungKomplex(xMin,xMax,nB);
+ gExtended: pW.eWerte.fft2dNachbearbeitungKomplex(xMin,xMax,nB);
+ end{of case}
+ else
+ case pW.genauigkeit of
+ gSingle: pW.sWerte.fft2dNachbearbeitungB(xMin,xMax,nB);
+ gDouble: pW.dWerte.fft2dNachbearbeitungB(xMin,xMax,nB);
+ gExtended: pW.eWerte.fft2dNachbearbeitungB(xMin,xMax,nB);
+ end{of case};
gibAus('... und fertig!',1);
end;