На вход схемы 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
Этот топик читают: Гость
Ответов: 19
Рейтинг: 0
|
|||
карма: 0 |
|
Ответов: 793
Рейтинг: 168
|
|||
RomanRoman писал(а): На вход схемы HiAsm поступают числа 0-100 (сигнал + шум) с промежутком 0,5 с. Как организовать цифровой фильтр «бегущее среднее», используя алгоритм программы (см. ниже)? Пробовал уложить формулу фильтра в элемент MathParse, но получается кольцевание с ошибкой компиляции. Может быть есть стандартное решение на HiAsm?
Редактировалось 2 раз(а), последний 2024-10-18 04:26:06 |
|||
карма: 16 |
|
Ответов: 19
Рейтинг: 0
|
|||
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 и т. д.
Редактировалось 1 раз(а), последний 2024-10-18 08:22:36 |
|||
карма: 0 |
|
Ответов: 8926
Рейтинг: 823
|
|||
RomanRoman, ещё:
Ещё
|
|||
карма: 19 |
|
Ответов: 19
Рейтинг: 0
|
|||
Леонид, спасибо за классный пример, задача решена. В своей схеме с двумя кнопками я заменил формулу в элементе MathParse %0 + (%1 - %0)*%2 и всё заработало.
|
|||
карма: 0 |
|
5