利用FFT求简谐波频率幅值的问题
假设有信号x=a0*sin(2*pi*f0*t)+a1*sin(2*pi*f1*t),我想把其中的a0.a1.f0.f1检测出来,我的想法是先利用最简单的FFT,再改善算法。但是FFT只有幅频图中的数据与设定值相差很大,看过论坛的一些帖子,感觉还是似懂非懂,仅仅是*2/N的问题吗?[ 本帖最后由 无水1324 于 2008-7-11 21:23 编辑 ] 看了楼主提供的程序,f1是f0的一倍,而幅值上要相差50db左右。要求出f0的幅值,可以有2种方法,一种是用窗函数,选择衰减较大的窗函数(现在用矩形窗,一个倍频程衰减6dB),所以很容易把f0淹没(或虚假的两者叠加在一起)而检不出正确的参数;另一种方法是对f1滤波,例如用自适应带陷滤波,对滤波后的信号检测f0的参数。 还可以有一个方法,就是整周期采样,使f0=ndf、f1=mdf,df是FFT后的分辨率,n和m都为整数,即在分析中没有泄漏发生。 谢谢!我需要检测出间谐波的幅值和频率, 整周期采样实现起来比较困难,加窗函数和插值应该能提高检测精度。
用校正法求谐波频率幅值
要求频率,振幅必须要用校正法, 你的程序只作FFT幅频图不够,这儿提供一个FFT和apFFT组合校正法程序, 可以校正相位,频率,振幅
对你提供的二个正弦波组成的信号, 运行结果:
频率校正值 fff1 =25 fff2 =50
振幅校正值 aaa1 =1.8598 aaa2 = 310
初相位校正值 ppp1 =360度 ppp2 = 360度
附校正程序
[ 本帖最后由 zhwang554 于 2008-7-6 20:58 编辑 ] 要对应上幅值肯定要注意归一化的问题,也就是你说的*2/N的问题。 因为两个信号的幅值相差太大,肯定要滤掉大的一个,更利用检测小信号。
同时要想频率更接近一些,
可以加大数据长度,
或者像5楼说的,进行频率细化:可参考丁康教授的相关文献。
回复 2楼 的帖子
呵呵,终于找到一个答案了。我原来有一个问题也可以用这个方法解决了。 最好是用三角回归法 fft的幅值与实测幅值相差较大,肯定需要校正,但具体应该怎么做,还是看看论坛中的相关帖子,最近我一直在关注。 学习了,APfft应该可以
页:
[1]