我希望对函数'stress'进行傅立叶变换,从0到无穷大,并提取实部和虚部。我有以下代码使用数字集成技术来完成它:
import numpy as np
from scipy.integrate import trapz
import fileinput
import sys,string
window = 200000 # length of the array I wish to transform (number of data points)
time = np.linspace(1,window,window)
freq = np.logspace(-5,2,window)
output = [0]*len(freq)
for index,f in enumerate(freq):
visco = trapz(stress*np.exp(-1j*f*t),t)
soln = visco*(1j*f)
output[index] = soln
print 'f storage loss'
for i in range(len(freq)):
print freq[i],output[i].real,output[i].imag
这让我对输入数据进行了很好的转换。
现在我有一个大小为2x10 ^ 6的数组,并且使用上述技术是不可行的(计算时间尺度为O(N ^ 2)),所以我已经转向numpy中的内置fft函数。 没有太多的参数可以指定来更改此功能,因此我发现很难根据我的需要对其进行自定义。 到目前为止我已经
了import numpy as np
import fileinput
import sys, string
np.set_printoptions(threshold='nan')
N = len(stress)
fvi = np.fft.fft(stress,n=N)
gprime = fvi.real
gdoubleprime = fvi.imag
for i in range(len(stress)):
print gprime[i], gdoubleprime[i]
并没有给我准确的结果。
python中的DFT格式为A_k = summation(a_m * exp(-2 * pi i m k / n))其中求和从m = 0到m = n-1(http://docs.scipy.org/doc/numpy-1.10.1/reference/routines.fft.html)。如何将其更改为我在第一个代码中提到的格式,即exp(-1j freq * t)(freq是频率,t是已经预定义的时间)?或者我是否需要对数据进行后期处理?
提前感谢您的帮助。