FIR滤波器在c++

FIR filter in c++

本文关键字:c++ 滤波器 FIR      更新时间:2023-10-16

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

我定义了一个类为filter, 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);
}

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

我看到你正试图做一个卷积,如果你想通过索引数组外避免段错误,你需要改变表达式。例如,您可以使用instead of

_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];
    }

第二个解决方案更好,因为您可以避免在无用时创建更大的循环。