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

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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版