IIR低通滤波器在C ++中的实现

迈克尔·多纳

我有一个来自Matlab函数的Butterworth低通滤波器的滤波器系数,[b, a] = butter(3, 0.4, 'low')并且根据Matlab的文档我实现了Matlab正在使用的相同计算filter(b, a, X)例如,对5.0的恒定信号进行滤波的结果是相同的,但仅对于前10个值!

我想我的循环缓冲区是错误的,但是我找不到任何问题。x使用filter方法正确地写入值,将数组初始化为零,圆形缓冲区指针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;
}
迈克尔·多纳

多亏迈克•西摩Mike Seymour)埃姆斯(emsr),问题成为了计算的负指标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];

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C中的低通滤波器

来自分类Dev

如何在C中实现IIR滤波器?

来自分类Dev

OpenCL中的低通滤波器

来自分类Dev

Python中的低通滤波器

来自分类Dev

MATLAB中的低通滤波器返回NaN值

来自分类Dev

在Matlab中设计一个低通滤波器

来自分类Dev

在MATLAB中的**任意**位置提取IIR滤波器状态

来自分类Dev

如何实现低通滤波器以减少陀螺仪值中的噪声?

来自分类Dev

如何在Android中为输入音频实现IIR带通滤波器

来自分类Dev

在SciPy中创建低通滤波器-了解方法和单位

来自分类Dev

低通滤波器从熊猫数据框中获取数据的二阶导数

来自分类Dev

如何在scipy.signal中制作一个低通滤波器?

来自分类Dev

在MATLAB中实现均值滤波器

来自分类Dev

C中的FIR滤波器?

来自分类Dev

C中的定点FIR滤波器?

来自分类Dev

C ++中的FIR滤波器

来自分类Dev

C语言中的Biquad滤波器示例实现

来自分类Dev

在尺寸为NxM的图像上应用低通滤波器(AxB)的过程中没有计算量

来自分类Dev

应用低通滤波器

来自分类Dev

FFT低通滤波器

来自分类Dev

FPGA的低通滤波器

来自分类Dev

FFT低通滤波器

来自分类Dev

应用低通滤波器

来自分类Dev

如何创建没有舍入误差的简单IIR低通滤波器?(16位pcm数据)

来自分类Dev

在UWP C#中应用高通滤波器

来自分类Dev

C中的Gabor滤波器卷积矩阵

来自分类Dev

高斯滤波器正确实现

来自分类Dev

使用向量实现 FIR 滤波器

来自分类Dev

使用MATLAB中的系数在C ++中进行FIR滤波器设计,滤波器未给出正确的结果