cjy 发表于 2021-10-26 15:27:45

STM32F4ADC做FFT问题

问题:我使用F4的板子+定时器+ADC+DMA采样1Hz的正弦波。只能测出频率为1KHZ.计算的直流分量和幅值都不对。
我设置的采样率为64000hz   fft点数为64   一周采64个点做64点的FFT。纠结 了好久不知道问题在哪。。

cjy 发表于 2021-10-26 15:30:01

我的正弦波VPP为2    直流分量设置为1V    但是测的幅值只有10几mv   直流分量只有几mv

eric2013 发表于 2021-10-26 17:43:24

方便的话,发代码看下,

cjy 发表于 2021-10-26 19:11:25

好的 您看看

cjy 发表于 2021-10-26 19:16:35

好像发不了压缩包

cjy 发表于 2021-10-26 19:19:10

void fft_get_maxvalue()
{
        int k,i;
        HAL_Delay(50);
        if(fft_complete_flag == 1)
        {       
                arm_cfft_f32(&arm_cfft_sR_f32_len64,MidBuffer,ifftFlag,doBitReverse);      //对输入数组进行FFT变换,变换结果将存放在输入数组中
       
                arm_cmplx_mag_f32(MidBuffer,OutPutBuffer,fftSize);                         //对经过FFT变换的数组进行取模运算,运算结果将存放在OutPutBuffer数组中
                               
                arm_max_f32(OutPutBuffer,fftSize,&maxvalue,&Index);                        //输出数组中频域最大的数值和其所在数组中的位置
               
                for(k=0;k<fftSize/2;k++)
                {
                        FreqBuffer = OutPutBuffer;                                    //取输出结果的一半,并且去除直流分量
                }
               
                arm_max_f32(FreqBuffer,fftSize/2,&Freq_maxvalue,&Freq_Index);                              //去除直流分量后输出数组中频域最大的数值和其所在数组中的位置
               
                Freq = (Freq_Index+1)*sample_freq;                                                                                        //频率 = (N-1)*Fs/FFTSize      单位Hz
               
                DC_Component = (OutPutBuffer/fftSize);                                              //直流分量 = value/FFTSize
               
                Amplitude = ((Freq_maxvalue/((float)fftSize/2)));                                      //频率幅度 = value/FFTSize/2*10   单位V
               
                Virtual_value = Amplitude/1.4142135;                                        //有效值

//                res = ((Virtual_value-8)/43.3)/(4-((Virtual_value-8)/43.3))*2000;               
//                printf("Fmaxvalue = %f \r\n Amplitude = %f\r\nDC_Component = %f\r\nVirtual_value = %f\r\n Res = %f\r\n",Freq,Amplitude,DC_Component,Virtual_value,res);
                printf("Fmaxvalue = %f \r\n Amplitude = %f\r\nDC_Component = %f\r\nVirtual_value = %f\r\n",Freq,Amplitude,DC_Component,Virtual_value);
                fft_complete_flag = 0;            
                HAL_ADC_Start_DMA(&hadc1,(uint32_t*)InPutBuffer,fftSize);                                        //标志位置0,表示转换完成
        }
}

eric2013 发表于 2021-10-26 19:43:10

cjy 发表于 2021-10-26 19:19


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

cjy 发表于 2021-10-26 20:17:15

11.273445
72:16.053169
74:-71.008087
76:-84.136810
78:-36.124557
80:53.257679
82:120.907928
84:57.369686
86:-112.752953
88:-165.528900
90:16.862816
92:197.198929
94:95.901306
96:-146.630859
98:-154.999969
100:73.003632
102:151.435913
104:-39.006737
106:-139.123886
108:48.888508
110:176.201050
112:-43.589710
114:-260.984436
116:-41.457325
118:322.884918
120:207.818420
122:-279.572144
124:-378.111511
126:111.611511

cjy 发表于 2021-10-26 20:18:04

这是FFT变换后的数 。。本人比较菜 不会绘制波形:shutup:

cjy 发表于 2021-10-26 20:18:34

我想发压缩包可是上传不了

cjy 发表于 2021-10-26 20:41:52

很奇怪 我采集到的值里有很多个0

cjy 发表于 2021-10-26 20:51:27

汉哥   我想问问AD采样的频率和定时器的频率如何设置   比如我采1KHZ正弦波的信号

cjy 发表于 2021-10-27 10:29:04

我的代码百度云链接   
链接:https://pan.baidu.com/s/1HqkVBnSm3tPjN-pUxMFnRA
提取码:ccc6
--来自百度网盘超级会员V3的分享

cjy 发表于 2021-10-27 11:07:21

解决了程序没有问题   是我线接错了想用代码的小伙伴 可以拿去用:lol

eric2013 发表于 2021-10-28 01:37:12

cjy 发表于 2021-10-27 11:07
解决了程序没有问题   是我线接错了想用代码的小伙伴 可以拿去用

解决了就好。

仰望星期五 发表于 2022-2-23 10:41:26

DC_Component = (OutPutBuffer/fftSize);                                              //直流分量 = value/FFTSize
楼主你好,你这个直流分量的计算结果单位是多少,我按照你这样算的,结果不对。计算结果510000,256点,实际电压是1.65V,还望指点一二呀。

仰望星期五 发表于 2022-2-23 10:42:38

cjy 发表于 2021-10-26 20:51
汉哥   我想问问AD采样的频率和定时器的频率如何设置   比如我采1KHZ正弦波的信号

采样频率不能低于2K。

eric2013 发表于 2022-2-23 12:34:34

仰望星期五 发表于 2022-2-23 10:41
DC_Component = (OutPutBuffer/fftSize);                                              //直流分量 =...

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

仰望星期五 发表于 2022-2-24 13:21:28

eric2013 发表于 2022-2-23 12:34
FFT的直流分量求解的结果 = 所有数值求平均,你看你那边是否复合。

貌似明白了。谢谢。
页: [1]
查看完整版本: STM32F4ADC做FFT问题