1

読み込んでいる実験データセットからパワースペクトルを作成し、それを理論曲線に当てはめようとしています。現在、すべてが正常に機能しており、エラーは発生していませんが、曲線がデータとは 1000 倍も異なっており、何が問題なのかまったくわかりません。数人に聞いてみましたがだめでした。(皆様のお役に立てれば幸いです)

とにかく、ユニットは私と他の2人によって3回チェックされたので、ユニットではないことは確かです. 基本的に、最小二乗法を使用して、powerspectrum を方程式に適合させる必要があります。かなり長くて少し面倒なので、コード全体を投稿することはできませんが、これはフーリエ部分です。コードで宣言されていないすべての配列と変数にコメントを追加しました)

#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 スペクトル、線は適合、赤色の点はカットオフ周波数であると考えられる場所、青色の線は最小値を探すカイ 2 乗適合です。

4

2 に答える 2

1

使用しているFFTのドキュメントをご覧ください。多くのFFTは、通常N *結果(サンプル数)であるスケーリング係数を導入します。1 / Nを掛けると、結果が元の位置に戻ります。(結果は1000が高すぎるとおっしゃいましたが、1024サイズのFFTを使用している可能性がありますか?)

于 2012-12-20T13:40:07.457 に答える
1

ライブラリ FFT ルーチンには、1/sqrt(n) の倍率が含まれている場合があります。

fft と ifft の間に割り当てられる倍率の比率は任意であるため、使用した fft のドキュメントを確認してください。

于 2012-12-20T18:20:41.423 に答える