2016-05-14 16 views
3

私はまだdataの周波数解析をPythonでFFTを使用して取得しようとしています。 サンプリングレートは1データポイント/分です。Pythonを使用したFFT - 予想外の低周波数

私のコードは次のとおりです。

from scipy.fftpack import fft 
df3 = pd.read_csv('Pressure - Dates by Minute.csv', sep=",", skiprows=0) 
df3['Pressure FFT'] = df3['ATMOSPHERIC PRESSURE (hPa) mean'] - df3['ATMOSPHERIC PRESSURE (hPa) mean'].mean() 
Pressure = df3['Pressure FFT'] 
Fs = 1/60 
Ts = 1.0/Fs 
n = len(Pressure) 
k = np.arange(n) 
T = n/Fs 
t = np.arange(0,1,1/n) # time vector 
frq = k/T # two sides frequency range 
frq = frq[range(int(n/2))] # one side frequency range 

Y = np.fft.fft(Pressure)/n # fft computing and normalization 
Y = Y[range(int(n/2))] 

fig, ax = plt.subplots(2, 1) 
ax[0].plot(t,Pressure) 
ax[0].set_xlabel('Time') 
ax[0].set_ylabel('Amplitude') 
ax[1].plot(frq,abs(Y),'r') # plotting the spectrum 
ax[1].set_xlabel('Freq (Hz)') 
ax[1].set_ylabel('|Y(freq)|') 

しかし、結果が得られます。

enter image description here

だから私の問題は、次のとおりです。

1)は、周波数が全く存在しないのはなぜ?データは明らかに周期的です。

2)なぜ周波数スペクトルが低いのですか? (0 - 0.009)

3)多分私は別のフィルタリング手法を試してみるべきですか?

洞察?

ありがとうございました!

+1

FFT関数によって返される配列の最初の項目は、DCコンポーネント、つまり元の配列のすべての値の合計を持ちます。これは、しばしば、周期成分よりも数桁大きい。プロットする前に 'Y [1:]'をプロットするか、 'Y [0] = 0'を行うと、あなたの周波数が表示されるはずです。 – Jaime

+0

プロットする前にY [0] = 0を実行しようとしましたが、周波数はまだありません。多分それは正規化ですか?定期的な行動は1日2回であるからです。 – ValientProcess

+1

通常、ログスケールを使用してY軸をプロットします。また、FFTの前に適切な窓関数を適用するのを忘れてしまった。 –

答えて

2

1)なぜ周波数が全くないのですか?データは明らかに周期的です。

周波数のコンテンツがあります。その構造のために正確には見えません。私たちは今、低い値を昇圧して高い値を制限し、単純な変換を適用している

semilog Spectrum

ax[1].plot(frq,abs(Y),'r')からax[1].semilogy(frq,abs(Y),'r')

に、周波数スペクトルをプロットラインを変更してみてくださいこれは、になります。詳細は​​を参照してください。もちろん、あなたのコードの3行目にあるように、DCを削除することも役立ちます。

これはまだ少しぼやけたようで、それがあるが、私たちは、スペクトルの下の部分にズームインするとき、我々はこれを参照してください約2.3e-05スパイクを示し

semilog Transform

約12時間に相当する。

2)なぜ周波数スペクトルが低いのですか? (0-0。009)

サンプリングは60秒ごとに1回行われるため、サンプリング周波数は(約)0.016Hzです。あなたのスペクトルには、DC(0Hz)と0.0083Hzの間のものがすべて含まれています。詳細については、を参照してくださいthis link

3)多分私は別のフィルタリング技術を試す必要がありますか?

ハーモニックを解決できない場合は、ここで必要なように見えません。

これが役に立ちます。

1

これらの周波数が非常に低いように見える理由の一部は、振幅プロットの時間軸が奇妙にスケーリングされているためです。 60秒に1つのサンプルが実際にある場合、x軸の範囲は0〜1690260秒(〜20日)です。目で

enter image description here

、あなたはおよそ2x10⁻⁵ヘルツの周波数に対応するすべての50000秒(〜2日)、約小さなピークを持っているようです。したがって、あなたのピリオドグラムは、私にとってかなり合理的です。

関連する問題