0

我想实现一个快速简单的 filtfilt 函数来放在我的嵌入式系统上。

我已经生成了系数 O 和 K。但是过滤器函数返回的结果与 MatLab 函数不同。

我被这个问题困住了,你有什么想法吗?

变量

double not_filtered_signal[10] = {9.96, 9.96, 9.959, 9.958, 9.957, 9.956, 9.954, 9.953, 9.952, 9.952};

double O[3] = {0.000241359, 0.000482718, 0.000241359};

double K[3] = {1, -1.95558, 0.956544};

C++ 代码

std::vector<double> filter(double *x, double *coeff_b, double *coeff_a)
{
    int len_x = x.size();
    int len_b = coeff_b.size();
    int len_a = coeff_a.size();

    std::vector<double> zi(len_b);

    std::vector<double> filter_x(len_x);

    if (len_a == 1)
    {
        for (int m = 0; m<len_x; m++)
        {
            filter_x[m] = coeff_b[0] * x[m] + zi[0];
            for (int i = 1; i<len_b; i++)
            {
                zi[i - 1] = coeff_b[i] * x[m] + zi[i];;
            }
        }
    }
    else
    {
        for (int m = 0; m<len_x; m++)
        {
            filter_x[m] = coeff_b[0] * x[m] + zi[0];
            for (int i = 1; i<len_b; i++)
            {
                zi[i - 1] = coeff_b[i] * x[m] + zi[i] - coeff_a[i] * filter_x[m];
            }
        }
    }
    std::cout << "filtered" << std::endl;
    for (int i = 0; i < 11; ++i) {
        std::cout << filter_x[i] << std::endl;
    }
    return filter_x;
}

int main(int argc, char **argv) {
   double not_filtered_signal[10] = {9.96, 9.96, 9.959, 9.958, 9.957, 9.956, 9.954, 9.953, 9.952, 9.952};
   double O[3] = {0.000241359, 0.000482718, 0.000241359};
   double K[3] = {1, -1.95558, 0.956544};

   filter(not_filtered_signal, O, K);
}

MATLAB 代码

output_matlab = filtfilt(o, k, not_filtered_signal)

结果

[C++_OUTPUT] = [0.00240394, 0.0119129, 0.0306129, 0.0580862, 0.0939243, 0.137728, 0.189108, 0.247685, 0.313087, 0.384953]

[OUTPUT_FROM_MATLAB] = [9.96068972064697, 9.96057742124022, 9.96046542095148, 9.96035381811049, 9.96024270955799, 9.96013218984091, 9.96002235028521, 9.95991327788561, 9.95980505407268, 9.95969775366202]

4

0 回答 0