2015-04-30 93 views
0

我正在嘗試做一個隨時間變化的壓力變化的FFT。但是,由於我是FFT分析的新手,我不確定我所做的是正確的。任何建議將被認真考慮。這裏是我的代碼:使用Numpy的波動壓力的FFT

import sys 
import numpy as np 
from numpy import fft 
import matplotlib.pyplot as plt 

pressure_data = np.loadtxt('p.dat') 
t, p = pressure_data[:,0], pressure_data[:,1] 

number = len(p) 
sample_period = 1.0/2000 

f_coeffs = np.fft.fft(p)/number 
f_coeffs_abs = np.absolute(f_coeffs) 
freq = np.fft.fftfreq(number, sample_period) 

plt.figure() 
plt.plot(freq, f_coeffs_abs) 
plt.show() 

p.dat文件是這樣的

0.0005  -2047.41878324 
0.001  -1709.80828161 
0.0015  -2158.61672106 
0.002  -3766.56591721 

其中第一列是時間,第二個是壓力

+0

StackOverflow上,就是要一個問答網站。你不是在這裏問一個真正的問題,而是要求代碼審查。 – tom10

+0

在回答你的問題時:知道你的代碼是否正常工作的一個好方法是在一些測試數據上運行它,即你知道預期結果的數據。這種方法將更好地工作,並捕捉更多的問題,而不僅僅是查看代碼。如果你這樣做並沒有得到你期望的結果,並且不能弄清楚如何解決它,那麼**它可能是SO問題的好時機。 – tom10

回答

1

一個FFT anaylsis的一個非常簡單的例子在這裏展示。

from scipy import fft 
from numpy import arange, cos, pi, random 
from matplotlib.pyplot import subplot, plot, ylabel, xlabel, title, grid, xlim, show 

N = 2**9 
F = 25 
t = arange(N)/float(N) 
x = cos(2*pi*t*F) + random.rand(len(t))*3 
subplot(2,1,1) 
plot(t,x) 
ylabel('x []') 
xlabel('t [seconds]') 
title('A cosine wave') 
grid() 

subplot(2,1,2) 
f = t*N 
xf = fft(x) 
plot(f,abs(xf)) 
title('Fourier transform of a cosine wave') 
xlabel('xf []') 
ylabel('xf []') 
xlim([0,N]) 
grid() 
show() 

enter image description here

應該讓你開始那。請注意,在25℃和475峯,這就是我們定義爲F

+0

475處的峯值不正確。 – tom10

+0

@ tom10,可否詳細說明一下? – nagordon

+0

@nagordon感謝您對代碼工作版本的解釋,儘管我的迴應很慢。 – hypersonics

1

只需添加到@ nagordon的解釋頻率:您可以通過做一些像提取峯:

xf = np.fft.fft(x)[:N//2] # it's reflected about middle so only take first half 
... 
threshold = 30.0 
peaks = np.where(((xf[1:-1] - xf[:-2]) > threshold) & ((xf[1:-1] - xf[2:]) > threshold)) 
print([(i + 1, abs(xf[i + 1])) for i in peaks])