先贴出来,后续优化
#include "filtering.h"
int firstOrderFilter(int newValue, int oldValue, float a)
{
return a * newValue + (1-a) * oldValue;
}
int slip_ave_filter(slip_ave_filter_def *p_adc)
{
if(p_adc == NULL)
{
return -1;
}
if(p_adc->filter_num == 0)
{
return p_adc->input_value;
}
if(p_adc->curNum < p_adc->filter_num)
{
p_adc->sum += p_adc->input_value;
p_adc->curNum++;
return p_adc->sum/p_adc->curNum;
}
else
{
p_adc->sum -= p_adc->sum/p_adc->filter_num;
p_adc->sum += p_adc->input_value;
return p_adc->sum/p_adc->filter_num;
}
}
int middleValueFilter(median_filter_def* p_adc)
{
if(p_adc == NULL)
{
return -1;
}
p_adc->value_buf[p_adc->i % MD_FILTER_NUM] = p_adc->input_value;
(p_adc->i)++;
if(p_adc->i < MD_FILTER_NUM)
{
return p_adc->value_buf[p_adc->i];
}
for(p_adc->j = 0 ; p_adc->j < MD_FILTER_NUM - 1; ++(p_adc->j))
{
for(p_adc->k = 0; p_adc->k < MD_FILTER_NUM - (p_adc->j) - 1; ++(p_adc->k))
{
if(p_adc->value_buf[p_adc->k] > p_adc->value_buf[(p_adc->k)+1])
{
p_adc->temp = p_adc->value_buf[p_adc->k];
p_adc->value_buf[p_adc->k] = p_adc->value_buf[(p_adc->k) + 1];
p_adc->value_buf[(p_adc->k) + 1] = p_adc->temp;
}
}
}
return p_adc->value_buf[(MD_FILTER_NUM-1)/2];
}
int averageFilter(int N)
{
int sum = 0;
short i;
for(i = 0; i < N; ++i)
{
sum += HAL_ADC_GetValue(&hadc1);
}
return sum/N;
}
#define N 10
int value_buf[N];
int sum=0;
int curNum=0;
int moveAverageFilter()
{
if(curNum < N)
{
value_buf[curNum] = HAL_ADC_GetValue(&hadc1);
sum += value_buf[curNum];
curNum++;
return sum/curNum;
}
else
{
sum -= sum/N;
sum += HAL_ADC_GetValue(&hadc1);
return sum/N;
}
}
#define A 50
#define M 12
int data[M];
int First_flag=0;
int LAverageFilter()
{
int i;
int temp,sum,flag=0;
data[0]=HAL_ADC_GetValue(&hadc1);
for(i=1;i<M;i++)
{
temp=HAL_ADC_GetValue(&hadc1);
if((temp-data[i-1])>A||((data[i-1]-temp)>A))
{
i--;flag++;
}
else
{
data[i]=temp;
}
}
for(i=0;i<M;i++)
{
sum+=data[i];
}
return sum/M;
}
int KalmanFilter(int inData)
{
static float prevData = 0;
static float p = 10, q = 0.001, r = 0.001, kGain = 0;
p = p + q;
kGain = p / ( p + r );
inData = prevData + ( kGain * ( inData - prevData ) );
p = ( 1 - kGain ) * p;
prevData = inData;
return inData;
}
#ifndef __FILTERING_H
#define __FILTERING_H
#include "stdint.h"
#include "stdio.h"
typedef struct
{
int sum;
int curNum;
int input_value;
int filter_num;
}slip_ave_filter_def;
int slip_ave_filter(slip_ave_filter_def *p_adc);
int firstOrderFilter(int newValue, int oldValue, float a);
#define MD_FILTER_NUM 15
typedef struct
{
uint32_t i,j,k,temp;
int input_value;
int value_buf[MD_FILTER_NUM];
}median_filter_def;
int middleValueFilter(median_filter_def* p_adc);
int averageFilter(int N);
int moveAverageFilter();
int LAverageFilter();
int KalmanFilter(int inData);
#endif