MrLi... 发表于 2016-10-8 17:00:26

STM32L432 FFT运算结果1024个点从第512点向两边是对称的,求解

我按照官网的例子改了一个FFT
输入是500HZ的正弦波(用的函数发生器),采样频率50KHZ,经AD采集后做1024点的FFT变换得出结果,但结果中从第512点开始向两边是对称的,按理应该不对称才对啊,求解,谢谢,MDK的原程序在:https://pan.baidu.com/s/1bHe8ua
main程序和打印的TXT文件如附件

MrLi... 发表于 2016-10-9 16:27:12

本帖最后由 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);
          }
    }
}



逍遥李 发表于 2016-10-8 17:30:52

FFT我记得不就是对称的吗?

asssdz-382474 发表于 2016-10-8 21:49:43

:(:(:(:(:(:(:(:(:(

高二毛 发表于 2016-10-9 08:45:07

做个记号,后续学习。

MrLi... 发表于 2016-10-9 09:31:25

逍遥李 发表于 2016-10-8 17:30
FFT我记得不就是对称的吗?

对,是的,刚接触到FFT,我以为是前面1024个点和后面1024个点是对称的,谢谢

逍遥李 发表于 2016-10-10 09:45:10

MrLi... 发表于 2016-10-9 16:27
你好!现在我的输入信号:CH1: 800HZ 3Vpp 加了1.5V的直流偏置的正弦波(函数发生器产生)               ...

这个stm32上我也没用过FFT,我只是了解过一点点

ynwscfsfi 发表于 2016-10-10 10:55:36

学习学习!

NYD 发表于 2016-10-11 09:19:07

FFT本来就是对称的

samhong 发表于 2016-10-11 11:35:52

做个记号,后续学习。
页: [1] 2
查看完整版本: STM32L432 FFT运算结果1024个点从第512点向两边是对称的,求解