Lynn 的整数滤波器呈线性增长趋势

信息处理 过滤器 无限脉冲响应
2022-02-10 20:48:16

我有一个以 50Hz 采样的 PPG 信号,我想使用 Lynn 的整数滤波器对信号进行滤波。IE

H(z)=(11/zm)2(11/z)2

截止频率为 5Hz,因此这给出了m3(这是一个 3db 截止),因此差分方程是

y[n]2y[n1]+y[n2]=x[n]2x[n3]+x[n6]

现在将此过滤器应用于信号,我的信号被过滤,但有一些线性分量使基线线性增加。

在此处输入图像描述

有什么建议我哪里出错了吗?

数据在基于 cortex M0 的蓝牙模块上进行处理并传输到手机。我在 Matlab 中绘制 csv 文件。

皮质 M0 代码:

float process_ppg_iir(uint16_t raw_data_ppg)
{
    int b0=1, b1=-2, b2=1, a1=-2; 
    int a2 = 1;

    if( global_sample_counter <= 7-1 )
    {
        ppg_raw[global_sample_counter] = raw_data_ppg;
        if(global_sample_counter <=3-1)
        ppg_processed[global_sample_counter] = raw_data_ppg;
        global_sample_counter++;
    }
    else
    {
        // sfit values to left

        int i=0;

        for(i=0 ;i <=5;i++)
        {
            ppg_raw[i] = ppg_raw[i+1];
        }

        ppg_processed[0] = ppg_processed[1];
        ppg_processed[1] = ppg_processed[2];

        ppg_raw[6] = raw_data_ppg;
        ppg_processed[2] = (b0*ppg_raw[6]+b1*ppg_raw[3]+b2*ppg_raw[0])- a1*ppg_processed[1]-a2*ppg_processed[0];

    }
        return ppg_processed[2];    
}
2个回答

您的低通滤波器是两个 3 点移动平均滤波器的级联,每个滤波器都实现为递归运行和滤波器。(它在 5 Hz 时的增益为 -2.4 dB。)我无法解释您的代码,但我猜您的反馈操作不正确。要测试您的代码,请确保所有累加器变量都设置为零。然后对你的滤波器应用一个单位脉冲,看看它的脉冲响应是否应该是 [1, 2, 3, 2, 1, 0, 0, 0, ...]。如果你改变你的H(z)指数来自21, 那么你的滤波器的脉冲响应应该是 [1, 1, 1, 0, 0,0, ...]。如果您的冲动反应与上述不符,那么找出它们不符的原因将解决您的问题。

这是一个作为递归滤波器(而不是具有所有 9 个系数的横向滤波器)实现的 FIR 滤波器。

注意H(z)可以写成两个后向差分和两个累加器的级联:

H(z)=(1z3)(1z3)11z111z1

有两个零极点抵消z=1,这使整个系统稳定(通过去除蓄电池引入的极点)。

在这种情况下,以正确的初始条件(例如,y[n]=0n<0)。

您正在使用单位延迟的任意值启动过滤器。这是在if语句内部,您可以在其中使用实际传入的数据(例如 )填充初始条件ppg_processed[] = raw_data_ppg这是错误的。