在STM32F4上使用rfft功能时,FFT结果错误

时间:2018-05-04 12:04:43

标签: arm signal-processing fft stm32 cmsis

我试图在STM32F407G中使用rfft功能,当我将其与online fft calculator 进行比较时,我得到的结果是错误的。我给出了一个样本输入为{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22 ,23,24,25,26,27,28,29,30,31,32}。我使用在线计算器的结果如下 -

1)   528 + 0j 
2)  -16 + 162.450726j
3)  -16 + 80.437432j
4)  -16 + 52.744931j
5)  -16 + 38.627417j
6)  -16 + 29.933895j
7)  -16 + 23.945692j
8)  -16 + 19.496056j
9)  -16 + 16j
10) -16 + 13.130861j
11) -16 + 10.690858j
12) -16 + 8.552178j
13) -16 + 6.627417j
14) -16 + 4.853547j
15) -16 + 3.182598j
16) -16 + 1.575862j
17) -16 + 0j
18) -16 - 1.575862j
19) -16 - 3.182598j
20) -16 - 4.853547j
21) -16 - 6.627417j
22) -16 - 8.552178j
23) -16 - 10.690858j
24) -16 - 13.130861j
25) -16 - 16j
26) -16 - 19.496056j
27) -16 - 23.945692j
28) -16 - 29.933895j
29) -16 - 38.627417j
30) -16 - 52.744931j
31) -16 - 80.437432j
32) -16 - 162.450726j

但使用我的代码的结果完全不同。我得到以下结果 -

    ffttestop[0]    float32_t   528 
    ffttestop[1]    float32_t   -16 
    ffttestop[2]    float32_t   -19.6766739 
    ffttestop[3]    float32_t   125.12075   
    ffttestop[4]    float32_t   -22.83638   
    ffttestop[5]    float32_t   46.0686264  
    ffttestop[6]    float32_t   -24.1503487 
    ffttestop[7]    float32_t   25.8768311  
    ffttestop[8]    float32_t   -25.7224121 
    ffttestop[9]    float32_t   15.1554413  
    ffttestop[10]   float32_t   -28.2019958 
    ffttestop[11]   float32_t   7.10556698  
    ffttestop[12]   float32_t   -32.8137932 
    ffttestop[13]   float32_t   -1.21792603 
    ffttestop[14]   float32_t   -43.8981056 
    ffttestop[15]   float32_t   -14.4978828 
    ffttestop[16]   float32_t   -96.4374313 
    ffttestop[17]   float32_t   -64.4374313 
    ffttestop[18]   float32_t   26.5798321  
    ffttestop[19]   float32_t   48.0752258  
    ffttestop[20]   float32_t   6.12293482  
    ffttestop[21]   float32_t   25.4729309  
    ffttestop[22]   float32_t   -0.353181839    
    ffttestop[23]   float32_t   16.9155769  
    ffttestop[24]   float32_t   -3.09499454 
    ffttestop[25]   float32_t   11.9728451  
    ffttestop[26]   float32_t   -3.78621292 
    ffttestop[27]   float32_t   8.55855846  
    ffttestop[28]   float32_t   -1.21792793 
    ffttestop[29]   float32_t   6.12293386  
    ffttestop[30]   float32_t   29.4866867  
    ffttestop[31]   float32_t   6.05591106  

这是我的代码 -

#include "stm32f4xx.h"
#include "arm_math.h"
#include "arm_const_structs.h"
#include "core_cm4.h"


#define TEST_LENGTH_SAMPLES 32

/* -------------------------------------------------------------------
*  Input and Output buffer Declarations for FFT
* ------------------------------------------------------------------- */
float32_t ffttestip[TEST_LENGTH_SAMPLES]=
{
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32
};
static float32_t ffttestop[TEST_LENGTH_SAMPLES];

/* ------------------------------------------------------------------
* Global variables
* ------------------------------------------------------------------- */
uint16_t fftSize = 32;
uint8_t ifftFlag = 0;
uint32_t doBitReverse = 0;


int main(void)
{
    //arm_cfft_instance_f32 * S;
    //arm_cfft_f32(&arm_cfft_sR_f32_len16, ffttestip, ifftFlag, doBitReverse);
    arm_rfft_fast_instance_f32 S;
    arm_rfft_fast_init_f32  (&S,fftSize);
    arm_rfft_fast_f32(&S,ffttestip,ffttestop,ifftFlag);
    //arm_cmplx_mag_f32(ffttestop,ffttestip,fftSize);


  while(1);
 return 0;
}

 /** \endlink */

有什么问题?我无法弄明白,如果有人可以提供帮助,那就太棒了。

1 个答案:

答案 0 :(得分:0)

我认为你的bitReverse配置正好与你想要的相反。

试试uint32_t doBitReverse = 1;

因此Bitreverse被激活(这意味着没有反转位) 我知道这似乎很混乱。