目前我正在尝试实现 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 滤波器?
最佳答案
我看到您正在尝试进行卷积,如果您想通过在数组外部建立索引来避免段错误,则需要更改表达式。 例如你可以使用而不是
_x_sign[pp -jj]
pp>jj? _x_sign[pp - jj] : 0
在这种情况下,您可以通过使用三元运算符避免在内存之外进行索引(如果 jj 大于 pp,则不会评估 _x_sign[pp - jj])
你也可以改变你的限制
for (jj = 0; jj < order+1&& jj< pp+1; jj++)
{
sum += _b[jj] * _x_sign[pp - jj];
}
第二种解决方案更好,因为您可以避免在无用时创建更大的循环。
关于c++ - C++ 中的 FIR 滤波器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24322055/