怎样提高FFT的速度
现在对8192点进行8192*2点(就是在8912个点后再补8192个0)大概需要16ms的时间,但是时间还是长了用的基二,请问各位大虾有什么方法可以让FFT速度更快?
回复 楼主 wanghedong1226 的帖子
FFT的计算速度与编写的程序代码有关,与电脑速度有关,请问你用的什么程序代码,CPU速度是多少?本人在单芯CPU速度3G电脑上运行16384点实数FFT速度小于4ms。
将FFT_Test.dat改名为FFT_Test.exe在你的电脑上运行,看看(16384点)FFT需要多少时间?
[ 本帖最后由 hcharlie 于 2010-8-17 06:55 编辑 ] 用你给的测试文件测也是小于4ms
本人是双核CPU 2G HZ
我执行16ms是在VC下面,我想的是能不能改算法来提高速度。
我用的是基二,输入的是实序列,但我还是当复序列进行处理的。如果是实序列,可不可以就是只处理一半来提高速度,因为是对称的。或者说16384点我分成8段处理,每次处理2048,最后叠加,但是好像这样频率分辨率要降低 本帖最后由 hcharlie 于 2010-8-18 15:47 编辑
复FFT(虚部加16384个0)大概 8 ms,我也是VC++编程,双精度浮点。
实数FFT 4 ms。(有极小的相位误差) 回复 hcharlie 的帖子
现在我打算进行分段处理,就是16384分8段,依次进行FFT,最后叠加,不知道这样行么?
本帖最后由 hcharlie 于 2010-8-18 16:17 编辑
当然可以,频率分辨率增加8倍。其实对于随机信号通常应该取多帧平均可以增加精度。参见(6楼):
http://forum.vibunion.com/thread-92098-1-1.html
通常还要加(如hanning)窗。
无须补零,应插值 为什么要补8192个0 ??? 本帖最后由 wanghedong1226 于 2010-8-18 20:41 编辑
回复 hcharlie 的帖子
我理论掌握得不是很好,个人认为补零就是为了提高频域的采样率,在频域上看到更多的谱线,减小栅栏效应我不知道我这样做对不对?
回复 VibrationMaster 的帖子
可以讲得更详细些么,我以前完全不懂FFT,看了一个月的书,勉强了解了一点,哎
本帖最后由 hcharlie 于 2010-8-19 08:24 编辑
回复
我理论掌握得不是很好,个人认为补零就是为了提高频域的采样率,在频域上看到更多的谱线,减小栅栏效应 ...
wanghedong1226 发表于 2010-8-18 20:21 static/image/common/back.gif
你的想法是错的,后面加多少0也不能达到减小栅栏效应。记住不要轻易去加0。
抄一段网上的论述如下:
补零对频谱的影响:
进行zero padding只是增加了数据的长度,而不是原信号的长度。就好比本来信号是一个周期的余弦信号,如果又给它补了9个周期长度的0,那么信号并不是10个周期的余弦信号,而是一个周期的余弦加一串0,补的0并没有带来新的信息。..........所以,如果待分析的两个信号频率接近,而时域长度又较短,那么在频域上它们就落在一个sinc主瓣内了,补再多的0也是无济于事的。
本帖最后由 hcharlie 于 2010-8-19 11:46 编辑
回复 wanghedong1226 的帖子
栅栏效应对于FFT来说,问题是始终存在的。比如频率分辨率10Hz,一帧数据中100Hz为10个整数周期,110Hz为11个整数周期,在100~110之间的频率就不可能是整数周期,比如105Hz就是10.5个周期,在一帧数据中它的波形不能首尾相接,这样一来就显示出加窗的效果。不加窗就是加矩形窗,这时候105Hz的能量除了反映在第10和11谱线上,更泄漏到更远的临近很多谱线中。加hanning窗则不会泄漏得更远。
参见:http://forum.vibunion.com/thread-94575-1-1.html
什么时候需要考虑栅栏效应?比如对某个特定频率(例如50Hz及其倍频)特别感兴趣,则要选择合适的采样频率,使50Hz为频率分辨率的整数倍,比如原定采样频率1000Hz应改为1024或2048Hz。(原因请自己想)
1. 栅栏效应是指分析周期或谐波信号
2。对随机信号,栅栏效应的概念不存在
3。对情形1可采用插值的方式完全消除栅栏效应,
参考下面的连接
http://forum.vibunion.com/forum-viewthread-tid-75167-from-home.html
页:
[1]