我想实现一个快速简单的 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]