c ++中的FIR滤波器

时间:2014-06-20 07:26:21

标签: c++ arrays filtering

目前我正在尝试实施FIR低通滤波器。 FIR系数在MATLAB中计算。现在我需要用C ++实现FIR算法。

我将一个类定义为过滤器和FIR的函数:

double * Filter::FIR (double x[])
{

    unsigned int jj;
    unsigned int pp;
    double sum;


    pp = 0;

    // input values
    memcpy(&_x_sign, &x, sizeof(x));


    for (pp = 0; pp < order+1; pp++)

    {
        sum = 0 ;
        for (jj = 0; jj <  order+1; jj++)
        {
            sum += _b[jj] * _x_sign[pp - jj];
        }

        _y_sign[pp] = sum;

    }

    return (_y_sign);
}

当循环(pp - jj)为负数时,_x_sign作为数组不起作用。 如何修改FIR滤波器?

1 个答案:

答案 0 :(得分:2)

我看到你正在尝试进行卷积,如果你想通过在数组外部索引来避免段错误,则需要更改表达式。 例如,您可以使用而不是

_x_sign[pp -jj]
pp>jj? _x_sign[pp - jj] : 0

在这种情况下,您可以避免使用三元运算符在内存外部建立索引(如果jj大于pp,则不会评估_x_sign [pp - jj])

您还可以使用

更改for的限制
for (jj = 0; jj < order+1&& jj< pp+1; jj++)
    {
        sum += _b[jj] * _x_sign[pp - jj];
    }

第二种解决方案更好,因为当它没用时你会避免做出更大的循环。