我尝试用FFT方法重新采样一维信号(基本上是scipy信号). 然而,代码要花很长时间才能运行,即使我的输入信号长度是2的幂次方。看了分析之后,我找到了问题的根源。在
基本上,这种方法先进行FFT,然后去除部分傅里叶频谱,然后采用IFFT以较低的采样率将其带回时域。在
问题是IFFT的运行时间比FFT长:
ncalls tottime percall cumtime percall filename:lineno(function)
1 6263.996 6263.996 6263.996 6263.996 basic.py:272(ifft)
1 1.076 1.076 1.076 1.076 basic.py:169(fft)
我假设这和截止后的fourier点的数量有关。也就是说,这是一个难以置信的减速,所以我要确保:
A.这种行为是半合理的,不一定是一个bug。 B、 我仍然可以有效地避免这个问题。在
现在,我可以将输入信号的幂补为2,以使FFT运行得非常快,但不知道如何对反向运算做同样的事情。我甚至没有意识到这是IFFTs的问题:P
如果IFFT的长度与FFT的长度不同,并且IFFT的长度不是由非常小的素数因子(2,3等)组成,那么效率会显著下降。在
因此,这种重采样方法只有在两个采样率不同的情况下才是有效的,这些比率具有较小的素数因子,如2、3和7(提示)。在
相关问题 更多 >
编程相关推荐