From d05d10b935d6287ee7f2afd7f95f26e5ac8e8a4e Mon Sep 17 00:00:00 2001 From: Erich Eckner Date: Wed, 22 Jul 2015 10:49:35 +0200 Subject: Filterung der Maxima optimiert, sodass _manchmal_ (?) nun auch mehrere Maxima pro Zyklus richtig behandelt werden koennen --- ROM.lps | 96 +++++++++++++++++++++++++-------------------------- romunit.pas | 113 ++++-------------------------------------------------------- 2 files changed, 54 insertions(+), 155 deletions(-) diff --git a/ROM.lps b/ROM.lps index b493d4f..f33f690 100644 --- a/ROM.lps +++ b/ROM.lps @@ -9,17 +9,18 @@ - + + - - - - + + + + @@ -27,14 +28,13 @@ - + - - - + + @@ -47,123 +47,123 @@ - + - + - + - + - + - + - - + + - + - + - + - - + + - + - + - - + + - + - + - - - - + + + + - + - - + + - + - + - + - - - - + + + + - + - + - - + + - + - + diff --git a/romunit.pas b/romunit.pas index 8bce286..a796540 100644 --- a/romunit.pas +++ b/romunit.pas @@ -314,36 +314,9 @@ begin monotonieHerstellen(inPuls,exList[0],exList[1]); monotonieHerstellen(outPuls,exList[2],exList[3]); - writeln; - for i:=0 to 3 do begin - for j:=0 to length(exList[i])-1 do - write(exList[i,j],'(',j,') '); - writeln; - end; - vereineExtrema(inPuls,outPuls,exList[0],exList[2],0.5); vereineExtrema(inPuls,outPuls,exList[1],exList[3],0.5); -writeln(length(exList[0]),' ',length(exList[1]),' ',length(exList[2]),' ',length(exList[3])); - -{ for k:=0 to 1 do begin - i:=0; - while (i0) and (exList[k,i-1]>exList[1-k,length(exList[1-k])-1]) do - dec(i); - setlength(exList[k],i+1); - setlength(exList[2+k],i+1); - end; } - writeln; for i:=0 to 3 do begin for j:=0 to length(exList[i])-1 do @@ -359,14 +332,6 @@ writeln(length(exList[0]),' ',length(exList[1]),' ',length(exList[2]),' ',length stuecke[i,b1,b2]:= exList[(i and 1) xor byte(exList[0,0]>exList[1,0]) xor (2*byte(b2)) xor byte(b1),(i+byte(b1)) div 2]; - writeln; - for i:=0 to length(stuecke)-1 do - writeln(i,': ',stuecke[i,false,false],' ',stuecke[i,false,true],' ',stuecke[i,true,false],' ',stuecke[i,true,true]); - writeln; -{ for i:=0 to length(stuecke)-1 do - writeln(inPuls[stuecke[i,false,false]].x,' ',outPuls[stuecke[i,false,true]].x,' ',inPuls[stuecke[i,true,false]].x,' ',outPuls[stuecke[i,true,true]].x); - writeln; } - setlength(erledigt,length(stuecke)); for i:=0 to length(erledigt)-1 do erledigt[i]:=false; @@ -408,21 +373,6 @@ writeln(length(exList[0]),' ',length(exList[1]),' ',length(exList[2]),' ',length for i:=0 to length(erledigt)-1 do b1:=b1 and erledigt[i]; until b1; - - -(* setlength(surTraj,min(length(inPuls),length(outPuls))); - for i:=0 to length(surTraj)-1 do begin - surTraj[i].x:=(inPuls[i].x+outPuls[i].x)/2; - surTraj[i].y:=inPuls[i].y+outPuls[i].y; - end; - for i:=0 to length(exList[0])-1 do - surTraj[exList[0,i]].y:=-1; - for i:=0 to length(exList[1])-1 do - surTraj[exList[1,i]].y:=1; - for i:=0 to length(exList[2])-1 do - surTraj[exList[2,i]].y:=0; - for i:=0 to length(exList[3])-1 do - surTraj[exList[3,i]].y:=0; *) end; procedure smoothen(var dat: tExtPointArray; width: longint); @@ -540,29 +490,19 @@ procedure filtereExtrema(const dat: tExtPointArray; var extrema: tLongintArray; var mitte,i,j,k: longint; mx,dist: extended; behalten: array of boolean; - Toepfe: array of longint; begin setlength(behalten,length(extrema)); for i:=0 to length(behalten)-1 do behalten[i]:=false; - setlength(toepfe,round(sqrt(length(extrema)))); - for i:=0 to length(toepfe)-1 do - toepfe[i]:=0; - - for i:=0 to length(extrema)-1 do - inc(toepfe[round(dat[extrema[i]].x/sollAbst*length(toepfe)) mod length(toepfe)]); - mitte:=0; - for i:=1 to length(toepfe)-1 do - if toepfe[i]>toepfe[mitte] then + mx:=abs(dat[extrema[0]].y); + for i:=1 to length(extrema)-1 do + if abs(dat[extrema[i]].y)>mx then begin + mx:=abs(dat[extrema[i]].y);; mitte:=i; - - mx:=0; - for i:=0 to length(extrema)-1 do - mx:=mx + myfrac(dat[extrema[i]].x - mitte/length(toepfe) + 0.5); - - mx:=(mx/length(extrema) + mitte/length(toepfe) - 0.5)*sollAbst; + end; + mx:=dat[extrema[mitte]].x; for i:=round((dat[extrema[0]].x - mx)/sollAbst) to round((dat[extrema[length(extrema)-1]].x - mx)/sollAbst) do begin dist:=abs(dat[extrema[0]].x - i*sollAbst - mx); @@ -576,51 +516,10 @@ begin behalten[k]:=true; end; -(*// Variante 1 - mx:=(dat[0].x+dat[length(dat)-1].x)/2; - mitte:=0; - for i:=1 to length(extrema)-1 do - if abs(dat[extrema[mitte]].x-mx)>abs(dat[extrema[i]].x-mx) then - mitte:=i; - repeat - j:=mitte; - repeat - k:=-1; - for i:=j-1 downto 0 do - if (abs(dat[extrema[j]].x-dat[extrema[i]].x-sollAbst)<=toleranz) and - ((k=-1) or (abs(dat[extrema[j]].x-dat[extrema[i]].x-sollAbst)-1 then begin - behalten[k]:=true; - behalten[j]:=true; - j:=k; - end; - until k=-1; - if j=mitte then - inc(mitte); - until (j<>mitte) or (mitte>length(extrema)); - if j=mitte then Fehler('So, wie sich der Programmierer das gedacht hat, findet man die richtigen Maxima nicht ...'); - j:=mitte; - repeat - k:=-1; - for i:=j+1 to length(extrema)-1 do - if (abs(dat[extrema[i]].x-dat[extrema[j]].x-sollAbst)<=toleranz) and - ((k=-1) or (abs(dat[extrema[i]].x-dat[extrema[j]].x-sollAbst)-1 then begin - behalten[k]:=true; - behalten[j]:=true; - j:=k; - end; - until k=-1; - if j=mitte then Fehler('So, wie sich der Programmierer das gedacht hat, findet man die richtigen Maxima nicht ...'); -*) - j:=0; for i:=0 to length(behalten)-1 do if behalten[i] then begin extrema[j]:=extrema[i]; -// write(extrema[j],' '); inc(j); end; setlength(extrema,j); -- cgit v1.2.3-70-g09d2