我正在尝试从我正在阅读的实验数据集中制作一个功率谱,然后将其与理论曲线拟合。现在一切正常,我没有得到错误,除了我的曲线与数据相差1000倍的事实,我完全不知道问题是什么。我问过几个人,但无济于事。 (我希望你们能帮忙)
无论如何,我很确定它不是单位,因为它们被我和另外两个人检查过。基本上,我需要使用最小二乘法将幂谱拟合到等式中。 我不能发布整个代码,因为它相当冗长而且有点混乱,但这是更为复杂的部分,我在所有未在代码中声明的数组和变量中添加了注释)
#Calculate stuff
Nm = 10**-6 #micro to meter
KbT = 4.10E-21 #Joule
T = 297. #K
l = zvalue*Nm #meter
meany = np.mean(cleandatay*Nm) #meter (cleandata is the array that I read in from a cvs at the start.)
SDy = sum((cleandatay*Nm - meany)**2)/len(cleandatay) #meter^2
FmArray[0][i] = ((KbT*l)/SDy) #N
#print FmArray[0][i]
print float((i*100/len(filelist)))#how many % done?
#fourier
dt = cleant[1]-cleant[0] #timestep
N = len(cleandatay) #Same for cleant, its the corresponding time to cleandatay
这是傅立叶部分开始的地方,我把fft转向功率谱。然后我用数组freqs
计算相应的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光谱,线是拟合,红点是它认为截止频率的位置,蓝线是卡方拟合,寻找最低值。
答案 0 :(得分:1)
查看您正在使用的FFT文档。许多FFT引入了通常为N *结果(样本数)的比例因子。乘以1 / N将重新调整结果。 (你说结果是1000太高了......你可能正在使用1024大小的FFT吗?)
答案 1 :(得分:1)
您的库FFT例程可能包含1 / sqrt(n)的比例因子。
检查您使用的fft的文档,因为在fft和ifft之间分配的比例因子的比例是任意的。