STM32F4ADC做FFT问题
问题:我使用F4的板子+定时器+ADC+DMA采样1Hz的正弦波。只能测出频率为1KHZ.计算的直流分量和幅值都不对。我设置的采样率为64000hz fft点数为64 一周采64个点做64点的FFT。纠结 了好久不知道问题在哪。。
我的正弦波VPP为2 直流分量设置为1V 但是测的幅值只有10几mv 直流分量只有几mv 方便的话,发代码看下, 好的 您看看 好像发不了压缩包 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,表示转换完成
}
} cjy 发表于 2021-10-26 19:19
把采集的点数绘制个波形,FFT变换后绘制个波形,然后贴到帖子里面,我看下,方便的话。 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 这是FFT变换后的数 。。本人比较菜 不会绘制波形:shutup: 我想发压缩包可是上传不了 很奇怪 我采集到的值里有很多个0 汉哥 我想问问AD采样的频率和定时器的频率如何设置 比如我采1KHZ正弦波的信号 我的代码百度云链接
链接:https://pan.baidu.com/s/1HqkVBnSm3tPjN-pUxMFnRA
提取码:ccc6
--来自百度网盘超级会员V3的分享 解决了程序没有问题 是我线接错了想用代码的小伙伴 可以拿去用:lol cjy 发表于 2021-10-27 11:07
解决了程序没有问题 是我线接错了想用代码的小伙伴 可以拿去用
解决了就好。 DC_Component = (OutPutBuffer/fftSize); //直流分量 = value/FFTSize
楼主你好,你这个直流分量的计算结果单位是多少,我按照你这样算的,结果不对。计算结果510000,256点,实际电压是1.65V,还望指点一二呀。 cjy 发表于 2021-10-26 20:51
汉哥 我想问问AD采样的频率和定时器的频率如何设置 比如我采1KHZ正弦波的信号
采样频率不能低于2K。 仰望星期五 发表于 2022-2-23 10:41
DC_Component = (OutPutBuffer/fftSize); //直流分量 =...
FFT的直流分量求解的结果 = 所有数值求平均,你看你那边是否复合。 eric2013 发表于 2022-2-23 12:34
FFT的直流分量求解的结果 = 所有数值求平均,你看你那边是否复合。
貌似明白了。谢谢。
页:
[1]