打印

stm32f3系列使用fpu和dsp的基本设置

[复制链接]
10148|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
smartmcu|  楼主 | 2013-1-27 17:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    看到很多初入者对 stm32f3系列使用fpu和dsp的基本设置没概念,现从 STM32F3-Discovery_FW_V1.1.0\Libraries\CMSIS\Documentation\DSP\html\index.html Ctrl+c Ctrl+v些东西过来,方便,提醒一下

在工程的option里c/c++的preproccesor symbols 的define里,加入,用逗号隔开
ARM_MATH_CM4
ARM_MATH_BIG_ENDIAN(如果用的是little ended的格式就忽略此项)
ARM_MATH_MATRIX_CHECK
ARM_MATH_ROUNDING
__FPU_PRESENT = 1
即可

然后编译链接时,会提示没有那些数学函数,解决方法很简单:在工程中把含dsp和fpu的函数库加进来就行。
方法是:添加 Keil\ARM\CMSIS\Lib\ARM\arm_cortexM4lf_math.lib到工程中即可。当然,如果用的是big ended的格式就选 arm_cortexM4bf_math.lib。

好好享受高速的快感吧:lol
沙发
smartmcu|  楼主 | 2013-1-27 17:09 | 只看该作者
当然,#include "arm_math.h" 是必须的

使用特权

评论回复
板凳
qiaoyang123| | 2013-4-12 21:47 | 只看该作者
楼主有没有程序实例  cfft和rfft有什么区别了?   还有输出数据存储是什么格式?

使用特权

评论回复
地板
cailantu| | 2013-8-30 14:29 | 只看该作者
谢谢楼主分享

使用特权

评论回复
5
yang4469| | 2014-4-3 18:16 | 只看该作者
“添加 Keil\ARM\CMSIS\Lib\ARM\arm_cortexM4lf_math.lib到工程中即可”怎么添加啊,能详细点么
我在define里面加了ARM_MATH_CM4等,编译,和之前没有区别呢。。。

使用特权

评论回复
6
圣骑士by| | 2014-4-17 17:16 | 只看该作者
标记一下

使用特权

评论回复
7
anran莫莫| | 2014-4-17 19:58 | 只看该作者
:)

使用特权

评论回复
8
ticomi| | 2014-7-21 17:03 | 只看该作者
请教下,这个库里面怎么使用三角函数呢?非常感谢!!

使用特权

评论回复
9
myst| | 2014-9-25 17:31 | 只看该作者

本帖最后由 myst 于 2014-9-25 17:17 编辑


我直接拿官方的FFT测试实例。
修改了初始值。。。

代码如下;

int32_t main(void)
{
for(index=0;index<2048;index++)
         {  
                  testInput_f32_10khz[index]= 100*sin(3.14*index/512);
        }

  arm_cfft_f32(&arm_cfft_sR_f32_len1024, testInput_f32_10khz, ifftFlag, doBitReverse);

  arm_cmplx_mag_f32(testInput_f32_10khz, testOutput, fftSize);  

  arm_max_f32(testOutput, fftSize, &maxValue, &testIndex);

   for(index=0;index<1024;index++)
         {
           printf("index%d =%d\r\n",index,(u32)testOutput[index]);
         
         }

  while(1);                             /* main function does not return */
}


1. 如果2048个点,我直接取正弦波的值,那么打印出来是

index2 =72203
index1022 =72647
貌似是对称的。。。
for(index=0;index<2048;index++)
         {  
                  testInput_f32_10khz[index]= 100*sin(3.14*index/512);
        }



2.但是如果2048个点,我按照下面方式
        for(index=0;index<2048;index++)
         {  

        if(index%2==0)
                  testInput_f32_10khz[index]= 100*sin(3.14*index/512);
            else
             testInput_f32_10khz[index]= 100*cos(3.14*index/512);
        }
那么测试出来是
index1022 =102399
不对称。。。

3.如果我虚部为0,实部位正弦值:
        for(index=0;index<2048;index++)
         {  

        if(index%2==0)
                  testInput_f32_10khz[index]= 100*sin(3.14*index/512);
            else
             testInput_f32_10khz[index]= 0;
        }

出来是
index2 =51212
index1022 =51212
是对称的。。


请问这怎么理解呢???
如果我ADC采集一个信号,我应该怎样设置这个初始值呢?请教高手

使用特权

评论回复
10
foxglove| | 2015-2-16 20:37 | 只看该作者
强帖留名,,,,

使用特权

评论回复
11
zh113214| | 2015-2-28 21:25 | 只看该作者
这些设置是必须的吗,我怎么不知道啊

使用特权

评论回复
12
xihui| | 2015-12-23 09:11 | 只看该作者
感谢楼主分享!

使用特权

评论回复
13
zhaoqing9008| | 2016-2-26 16:43 | 只看该作者
mark

使用特权

评论回复
14
天一止水| | 2016-12-14 16:47 | 只看该作者
myst 发表于 2014-9-25 17:31
本帖最后由 myst 于 2014-9-25 17:17 编辑

这是FFT原理的问题,我没记错的话,回去补补吧,主要是数学方面的知识;附:只要看懂图就好,知道怎么避免就可以了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

199

帖子

2

粉丝