吃肉的考拉 发表于 2014-5-4 18:14

AD采集进来的数据如何变换做FFT可以计算出准确幅值

将AD结果寄存器里的16位数据右移4位后直接用库做fft是得不到正确幅值结果的吧,网上看了要用什么Q30格式还有QMATH,不明白具体怎么么做

zhangmangui 发表于 2014-5-4 23:29

你先看看Qx的处理原理吧网上资料很多

吃肉的考拉 发表于 2014-5-5 12:12

本帖最后由 吃肉的考拉 于 2014-5-5 12:13 编辑

zhangmangui 发表于 2014-5-4 23:29 https://bbs.21ic.com/static/image/common/back.gif
你先看看Qx的处理原理吧网上资料很多

你是说使用QMath库么,我的理解就是防止数据溢出,各种数据格式之间转换,不知道理解的对不对,但是在FFT应用这里具体怎么实现,我按我的理解将AD结果寄存器里的数据换算成实际的0~3v,再乘以2的31次,
ADResult=((AdcRegs.RESULT0>>4)*3)/4095.0+adclo;
ipcb2=ADResult*2147483648;
将计算出来的幅值结果,因为是Q30格式,再除以2的30次开根号,就是实际幅值了吧,但幅值依然不准确,甚至频率相对ipcb1=((unsigned long)(AdcRegs.RESULT0>>4))<<19;这样进行的数据转换也出现了比较大的误差,
但是我不用外部信号源,用函数发生器这么做却好着
M1 = N*Fn1/Fs;//N为采集点数,Fn1是信号频率,Fs是采样频率
ipcb1=0.73*sin(PI*2*i/N*M1)*2147483648;
max_mag = 2*(float)sqrt(mag)/sqrt(1073741824);//幅值计算

是软件算法有问题还是使用外部信号源有可能不稳定造成的
页: [1]
查看完整版本: AD采集进来的数据如何变换做FFT可以计算出准确幅值