FFT点数与频率的关系
本人目前正在做一个监测项目。开始用的是DFT(没有蝶型算法),后来为了速度选择了FFT,程序是用vc自己写的。开始用DFT算得的复数值与maltab一致。现进行FFT时,由于采用的是采样间隔为1分钟的一天连续数据,共1440个点。为了用FFT不得不扩充到2048个点。现在的问题是扩充后求得2048个复数值,与之前直接DFT算出的结果有什么关系?换句话讲,之前DFT的复数中第二个值F代表的是频率为一天一个周期的信号,那在FFT变换后的2048个复数点中,那一个能表示之前DFT的F。看了书上写的是:补零前个数n1,傅里叶变换用F[]表示;傅里叶变换补零后为n2,傅里叶变换用G[]表示,则F=(n2/n1)G。但是当v=1时,n2*v/n1不是一个整数,也就是说G并不存在。我想请问高手,这个对应关系该怎么解决?在1440个点补零到2048个点后,那一个复数值对应的是频率我一天一个周期的信号。谢谢指导!! 补零是不对的,这样会把信号的特性改变了。比较好的办法是继续测试,把第二天的数据延续下来。或者把第一天的数据再接都后面。或者改变采样间隔使之满足一天的时间长度。
回复 #1 随风起舞 的帖子
我想您应该看看一些论坛上内容,我记得发的附件里面的内容就从论坛里拷下来的,不过我比较昧良心,忘了是哪个帖子:loveliness: 这段时间比较忙,没办法和您一道看看问题,先研究一下吧 1.补零后的结果第一条谱线意义不再是一天,而是1440/2480的结果;2.如果想让第一条谱线仍然具有一天的意义,可以对1440点数据重新抽样成2048点,有resamp这个函数可以完成
3.如果你只想计算一天,半天等几条谱线,而不是全部的谱线,直接用1440点数据做DFT也是可以的(比如<20)
4.MATLAB还有另外一个函数CZT,长期被振动界所忽略.采用这个函数可以对频谱任意取样,样本长度也无须2^N. 但是运算量约是同样长度的FFT的六倍 看来用FFT点数扩充后是无法得到例如周期为一天的低频谱线的,只能选择DFT。二楼朋友说的延长观测数据至2048个,我想得到的第一条谱线的周期同样是(1440/2048)/天,第二条周期为(2*1440/2048)。归根到底还是补零后计算点的频率分辨率不匹配的原因。不知道我的这种理解是否正确,或者还有什么其他的方法可以得到2048个点的周期为一天的谱线。
由于目前本人是用vc自己写的程序,所以无法使用matlab的诸如resample之类的函数。但在matlab中1440个点采用FFT后仍然生成1440个对应复数,而不是2^N,我觉得不太理解,可能在这种情况下matlab自动调用DFT? 是的。采用DFT也可以解决这个问题。
回复 #5 随风起舞 的帖子
其实任意点数的FFT都是可以的,只是2^N长度的效率最高.如果是一个质数长度,那么其效率和直接的DFT相同.我建议你在VC中使用CZT,他需要调用3次FFT.如果你的FFT自己已调试好,附加的工作量大概有30条语句就够了.但是你的文章可以写的花哨一些.
回复 #7 VibrationMaster 的帖子
我的FFT中的VC代码只能分析长度为2^N的序列,并不具有任意长度的通用性。所以看来还是只能用DFT了。 如果计算的谱线数比较少,就直接用DFT,如果比较多,不妨试一下CZT. CZT在振动的资料中介绍的比较少. 胡广书的《数字信号处理》的教材中有介绍。 希望这种方法能在振动界发扬光大。
页:
[1]