diff options
Diffstat (limited to 'epostunit.pas')
-rw-r--r-- | epostunit.pas | 191 |
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; |