10个员额/0个新员额
最后一篇文章
罗尼
离线
最后一次见到:4年11个月前
主人
加入:2014-05-15 15:02
浮点数学

我试图使用一个短滤波器(8个浮点乘法和加法)来处理4kHz信号,但芯片无法忍受。
我在论坛上看到有一个浮点库:arm\u cortexM0l\u math.lib。
如何将其纳入项目?

设备:
MT_对话框
离线
最后一次见到:2个月1周前
工作人员
加入:2015-06-08 11:34
嗨,Rony,

嗨,Rony,

尝试从keil中选择CMSIS DSP软件组件,用于您的项目和包括arm_math.h文件.

谢谢你的对话

罗尼
离线
最后一次见到:4年11个月前
主人
加入:2014-05-15 15:02
如何选择CMSIS DSP

如何从keil中选择CMSIS DSP软件组件?
顺便说一句,我做了一些测量,看起来浮点乘法大约需要5微秒。
是这样吗?

MT_对话框
离线
最后一次见到:2个月1周前
工作人员
加入:2015-06-08 11:34
嗨,Rony,

嗨,Rony,

请按照keil网站的链接查看如何在keil中添加软件包http://www.keil.com/support/man/docs/uv4/uv4_ca_packselect.htm

关于快速测试中的浮点运算,我可以验证浮点乘法大约需要5微秒。

谢谢你的对话

罗尼
离线
最后一次见到:4年11个月前
主人
加入:2014-05-15 15:02
我已经用计算机测试了时间

我已经在没有keil库的情况下使用以下代码测试了计时:

uint32_t time0;
浮动fddd,yn1,yn2,yn3,yn4;
uint16_t ddd、xn1、xn2、xn3、xn4;
time0=lld_evt_time_get();

对于(int i=0;i<100;(i++){
ddd=17;
fddd=0.1672*ddd-0.6687*xn1+1.0031*xn2-0.6687*xn3+0.1672*xn4;
fddd=fddd+0.7821*yn1-0.68*yn2+0.1827*yn3-0.0301*yn4;

xn4=xn3;xn3=xn2;xn2=xn1;xn1=ddd;
yn4=yn3;yn3=yn2;yn2=yn1;yn1=fddd;
}
uint32_t time1=lld_evt_time_get();

当我检查time1-time0时,我得到大约100。
这意味着过滤器计算(8次乘法,8次加法)大约需要600微秒。

我错了吗?

罗尼
离线
最后一次见到:4年11个月前
主人
加入:2014-05-15 15:02
按照您的要求安装该软件包

按照您的建议安装了软件包。

在构建项目时,我得到以下信息:
\out\template.axf:警告:L6304W:输入文件重复。\out\system\u armcm0.o被忽略。
..\..\..\..\..\scatterfiles\scatterfile_common.sct(327):错误:L6235E:多个节与选择器匹配-不能全部为第一个/最后一个。
信息不足,无法生成SYMDEFs文件。
信息不足,无法列出图像符号。
信息不足,无法列出图像贴图。
完成:3条信息、1条警告和1条错误消息。
“\out\template.axf”-1个错误,1个警告。
未创建目标

罗尼
离线
最后一次见到:4年11个月前
主人
加入:2014-05-15 15:02
包裹什么时候寄出去的

安装软件包时,我在项目中看到两个新项目:
包含库的CMSIS
包括启动_ARMCM0.s和系统_ARMCM0.c的设备

我认为有两个文件系统&u ARMCM0.c

您是否有使用浮点库的项目示例?

罗尼
离线
最后一次见到:4年11个月前
主人
加入:2014-05-15 15:02
Hi MT_对话

Hi MT_对话
我删除了“设备”软件包,所以我所拥有的只是带有库的CMSIS。
项目构建成功,但我认为软件无法访问库。
如何强制将浮点路由到此库而不是内置数学库?

乔西姆韦
离线
最后一次见到:1年5个月前
大师
加入:2014-01-14 06:45
您不需要使用DSP

您不需要使用DSP库来满足您的最后期限。只要确保使用浮点计算,而不是双重计算。像1.0031这样的常量是双文本而不是浮点文本。改为写入1.0031f,否则在每次迭代中,浮点/uint16_t值将首先转换为双精度,然后进行双精度计算,当结果存储在fddd中时,结果将转换回浮点。所以你应该这样写:


uint32_t time0;
浮动fddd,yn1,yn2,yn3,yn4;
uint16_t ddd、xn1、xn2、xn3、xn4;
time0=lld_evt_time_get();

对于(int i=0;i<100;(i++){
ddd=17;
fddd=0.1672f*ddd-0.6687f*xn1+1.0031f*xn2-0.6687f*xn3+0.1672f*xn4;
fddd=fddd+0.7821f*yn1-0.68f*yn2+0.1827f*yn3-0.0301f*yn4;

xn4=xn3;xn3=xn2;xn2=xn1;xn1=ddd;
yn4=yn3;yn3=yn2;yn2=yn1;yn1=fddd;
}
uint32_t time1=lld_evt_time_get();

这使得time1=21,这意味着每次迭代需要131微秒,这满足了4kHz滤波器250微秒的截止时间。

罗尼
离线
最后一次见到:4年11个月前
主人
加入:2014-05-15 15:02
谢谢

上帝保佑你,乔西姆。
像冠军一样工作。
祝你有一个美好而祥和的新年