硬汉嵌入式论坛

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

[有问必答] STM32F0 使用DSP库中arm_cfft_f32总是进入HardFault

[复制链接]

2

主题

9

回帖

15

积分

新手上路

积分
15
发表于 2020-7-13 19:33:59 | 显示全部楼层 |阅读模式
有大佬帮忙指点一下吗?第一次用dsp库的fft。STM32F0 使用DSP库中arm_cfft_f32总是进入HardFault,单步仿真发现是进arm_cfft_radix8by2_f32这个函数后,单步执行几下,就进HardFault,修改过堆栈大小,没有解决掉
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106749
QQ
发表于 2020-7-14 09:04:35 | 显示全部楼层
hardfault的错误类型是什么,调用个简单浮点运算api是否正常,比计算sin。

先把问题方向锁定了。
回复

使用道具 举报

2

主题

9

回帖

15

积分

新手上路

积分
15
 楼主| 发表于 2020-7-16 10:45:35 | 显示全部楼层
arm_sin_f32(2*3.1415926f*50*i/1000);这个运行是正常的,用printf打印出来看过。

hardfault的错误类型我不知道怎样通过那些调试时看到的寄存器去判断是什么错误类型,但我估计是RAM不够,内存溢出导致的

这是运行arm_cfft_f32函数时,进hardfault的寄存器图

这是运行arm_cfft_f32函数时,进hardfault的寄存器图

这是arm_sin_f32(2*3.1415926f*50*i/1000)运行后打印在串口助手上的波形

这是arm_sin_f32(2*3.1415926f*50*i/1000)运行后打印在串口助手上的波形

f031_fft_demo0716.rar

1019.42 KB, 下载次数: 57

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106749
QQ
发表于 2020-7-16 10:57:15 | 显示全部楼层
beck 发表于 2020-7-16 10:45
arm_sin_f32(2*3.1415926f*50*i/1000);这个运行是正常的,用printf打印出来看过。

hardfault的错误类型 ...

调试状态有个hardfault report的。
回复

使用道具 举报

2

主题

9

回帖

15

积分

新手上路

积分
15
 楼主| 发表于 2020-7-16 11:48:43 | 显示全部楼层
M0内核好像没有这个fault reports,M3、M4内核有,我之前也用过这个fault reports,但M0的这个仿真就没有看到这个窗口选项,
下面这个链接是老外问别人回答的这个,说让用call stack +locals窗口鼠标跳转去找fault位置,但那个fft函数是库,我就没法。


https://community.arm.com/developer/tools-software/tools/f/keil-forum/32797/fault-reports-dialog?pifragment-22305=4



这个是链接里面的内容

这个是链接里面的内容

这个是我仿真窗口截图

这个是我仿真窗口截图
回复

使用道具 举报

2

主题

9

回帖

15

积分

新手上路

积分
15
 楼主| 发表于 2020-7-16 11:54:08 | 显示全部楼层
还有些问题想请教硬汉哥,因为arm_cfft_f32使用不成功,我就去用了arm_cfft_radix2_q15,按照你的教程弄的,当fft信号输入采用testInput_q15[i*2] = arm_sin_q15(1638*j);

arm_cfft_radix2_q15(&S, testInput_q15);后,再用arm_cmplx_mag_q15计算模值出来没有问题,但fft信号输入采用我自己传入的AD数据,用arm_cmplx_mag_q15计算模值就有问题,

和用matlab整出来的图形不一样,下面是图,但我不用arm_cmplx_mag_q15来计算模值,自己去拿arm_cfft_radix2_q15后的数据出来自己算模值,出来的波形就是对的了,

是我的用法有问题吗?还是说arm_cmplx_mag_q15有点问题呢?


ad数据

ad数据

matlab计算ad数据fft

matlab计算ad数据fft

OriginPro软件计算ad数据fft

OriginPro软件计算ad数据fft

ad原始数据波形(蓝色线)和调用arm_cfft_radix2_q15后用arm_cmplx_mag_q15得到的模值(红色线)

ad原始数据波形(蓝色线)和调用arm_cfft_radix2_q15后用arm_cmplx_mag_q15得到的模值(红色线)

这是arm_cfft_radix2_q15后我自己把数据拿出来excel计算的模值

这是arm_cfft_radix2_q15后我自己把数据拿出来excel计算的模值
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106749
QQ
发表于 2020-7-16 12:02:41 | 显示全部楼层
beck 发表于 2020-7-16 11:54
还有些问题想请教硬汉哥,因为arm_cfft_f32使用不成功,我就去用了arm_cfft_radix2_q15,按照你的教程弄的 ...

这个图稍有点凌乱,你可以在Matlab里面把原始波形,Matlab计算的幅频响应,arm_cfft_radix2_q15计算的幅频响应,arm_cfft_f32计算的幅频响应都展示出来。

如果大体一致,说明是没问题的,先不要看数值大小。

你使用arm_cfft_radix2_q15是采用的定点数格式,他计算出来的数据已经不再是Q15,是Qx.y,具体x和y是多少,在源码注释上有说明。
回复

使用道具 举报

2

主题

9

回帖

15

积分

新手上路

积分
15
 楼主| 发表于 2020-7-16 12:08:07 | 显示全部楼层
硬汉哥,然后还有个问题我看教程不太懂,通过fft后的频域幅频图,可以计算出某点时域上的幅值,
教程中有说“假设原始信号的峰值为 A,那么 FFT 的结果的每个点(除了第一个点直流分量之外)的模值就是 A的 N/2 倍。 而第一个点就是直流分量,它的模值就是直流分量的 N 倍。”,这个我知道如何计算出来。
但是matlab图形和stm32dsp库fft后图形,它们的Y轴模值幅度不一样。我有看到教程中有说因为防止溢出,基2的fft蝶形运算每次要缩小0.5倍,那么我用的是arm_cfft_radix2_q15,我该怎么计算出时域某点的幅值呢?  




教程中的FFT对比图.png
教程中FFT的说明.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106749
QQ
发表于 2020-7-16 12:13:32 | 显示全部楼层
beck 发表于 2020-7-16 12:08
硬汉哥,然后还有个问题我看教程不太懂,通过fft后的频域幅频图,可以计算出某点时域上的幅值,
教程中有 ...

看我7楼的回复即可。

这个说明适用于浮点FFT函数的。

而你定点FFT是不同的,知道了你输出输出的Q格式后,即Qx.y,具体x和y是多少,在源码注释上有说明。

转换后,再按照这个转换就正常了。


就帮你这么多吧,剩下你自己再研究下,结帖。
回复

使用道具 举报

2

主题

9

回帖

15

积分

新手上路

积分
15
 楼主| 发表于 2020-7-16 12:23:46 | 显示全部楼层
刚刚编辑最后一个问的时候没看到回复。好的,感谢,我再自己研究研究
回复

使用道具 举报

36

主题

249

回帖

357

积分

高级会员

积分
357
发表于 2020-9-10 15:44:45 | 显示全部楼层
版主  串口波形助手 给个包呗
回复

使用道具 举报

2

主题

9

回帖

15

积分

新手上路

积分
15
 楼主| 发表于 2020-10-13 14:01:38 | 显示全部楼层
本帖最后由 beck 于 2020-10-14 13:42 编辑
zhengwending 发表于 2020-9-10 15:44
版主  串口波形助手 给个包呗

附件不知道怎么的添加不了,串口波形助手,改在百度云了
链接:https://pan.baidu.com/s/1JbB6816RHQiRI2i5xyIjxw
提取码:wyjs
回复

使用道具 举报

3

主题

32

回帖

41

积分

新手上路

积分
41
发表于 2020-10-15 18:59:33 | 显示全部楼层
beck, 我最近也在调试f0+fft,遇到了一些问题,你看一下我的帖子,可否一起探讨一下
回复

使用道具 举报

3

主题

32

回帖

41

积分

新手上路

积分
41
发表于 2020-10-15 19:05:26 | 显示全部楼层
后面我改用arm_cfft_radix4_q15计算,调用3此这个函数程序就会进入错误中断,而且每次计算出来的值也不一样。。感觉就不对

后面又改用arm_cfft_radix2_q15计算,反复调用也不会进入错误中断,但是每次计算的值还是不一样,不知道是哪里出了问题了,

我每次的参与计算的原始数据都是一样的


回复

使用道具 举报

3

主题

32

回帖

41

积分

新手上路

积分
41
发表于 2020-10-15 19:06:35 | 显示全部楼层
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2023-9-19 09:43:29 | 显示全部楼层
beck 发表于 2020-10-13 14:01
附件不知道怎么的添加不了,串口波形助手,改在百度云了
链接:https://pan.baidu.com/s/1JbB6816RHQiRI ...

你好,下载链接失效了,能在发一个么,十分感谢!
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2023-9-19 09:54:03 | 显示全部楼层
zhengwending 发表于 2020-9-10 15:44
版主  串口波形助手 给个包呗

你好 这个软件安装包有么,能不能给我发下,原作者的连接失效了
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2023-10-28 17:46:36 | 显示全部楼层
感谢楼主,看了你的贴子很有启发。
6#提到的问题,我把输入testInput_q15的数据先转换成Q15格式之后,最后输出的模值就正常了。文档中7.3.1中提到了这个方法。


[C] 纯文本查看 复制代码
		pSrcB2 = (((float)data_1[i])/10000.0)*32768;
    testInput_q15[i*2] =pSrcB2;//(((float)data_1[i])/1000.0)*32768;
1698486069351.jpg
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-4 06:12 , Processed in 0.228702 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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