一. 限幅滤波法
给定一个最大偏差X,如果本次值与上次差值小于X,则本次有效,否则无效,使用上次值代替。
#incldue <stdio.h>#define X 2
int lastvalue;
//限幅滤波法
int filter(void)
{int nowValue ;nowValue = getValue();if (abs(nowValue - lastvalue) > X){return lastValue}else{return nowvalue;}lastValue = nowValue;
}
二. 中位值滤波法
采样N次值,对这N个值按大小排序,取中间值为本次有效值.
//中值滤波
uint16_t GetADC1Average(int num)
{uint16_t AdcValueBuf[N] = {0},AdcValuetemp=0;unsigned int count=0,i=0,j=0;uint32_t sum = 0;for(count=0;count<N;count++)AdcValueBuf[count]=filter_yijie(num);//冒泡排序for(j=0;j<N-1;j++){for(i=0;i<N-j;i++){if(AdcValueBuf[i] > AdcValueBuf[i+1]){AdcValuetemp = AdcValueBuf[i];AdcValueBuf[i] = AdcValueBuf[i+1];AdcValueBuf[i+1] = AdcValuetemp;}}}return AdcValueBuf[(N - 1) / 2];
}
三. 算术平均滤波法
连续采用N个值进行算数平均运算.
int Filter_Value;
// 算术平均滤波法
#define FILTER_N 12
int Filter() {int i;int filter_sum = 0;for(i = 0; i < FILTER_N; i++) {filter_sum += Get_AD();delay(1);}return (int)(filter_sum / FILTER_N);
}
四. 中位值平均滤波法
取样值去掉最大最小,再取平均值
//中值滤波
//采样若干次,舍弃较大数据和较小数据,然后将中间值平均
#define N 300//采样次数
#define BAN 100 //舍弃数据
uint16_t GetADC1Average(int num)
{uint16_t AdcValueBuf[N] = {0},AdcValuetemp=0;unsigned int count=0,i=0,j=0;uint32_t sum = 0;for(count=0;count<N;count++)AdcValueBuf[count]=filter_yijie(num);//冒泡排序for(j=0;j<N-1;j++){for(i=0;i<N-j;i++){if(AdcValueBuf[i] > AdcValueBuf[i+1]){AdcValuetemp = AdcValueBuf[i];AdcValueBuf[i] = AdcValueBuf[i+1];AdcValueBuf[i+1] = AdcValuetemp;}}}for(count=BAN;count<N-BAN;count++)sum+=AdcValueBuf[count];return ((uint16_t)((float)sum/(N-BAN*2)));
}
五. 一阶滞后滤波
取α = ( 0 , 1 ) α=(0,1)α=(0,1),f i l t e r d a t a = ( 1 − α ) 本 次 采 样 值 + α 上 次 滤 波 结 果 filter_{data} = (1-\alpha)本次采样值+\alpha 上次滤波结果filterdata=(1−α)本次采样值+α上次滤波结果
//一阶滞后滤波
#define a 0.05
uint16_t value;
float value_yijie;
uint16_t filter_yijie(int num){uint16_t new_value;new_value = AD_Value[num];value_yijie = ((1-a)*value + a*new_value);value = new_value;return (uint16_t)value_yijie;
}
六. 卡尔曼滤波
uint16_t KalmanFiter(uint16_t inData) {static float prevData = 0;//上一个数据//q控制误差,r控制响应速度static float kalman_adc;uint16_t kal=0;static float p = 1,q = 0.01,r = 10,kGain = 0;p= p + q;kGain = p / (p+r);//计算卡尔曼增益kalman_adc = prevData + (kGain * (inData - prevData));//计算本次滤波估计值p = (1-kGain)*p;//更新测量方差prevData = kalman_adc;kal = (uint16_t)(kalman_adc*10)%10;if(kal>=5)kalman_adc++;return (uint16_t)kalman_adc;
}
七. 一阶滞后滤波+卡尔曼滤波
在采样值与优化值相差大于某值时采用一阶滞后滤波算法,小于该值时采用卡尔曼滤波算法;