Вверх ↑
Этот топик читают: Гость
Ответов: 18
Рейтинг: 0
#1: 2024-10-17 23:58:27 ЛС | профиль | цитата
На вход схемы HiAsm поступают числа 0-100 (сигнал + шум) с промежутком 0,5 с. Как организовать цифровой фильтр «бегущее среднее», используя алгоритм программы (см. ниже)? Пробовал уложить формулу фильтра в элемент MathParse, но получается кольцевание с ошибкой компиляции. Может быть есть стандартное решение на HiAsm?

static float filVal;
float k = 0.1; // коэффициент фильтрации, 0.0-1.0

float expRunningAverage(float newVal) {
filVal += (newVal - filVal) * k;
return filVal;
}

Редактировалось 1 раз(а), последний 2024-10-18 00:03:04
карма: 0

0
Ответов: 773
Рейтинг: 168
#2: 2024-10-18 04:12:16 ЛС | профиль | цитата
RomanRoman писал(а):
На вход схемы HiAsm поступают числа 0-100 (сигнал + шум) с промежутком 0,5 с. Как организовать цифровой фильтр «бегущее среднее», используя алгоритм программы (см. ниже)? Пробовал уложить формулу фильтра в элемент MathParse, но получается кольцевание с ошибкой компиляции. Может быть есть стандартное решение на HiAsm?

Add(MainForm,7345118,273,196)
{
Caption="RunningAverage"
}
Add(Timer,12654630,336,196)
{
Interval=500
AutoStop=9999999
link(onTimer,7290067:doNext,[])
}
Add(Label,11097072,728,245)
{
Width=384
Height=115
Align=2
Font=[MS Sans Serif,23,0,0,1]
AutoSize=1
}
Add(Label,14996953,728,196)
{
Top=115
Width=384
Height=146
Align=5
Font=[MS Sans Serif,23,0,0,1]
AutoSize=1
}
Add(MathParse,11086776,672,196)
{
MathStr="( %1 - %0 ) * %2"
link(onResult,14996953:doText,[])
link(X2,15609717:Value,[])
}
Add(Hub,2023453,630,196)
{
link(onEvent1,11086776:doCalc,[])
link(onEvent2,11097072:doText,[(662,209)(662,251)])
}
Add(Memory,15609717,679,133)
{
@Hint=#31:коэффициент фильтрации, 0.0-1.0|
Default=Real(0.1)
AddHint(164,-8,187,13,@Hint)
}
Add(MathParse,2953015,448,196)
{
MathStr="sin( %1 ) * 50 + 50"
AngleMode=1
link(onResult,2023453:doEvent1,[])
}
Add(CounterEx,7290067,392,196)
{
Max=359
link(onNext,2953015:doCalc,[])
}
Add(InfoTip,2948199,315,140)
{
Info=#17:Генератор сигнала|
Width=218
Height=123
}


Редактировалось 2 раз(а), последний 2024-10-18 04:26:06
карма: 15

0
Ответов: 18
Рейтинг: 0
#3: 2024-10-18 08:21:49 ЛС | профиль | цитата
Gunta Спасибо за быстрый ответ, но это не есть цифровой фильтр. Для упрощения схемы вместо генератора чисел можно поставить две кнопки, формирующие числа 100 и 105 (значение не принципиально). Если по очереди нажимать кнопки 1 и 2, то будет генерироваться последовательность чисел 100 и 105, поступающая на элемент MathParse. В результате фильтрации через определённое число итераций должно получиться число, близкое к среднему, то есть 102,5. Этого не получается.

Формула filVal = filVal + (newVal - filVal) * k означает, что имеется переменная filVal, в которой накапливается усреднённый результат. На вход поступает переменная newVal (в нашем случае ряд чисел 100 и 105). Если filVal изначально равно 0, то при k=0,1 должны последовательно получаться числа: filVal = 0 + (100 – 0)*0,1 = 10; filVal = 10 + (105 – 10)*0,1 = 19,5; filVal = 19,5 + (100 – 19,5)*0,1 = 27,55 и т. д.

Add(MainForm,7345118,126,252)
{
Width=579
Caption="RunningAverage"
}
Add(Label,11097072,420,301)
{
Width=563
Height=60
Font=[MS Sans Serif,16,0,0,1]
AutoSize=1
}
Add(Label,14996953,420,252)
{
Top=115
Width=563
Height=47
Font=[MS Sans Serif,16,0,0,1]
AutoSize=1
}
Add(MathParse,11086776,364,252)
{
MathStr="( %1 - %0 ) * %2"
link(onResult,14996953:doText,[])
link(X2,15609717:Value,[])
}
Add(Hub,2023453,322,252)
{
InCount=2
link(onEvent1,11086776:doCalc,[])
link(onEvent2,11097072:doText,[(354,265)(354,307)])
}
Add(Memory,15609717,371,189)
{
@Hint=#31:коэффициент фильтрации, 0.0-1.0|
Default=Real(0.1)
AddHint(164,-8,187,13,@Hint)
}
Add(Edit,472500,252,189)
{
@Color=16777130
Left=267
Top=187
Height=19
Color=16777215
Font=[MS Sans Serif,8,1,0,1]
ParentFont=0
Text="100"
Alignment=2
Point(doVisible)
}
Add(Button,8303377,189,252)
{
Left=180
Top=190
Caption="Button_1"
Data=String()
link(onClick,10514528:doData,[])
}
Add(DoData,10514528,252,252)
{
Data=Real(0.001)
link(onEventData,2023453:doEvent1,[])
link(Data,472500:Text,[])
}
Add(Edit,815006,245,308)
{
@Color=16777130
Left=267
Top=217
Height=19
Color=16777215
Font=[MS Sans Serif,8,1,0,1]
ParentFont=0
Text="105"
Alignment=2
Point(doVisible)
}
Add(Button,10382153,182,371)
{
Left=180
Top=215
Caption="Button_2"
link(onClick,1975013:doData,[])
}
Add(DoData,1975013,245,371)
{
Data=Real(0.001)
link(onEventData,2023453:doEvent2,[(299,377)(299,265)])
link(Data,815006:Text,[])
}


Редактировалось 1 раз(а), последний 2024-10-18 08:22:36
карма: 0

0
Ответов: 8912
Рейтинг: 823
#4: 2024-10-18 11:03:21 ЛС | профиль | цитата
RomanRoman, ещё:
Ещё


Add(MainForm,7345118,231,140)
{
Width=548
Height=502
Caption="RunningAverage"
}
Add(Timer,12654630,294,140)
{
Interval=50
AutoStop=9999999
link(onTimer,12886786:doNext,[])
}
Add(Label,11097072,623,210)
{
Left=-5
Top=60
Width=384
Height=35
Font=[MS Sans Serif,23,0,0,1]
AutoSize=1
}
Add(Label,14996953,644,140)
{
Top=95
Width=384
Height=41
Font=[MS Sans Serif,23,0,0,1]
AutoSize=1
}
Add(MathParse,11086776,560,140)
{
MathStr="%0*(1-%2)+%1*%2"
link(onResult,16698972:doEvent1,[])
link(X2,10725009:Text,[])
}
Add(Hub,2023453,518,140)
{
link(onEvent1,11086776:doCalc,[])
link(onEvent2,7101916:doEvent1,[(550,153)(550,216)])
}
Add(MathParse,2953015,434,140)
{
DataCount=3
MathStr="(sin( %1)+1)*%2+%3*(100-%2)"
AngleMode=1
link(onResult,2023453:doEvent1,[])
link(X1,12886786:Count,[(440,131)(380,131)(380,184)(342,184)])
link(X2,8158608:Position,[])
}
Add(InfoTip,2948199,273,84)
{
Info=#17:Генератор сигнала|
Width=218
Height=123
}
Add(Random,844032,392,140)
{
Min=-1
Max=1
Mode=1
link(onRandom,2953015:doCalc,[])
}
Add(Counter,12886786,336,140)
{
Max=359
Step=10
link(onNext,844032:doRandom,[])
}
Add(ScrollBar,8158608,441,42)
{
Left=35
Top=10
Width=240
Height=25
Max=100
Page=20
Position=50
}
Add(Plotter,6104298,518,84)
{
Top=140
Width=532
Height=324
Name="MyPl"
}
Add(Edit,10725009,567,84)
{
Left=430
Top=10
Text="0.1"
}
Add(PlotLines,4793759,686,175)
{
Grapher="MyPl"
Step=1
MaxValues=100
}
Add(PlotLines,7540784,686,245)
{
Grapher="MyPl"
Color=16711680
Step=1
MaxValues=100
}
Add(Hub,7101916,567,210)
{
link(onEvent1,11097072:doText,[])
link(onEvent2,7540784:doAdd,[(613,223)(613,251)])
}
Add(Hub,16698972,609,140)
{
link(onEvent1,14996953:doText,[])
link(onEvent2,4793759:doAdd,[(634,153)(634,181)])
}
Add(Label,4271502,623,84)
{
Left=295
Top=10
Width=135
Height=20
Font=[MS Sans Serif,10,1,0,1]
Caption="S/N K"
}

карма: 19

0
Ответов: 18
Рейтинг: 0
#5: 2024-10-18 19:25:56 ЛС | профиль | цитата
Леонид, спасибо за классный пример, задача решена. В своей схеме с двумя кнопками я заменил формулу в элементе MathParse %0 + (%1 - %0)*%2 и всё заработало.
карма: 0

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