计算平均值滤波时,需要求出数组的和,然后求出平均值。 一般来说,首先放入数组,循环使用最后一个旧值循环使用新值
通常的做法
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *。
//*
每次处理* @param[in] data[3]维的数据集时,都需要对每个数据进行平均过滤
* fifo:中间存储数据的数组三维数组,使用前定义
* len: N个值的平均滤波,例如len=5,表示5个点取平均值
* output:平均滤波后的数据、三维的
* idx:平均值过滤后的值对应的下标
* @return
*
*
********************************。
voidavgfilter1(floatdata[3],float fifo[][FILTER_SIZE],int len,float output[][BUF_SIZE],int idx
{
浮体sum 1、sum2、sum3;
uint8_t i;
//MEXprintf('%d”,data[1];
for(I=1; i len; I )
{
fifo[0][i - 1]=fifo[0][i];
fifo[1][i - 1]=fifo[1][i];
fifo[2][i - 1]=fifo[2][i];
}
fifo[0][len - 1]=data[0];
fifo[1][len - 1]=data[1];
fifo[2][len - 1]=data[2];
sum1=0;
sum2=0;
sum3=0;
for(I=0; i len; I )
{
sum1 =fifo[0][i];
sum2 =fifo[1][i];
sum3 =fifo[2][i];
}
output[0][idx]=(sum1/len );
output[1][idx]=(sum2/len );
output[2][idx]=(sum3/len );
//mexprintf(output:(n );
if(idx==buf_size ) )。
{
for(I=0; I
可以修改为新的做法
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *。
/** SIZE:相当于len、平均过滤的个数
* @ param [ in ] dealwithdataonebyoneandgettheaverage
* data: three axis' data
* FIFO : cacheintermediatedata
* len : thelengthofaverage ' sdata
* output : outputofaverage ' sdata
* @return
*
*
********************************。
voidavgfilter(floatdata[3],float fifo[][SIZE],float output[][BUF_SIZE],int idx ) )。
{
/* filter_buff,FILTER_SIZE */
static uint8_t data_index=0;
static float sum_x=0,sum_y=0,sum_z=0;
float fir_x、fir_y、fir_z;
uint8_t fir_pos;
/* find the index-9' data */
fir_x=fifo[0][data_index];
fir_y=fifo[1][data_index];
fir_z=fifo[2][data_index];
fifo[0][data_index]=data[0];
fifo[1][data_index]=data[1];
fifo[2][data_index]=data[2];
数据索引=(data _ index1) % SIZE;
sum_x =data[0];
sum_y =data[1];
sum_z =data[2];
sum_x -=fir_x;
sum_y -=fir_y;
sum_z -=fir_z;
output[0][idx]=(sum_x/SIZE );
output[1][idx]=(sum_y/SIZE );
output[2][idx]=(sum_z/SIZE );
}
这样,运算量大幅减少,将数据存储在由1个数组构成的环形buffer中,每次取现在的index的前一个value[index],从sum中减去value,加入新的数据后成为现在数组的数据和,平均值