STM32F4中进行FFT等复数运算相应函数使用方法,使用友善串口助手查看函数运行结果
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"
#include "math.h"
#include "arm_math.h"
#include "arm_const_structs.h"
#define F 10 //
#define PI2 6.28318530717959
__IO uint16_t ADC1ConvertedValue[4096];
float rfft_inputbuf[F];
float rfft_outputbuf[F*2];
float routputbuf[F];//幅度输出数组
float cfft_inputbuf[F*2];
//float cfft_outputbuf[4096*2];
float coutputbuf[F];//幅度输出数组
float conj_rfft_outputbuf[F*2];
float squared_rfft_outputbuf[F];
float mult_fft_outputbuf[F*2];
float mult_real_fft_outputbuf[F*2];
float sub_fft_outputbuf[F*2];
float scale_fft_outputbuf[F*2];
int main(void)
{
// u8 len;
// u16 times=0;
HAL_Init(); //初始化HAL库
Stm32_Clock_Init(360,25,2,8); //设置时钟,180Mhz
delay_init(180); //初始化延时函数
uart_init(115200); //初始化USART
LED_Init(); //初始化LED
KEY_Init(); //初始化按键
for(int j =0; j
rfft_inputbuf[j]=0.0f;
routputbuf[j]=0.0f;
squared_rfft_outputbuf[j]=0.0f;
coutputbuf[j]=0.0f;
}
for(int j =0; j
rfft_outputbuf[j]=0.0f;
cfft_inputbuf[j]=0.0f;
conj_rfft_outputbuf[j]=0.0f;
mult_fft_outputbuf[j]=0.0f;
mult_real_fft_outputbuf[j]=0.0f;
sub_fft_outputbuf[j]=0.0f;
scale_fft_outputbuf[j]=0.0f;
// cifft_inputbuf[j]=0.0f;
}
uint16_t i;
arm_rfft_fast_instance_f32 S;
uint16_t fftSize = F;
uint8_t ifftFlag = 0;
arm_rfft_fast_init_f32(&S, fftSize);
for(i=0; i
rfft_inputbuf[i] = 2*arm_sin_f32(PI2*i*38.0/F) +
3*arm_sin_f32(PI2*i*47.0/F) +
4*arm_sin_f32(PI2*i*23.0/F);
}
printf("rfft_inputbufn");
for(i=0; i
printf("%frn", rfft_inputbuf[i]);
LED0=!LED0;
delay_ms(40);
}
arm_rfft_fast_f32(&S, rfft_inputbuf, rfft_outputbuf, ifftFlag);
printf("2-rfft_inputbufn");
for(i=0; i
printf("%frn", rfft_inputbuf[i]);
LED0=!LED0;
delay_ms(40);
}
printf("rfft_outputbufn");
for(i=0; i
printf("%frn", rfft_outputbuf[i]);
LED0=!LED0;
delay_ms(40);
}
// arm_rfft_fast_f32(&S, rifft_inputbuf, rifft_outputbuf, 1);
//
//
arm_cmplx_mag_f32(rfft_outputbuf, routputbuf, fftSize);
printf("2—rfft_outputbufn");
for(i=0; i
printf("%frn", rfft_outputbuf[i]);
LED0=!LED0;
delay_ms(40);
}
printf("绝对值n");
for(i=0; i
printf("%frn", routputbuf[i]);
LED0=!LED0;
delay_ms(40);
}
//复数共轭 每个数组都有2*fftSize个值
arm_cmplx_conj_f32(rfft_outputbuf,conj_rfft_outputbuf,fftSize);
printf("3—rfft_outputbufn");
for(i=0; i
printf("%frn", rfft_outputbuf[i]);
LED0=!LED0;
delay_ms(40);
}
printf("共轭3—rfft_outputbufn");
for(i=0; i
printf("%frn", conj_rfft_outputbuf[i]);
LED0=!LED0;
delay_ms(40);
}
//
arm_cmplx_mag_squared_f32(rfft_outputbuf,squared_rfft_outputbuf,fftSize);
printf("4—rfft_outputbufn");
for(i=0; i
printf("%frn", rfft_outputbuf[i]);
LED0=!LED0;
delay_ms(40);
}
printf("复数能量4—rfft_outputbufn");
for(i=0; i
printf("%frn", squared_rfft_outputbuf[i]);
LED0=!LED0;
delay_ms(40);
}
//
for(i=0; i
squared_rfft_outputbuf[i]=i;
}
arm_cmplx_mult_cmplx_f32 (rfft_outputbuf,squared_rfft_outputbuf,mult_fft_outputbuf,fftSize);
printf("5—rfft_outputbufn");
for(i=0; i
printf("%frn", rfft_outputbuf[i]);
LED0=!LED0;
delay_ms(40);
}
printf("复数乘法5—rfft_outputbuf*fft_outputbufn");
for(i=0; i
printf("%frn", mult_fft_outputbuf[i]);
LED0=!LED0;
delay_ms(40);
}
//
arm_cmplx_mult_real_f32(rfft_outputbuf,squared_rfft_outputbuf,mult_real_fft_outputbuf,fftSize);
printf("6—rfft_outputbufn");
for(i=0; i
printf("%frn", rfft_outputbuf[i]);
LED0=!LED0;
delay_ms(40);
}
printf("复数与实数相乘6—rfft_outputbuf*squared_rfft_outputbufn");
for(i=0; i
printf("%frn", mult_real_fft_outputbuf[i]);
LED0=!LED0;
delay_ms(40);
}
//
arm_sub_f32(rfft_outputbuf,mult_real_fft_outputbuf,sub_fft_outputbuf,2*fftSize);
printf("7—rfft_outputbufn");
for(i=0; i
printf("%frn", rfft_outputbuf[i]);
LED0=!LED0;
delay_ms(40);
}
printf("向量减法7—rfft_outputbuf-mult_real_fft_outputbufn");
for(i=0; i
printf("%frn", sub_fft_outputbuf[i]);
LED0=!LED0;
delay_ms(40);
}
//
arm_scale_f32(rfft_outputbuf,3.3,scale_fft_outputbuf,2*fftSize);
printf("8—rfft_outputbufn");
for(i=0; i
printf("%frn", rfft_outputbuf[i]);
LED0=!LED0;
delay_ms(40);
}
printf("向量乘以标量值8—rfft_outputbuf*3.3n");
for(i=0; i
printf("%frn", scale_fft_outputbuf[i]);
LED0=!LED0;
delay_ms(40);
}
float max;
uint32_t num;
for(i=0; i
rfft_inputbuf[i]=9;
}
arm_max_f32(rfft_inputbuf,fftSize,&max,&num);
printf("rfft_inputbufn");
for(i=0; i
printf("%frn", rfft_inputbuf[i]);
LED0=!LED0;
delay_ms(40);
}
printf("最大值n");
printf("%frn", max);
printf("在数组中的位置n");
printf("%drn", num);
LED0=!LED0;
delay_ms(40);
float rfft_inputbuf22[F];
arm_copy_f32(rfft_inputbuf,rfft_inputbuf22,fftSize);// ( float32_t *pSrc, float32_t *pDst, uint32_t blockSize )
printf("rfft_inputbuf22n");
for(i=0; i
printf("%frn", rfft_inputbuf22[i]);
LED0=!LED0;
delay_ms(40);
}
for (int i = 0; i < F*2; i++)
{
//cfft_inputbuf[i * 2] = ADC1ConvertedValue[i] * 3.3 / 4096;//实部赋值,* 3.3 / 4096是为了将ADC采集到的值转换成实际电压
cfft_inputbuf[i * 2] = 500+1000*arm_sin_f32(PI2*i*50.0/F) +
2000*arm_sin_f32(PI2*i*1500.0/F) +
3000*arm_sin_f32(PI2*i*1550.0/F);
cfft_inputbuf[i * 2 + 1] = 0;//虚部赋值,固定为0.
}
uint32_t doBitReverse = 1;
arm_cfft_f32(&arm_cfft_sR_f32_len4096, cfft_inputbuf, ifftFlag, doBitReverse);
arm_cfft_f32(&arm_cfft_sR_f32_len4096, cfft_inputbuf, 1, doBitReverse);
arm_cmplx_mag_f32(cfft_inputbuf, coutputbuf, fftSize);
// for(i=0; i
LED0=!LED0;
delay_ms(1000);
};
}