硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1857|回复: 18
收起左侧

[DSP] STM32F4ADC做FFT问题

[复制链接]

5

主题

15

回帖

30

积分

新手上路

积分
30
发表于 2021-10-26 15:27:45 | 显示全部楼层 |阅读模式
问题:我使用F4的板子+定时器+ADC+DMA采样1Hz的正弦波。只能测出频率为1KHZ.  计算的直流分量和幅值都不对。
我设置的采样率为64000hz   fft点数为64   一周采64个点  做64点的FFT。纠结 了好久  不知道问题在哪。。

回复

使用道具 举报

5

主题

15

回帖

30

积分

新手上路

积分
30
 楼主| 发表于 2021-10-26 15:30:01 | 显示全部楼层
我的正弦波VPP为2    直流分量设置为1V    但是测的幅值只有10几mv   直流分量只有几mv
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106649
QQ
发表于 2021-10-26 17:43:24 | 显示全部楼层
方便的话,发代码看下,
回复

使用道具 举报

5

主题

15

回帖

30

积分

新手上路

积分
30
 楼主| 发表于 2021-10-26 19:11:25 | 显示全部楼层
好的 您看看
回复

使用道具 举报

5

主题

15

回帖

30

积分

新手上路

积分
30
 楼主| 发表于 2021-10-26 19:16:35 | 显示全部楼层
好像发不了压缩包
回复

使用道具 举报

5

主题

15

回帖

30

积分

新手上路

积分
30
 楼主| 发表于 2021-10-26 19:19:10 | 显示全部楼层
  1. void fft_get_maxvalue()
  2. {
  3.         int k,i;
  4.         HAL_Delay(50);
  5.         if(fft_complete_flag == 1)
  6.         {       
  7.                 arm_cfft_f32(&arm_cfft_sR_f32_len64,MidBuffer,ifftFlag,doBitReverse);      //对输入数组进行FFT变换,变换结果将存放在输入数组中
  8.        
  9.                 arm_cmplx_mag_f32(MidBuffer,OutPutBuffer,fftSize);                         //对经过FFT变换的数组进行取模运算,运算结果将存放在OutPutBuffer数组中
  10.                                
  11.                 arm_max_f32(OutPutBuffer,fftSize,&maxvalue,&Index);                        //输出数组中频域最大的数值和其所在数组中的位置
  12.                
  13.                 for(k=0;k<fftSize/2;k++)
  14.                 {
  15.                         FreqBuffer[k] = OutPutBuffer[k+1];                                      //取输出结果的一半,并且去除直流分量
  16.                 }
  17.                
  18.                 arm_max_f32(FreqBuffer,fftSize/2,&Freq_maxvalue,&Freq_Index);                              //去除直流分量后输出数组中频域最大的数值和其所在数组中的位置
  19.                
  20.                 Freq = (Freq_Index+1)*sample_freq;                                                                                        //频率 = (N-1)*Fs/FFTSize        单位Hz
  21.                
  22.                 DC_Component = (OutPutBuffer[0]/fftSize);                                              //直流分量 = value/FFTSize
  23.                
  24.                 Amplitude = ((Freq_maxvalue/((float)fftSize/2)));                                      //频率幅度 = value/FFTSize/2*10   单位V
  25.                
  26.                 Virtual_value = Amplitude/1.4142135;                                        //有效值

  27. //                res = ((Virtual_value-8)/43.3)/(4-((Virtual_value-8)/43.3))*2000;               
  28. //                printf("Fmaxvalue = %f \r\n Amplitude = %f  \r\n  DC_Component = %f  \r\n  Virtual_value = %f  \r\n Res = %f  \r\n  ",Freq,Amplitude,DC_Component,Virtual_value,res);
  29.                 printf("Fmaxvalue = %f \r\n Amplitude = %f  \r\n  DC_Component = %f  \r\n  Virtual_value = %f  \r\n  ",Freq,Amplitude,DC_Component,Virtual_value);
  30.                 fft_complete_flag = 0;              
  31.                 HAL_ADC_Start_DMA(&hadc1,(uint32_t*)InPutBuffer,fftSize);                                        //标志位置0,表示转换完成
  32.         }
  33. }
复制代码
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106649
QQ
发表于 2021-10-26 19:43:10 | 显示全部楼层

把采集的点数绘制个波形,FFT变换后绘制个波形,然后贴到帖子里面,我看下,方便的话。
回复

使用道具 举报

5

主题

15

回帖

30

积分

新手上路

积分
30
 楼主| 发表于 2021-10-26 20:17:15 | 显示全部楼层
  1. 11.273445
  2. 72:16.053169
  3. 74:-71.008087
  4. 76:-84.136810
  5. 78:-36.124557
  6. 80:53.257679
  7. 82:120.907928
  8. 84:57.369686
  9. 86:-112.752953
  10. 88:-165.528900
  11. 90:16.862816
  12. 92:197.198929
  13. 94:95.901306
  14. 96:-146.630859
  15. 98:-154.999969
  16. 100:73.003632
  17. 102:151.435913
  18. 104:-39.006737
  19. 106:-139.123886
  20. 108:48.888508
  21. 110:176.201050
  22. 112:-43.589710
  23. 114:-260.984436
  24. 116:-41.457325
  25. 118:322.884918
  26. 120:207.818420
  27. 122:-279.572144
  28. 124:-378.111511
  29. 126:111.611511
复制代码
回复

使用道具 举报

5

主题

15

回帖

30

积分

新手上路

积分
30
 楼主| 发表于 2021-10-26 20:18:04 | 显示全部楼层
这是FFT变换后的数 。。  本人比较菜 不会绘制波形
回复

使用道具 举报

5

主题

15

回帖

30

积分

新手上路

积分
30
 楼主| 发表于 2021-10-26 20:18:34 | 显示全部楼层
我想发压缩包  可是上传不了
回复

使用道具 举报

5

主题

15

回帖

30

积分

新手上路

积分
30
 楼主| 发表于 2021-10-26 20:41:52 | 显示全部楼层
很奇怪 我采集到的值里有很多个0
回复

使用道具 举报

5

主题

15

回帖

30

积分

新手上路

积分
30
 楼主| 发表于 2021-10-26 20:51:27 | 显示全部楼层
汉哥   我想问问AD采样的频率  和定时器的频率  如何设置   比如我采1KHZ正弦波的信号
回复

使用道具 举报

5

主题

15

回帖

30

积分

新手上路

积分
30
 楼主| 发表于 2021-10-27 10:29:04 | 显示全部楼层
我的代码  百度云链接   
链接:https://pan.baidu.com/s/1HqkVBnSm3tPjN-pUxMFnRA
提取码:ccc6
--来自百度网盘超级会员V3的分享
回复

使用道具 举报

5

主题

15

回帖

30

积分

新手上路

积分
30
 楼主| 发表于 2021-10-27 11:07:21 | 显示全部楼层
解决了  程序没有问题   是我线接错了  想用代码的小伙伴 可以拿去用
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106649
QQ
发表于 2021-10-28 01:37:12 | 显示全部楼层
cjy 发表于 2021-10-27 11:07
解决了  程序没有问题   是我线接错了  想用代码的小伙伴 可以拿去用

解决了就好。
回复

使用道具 举报

3

主题

24

回帖

33

积分

新手上路

积分
33
发表于 2022-2-23 10:41:26 | 显示全部楼层
DC_Component = (OutPutBuffer[0]/fftSize);                                              //直流分量 = value/FFTSize
楼主你好,你这个直流分量的计算结果单位是多少,我按照你这样算的,结果不对。计算结果510000,256点,实际电压是1.65V,还望指点一二呀。
回复

使用道具 举报

3

主题

24

回帖

33

积分

新手上路

积分
33
发表于 2022-2-23 10:42:38 | 显示全部楼层
cjy 发表于 2021-10-26 20:51
汉哥   我想问问AD采样的频率  和定时器的频率  如何设置   比如我采1KHZ正弦波的信号

采样频率不能低于2K。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106649
QQ
发表于 2022-2-23 12:34:34 | 显示全部楼层
仰望星期五 发表于 2022-2-23 10:41
DC_Component = (OutPutBuffer[0]/fftSize);                                              //直流分量 =  ...

FFT的直流分量求解的结果 = 所有数值求平均,你看你那边是否复合。
回复

使用道具 举报

3

主题

24

回帖

33

积分

新手上路

积分
33
发表于 2022-2-24 13:21:28 | 显示全部楼层
eric2013 发表于 2022-2-23 12:34
FFT的直流分量求解的结果 = 所有数值求平均,你看你那边是否复合。

貌似明白了。谢谢。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-27 22:17 , Processed in 0.347365 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表