目前我正在尝试实施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滤波器?
答案 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];
}
第二种解决方案更好,因为当它没用时你会避免做出更大的循环。