硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2966|回复: 6
收起左侧

[信号与系统] 求助,DSP库FIR函数数值异常

[复制链接]

5

主题

26

回帖

41

积分

新手上路

积分
41
发表于 2018-4-1 22:10:05 | 显示全部楼层 |阅读模式
本帖最后由 黄毅7789 于 2018-4-1 22:36 编辑

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

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

  1. #define TEST_LENGTH_SAMPLES 1000 /* 采样点数 */
  2. #define BLOCK_SIZE 100 /* 调用一次arm_fir_f32处理的采样点个数 */
  3. #define NUM_TAPS 29 /* 滤波器系数个数 */
  4. uint32_t blockSize = BLOCK_SIZE;
  5. uint32_t numBlocks = TEST_LENGTH_SAMPLES/BLOCK_SIZE; /* 需要调用arm_fir_f32的次数 */
  6. //static float32_t testInput_f32_50Hz_200Hz[TEST_LENGTH_SAMPLES]; /* 采样点 */
  7. static float32_t testOutput[TEST_LENGTH_SAMPLES]; /* 滤波后的输出 */
  8. static float32_t firStateF32[BLOCK_SIZE + NUM_TAPS - 1]; /* 状态缓存,大小numTaps + blockSize - 1*/
  9. /* 带通滤波器系数 通过fadtool获取*/
  10. const float32_t firCoeffs32BP[NUM_TAPS] = {
  11.    -0.00831860397,-0.003651876235, 0.005030068569,  0.01898931712,  0.03306612372,
  12.     0.03607933968,  0.01776700467, -0.02197688632, -0.06858944148, -0.09779074788,
  13.    -0.08857547492, -0.03685576096,  0.03913307562,   0.1061559916,   0.1327688545,
  14.      0.1061559916,  0.03913307562, -0.03685576096, -0.08857547492, -0.09779074788,
  15.    -0.06858944148, -0.02197688632,  0.01776700467,  0.03607933968,  0.03306612372,
  16.     0.01898931712, 0.005030068569,-0.003651876235, -0.00831860397
  17. };
复制代码
  1. char table[20]={0};
  2.         u16 i=0;
  3.         arm_fir_instance_f32 S;
  4.         float32_t *inputF32, *outputF32;
  5.         /* 初始化输入输出缓存指针 */
  6.         inputF32 = &aa[0];
  7.         outputF32 = &testOutput[0];
  8.         /* 初始化结构体S */
  9.         arm_fir_init_f32(&S, NUM_TAPS, (float32_t *)&firCoeffs32BP[0], &firStateF32[0], blockSize);
  10.         /* 实现FIR滤波 */
  11.         for(i=0; i < numBlocks; i++)
  12.         {
  13.         arm_fir_f32(&S, inputF32 + (i * blockSize), outputF32 + (i * blockSize), blockSize);
  14.         }
  15.         for(i=0; i<TEST_LENGTH_SAMPLES; i++)
  16.         {
  17.                 sprintf(table,"%f\n",testOutput[i]);
  18.                 USART1_TX_string(table);
  19.         }
复制代码
QQ截图20180401215808.png

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

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

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106739
QQ
发表于 2018-4-2 00:30:30 | 显示全部楼层
多试试。
回复

使用道具 举报

5

主题

26

回帖

41

积分

新手上路

积分
41
 楼主| 发表于 2018-4-2 09:08:08 | 显示全部楼层

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

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106739
QQ
发表于 2018-4-3 01:26:26 | 显示全部楼层
黄毅7789 发表于 2018-4-2 09:08
往哪个方向试,现在毫无头绪。

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

使用道具 举报

5

主题

26

回帖

41

积分

新手上路

积分
41
 楼主| 发表于 2018-4-3 22:50:38 | 显示全部楼层
本帖最后由 黄毅7789 于 2018-4-3 23:16 编辑
eric2013 发表于 2018-4-3 01:26
别别用定点Q15,定点API涉及到定标的问题,比较麻烦。你现在用的F3是带DSP单元的,就有浮点就好。

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

经过测试,这和您的例程和参数得到相同的结果,基本上排除了,移植错误
QQ截图20180403231358.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106739
QQ
发表于 2018-4-4 01:24:39 | 显示全部楼层
黄毅7789 发表于 2018-4-3 22:50
ARM库的滤波结果后面的基本相同,但是前面为什么会有个尖峰?

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

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

使用道具 举报

5

主题

26

回帖

41

积分

新手上路

积分
41
 楼主| 发表于 2018-4-4 22:56:34 | 显示全部楼层
eric2013 发表于 2018-4-4 01:24
这个是群延迟,注意群延迟问题了没

抱歉我没说清楚,是这里ARM库和MATLAB有明显差异
QQ截图20180404225254.png
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-3 11:52 , Processed in 0.222466 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表