Numpy np.fft.fft关闭1000倍(拟合功率谱)

Numpy np.fft.fft关闭1000倍(拟合功率谱),numpy,fft,Numpy,Fft,我试图从我正在阅读的一个实验数据集中制作一个功率谱,然后将其拟合到理论曲线上。现在一切正常,我没有出错,除了我的曲线与数据相差1000倍,我完全不知道问题出在哪里。我问过几个人,但没有用。(我希望你们能帮忙) 不管怎么说,我很确定这不是单位,因为它们是由我和另外两个人三联检查的。基本上,我需要使用最小二乘法将功率谱拟合到方程中。 我不能发布整个代码,因为它相当长,有点凌乱,但这是傅立叶部分,我对所有未在代码中声明的数组和变量添加了注释) 这里是傅里叶部分开始的地方,我将fft转换成功率谱。然后我

我试图从我正在阅读的一个实验数据集中制作一个功率谱,然后将其拟合到理论曲线上。现在一切正常,我没有出错,除了我的曲线与数据相差1000倍,我完全不知道问题出在哪里。我问过几个人,但没有用。(我希望你们能帮忙)

不管怎么说,我很确定这不是单位,因为它们是由我和另外两个人三联检查的。基本上,我需要使用最小二乘法将功率谱拟合到方程中。 我不能发布整个代码,因为它相当长,有点凌乱,但这是傅立叶部分,我对所有未在代码中声明的数组和变量添加了注释)

这里是傅里叶部分开始的地方,我将fft转换成功率谱。然后我用数组freq计算相应的freq步长

fouriery =  np.fft.fft((cleandatay*(10**-6)))
fourierpower = (np.abs(fouriery))**2
fourierpower = fourierpower[1:N/2] #remove 0th datapoint and /2 (remove negative freqs)
fourierpower =  fourierpower*dt #*dt to account for steps

freqs = (1.+np.arange((N/2)-1.))/50.

#Least squares method
eta = 8.9E-4 #pa*s
Rbead = 0.5E-6#meter
constant = 2*KbT/(3*eta*pi*Rbead)    

omega = 2*pi*freqs #rad/s
Wcarray = 2.*pi*np.arange(0,30, 0.02003) #0.02 = 30/len(freqs)
ChiSq = np.zeros(len(Wcarray))

for k in range(0, len(Wcarray)):
    Py = (constant / (Wcarray[k]**2 + omega**2))
    ChiSq[k] = sum((fourierpower - Py)**2)
    pylab.loglog(omega, Py)
    print k*100/len(Wcarray) 


index = np.where(ChiSq == min(ChiSq))
cutoffw = Wcarray[index]    
Pygoed = (constant / (Wcarray[index]**2 + omega**2))
print cutoffw
print constant
print min(ChiSq)
pylab.loglog(omega,ChiSq)
所以我不知道会出什么问题,我认为这是fft,因为没有其他东西会出问题。 下面是我根据光谱绘制所有拟合线时得到的图片,你可以看到它偏离了大约1000(实际上正好是1000,因为这留下了10^-22的最小二乘余数,但我不能在不知道为什么的情况下随机相乘)
我只是想详细说明一下。绿点是fft频谱,直线是拟合,红点是它认为截止频率的位置,蓝线是卡方拟合,寻找最小值

查看您正在使用的FFT的文档。许多FFT引入的比例因子通常为N*result(样本数)。乘以1/N将使结果按直线缩放。(您说结果太高了1000…可能是您使用的是1024大小的FFT吗?

您的库FFT例程可能包含1/sqrt(n)的比例因子


查看您使用的fft的文档,因为fft和ifft之间分配的比例因子是任意的。

我使用的是Cooley-Tukey算法(),我认为它可以解释这一点,但是即使没有,我的数组大小是5999,所以不是这样。(或者这里有N个其他的吗?)通常FFT真的希望FFT的大小是2的幂(例如FFT大小4096),可能暗示的填充有一些影响。你能试试更小或更大的样本大小,看看这是否会影响缩放效果吗?二次幂只会让事情变得更快,只要你的大小不是质数,Cooley Tukey仍然可以大大加快事情的速度。除非被要求,否则SciPy/NumPy绝对不会进行填充。处理任何FFT库的关键是了解它们对世界的看法。有些人缩放结果,有些人不填充输入,有些人不填充输入。RT*M始终是一个很好的起点。Numpy的FFT计算的确切定义如下:Numpy包括ifft中的整个1/n因子。试着对在Numpy中生成的已知信号进行分析,在那里你确切地知道功率谱应该是什么样子,比如说,一个简单的正弦波,然后看看结果如何。(而且,这对于这个站点上的人来说调试起来要容易得多,因为我们可以运行代码,假设有人这么想的话。)这样的例子是数据分析的单元测试,会让你对结果有充分的信心。
fouriery =  np.fft.fft((cleandatay*(10**-6)))
fourierpower = (np.abs(fouriery))**2
fourierpower = fourierpower[1:N/2] #remove 0th datapoint and /2 (remove negative freqs)
fourierpower =  fourierpower*dt #*dt to account for steps

freqs = (1.+np.arange((N/2)-1.))/50.

#Least squares method
eta = 8.9E-4 #pa*s
Rbead = 0.5E-6#meter
constant = 2*KbT/(3*eta*pi*Rbead)    

omega = 2*pi*freqs #rad/s
Wcarray = 2.*pi*np.arange(0,30, 0.02003) #0.02 = 30/len(freqs)
ChiSq = np.zeros(len(Wcarray))

for k in range(0, len(Wcarray)):
    Py = (constant / (Wcarray[k]**2 + omega**2))
    ChiSq[k] = sum((fourierpower - Py)**2)
    pylab.loglog(omega, Py)
    print k*100/len(Wcarray) 


index = np.where(ChiSq == min(ChiSq))
cutoffw = Wcarray[index]    
Pygoed = (constant / (Wcarray[index]**2 + omega**2))
print cutoffw
print constant
print min(ChiSq)
pylab.loglog(omega,ChiSq)