均值滤波C语言代码实现的一种简单方式

计算均值滤波时,需要每次求数组的和,再求均值,一般先放入一个数组,循环移出最后一个旧的值循环移入新的值

一般原来的做法

/******************************************************************************/
/**
* @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,再加上新的数据,即为当前数组的数据和,再求均值。

你可能感兴趣的:(C++)