История изменений
Исправление shkolnick-kun, (текущая версия) :
Еще можно попробовать вот так:
#include <sdtint.h>
#include <stdbool.h>
/*Используем с99 и знаковые типы, так проще*/
const int32_t fast = 100; /*Постоянная времени быстрого фильтра*/
const int32_t med = 10; /*Постоянная времени промежуточного фильтра*/
const int32_t slow = 1; /*Постоянная времени медленного фильтра*/
const int32_t denom = 1000;
int32_t mean = 0; /*Оценка среднего*/
int32_t noise = 0; /*Оценка шума*/
int16_t tr_mean(int16_t input)
{
int32_t delta = (int32_t)input - (mean / denom);
int32_t nz = delta * delta; /*Оцениваем квадрат отклонения*/
alpha = (nz > noise * 9)?med:fast; /*Изменения < 3s будем копить быстрее*/
mean += delta * alpha;
noise += (nz - (noise / denom)) * slow; /*Оценку шума делаем медленнее всего*/
return (int16_t)(mean / denom);
}
Кольцевой буфер тут не нужен. Но есть неилюзорный шанс переполнения...
Исправление shkolnick-kun, :
Еще можно попробовать вот так:
#include <sdtint.h>
#include <stdbool.h>
/*Используем с99 и знаковые типы, так проще*/
const int32_t fast = 100; /*Постоянная времени быстрого фильтра*/
const int32_t med = 10; /*Постоянная времени промежуточного фильтра*/
const int32_t slow = 1; /*Постоянная времени медленного фильтра*/
const int32_t denom = 1000;
int32_t mean = 0; /*Оценка среднего*/
int32_t noise = 0; /*Оценка шума*/
int16_t tr_mean(int16_t input)
{
int32_t delta = (int32_t)input - (mean / denom);
int32_t nz = delta * delta; /*Оцениваем квадрат отклонения*/
alpha = (nz > noise * 9)?med:fast; /*Изменения < 3s будем копить быстрее*/
mean += delta * alpha;
noise += (nz - (noise / denom)) * slow; /*Оценку шума делаем медленнее всего*/
return (int16_t)(mean / denom);
}
Кольцевой буфер тут не нужен. Но есть неизюзорный шанс переполнения...
Исправление shkolnick-kun, :
Еще можно попробовать вот так:
#include <sdtint.h>
#include <stdbool.h>
/*Используем с99 и знаковые типы, так проще*/
const int32_t fast = 100; /*Постоянная времени быстрого фильтра*/
const int32_t med = 10; /*Постоянная времени промежуточного фильтра*/
const int32_t slow = 1; /*Постоянная времени медленного фильтра*/
const int32_t denom = 1000;
int32_t mean = 0; /*Оценка среднего*/
int32_t noise = 0; /*Оценка шума*/
int16_t tr_mean(int16_t input)
{
int32_t delta = (int32_t)input - (mean / denom);
int32_t nz = delta * delta; /*Оцениваем квадрат отклонения*/
alpha = (nz > noise * 9)?med:fast; /*Изменения < 3s будем копить быстрее*/
mean += delta * alpha;
noise += (nz - (noise / denom)) * slow; /*Оценку шума делаем медленнее всего*/
return (int16_t)(mean / denom);
}
Кольцевой буфер тут не нужен. Но есть неизюзорный швнс переполнения...
Исправление shkolnick-kun, :
Еще можно попробовать вот так:
#include <sdtint.h>
#include <stdbool.h>
/*Используем с99 и знаковые типы, так проще*/
const int32_t fast = 100; /*Постоянная времени быстрого фильтра*/
const int32_t med = 10; /*Постоянная времени промежуточного фильтра*/
const int32_t slow = 1; /*Постоянная времени медленного фильтра*/
const int32_t denom = 1000;
int32_t mean = 0; /*Оценка среднего*/
int32_t noise = 0; /*Оценка шума*/
int16_t tr_mean(int16_t input)
{
int32_t delta = (int32_t)input - (mean / denom);
int32_t nz = delta * delta; /*Оцениваем квадрат отклонения*/
alpha = (nz > noise * 9)?med:fast; /*Изменения < 3s будем копить быстрее*/
mean += delta * alpha;
noise += (nz - (noise / denom)) * slow; /*Оценку шума делаем медленнее всего*/
return (int16_t)(mean / denom);
}
Кольцевой буфер тут не нужен.
Исходная версия shkolnick-kun, :
Еще можно попробовать вот так:
#include <sdtint.h>
#include <stdbool.h>
/*Используем с99 и знаковые типы, так проще*/
const int32_t fast = 100; /*Постоянная времени быстрого фильтра*/
const int32_t med = 10; /*Постоянная времени промежуточного фильтра*/
const int32_t slow = 1; /*Постоянная времени медленного фильтра*/
const int32_t denom = 1000;
int32_t mean = 0; /*Оценка среднего*/
int32_t noise = 0; /*Оценка шума*/
int16_t tr_mean(int16_t input)
{
int32_t delta = (int32_t)input - (mean / denom);
int32_t nz = delta * delta; /*Оцениваем квадрат отклонения*/
alpha = (nz > noise * 9)?med:fast; /*Изменения < 3s будем копить быстрее*/
mean += delta * alpha;
noise += (nz - (noise / denom)) * slow; /*Оценку шума делаем медленнее всего*/
return (int16_t)(mean / denom);
}