LINUX.ORG.RU

История изменений

Исправление 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);
}