C++ IIR低通滤波器在C++;

C++ IIR低通滤波器在C++;,c++,matlab,filter,lowpass-filter,C++,Matlab,Filter,Lowpass Filter,我有巴特沃斯低通滤波器的滤波器系数,来自Matlab函数[b,a]=butter(3,0.4,'low'),我实现了与Matlab使用的相同的计算,根据for滤波器(b,a,X)。例如,过滤5.0的恒定信号的结果是相同的,但仅适用于前10个值 我想我的循环缓冲区是错误的,但我找不到任何问题。使用筛选方法在x中正确写入值,数组用零初始化,循环缓冲指针n具有正确的值。。。你有什么想法吗 // Interface class LowpassFilter { private: double x[

我有巴特沃斯低通滤波器的滤波器系数,来自Matlab函数
[b,a]=butter(3,0.4,'low')
,我实现了与Matlab使用的相同的计算,根据for
滤波器(b,a,X)
。例如,过滤5.0的恒定信号的结果是相同的,但仅适用于前10个值

我想我的循环缓冲区是错误的,但我找不到任何问题。使用筛选方法在
x
中正确写入值,数组用零初始化,循环缓冲指针
n
具有正确的值。。。你有什么想法吗

// Interface
class LowpassFilter {
private:
    double x[10]; // input vector
    double y[10]; // output vector
    int n;    // pointer to the current array index

public:
    LowpassFilter(); 
    double filter(double sample);
};


// Implementation

// filter coefficients a and b
const double a[] = {1.0, -0.577240524806303, 0.421787048689562, -0.056297236491843};
const double b[] = {0.098531160923927, 0.295593482771781, 0.295593482771781, 0.098531160923927};
static int c = 0;

LowpassFilter::LowpassFilter() : x{0.0}, y{0.0}, n(0) { } // Constructor

double LowpassFilter::filter(double sample)
{
    x[n] = sample;
    y[n] = b[0] * x[n] + b[1] * x[(n-1)%10] + b[2] * x[(n-2)%10] + b[3] * x[(n-3)%10]
                       - a[1] * y[(n-1)%10] - a[2] * y[(n-2)%10] - a[3] * y[(n-3)%10];

    std::cout << c++ << ": " << y[n] << std::endl; // for checking the result with the Matlab results

    double result = y[n];
    n = (n + 1) % 10; // new pointer index 
    return result;
}
//接口
类低通滤波器{
私人:
双x[10];//输入向量
双y[10];//输出向量
int n;//指向当前数组索引的指针
公众:
低通滤波器();
双过滤器(双样本);
};
//实施
//滤波器系数a和b
常数双a[]={1.0,-0.577240524806303,0.421787048689562,-0.056297236491843};
常数双b[]={0.098531160923927,0.295593482771781,0.295593482771781,0.098531160923927};
静态int c=0;
LowpassFilter::LowpassFilter():x{0.0},y{0.0},n(0){}//构造函数
双低通滤波器::滤波器(双采样)
{
x[n]=样品;
y[n]=b[0]*x[n]+b[1]*x[(n-1)%10]+b[2]*x[(n-2)%10]+b[3]*x[(n-3)%10]
-a[1]*y[(n-1)%10]-a[2]*y[(n-2)%10]-a[3]*y[(n-3)%10];
std::cout由于和问题是
y[n]
计算中的负指数。要解决该问题,只需采用一行:

y[n] = b[0] * x[n] + b[1] * x[(n-1+m)%m] + b[2] * x[(n-2+m)%m] + b[3] * x[(n-3+m)%m]
                   - a[1] * y[(n-1+m)%m] - a[2] * y[(n-2+m)%m] - a[3] * y[(n-3+m)%m];

确保索引为正值。现在它工作正常。非常感谢!

当n==0和(n-2)%10?时,模数会发生什么变化。您的输出是什么?您看到的问题是什么。@MichaelDorner:模数确实有负值,这是问题的原因。将例如
(n-1)%10
替换为
(n+10-1)%10
以确保您始终获得预期的正值。非常感谢,您完全正确!