黄毅7789 发表于 2018-4-1 22:10:05

求助,DSP库FIR函数数值异常

本帖最后由 黄毅7789 于 2018-4-1 22:36 编辑

单片机:STM32F303RE(M4内核,带FPU)

使用arm_fir_f32函数数值异常:
程序:

#define TEST_LENGTH_SAMPLES 1000 /* 采样点数 */
#define BLOCK_SIZE 100 /* 调用一次arm_fir_f32处理的采样点个数 */
#define NUM_TAPS 29 /* 滤波器系数个数 */
uint32_t blockSize = BLOCK_SIZE;
uint32_t numBlocks = TEST_LENGTH_SAMPLES/BLOCK_SIZE; /* 需要调用arm_fir_f32的次数 */
//static float32_t testInput_f32_50Hz_200Hz; /* 采样点 */
static float32_t testOutput; /* 滤波后的输出 */
static float32_t firStateF32; /* 状态缓存,大小numTaps + blockSize - 1*/
/* 带通滤波器系数 通过fadtool获取*/
const float32_t firCoeffs32BP = {
   -0.00831860397,-0.003651876235, 0.005030068569,0.01898931712,0.03306612372,
    0.03607933968,0.01776700467, -0.02197688632, -0.06858944148, -0.09779074788,
   -0.08857547492, -0.03685576096,0.03913307562,   0.1061559916,   0.1327688545,
   0.1061559916,0.03913307562, -0.03685576096, -0.08857547492, -0.09779074788,
   -0.06858944148, -0.02197688632,0.01776700467,0.03607933968,0.03306612372,
    0.01898931712, 0.005030068569,-0.003651876235, -0.00831860397
}; char table={0};
      u16 i=0;
      arm_fir_instance_f32 S;
      float32_t *inputF32, *outputF32;
      /* 初始化输入输出缓存指针 */
      inputF32 = &aa;
      outputF32 = &testOutput;
      /* 初始化结构体S */
      arm_fir_init_f32(&S, NUM_TAPS, (float32_t *)&firCoeffs32BP, &firStateF32, blockSize);
      /* 实现FIR滤波 */
      for(i=0; i < numBlocks; i++)
      {
      arm_fir_f32(&S, inputF32 + (i * blockSize), outputF32 + (i * blockSize), blockSize);
      }
      for(i=0; i<TEST_LENGTH_SAMPLES; i++)
      {
                sprintf(table,"%f\n",testOutput);
                USART1_TX_string(table);
      }

以上大部分程序来自“安富莱_STM32-V5开发板_数字信号处理教程(V1.0)”
仅修改
1、采样点数
2、每次处理的点数
3、输入ADC数组的名称

使用arm_fir_q15函数程序跑飞:
程序
#define TEST_LENGTH_SAMPLES 1000 /* 采样点数 */
#define BLOCK_SIZE 100 /* 调用一次arm_fir_f32处理的采样点个数 */
#define NUM_TAPS 29 /* 滤波器系数个数 */
uint32_t blockSize = BLOCK_SIZE;
uint32_t numBlocks = TEST_LENGTH_SAMPLES/BLOCK_SIZE; /* 需要调用arm_fir_f32的次数 */
//static float32_t testInput_f32_50Hz_200Hz; /* 采样点 */
static q15_t testOutput; /* 滤波后的输出 */
static q15_t firStateF32; /* 状态缓存,大小numTaps + blockSize - 1*/
/* 带通滤波器系数 通过fadtool获取*/
const q15_t firCoeffs32BP =
{
   -273,   -120,    165,    622,   1084,   1182,    582,   -720,-2248,
    -3204,-2902,-1208,   1282,   3479,   4351,   3479,   1282,-1208,
    -2902,-3204,-2248,   -720,    582,   1182,   1084,    622,    165,
   -120,   -273
}; char table={0};
      u16 i=0;
      arm_fir_instance_q15 S;
      q15_t *inputq15, *outputq15;
      /* 初始化输入输出缓存指针 */
      inputq15 = &aa;
      outputq15 = &testOutput;
      /* 初始化结构体S */
      arm_fir_init_q15(&S, NUM_TAPS, (q15_t *)&firCoeffs32BP, &firStateF32, blockSize);
      /* 实现FIR滤波 */
      for(i=0; i < numBlocks; i++)
      {
      arm_fir_q15(&S, inputq15 + (i * blockSize), outputq15 + (i * blockSize), blockSize);
      }
      for(i=0; i<TEST_LENGTH_SAMPLES; i++)
      {
                sprintf(table,"%d\n",testOutput);
                USART1_TX_string(table);
      }
程序进入arm_fir_q15()内运行这行之后跑飞

eric2013 发表于 2018-4-2 00:30:30

多试试。

黄毅7789 发表于 2018-4-2 09:08:08

eric2013 发表于 2018-4-2 00:30
多试试。

往哪个方向试,现在毫无头绪。

eric2013 发表于 2018-4-3 01:26:26

黄毅7789 发表于 2018-4-2 09:08
往哪个方向试,现在毫无头绪。

别别用定点Q15,定点API涉及到定标的问题,比较麻烦。你现在用的F3是带DSP单元的,就有浮点就好。

黄毅7789 发表于 2018-4-3 22:50:38

本帖最后由 黄毅7789 于 2018-4-3 23:16 编辑

eric2013 发表于 2018-4-3 01:26
别别用定点Q15,定点API涉及到定标的问题,比较麻烦。你现在用的F3是带DSP单元的,就有浮点就好。

ARM库的滤波结果后面的基本相同,但是前面为什么会有个尖峰?

经过测试,这和您的例程和参数得到相同的结果,基本上排除了,移植错误

eric2013 发表于 2018-4-4 01:24:39

黄毅7789 发表于 2018-4-3 22:50
ARM库的滤波结果后面的基本相同,但是前面为什么会有个尖峰?

经过测试,这和您的例程和参数得到相 ...

这个是群延迟,注意群延迟问题了没

黄毅7789 发表于 2018-4-4 22:56:34

eric2013 发表于 2018-4-4 01:24
这个是群延迟,注意群延迟问题了没

抱歉我没说清楚,是这里ARM库和MATLAB有明显差异

页: [1]
查看完整版本: 求助,DSP库FIR函数数值异常