你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

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

FFT.rar

下载

10.37 KB, 下载次数: 72, 下载积分: ST金币 -1

收藏 2 评论13 发布时间:2016-10-8 17:00

举报

13个回答
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[2*i]=(float)(ADC_ConvertedValue[3*i]&0xFFF)*3.3/4096;
                ADC_ConvertedValueLocal1[2*i+1]=0;
                ADC_ConvertedValueLocal2[2*i]=(float)(ADC_ConvertedValue[3*i+1]&0xFFF)*3.3/4096;
                ADC_ConvertedValueLocal2[2*i+1]=0;
                //ADC_ConvertedValueLocal3[2*i]=(float)(ADC_ConvertedValue[3*i+2]&0xFFF)*3.3/4096;
                //ADC_ConvertedValueLocal3[2*i+1]=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[0]);
        for(i=513;i<1024;i++)
                {
                testOutput1=0;
        }
        testOutput1[0]=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[0]);
        for(i=513;i<1024;i++)
                {
                testOutput2=0;
        }
        testOutput2[0]=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我记得不就是对称的吗?
assssdz 回答时间: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
学习学习!
txywqp2015 回答时间:2016-10-11 09:19:07
FFT本来就是对称的
samhong 回答时间:2016-10-11 11:35:52
做个记号,后续学习。
zhangdaijin 回答时间:2016-10-11 11:51:42
zbber 回答时间:2016-10-11 13:30:58
FFT我记得不就是对称的吗?
wenyangzeng 回答时间:2016-10-11 14:45:36
512以后是512之前的镜像呀。没错!
maozheng110 回答时间:2016-10-26 16:05:19
本帖最后由 maozheng110 于 2016-10-26 16:14 编辑

知道了 16.322是采用
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版