Вверх ↑
Этот топик читают: Гость
Ответов: 495
Рейтинг: 163
#1: 2022-10-11 23:04:30 ЛС | профиль | цитата
Всем привет! Понадобился фильтр данных полученных с 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,[])
}


Редактировалось 1 раз(а), последний 2022-10-12 00:19:16
карма: 4

0
Ответов: 8926
Рейтинг: 823
#2: 2022-10-12 00:14:27 ЛС | профиль | цитата
tig-rrr, при шумах длительностью более одного такта ошибётся
Экспонентный фильтр (a+b=1)


Add(MainForm,6712647,301,49)
{
Width=872
Height=521
Caption="Пример работы медианного фильтра"
}
Add(Plotter,12776507,791,63)
{
Width=856
Height=482
Align=5
Name="PL"
MinH=-2
MaxH=2
}
Add(PlotLines,7443287,791,119)
{
Grapher="PL"
Step=1
MaxValues=1000
}
Add(Random,5161000,518,56)
{
Min=-20
Max=20
link(onRandom,9457097:doOperation,[])
}
Add(Timer,15468176,364,49)
{
Interval=10
link(onTimer,4129583:doEvent1,[])
}
Add(PlotLines,14333504,791,168)
{
Grapher="PL"
Color=32768
Size=3
Step=1
MaxValues=1000
}
Add(Hub,7432474,609,119)
{
OutCount=3
link(onEvent1,7443287:doAdd,[])
link(onEvent2,14441308:doOperation,[(676,132)(676,174)])
link(onEvent3,7132472:doOperation,[(669,139)(669,223)])
}
Add(MultiElementEx,3636491,735,168)
{
@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,413,119)
{
Max=628
link(onNext,1598210:doOperation,[])
}
Add(Math,16233310,518,119)
{
OpType=13
link(onResult,5849793:doOperation,[])
}
Add(Math,1598210,469,119)
{
OpType=3
Op2=100
link(onResult,16233310:doOperation,[])
}
Add(CounterEx,12141963,462,49)
{
Max=70
Point(onThroughMax)
link(onThroughMax,5161000:doRandom,[])
}
Add(Hub,4129583,420,49)
{
OutCount=3
link(onEvent1,12141963:doNext,[])
link(onEvent2,1087479:doNext,[(446,62)(446,94)(401,94)(401,125)])
link(onEvent3,9457097:doDefault,[])
}
Add(Math,9457097,574,56)
{
OpType=3
Op2=10
Point(doDefault)
}
Add(Math,5849793,567,119)
{
link(onResult,7432474:doEvent1,[])
link(Op2,9457097:Result,[])
}
Add(Math,14441308,686,168)
{
Op2=0.1
link(onResult,3636491:doIn,[])
}
Add(Math,7132472,686,217)
{
Op2=0.2
link(onResult,4273938:doCalc,[])
}
Add(MathParse,4273938,735,217)
{
MathStr="%0*0.92 + %1*0.08"
link(onResult,8810067:doAdd,[])
}
Add(PlotLines,8810067,791,217)
{
Grapher="PL"
Color=16711680
Size=3
Step=1
MaxValues=1000
}

карма: 19

1
Голосовали:tig-rrr
Ответов: 495
Рейтинг: 163
#3: 2022-10-12 00:25:45 ЛС | профиль | цитата
Леонид писал(а):
tig-rrr, при шумах длительностью более одного такта ошибётся
Это верно . В таком случае применял паровозиком сначала медианный затем Экспоненциальное бегущее среднее.
Пример работы фильтров в разных режимах https://forum.hiasm.com/getfile/39557
Пример работы фильтра.jpg

Редактировалось 3 раз(а), последний 2022-10-18 11:05:49
карма: 4

0
3
Сообщение
...
Прикрепленные файлы
(файлы не залиты)