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要用到实际的应用中还有很多要进行设计和控制(比如采样周期控制等)。
这里只是测试一下,抛砖引玉,不对的地方欢迎大家批评吐槽。
|