搜索
bottom↓
回复: 9

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

[复制链接]

出0入42汤圆

发表于 2013-9-21 19:28:24 | 显示全部楼层 |阅读模式
最近被一个问题憋了两天了,就是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个实数,奇数序号当虚部这一说,但是并不太清楚,不知道哪位大师能解释明白.莫元不多,意思一下.

出0入42汤圆

 楼主| 发表于 2013-9-22 09:39:13 | 显示全部楼层
没人知道吗

出0入42汤圆

 楼主| 发表于 2013-9-22 10:58:07 | 显示全部楼层
本帖最后由 lzy888 于 2013-9-22 11:11 编辑

搞定了,结贴,很幼稚的问题,各位高手见笑了

出0入0汤圆

发表于 2013-9-23 20:07:13 | 显示全部楼层
我最近也在用stm32做FFT,我用ADC采集到的数据求相位,楼主有没有什么程序借我用用

出0入42汤圆

 楼主| 发表于 2013-9-24 10:02:39 | 显示全部楼层
85891240 发表于 2013-9-23 20:07
我最近也在用stm32做FFT,我用ADC采集到的数据求相位,楼主有没有什么程序借我用用 ...

我用的就是上面的程序,做完FFT后知道了实部和虚部,相位就出来了,不知道有没有arctan这个函数,我还没做到这一步

出0入0汤圆

发表于 2013-10-15 17:02:53 | 显示全部楼层
你好 你的问题解决了吗?   我遇到一个问题 像你请教, 就是我拿官方例子STM32F4-Discovery_FW_V1.1.0\Libraries\CMSIS\DSP_Lib\Examples\arm_fft_bin_example\ARM 里面的工程 编译的时候 报错  说..\system_ARMCM4.c(25): error:  #5: cannot open source input file "ARMCM4.h": No such file or directory     请问一下 我没有动这个工程 怎么也会报错   难道官方来的 时候就错的?   

出0入0汤圆

发表于 2013-11-22 08:50:51 | 显示全部楼层
lzy888 发表于 2013-9-22 10:58
搞定了,结贴,很幼稚的问题,各位高手见笑了

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

出0入0汤圆

发表于 2013-12-5 13:09:33 | 显示全部楼层
我的用的是LPC1768做FFT,没有大家那么幸运的,NXP只提供了dsp库,却没有工程实例呀!晕菜!@

出0入0汤圆

发表于 2014-6-18 21:24:36 | 显示全部楼层
本帖最后由 yunjuanyunshu 于 2014-6-19 21:16 编辑

本来不是太明白,后来又想了想,感觉明白了一些,谢谢你!

出0入0汤圆

发表于 2019-8-4 16:38:41 | 显示全部楼层
明天开始搞fft,先来灌水。。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-19 06:54

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表