请教:VC下实现apFFT,但幅度校正不准确,高手帮忙看看
我在VC下实现了apFFT算法,但是幅度校正不准确,情况如下:
#defineDATA_PER_T (512) //采样点数
i 取 - DATA_PER_T+1 到 2* DATA_PER_T – 1的范围。
Fsig是输入的信号频率。
测试信号:2.356+8.365 * cos(2 * M_PI * Fsig * (i-DATA_PER_T)/DATA_PER_T - M_PI * 1/6 )
所有数据采用float型,采用apFFT/apFFT算法,对相位、频率、幅度进行校正。
测试结果发现,相位和频率校正非常准确,但是幅度校正值较差。实际幅度为8.365,当频点在.9到.4时(比如36.9、36.2、36.4等等),幅度校正结果在8.36左右,当从.4到.8变化时,幅度由8.358105递减到8.335485,最大误差有0.38%。这是什么原因?是否有什么改进的方法让精度高一些?还是我的算法有什么问题?
幅度的校正算法如下:
当p大于0.5时,也就是频点大于.5时,a2取最大点前面的一个,否则取最大点的幅值。
p为相位差,在0-1之间。
a = 2*M_PI*p*(1-p*p)/sin(M_PI*p);
a2 = (a*a)*a2/2;
a2即为校正的幅值。
详细测试结果见附件。初始相角值不正确,实际计算的不是按照下面的相角,另作了处理的。
[ 本帖最后由 fudeyun 于 2009-11-20 17:05 编辑 ]
回复楼主fudeyun的贴子
你的程序对,但p大于0.5时,不在峰值处取值, 取最大点前面的一个,有时影响精度可参见whoru 发表于 2009-6-23 16:33 的贴子"求教:apFFT频谱校正问题!'中的程序
http://forum.vibunion.com/thread-83661-1-1.html
这个程序始终在峰值处取值
另外apfft程序中的hanning和hanning卷积窗 可改为 hann和hanning卷积窗 一试
[ 本帖最后由 zhwang554 于 2009-11-21 01:07 编辑 ]
好的,我试试
多谢赐教,非常感谢!回复板凳fudeyun的贴子
可参见 振动论坛上下日志<apfft谱分析中的振幅校正精度>
zhwang554 2009-12-01 01:40
http://home.vibunion.com/blog-62061-17986.html
[ 本帖最后由 zhwang554 于 2009-12-2 22:23 编辑 ] 王老师就是厉害啊!中国的学术强人! 感谢楼主的提问?为中国的学术做出了贡献! APFFT是一个很好的算法,向王老师的科研团队致敬!
页:
[1]