Всем привет! Понадобился фильтр данных полученных с ARDUINO, периодически приходил случайный шум, который возникает при различных (чаще всего внешних) обстоятельствах. Применил Медианный фильтр, он находит среднее значение, но не усредняя, а выбирая его из представленных (выбор из трёх значений). Мне помог  . Может кому пригодится...  Пример , медианный фильтр Add(MainForm,2953706,49,56) { Width=872 Height=521 Caption="Пример работы медианного фильтра" } Add(Plotter,12776507,539,70) { Width=856 Height=482 Align=5 Name="PL" MinH=-2 MaxH=2 } Add(PlotLines,7443287,539,126) { Grapher="PL" Step=1 MaxValues=1000 } Add(Random,5161000,266,63) { Min=-20 Max=20 link(onRandom,9457097:doOperation,[]) } Add(Timer,15468176,112,56) { Interval=10 link(onTimer,4129583:doEvent1,[]) } Add(PlotLines,14333504,539,175) { Grapher="PL" Color=32768 Size=3 Step=1 MaxValues=1000 } Add(Hub,7432474,399,126) { link(onEvent1,7443287:doAdd,[]) link(onEvent2,14441308:doOperation,[(424,139)(424,181)]) } Add(MultiElementEx,3636491,483,175) { @Hint=#16:Медианный фильтр| link(onOut,14333504:doAdd,[]) AddHint(-50,51,114,13,@Hint) } BEGIN_SDK Add(EditMultiEx,3344294,21,21) { WorkCount=#4:doIn| EventCount=#5:onOut| Width=328 Height=298 link(doIn,13526129:doValue,[(42,27)(42,41)]) } Add(Math,6843322,63,259) { OpType=39 link(onResult,10457593:doWork2,[]) link(Op1,347705:Var2,[]) link(Op2,14694163:Var1,[(76,124)]) } Add(Math,15407014,98,147) { OpType=39 link(onResult,11177945:doOperation,[]) link(Op1,12502970:Var3,[(104,103)]) link(Op2,2539272:Var2,[]) } Add(Math,11177945,140,147) { OpType=39 link(onResult,15884267:doCompare,[(181,153)(181,187)(86,187)(86,209)]) link(Op1,14928275:Var3,[(146,103)]) link(Op2,14694163:Var2,[]) } Add(GetDataEx,12502970,63,98) { link(Data,13526129:Value1,[]) } Add(GetDataEx,14928275,105,98) { link(Data,13526129:Value2,[(111,84)(76,84)]) } Add(GetDataEx,14694163,147,119) { link(Data,8383875:Var2,[]) } Add(If_else,15884267,98,203) { link(onTrue,6843322:doOperation,[(145,209)(145,241)(45,241)(45,265)]) link(onFalse,6330053:doOperation,[]) link(Op1,15407014:Result,[]) link(Op2,11177945:Result,[(111,194)(146,194)]) } Add(Math,6330053,182,210) { OpType=38 link(onResult,8277000:doOperation,[]) link(Op1,347705:Var3,[(188,117)]) link(Op2,8383875:Var3,[(195,103)]) } Add(GetDataEx,347705,63,112) { link(Data,12502970:Var2,[]) } Add(GetDataEx,8383875,147,98) { link(Data,13526129:Value3,[(153,75)(83,75)]) } Add(Math,8277000,238,210) { OpType=39 link(onResult,10457593:doWork1,[(284,216)]) link(Op1,6330053:Result,[(244,195)(225,195)(225,253)(188,253)]) link(Op2,2539272:Var3,[(251,131)]) } Add(GetDataEx,2539272,105,126) { link(Data,14928275:Var2,[]) } Add(HubEx,10457593,280,259) { link(onEvent,3344294:onOut,[(334,265)(334,27)]) } Add(MemFIFO,13526129,63,35) { Default=Integer(0) Count=3 link(onData,15407014:doOperation,[(120,41)(120,92)(46,92)(46,153)]) } Add(InfoTip,10949533,161,35) { Info=#17:Медианный фильтр |7:tig-rrr| Font=[MS Sans Serif,10,1,0,1] HAlign=2 Width=162 Height=46 Margin=5 } Add(Icon,13038747,280,98) { @Hint=#5:#main| Icon=[ZIPDE06000078DA636060044209090620C9C170828D81418C818141038881420C060C1071FCE03F83C8158651300A46C1281800C0C84891381304E012874BA399804D12C9045CE2346153121A0309FEFFFFCFF01D8C7F331C00D63420FAFB9FFF70FC81078819E419BE032BA2EFF60F80F8332AFE0FC3FF191E43CDFA8F840136823FD6] } END_SDK Add(CounterEx,1087479,161,126) { Max=628 link(onNext,1598210:doOperation,[]) } Add(Math,16233310,266,126) { OpType=13 link(onResult,5849793:doOperation,[]) } Add(Math,1598210,217,126) { OpType=3 Op2=100 link(onResult,16233310:doOperation,[]) } Add(CounterEx,12141963,210,56) { Max=70 Point(onThroughMax) link(onThroughMax,5161000:doRandom,[]) } Add(Hub,4129583,168,56) { OutCount=3 link(onEvent1,12141963:doNext,[]) link(onEvent2,1087479:doNext,[(194,69)(194,101)(149,101)(149,132)]) link(onEvent3,9457097:doDefault,[]) } Add(Math,9457097,322,63) { OpType=3 Op2=10 Point(doDefault) } Add(Math,5849793,315,126) { link(onResult,7432474:doEvent1,[]) link(Op2,9457097:Result,[]) } Add(Math,14441308,434,175) { Op2=0.1 link(onResult,3636491:doIn,[]) }
 +ещё пару фильтров Add(MainForm,10253624,252,154) { Width=872 Height=521 Caption="Пример работы фильтра" } Add(Plotter,12776507,798,147) { Width=856 Height=482 Align=5 Name="PL" MinH=-2 MaxH=2 } Add(PlotLines,7443287,798,224) { Grapher="PL" Step=1 MaxValues=1000 } Add(Random,5161000,469,161) { Min=-20 Max=20 link(onRandom,9457097:doOperation,[]) } Add(Timer,15468176,315,154) { Interval=10 link(onTimer,4129583:doEvent1,[]) } Add(PlotLines,14333504,903,371) { Grapher="PL" Color=32768 Size=3 Step=1 MaxValues=1000 } Add(Hub,7432474,602,224) { link(onEvent1,7443287:doAdd,[]) link(onEvent2,14441308:doOperation,[(634,237)(634,307)]) } Add(MultiElementEx,3636491,798,301) { @Hint=#16:Медианный фильтр| link(onOut,1906685:doWork1,[(879,307)]) AddHint(52,-33,114,13,@Hint) } BEGIN_SDK Add(EditMultiEx,3344294,21,21) { WorkCount=#4:doIn| EventCount=#5:onOut| Width=328 Height=298 link(doIn,13526129:doValue,[(42,27)(42,41)]) } Add(Math,6843322,63,259) { OpType=39 link(onResult,10457593:doWork2,[]) link(Op1,347705:Var2,[]) link(Op2,14694163:Var1,[(76,124)]) } Add(Math,15407014,98,147) { OpType=39 link(onResult,11177945:doOperation,[]) link(Op1,12502970:Var3,[(104,103)]) link(Op2,2539272:Var2,[]) } Add(Math,11177945,140,147) { OpType=39 link(onResult,15884267:doCompare,[(181,153)(181,187)(86,187)(86,209)]) link(Op1,14928275:Var3,[(146,103)]) link(Op2,14694163:Var2,[]) } Add(GetDataEx,12502970,63,98) { link(Data,13526129:Value1,[]) } Add(GetDataEx,14928275,105,98) { link(Data,13526129:Value2,[(111,84)(76,84)]) } Add(GetDataEx,14694163,147,119) { link(Data,8383875:Var2,[]) } Add(If_else,15884267,98,203) { link(onTrue,6843322:doOperation,[(145,209)(145,241)(45,241)(45,265)]) link(onFalse,6330053:doOperation,[]) link(Op1,15407014:Result,[]) link(Op2,11177945:Result,[(111,194)(146,194)]) } Add(Math,6330053,182,210) { OpType=38 link(onResult,8277000:doOperation,[]) link(Op1,347705:Var3,[(188,117)]) link(Op2,8383875:Var3,[(195,103)]) } Add(GetDataEx,347705,63,112) { link(Data,12502970:Var2,[]) } Add(GetDataEx,8383875,147,98) { link(Data,13526129:Value3,[(153,75)(83,75)]) } Add(Math,8277000,238,210) { OpType=39 link(onResult,10457593:doWork1,[(284,216)]) link(Op1,6330053:Result,[(244,195)(225,195)(225,253)(188,253)]) link(Op2,2539272:Var3,[(251,131)]) } Add(GetDataEx,2539272,105,126) { link(Data,14928275:Var2,[]) } Add(HubEx,10457593,280,259) { link(onEvent,3344294:onOut,[(334,265)(334,27)]) } Add(MemFIFO,13526129,63,35) { Default=Integer(0) Count=3 link(onData,15407014:doOperation,[(120,41)(120,92)(46,92)(46,153)]) } Add(InfoTip,10949533,161,35) { Info=#17:Медианный фильтр |7:tig-rrr| Font=[MS Sans Serif,10,1,0,1] HAlign=2 Width=162 Height=46 Margin=5 } Add(Icon,13038747,280,98) { @Hint=#5:#main| Icon=[ZIPDE06000078DA636060044209090620C9C170828D81418C818141038881420C060C1071FCE03F83C8158651300A46C1281800C0C84891381304E012874BA399804D12C9045CE2346153121A0309FEFFFFCFF01D8C7F331C00D63420FAFB9FFF70FC81078819E419BE032BA2EFF60F80F8332AFE0FC3FF191E43CDFA8F840136823FD6] } END_SDK Add(CounterEx,1087479,364,224) { Max=628 link(onNext,1598210:doOperation,[]) } Add(Math,16233310,469,224) { OpType=13 link(onResult,5849793:doOperation,[]) } Add(Math,1598210,420,224) { OpType=3 Op2=100 link(onResult,16233310:doOperation,[]) } Add(CounterEx,12141963,413,154) { Max=70 Point(onThroughMax) link(onThroughMax,5161000:doRandom,[]) } Add(Hub,4129583,371,154) { OutCount=3 link(onEvent1,12141963:doNext,[]) link(onEvent2,1087479:doNext,[(397,167)(397,199)(352,199)(352,230)]) link(onEvent3,9457097:doDefault,[]) } Add(Math,9457097,525,161) { OpType=3 Op2=10 Point(doDefault) } Add(Math,5849793,518,224) { link(onResult,7432474:doEvent1,[]) link(Op2,9457097:Result,[]) } Add(Math,14441308,651,301) { Op2=0.1 link(onResult,5788221:doEvent,[]) } Add(RadioButton,7707236,462,56) { Left=50 Top=25 Width=155 Selected=0 Caption="Медианный фильтр" link(onSelect,3285088:doWork1,[]) } Add(MultiElementEx,6273163,798,371) { @Hint=#22:Среднее арифметическое| link(onOut,1906685:doWork2,[]) AddHint(47,-30,147,13,@Hint) } BEGIN_SDK Add(EditMultiEx,3522453,21,21) { WorkCount=#4:doIn| EventCount=#5:onOut| Width=167 Height=179 link(doIn,1233035:doValue,[(42,27)(42,55)]) } Add(MemFIFO,1233035,63,49) { Default=Integer(0) Count=3 link(onData,6342667:doCalc,[(107,55)(107,93)(51,93)(51,132)]) } Add(MathParse,6342667,63,126) { DataCount=3 MathStr="(%1 + %2 + %3) / 3" link(onResult,3522453:onOut,[(141,132)(141,27)]) link(X1,1233035:Value1,[]) link(X2,1233035:Value2,[]) link(X3,1233035:Value3,[]) } END_SDK Add(MultiElementEx,10408034,798,441) { @Hint=#32:Экспоненциальное бегущее среднее| link(onOut,1906685:doWork3,[(879,447)]) AddHint(-57,54,161,26,@Hint) } BEGIN_SDK Add(EditMultiEx,14156445,21,21) { WorkCount=#4:doIn| EventCount=#5:onOut| Width=167 Height=179 link(doIn,3138742:doCalc,[(39,27)(39,139)]) } Add(MathParse,3138742,84,133) { MathStr="%0 + (%1 - %0 ) * %2" link(onResult,14156445:onOut,[(152,139)(152,27)]) link(X2,7345345:Value,[]) } Add(Memory,7345345,91,77) { @Hint=#9:От 0 до 1| Default=Real(0.1) AddHint(-27,-36,61,13,@Hint) } END_SDK Add(IndexToChanel,5788221,714,301) { Count=3 Point(Index) link(onEvent1,3636491:doIn,[]) link(onEvent2,6273163:doIn,[(780,314)(780,377)]) link(onEvent3,10408034:doIn,[(764,321)(764,447)]) link(Index,7189635:Value,[]) } Add(HubEx,1906685,875,371) { link(onEvent,14333504:doAdd,[]) } Add(ChanelToIndex,3285088,658,56) { Count=3 link(onIndex,7189635:doValue,[]) } Add(Memory,7189635,714,56) { Default=Integer(0) } Add(RadioButton,1473588,532,63) { Left=220 Top=25 Width=180 Caption="Среднее арифметическое" link(onSelect,3285088:doWork2,[]) } Add(RadioButton,713150,595,70) { Left=435 Top=25 Width=240 Caption="Экспоненциальное бегущее среднее" link(onSelect,3285088:doWork3,[]) }
|