一.完成巴特沃斯滤波、中值滤波、平均值滤波在当前工程中的实现
1.传感器结构体
typedef struct
{
float dataNowSensor;
float dataNowRes;
Butter_BufferData bufButterSensor;
Butter_BufferData bufButterRes;
float bufMFSensor[10];
float bufMFRes[10];
float bufAvgFSensor[10];
float bufAvgFRes[10];
float dataLPFSensor;
float dataLPFRes;
float dataMFSensor;
float dataMFRes;
float dataAvgFSensor;
float dataAvgFRes;
}Rt;
2.巴特沃斯滤波子程序
float LPButterworth(float curr_input,Butter_BufferData *Buffer,Butter_Parameter *Parameter)
{
static int LPF_Cnt=0;
Buffer->Input_Butter[2] = curr_input;
if(LPF_Cnt>=100)
{
Buffer->Output_Butter[2]=
Parameter->b[0] * Buffer->Input_Butter[2]
+Parameter->b[1] * Buffer->Input_Butter[1]
+Parameter->b[2] * Buffer->Input_Butter[0]
-Parameter->a[1] * Buffer->Output_Butter[1]
-Parameter->a[2] * Buffer->Output_Butter[0];
}
else
{
Buffer->Output_Butter[2]=Buffer->Input_Butter[2];
LPF_Cnt++;
}
Buffer->Input_Butter[0]=Buffer->Input_Butter[1];
Buffer->Input_Butter[1]=Buffer->Input_Butter[2];
Buffer->Output_Butter[0]=Buffer->Output_Butter[1];
Buffer->Output_Butter[1]=Buffer->Output_Butter[2];
return Buffer->Output_Butter[2];
}
#define M_PI_F 3.141592653589793f
void Set_Cutoff_Frequency(float sample_frequent, float cutoff_frequent,Butter_Parameter *LPF)
{
float fr = sample_frequent / cutoff_frequent;
float ohm = tanf(M_PI_F / fr);
float c = 1.0f + 2.0f * cosf(M_PI_F / 4.0f) * ohm + ohm * ohm;
if (cutoff_frequent <= 0.0f) {
return;
}
LPF->b[0] = ohm * ohm / c;
LPF->b[1] = 2.0f * LPF->b[0];
LPF->b[2] = LPF->b[0];
LPF->a[0] = 1.0f;
LPF->a[1] = 2.0f * (ohm * ohm - 1.0f) / c;
LPF->a[2] = (1.0f - 2.0f * cosf(M_PI_F / 4.0f) * ohm + ohm * ohm) / c;
}
3.中值滤波
uint8_t numMF = 10;
float Filter_Middle3(float nowData,float *Buffer)
{
float temp[numMF];
uint8_t i;
float Middle;
*(Buffer+numMF-1) = nowData;
for(i=0; i<numMF; i++)
temp[i] = *(Buffer+i);
bubbleSort(temp, numMF);
Middle = temp[numMF/2];
for(i=0; i<numMF-1; i++)
*(Buffer+i) = *(Buffer+i+1);
return Middle;
}
4.平均值滤波
#define numAvg 10
float Filter_Average(float nowData,float *Buffer)
{
float Sum;
float Average;
uint16_t i;
*(Buffer+numAvg-1) = nowData;
for(i=0; i<numAvg; i++)
Sum = *(Buffer+i) + Sum;
Average = Sum/(numAvg*1.0);
for(i=0; i<(numAvg-1); i++)
*(Buffer+i) = *(Buffer+i+1);
return Average;
}
5.主函数
Set_Cutoff_Frequency(500,10,&Sensor_Parameter);
Set_Cutoff_Frequency(500,10,&Res_Parameter);
if(g_tADS1256.ReadOver)
{
g_tADS1256.ReadOver = 0;
for (i = 0; i < 4; i++)
{
adc[i] = ADS1256_GetAdc(i);
volt[i] = ((int64_t)adc[i] * 2503000) / 4194303;
}
R1.dataNowSensor = -volt[0]/1000000.0;
R1.dataNowRes = -volt[1]/1000000.0;
R1.dataLPFSensor = LPButterworth(R1.dataNowSensor, &R1.bufButterSensor, &Sensor_Parameter);
R1.dataLPFRes = LPButterworth(R1.dataNowRes , &R1.bufButterRes, &Res_Parameter);
R1.dataMFSensor = Filter_Middle3(R1.dataLPFSensor, R1.bufMFSensor);
R1.dataMFRes = Filter_Middle3(R1.dataLPFRes, R1.bufMFRes);
R1.dataAvgFSensor = Filter_Average(R1.dataMFSensor, R1.bufAvgFSensor);
R1.dataAvgFRes = Filter_Average(R1.dataMFRes, R1.bufAvgFRes);
var[0] = R1.dataNowSensor;
var[1] = R1.dataNowRes;
var[2] = R1.dataLPFSensor;
var[3] = R1.dataLPFRes;
var[4] = R1.dataMFSensor;
var[5] = R1.dataMFRes;
var[6] = R1.dataAvgFSensor;
var[7] = R1.dataAvgFRes;
vcan2_sendware((uint8_t *)var, sizeof(var));
}