请教STM32F4的FFT的复数与实数问题

2019-12-10 18:20发布

最近被一个问题憋了两天了,就是STM32F4的FFT问题,就是arm_cfft_radix4_f32(&S, testInput);看这个函数的介绍,testinput数组应当是复数形式,即数组内的0,2,4等偶数序号是实部,1,3,5等奇数序号是虚部,好像这样才能得出正确的结果,它的例程中也是用的一个2048的数组,奇数序号也就是虚部都是0.
但是我在程序开始定义的2048的数组,模拟了一个直流和50Hz,100Hz,150Hz的信号.
testInput[i]=1000.0f+ 100.0f*arm_sin_f32(PI2*i*50.0f/Fs)+ 10.0f * arm_cos_f32(PI2*i*100.0f/Fs) + 1.0f*arm_sin_f32(PI2*i*150.0f/Fs) ;也就是一个实数数组,数组内并没有虚部,但是把这个代入arm_cfft_radix4_f32(&S, testInput);后得出的结果却完全正确,这是怎么回事?
程序如下:
#define TEST_LENGTH_SAMPLES 2048
#define Fs                           102400

#define PI2 (6.283185307179586476925286766559)
/* -------------------------------------------------------------------
* External Input and Output buffer Declarations for FFT Bin Example
* ------------------------------------------------------------------- */
//extern float32_t testInput_f32_10khz[TEST_LENGTH_SAMPLES];
//float32_t testInput_f32_10khz[TEST_LENGTH_SAMPLES];

float32_t testInput[TEST_LENGTH_SAMPLES];

static float32_t testOutput[TEST_LENGTH_SAMPLES/2];

static float32_t output[TEST_LENGTH_SAMPLES/2];

/* ------------------------------------------------------------------
* Global variables for FFT Bin Example
* ------------------------------------------------------------------- */
uint32_t fftSize = TEST_LENGTH_SAMPLES/2;   ////这个数只能是1024,256,64,16.是采样点数的一半?       
uint32_t ifftFlag = 0;           ////0是正变换,1是逆变换       
uint32_t doBitReverse = 1; ////这个好像必须是1

/* Reference index at which max energy of bin ocuurs */
uint32_t refIndex = 213, testIndex = 0;

void fft_test()
{

        u16 i;

        arm_status status;
        arm_cfft_radix4_instance_f32 S;
        float32_t maxValue;
       
       
        fft_init();
       
        status = ARM_MATH_SUCCESS;
         
        status = arm_cfft_radix4_init_f32(&S, fftSize,  ifftFlag, doBitReverse);
                                                                         

        ////第一个参数是个结构,第二个参数指向2*fftsize的复数数组,输出结果也存入此数组.         
        GPIO_SetBits(GPIOC, GPIO_Pin_11);///运行灯2
        arm_cfft_radix4_f32(&S, testInput);
        GPIO_ResetBits(GPIOC, GPIO_Pin_11);///运行灯2                                 
         
         
        ////testout中存放的数除以1024是各次谐波的有效值,再乘以根号2等于幅值
       
        arm_cmplx_mag_f32(testInput, testOutput, fftSize);  ////1024点 需要0.18ms 64点需要0.011ms
         
        ////计算最大值
        arm_max_f32(testOutput, fftSize, &maxValue, &testIndex);
         
         
        for(i=0;i< (TEST_LENGTH_SAMPLES/2);i++)
        {
                output[i]=(testOutput[i]*2.828427f)/TEST_LENGTH_SAMPLES;
        }
       
        if(testIndex !=  refIndex)
        {
                status = ARM_MATH_TEST_FAILURE;
        }
         
        /* ----------------------------------------------------------------------
        ** Loop here if the signals fail the PASS check.
        ** This denotes a test failure
        ** ------------------------------------------------------------------- */
         
        if( status != ARM_MATH_SUCCESS)
        {
                //while(1);
        }
       
}
对FFT不是很明白,也知道有2N个实数,奇数序号当虚部这一说,但是并不太清楚,不知道哪位大师能解释明白.莫元不多,意思一下.
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
lzy888
1楼-- · 2019-12-10 19:14
没人知道吗
lzy888
2楼-- · 2019-12-10 23:04
本帖最后由 lzy888 于 2013-9-22 11:11 编辑

搞定了,结贴,很幼稚的问题,各位高手见笑了
85891240
3楼-- · 2019-12-11 03:16
 精彩回答 2  元偷偷看……
lzy888
4楼-- · 2019-12-11 08:17
85891240 发表于 2013-9-23 20:07
我最近也在用stm32做FFT,我用ADC采集到的数据求相位,楼主有没有什么程序借我用用 ...

我用的就是上面的程序,做完FFT后知道了实部和虚部,相位就出来了,不知道有没有arctan这个函数,我还没做到这一步
tianyu1989
5楼-- · 2019-12-11 10:32
你好 你的问题解决了吗?   我遇到一个问题 像你请教, 就是我拿官方例子STM32F4-Discovery_FW_V1.1.0LibrariesCMSISDSP_LibExamplesarm_fft_bin_exampleARM 里面的工程 编译的时候 报错  说..system_ARMCM4.c(25): error:  #5: cannot open source input file "ARMCM4.h": No such file or directory     请问一下 我没有动这个工程 怎么也会报错   难道官方来的 时候就错的?   
szszjdb
6楼-- · 2019-12-11 14:00
lzy888 发表于 2013-9-22 10:58
搞定了,结贴,很幼稚的问题,各位高手见笑了

兄弟,到底为什么实数FFT用复数计算没有错?是什么原因可否告知?多谢!

一周热门 更多>