randolph 发表于 2016-5-10 18:48:52

IIR滤波,C语言代码实现

请教版主和各路大神,我使用IIR低通滤波(基于matlab和ARM DSP)来处理MEMS加速度传感器输出值, 传感器采样100Hz, 想得到一个正常人呼吸的波形图。使用IIR过滤得到了一个较为规则的波形,单并不是呼吸的波形


滤波器系数采用matlab生成,代码如下

#define MEDIAN_FILTER_WINDOW 3
static u16 mf_array;
static u8 median_filter_index = 0;

static float32_t testInput_f32_50Hz_200Hz;
static float32_t testOutput;
static float32_t IIRStateF32;


const float32_t IIRCoeffs32LP = {
1.0f, 2.0f, 1.0f, 1.3209134308194264f, -0.63273879288527657f,      
1.0f, 2.0f, 1.0f, 1.0485995763626117f, -0.29614035756166951f

};

static void arm_iir_f32_lp(void)
{
    uint32_t i;
    arm_biquad_casd_df1_inst_f32 S;
    float32_t ScaleValue;
    /* 初始化 */
    arm_biquad_cascade_df1_init_f32(&S, numStages, (float32_t *)&IIRCoeffs32LP, (float32_t
    *)&IIRStateF32);
    /* IIR滤波 */
    arm_biquad_cascade_df1_f32(&S, testInput_f32_50Hz_200Hz, testOutput, TEST_LENGTH_SAMPLES);
    /*放缩系数 */
//    ScaleValue = 0.052219514664161221f * 0.04279801741658381f;
    ScaleValue = 0.077956340516462552f * 0.061885195299764481f;
    /* 打印滤波后结果 */
    for(i=0; i<TEST_LENGTH_SAMPLES; i++)
    {
    printf("%f\r\n", testOutput*ScaleValue);
    }
}
最终输出结果的matlab显示如下:

   这不是我想要的结果,我该如何处理,求大神指点。

eric2013 发表于 2016-5-10 22:38:25

先对比正常的波形和含有噪声波形的FFT,看看噪声主要在那个频段,然后再做相应的滤波。

randolph 发表于 2016-5-26 12:51:39

回 eric2013 的帖子

eric2013:先对比正常的波形和含有噪声波形的FFT,看看噪声主要在那个频段,然后再做相应的滤波。 (2016-05-10 22:38) images/back.gif

发现原因了,因为我是每采样一个点,就计算一次,导致最终结果很小, 现在我每32个点处理一次,值是正常的,为什么会这样,也不清楚
那么,每次处理多少个点会不会影响最终的滤波效果呢?比如32个点和400个点

eric2013 发表于 2016-5-26 14:03:17

回 randolph 的帖子

randolph:发现原因了,因为我是每采样一个点,就计算一次,导致最终结果很小, 现在我每32个点处理一次,值是正常的,为什么会这样,也不清楚
  那么,每次处理多少个点会不会影响最终的滤波效果呢?  比如32个点和400个点  (2016-05-26 12:51) images/back.gif

要大于1个点,DSP教程有说。

randolph 发表于 2016-5-26 15:26:52

现在发现论坛上有好多资料可以参考。
   我在设计滤波器时遇到了问题,加速度传感器采样频率100hz, 要从里面提取出呼吸波形(呼吸大概2.5秒一次), 使用fir滤波器,fdatool该如何设计参数?

xgqxgq 发表于 2016-7-28 09:47:01

LZ你好,你的滤波是滤掉多少赫兹的呀,我现在程序也是这样,可我想滤掉50HZ的,却不成功
页: [1]
查看完整版本: IIR滤波,C语言代码实现