最近被一个问题憋了两天了,就是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个实数,奇数序号当虚部这一说,但是并不太清楚,不知道哪位大师能解释明白.莫元不多,意思一下.
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
搞定了,结贴,很幼稚的问题,各位高手见笑了
一周热门 更多>