计算均值滤波时,需要每次求数组的和,再求均值,一般先放入一个数组,循环移出最后一个旧的值循环移入新的值
一般原来的做法
/******************************************************************************/
/**
* @param[in] data[3] 每次处理一组三维的数据,每个数据都需要均值滤波
* fifo:中间存数据的数组三维数组,在使用前定义
* len: N个值的均值滤波,比如len=5,代表5个点取一个均值
* output:均值滤波后的数据,三维的
* idx:均值滤波后的值对应的下标
* @return
*
*
*******************************************************************************/
void AvgFilter1(float data[3], float fifo[][FILTER_SIZE], int len, float output[][BUF_SIZE], int idx)
{
float sum1, 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] deal with data one by one and get the average
* data: three axis' data
* fifo: Cache intermediate data
* len: the length of average's data
* output: output of average's data
* @return
*
*
*******************************************************************************/
void AvgFilter(float data[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_index = (data_index + 1) % 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);
}
这样运算量大大减少,将数据存放到一个数组组成的环形buffer中,每次取当前index的前一个value[index],在sum和中减去value,再加上新的数据,即为当前数组的数据和,再求均值。