qq_33787896 2019-04-24 19:02 采纳率: 0%
浏览 481

FIR低通滤波器输入缓冲区为频率等于0的常数,输出缓冲区是否跟随输入?

请教老师:

用MATLAB的FDATool设计一个FIR低通滤波器,Fs=4HZ,Fc=1.5HZ,Order=16,输入采样32个值恒定=1.那么滤波器输出是不是应该=1 ?

我用STM32的CMSIS库函数arm_fir_f32(&S, inputF32 + (i * blockSize), outputF32 + (i * blockSize), blockSize);

把输入缓冲区的数值全部为1,输出缓冲区数值却是随机的,这是为什么?

#define TEST_LENGTH_SAMPLES  16    /* 采样点数 */
#define BLOCK_SIZE           16    /* 调用一次arm_fir_f32处理的采样点个数 */
#define NUM_TAPS             15  //29   /* 滤波器系数个数 */


uint32_t blockSize = BLOCK_SIZE;
uint32_t numBlocks = TEST_LENGTH_SAMPLES/BLOCK_SIZE;            /* 需要调用arm_fir_f32的次数 */

static float32_t testInput_f32_50Hz_200Hz[TEST_LENGTH_SAMPLES]; /* 采样点 */
static float32_t testOutput[TEST_LENGTH_SAMPLES];               /* 滤波后的输出 */
static float32_t firStateF32[BLOCK_SIZE + NUM_TAPS - 1];        /* 状态缓存,大小numTaps + blockSize - 1*/


/* 低通滤波器系数 通过fadtool获取  FS=4HZ,FC=1.5HZ */
const float32_t firCoeffs32LP[NUM_TAPS] = {
  -0.002572332276, 0.006660863757, -0.01139776595,1.279498026e-17,   0.0481939055,
    -0.1315901577,   0.2148257494,           0.75,   0.2148257494,  -0.1315901577,
     0.0481939055,1.279498026e-17, -0.01139776595, 0.006660863757,-0.002572332276
};

int main(void)
{
uint8_t ucKeyCode;      /* 按键代码 */
    uint16_t i;


    for(i=0; i<16; i++)
    {
            testInput_f32_50Hz_200Hz[i] = 1.0;
    }


while (1)
    {

            arm_fir_f32_lp();    //27ms执行周期


    for(i=0; i<16; i++)
    {

    y=testOutput[i];

    //   timeDly(1000);

    }





    }


}

static void arm_fir_f32_lp(void)
{
    uint32_t i;
    arm_fir_instance_f32 S;
    float32_t  *inputF32, *outputF32;

    /* 初始化输入输出缓存指针 */
    inputF32 = &testInput_f32_50Hz_200Hz[0];
    outputF32 = &testOutput[0];

    /* 初始化结构体S */
    arm_fir_init_f32(&S, NUM_TAPS, (float32_t *)&firCoeffs32LP[0], &firStateF32[0], blockSize);

    /* 实现FIR滤波 */
//  for(i=0; i < numBlocks; i++)
    //{
    i=0;    
    arm_fir_f32(&S, inputF32 + (i * blockSize), outputF32 + (i * blockSize), blockSize);
//  }


    }
}


  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-09 03:08
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    在你的代码中,你使用了arm_fir_f32函数来实现FIR滤波。这个函数的主要目的是计算FIR滤波器的输出,并将其存储在一个数组中。

    在这个例子中,你设置了一个循环,每次迭代都计算并存储FIR滤波器的输出。然而,当你需要将这些输出结果用于后续操作时,例如绘制图像或进行进一步的分析,你应该确保这些输出是连续的。这意味着在FIR滤波器输出被存储后,你应当更新输出缓冲区,以便它们能够保持与输入相同的格式和大小。

    此外,在你的main()函数中,你没有正确地更新输出缓冲区。你应该在FIR滤波器的输出被存储后立即更新输出缓冲区,而不是等到整个过程结束后才这样做。

    因此,为了使你的代码正常工作并且得到正确的结果,你需要修改你的main()函数以确保输出缓冲区总是包含与输入相同的数据量,并且在FIR滤波器输出被存储后立即更新它。

    以下是修改后的代码:

    #include "stm32f4xx_hal.h"
    
    #define TEST_LENGTH_SAMPLES  16    /* 采样点数 */
    #define BLOCK_SIZE           16    /* 调用一次arm_fir_f32处理的采样点个数 */
    #define NUM_TAPS             15  //29   /* 滤波器系数个数 */
    
    static float32_t testInput_f32_50Hz_200Hz[TEST_LENGTH_SAMPLES]; /* 采样点 */
    static float32_t testOutput[TEST_LENGTH_SAMPLES];               /* 滤波后的输出 */
    static float32_t firStateF32[BLOCK_SIZE + NUM_TAPS - 1];        /* 状态缓存,大小numTaps + blockSize - 1*/
    
    const float32_t firCoeffs32LP[NUM_TAPS] = {
      -0.002572332276, 0.006660863757, -0.01139776595,1.279498026e-17,   0.0481939055,
        -0.1315901577,   0.2148257494,           0.75,   0.2148257494,  -0.1315901577,
         0.0481939055,1.279498026e-17, -0.01139776595, 0.006660863757,-0.002572332276
    };
    
    int main(void)
    {
        uint8_t ucKeyCode;      /* 按键代码 */
        uint16_t i;
    
        for(i=0; i<16; i++)
        {
            testInput_f32_50Hz_200Hz[i] = 1.0;
        }
    
        while (1)
        {
            arm_fir_f32_lp();    //27ms执行周期
    
            for(i=0; i<16; i++)
            {
                testOutput[i] = testOutput[i];
            }
    
            timeDly(1000);       //延迟1秒
        }
    
        return 0;
    }
    
    static void arm_fir_f32_lp(void)
    {
        uint32_t i;
        arm_fir_instance_f32 S;
        float32_t  *inputF32, *outputF32;
    
        /* 初始化输入输出缓存指针 */
        inputF32 = &testInput_f32_50Hz_200Hz[0];
        outputF32 = &testOutput[0];
    
        /* 初始化结构体S */
        arm_fir_init_f32(&S, NUM_TAPS, (float32_t *)&firCoeffs32LP[0], &firStateF32[0], blockSize);
    
        /* 实现FIR滤波 */
        for(i=0; i < NUM_TAPS; i++) { /* 这里应该是numTaps */
            arm_fir_f32(&S, inputF32 + (i * blockSize), outputF32 + (i * blockSize), blockSize);
        }
    }
    

    注意:这段代码可能需要根据具体的硬件配置和FIR滤波器的具体参数进行调整。

    评论

报告相同问题?