我试图使用一个短滤波器(8个浮点乘法和加法)来处理4kHz信号,但芯片无法忍受。我在论坛上看到有一个浮点库:arm\u cortexM0l\u math.lib。如何将其纳入项目?
嗨,Rony,
尝试从keil中选择CMSIS DSP软件组件,用于您的项目和包括arm_math.h文件.
谢谢你的对话
如何从keil中选择CMSIS DSP软件组件?顺便说一句,我做了一些测量,看起来浮点乘法大约需要5微秒。是这样吗?
请按照keil网站的链接查看如何在keil中添加软件包http://www.keil.com/support/man/docs/uv4/uv4_ca_packselect.htm
关于快速测试中的浮点运算,我可以验证浮点乘法大约需要5微秒。
我已经在没有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微秒。
我错了吗?
按照您的建议安装了软件包。
在构建项目时,我得到以下信息:\out\template.axf:警告:L6304W:输入文件重复。\out\system\u armcm0.o被忽略。..\..\..\..\..\scatterfiles\scatterfile_common.sct(327):错误:L6235E:多个节与选择器匹配-不能全部为第一个/最后一个。信息不足,无法生成SYMDEFs文件。信息不足,无法列出图像符号。信息不足,无法列出图像贴图。完成:3条信息、1条警告和1条错误消息。“\out\template.axf”-1个错误,1个警告。未创建目标
安装软件包时,我在项目中看到两个新项目:包含库的CMSIS包括启动_ARMCM0.s和系统_ARMCM0.c的设备
我认为有两个文件系统&u ARMCM0.c
您是否有使用浮点库的项目示例?
Hi MT_对话我删除了“设备”软件包,所以我所拥有的只是带有库的CMSIS。项目构建成功,但我认为软件无法访问库。如何强制将浮点路由到此库而不是内置数学库?
您不需要使用DSP库来满足您的最后期限。只要确保使用浮点计算,而不是双重计算。像1.0031这样的常量是双文本而不是浮点文本。改为写入1.0031f,否则在每次迭代中,浮点/uint16_t值将首先转换为双精度,然后进行双精度计算,当结果存储在fddd中时,结果将转换回浮点。所以你应该这样写:
对于(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;
这使得time1=21,这意味着每次迭代需要131微秒,这满足了4kHz滤波器250微秒的截止时间。
上帝保佑你,乔西姆。像冠军一样工作。祝你有一个美好而祥和的新年
嗨,Rony,
尝试从keil中选择CMSIS DSP软件组件,用于您的项目和包括arm_math.h文件.
谢谢你的对话
如何从keil中选择CMSIS DSP软件组件?
顺便说一句,我做了一些测量,看起来浮点乘法大约需要5微秒。
是这样吗?
嗨,Rony,
请按照keil网站的链接查看如何在keil中添加软件包http://www.keil.com/support/man/docs/uv4/uv4_ca_packselect.htm
关于快速测试中的浮点运算,我可以验证浮点乘法大约需要5微秒。
谢谢你的对话
我已经在没有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微秒。
我错了吗?
按照您的建议安装了软件包。
在构建项目时,我得到以下信息:
\out\template.axf:警告:L6304W:输入文件重复。\out\system\u armcm0.o被忽略。
..\..\..\..\..\scatterfiles\scatterfile_common.sct(327):错误:L6235E:多个节与选择器匹配-不能全部为第一个/最后一个。
信息不足,无法生成SYMDEFs文件。
信息不足,无法列出图像符号。
信息不足,无法列出图像贴图。
完成:3条信息、1条警告和1条错误消息。
“\out\template.axf”-1个错误,1个警告。
未创建目标
安装软件包时,我在项目中看到两个新项目:
包含库的CMSIS
包括启动_ARMCM0.s和系统_ARMCM0.c的设备
我认为有两个文件系统&u ARMCM0.c
您是否有使用浮点库的项目示例?
Hi MT_对话
我删除了“设备”软件包,所以我所拥有的只是带有库的CMSIS。
项目构建成功,但我认为软件无法访问库。
如何强制将浮点路由到此库而不是内置数学库?
您不需要使用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微秒的截止时间。
上帝保佑你,乔西姆。
像冠军一样工作。
祝你有一个美好而祥和的新年