Stm32L467的板子也拿到了一段时间了,一直不知拿它干些什么。开始想驱动个IO,串口或spi…….,后来感觉这些任何单片机都带,基本又是大同小异。就想还是试一下M4核特有的东西。我们知道M4核包含有FPU单元,单精度的浮点运算比M3会快很多。M4核还具有部分DSP指令,软件同时也提供了DSP库,我们可以直接调用。于是我就利用软件中的DSP库对FFT进行了测试。源码附件在最后,欢迎大家下载测试 步骤如下: 1 建一个1024点的数组,然后用DSP库中的函数,生成一组正弦函数,模拟采样数据。 testInput_f32_10khz =((1.2f)*arm_sin_f32(2*3.1415926f*50*i/fftSize)+1) +(arm_sin_f32(2*3.1415926f*100*i/fftSize)); 数据在testInput_f32_10khz[]中保存 2 对这组数据进行FFT计算。并观察计算结果 计算的函数为arm_rfft_fast_f32(&S, testInput_f32_10khz, (float32_t*)(&(FftOut_f32.Buf[0])), ifftFlag); 结果放在FftOut_f32.Buf[]中。这个是复数的,要找到频谱必须求模。(为什么要求模请自己看看数字信号处理) 下图 中前三个图 3 对FFT计算出的结果再用DSP库中的函数进行求模运算。并观察运算结果。 arm_cmplx_mag_f32((float32_t *)(&(FftOut_f32.Buf[0])), testOutput,fftSize) 求模的结果放在testOutput[]数组中。 下图 中后三个图 从图中可以看到模值最大的是第一个,这是FFT特点决定,然后是在50这个点和100这个两个点,我们生成这组数据时就是模拟50Hz和100Hz(((1.2f)*arm_sin_f32(2*3.1415926f*50*i/fftSize)+1) +(arm_sin_f32(2*3.1415926f*100*i/fftSize));)同时50Hz的幅值大于100Hz的。 Fft在实际中用处很多, Fft要用到实际的应用中还有很多要进行设计和控制(比如采样周期控制等)。 这里只是测试一下,抛砖引玉,不对的地方欢迎大家批评吐槽。 |
但是发现1024点的fft必须要分配很大的CSTACK才可以(大约要20多kb吧),否则会栈溢出,这样对MCU的RAM容量要求就很高,需要至少32kb。
不知lz有没有碰到同样的问题?有没有什么好的解决办法可以分享一下?
是的,我开始用的是16k的F303,编译提示越界,要用更大的RAM才行
先采样,在fft,不冲突