Неправильный результат FFT при использовании функции rfft на STM32F4 - PullRequest
0 голосов
/ 04 мая 2018

Я пытаюсь использовать функцию rfft в STM32F407G, и я получаю неправильные результаты, сравнивая ее с онлайн-калькулятором fft . Я даю образец ввода как {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 голосов
/ 31 мая 2018

Я думаю, что ваша конфигурация bitReverse работает так, как вам хотелось бы.

try uint32_t doBitReverse = 1;

, поэтому активируются битрейверы (что означает, что биты не инвертированы) Кажется, я запутался.

...