STM32L432 FFT运算结果1024个点从第512点向两边是对称的,求解
我按照官网的例子改了一个FFT输入是500HZ的正弦波(用的函数发生器),采样频率50KHZ,经AD采集后做1024点的FFT变换得出结果,但结果中从第512点开始向两边是对称的,按理应该不对称才对啊,求解,谢谢,MDK的原程序在:https://pan.baidu.com/s/1bHe8ua
main程序和打印的TXT文件如附件
本帖最后由 MrLi... 于 2016-10-14 11:49 编辑
现在我的输入信号:CH1: 800HZ 3Vpp 加了1.5V的直流偏置的正弦波(函数发生器产生) CH2: 200HZ 2Vpp 加了1V的直流偏置的正弦波(函数发生器产生)采样频率是16.322K 做1024点FFT 输出的后换算出来的直流分量和频率点都能对的上 但是800HZ和200HZ的幅值却不对应打印:CH1 DC1= 1501.525879
CH1 maxvalue1= 614.746094 Index1= 51
CH2 DC2= 974.417603
CH2 maxvalue1= 431.114563 Index2= 13
我的换算:
CH1:
直流分量:1501/1024=1.46V
频点:51*16.322/1024=0.812K
800HZ频点幅值:614/(1024/2)=1.19V 实际用函数发生器输出的正弦波幅值是1.5V 难道是误差?求解?谢谢
main函数如下:
int main(void)
{
/* USER CODE BEGIN 1 */
//arm_status status;
float32_t maxValue1;
float32_t maxValue2;
//float32_t maxValue3;
uint16_t i;
int32_t timer=0,timer1=0,timer2=0,timer3=0;
/* USER CODE END 1 */
/* MCU Configuration----------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* Configure the system clock */
SystemClock_Config();
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_ADC1_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
HAL_ADCEx_Calibration_Start(&hadc1,ADC_SINGLE_ENDED);
/* 启动AD转换并使能DMA传输和中断 */
HAL_ADC_Start_DMA(&hadc1,ADC_ConvertedValue,ADC_NUMOFCHANNEL);
timer=HAL_GetTick();
//arm_status status;
//status = ARM_MATH_SUCCESS;
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
if(__HAL_DMA_GET_COUNTER(&hdma_adc1)==1)
{
timer1=HAL_GetTick();
//printf("ADwc time1:%d\r\n",timer1-timer);
HAL_ADC_Stop_DMA(&hadc1);
HAL_ADC_Stop(&hadc1);
for(i=0;i<1024;i++)
{
ADC_ConvertedValueLocal1=(float)(ADC_ConvertedValue&0xFFF)*3.3/4096;
ADC_ConvertedValueLocal1=0;
ADC_ConvertedValueLocal2=(float)(ADC_ConvertedValue&0xFFF)*3.3/4096;
ADC_ConvertedValueLocal2=0;
//ADC_ConvertedValueLocal3=(float)(ADC_ConvertedValue&0xFFF)*3.3/4096;
//ADC_ConvertedValueLocal3=0;
}
// for(i=0;i<2048;i++)
// {
// printf("Bufwc[%d]:%f\r\n",i,ADC_ConvertedValueLocal1);
// }
timer2=HAL_GetTick();
//printf("Bufwc time2:%d\r\n",timer2-timer1);
HAL_ADC_Start_DMA(&hadc1,ADC_ConvertedValue,ADC_NUMOFCHANNEL);
arm_cfft_f32(&arm_cfft_sR_f32_len1024, ADC_ConvertedValueLocal1, ifftFlag, doBitReverse);
// for(i=0;i<2048;i++)
// {
// printf("Bufwc[%d]:%f\r\n",i,ADC_ConvertedValueLocal1);
// }
arm_cmplx_mag_f32(ADC_ConvertedValueLocal1, testOutput1, fftSize);
// for(i=0;i<1024;i++)
// {
// printf("fft_outputbuf[%d]:%f\r\n",i,testOutput1);
// }
printf("CH1 DC1= %f \r\n",testOutput1);
for(i=513;i<1024;i++)
{
testOutput1=0;
}
testOutput1=0;
arm_max_f32(testOutput1, fftSize, &maxValue1, &testIndex1);
printf("CH1 maxvalue1= %f Index1= %d\r\n",maxValue1,testIndex1);
arm_cfft_f32(&arm_cfft_sR_f32_len1024, ADC_ConvertedValueLocal2, ifftFlag, doBitReverse);
arm_cmplx_mag_f32(ADC_ConvertedValueLocal2, testOutput2, fftSize);
printf("CH2 DC2= %f \r\n",testOutput2);
for(i=513;i<1024;i++)
{
testOutput2=0;
}
testOutput2=0;
arm_max_f32(testOutput2, fftSize, &maxValue2, &testIndex2);
printf("CH2 maxvalue1= %f Index2= %d\r\n",maxValue2,testIndex2);
//arm_cfft_f32(&arm_cfft_sR_f32_len1024, ADC_ConvertedValueLocal3, ifftFlag, doBitReverse);
//arm_cmplx_mag_f32(ADC_ConvertedValueLocal3, testOutput3, fftSize);
//arm_max_f32(testOutput3, fftSize, &maxValue3, &testIndex3);
timer3=HAL_GetTick();
printf("FFTwc time3:%d\r\n",timer3-timer1);
//while(1);
}
}
}
FFT我记得不就是对称的吗? :(:(:(:(:(:(:(:(:( 做个记号,后续学习。 逍遥李 发表于 2016-10-8 17:30
FFT我记得不就是对称的吗?
对,是的,刚接触到FFT,我以为是前面1024个点和后面1024个点是对称的,谢谢 MrLi... 发表于 2016-10-9 16:27
你好!现在我的输入信号:CH1: 800HZ 3Vpp 加了1.5V的直流偏置的正弦波(函数发生器产生) ...
这个stm32上我也没用过FFT,我只是了解过一点点 学习学习! FFT本来就是对称的 做个记号,后续学习。
页:
[1]
2