diff options
Diffstat (limited to 'epostunit.pas')
-rw-r--r-- | epostunit.pas | 46 |
1 files changed, 32 insertions, 14 deletions
diff --git a/epostunit.pas b/epostunit.pas index efdb914..07e921a 100644 --- a/epostunit.pas +++ b/epostunit.pas @@ -2856,7 +2856,7 @@ end; function tWerte.fft(threads: longint; senkrecht,invers: boolean; const vor,nach: tFFTDatenordnung; fen: tFenster; hg: extended; out pvFehler: extended; Warn: tWarnstufe): boolean; var fftThreads: array of tFFTThread; - i: int64; + i,fftTSiz: int64; fertig: boolean; begin result:=false; @@ -2869,11 +2869,12 @@ begin gibAus('tWerte.fft kann nicht mit getrenntem Input oder Output umgehen!',3); exit; end; + fftTSiz:=_tSiz div (1+byte(vor in [doAlleResIms,doAlleResSmi])); if senkrecht then begin if assigned(fen) and - (length(fen.werte)<>_tSiz) then - fen.berechneWerte(_tSiz); + (length(fen.werte)<>fftTSiz) then + fen.berechneWerte(fftTSiz); if threads>_xSteps then threads:=_xSteps; end @@ -2881,8 +2882,8 @@ begin if assigned(fen) and (length(fen.werte)<>_xSteps) then fen.berechneWerte(_xSteps); - if threads>_tSiz then - threads:=_tSiz; + if threads>fftTSiz then + threads:=fftTSiz; end; setLength(fftThreads,threads); @@ -2915,7 +2916,7 @@ begin tFFTThread.create( self, 0, - round(_tSiz/threads-1), + round(fftTSiz/threads-1), senkrecht, invers, vor, @@ -2926,8 +2927,8 @@ begin fftThreads[i]:= tFFTThread.create( self, - round(_tSiz/threads*i), - round(_tSiz/threads*(i+1)-1), + round(fftTSiz/threads*i), + round(fftTSiz/threads*(i+1)-1), senkrecht, invers, fftThreads[0].algo, @@ -3803,6 +3804,7 @@ var bekannteBefehle: tMyStringList; maxPos: tIntPoint; betraege: tWerte; + i,j: int64; begin result:=false; Zeit:=now; @@ -3883,14 +3885,14 @@ begin gibAus(' (Parseval-Fehler = '+floatToStr(pvFehler)+')',3); for b:=false to true do fensters[b].free; - +(* gibAus('spektrale Beträge ermitteln',3); betraege:=tWerte.create(self,0,_xSteps-1); betraege.fft2dNachbearbeitung(threads,doBetrQdr); - + *) fft2dNachbearbeitung(threads,doAlleResIms); - gibAus('tiefe Frequenzen filtern',3); +(* gibAus('tiefe Frequenzen filtern',3); case genauigkeit of gSingle: sWerte.kantenFilter(betraege.sWerte,xFak,yFak,kfHochpass,true,maxPos); @@ -3898,8 +3900,8 @@ begin dWerte.kantenFilter(betraege.dWerte,xFak,yFak,kfHochpass,true,maxPos); gExtended: eWerte.kantenFilter(betraege.eWerte,xFak,yFak,kfHochpass,true,maxPos); - end{of case}; - betraege.free; + end{of case}; *) +// betraege.free; gibAus('berechne inverse x-FFT ...',3); if not fft(threads,false,true,doAlleResIms,doAlleResIms,nil,0,pvFehler,wsLasch) then begin @@ -3913,6 +3915,22 @@ begin exit; end; gibAus(' (Parseval-Fehler = '+floatToStr(pvFehler)+')',3); + + hintergrund:=0; + for i:=_tSiz div 2 +1 to _tSiz-1 do + for j:=0 to _xSteps-1 do + hintergrund:=hintergrund + sqr(eWerte.werte[j+i*_xSteps]); + + writeln(hintergrund,' ',_xSteps*_tSiz div 2,' ',hintergrund*2/_xSteps/_tSiz); + + pvFehler:=0; + for i:=0 to _tSiz div 2 do + for j:=0 to _xSteps-1 do + pvFehler:=pvFehler + sqr(eWerte.werte[j+i*_xSteps]); + +// _tSiz:=_tSiz div 2; +// holeRAM(3); + gibAus('... fertig '+timetostr(now-Zeit),3); result:=true; end; @@ -5771,7 +5789,7 @@ begin if senkrecht then tmpFFTAlgo:=createFFTAlgorithmus(werte._tSiz div (1+byte(halberInput)),vor,nach) else - tmpFFTAlgo:=createFFTAlgorithmus(werte._xSteps div (1+byte(halberInput)),vor,nach); + tmpFFTAlgo:=createFFTAlgorithmus(werte._xSteps,vor,nach); create(werte,sMin,sMax,senkrecht,invers,tmpFFTAlgo,fenster,hintergrund); tmpFFTAlgo.free; end; |