使用Numpy进行波动压力的FFT

时间:2015-04-30 01:15:12

标签: python numpy fft

我正在尝试对随时间变化的压力变化进行FFT。但是,由于我是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

其中第一列是时间,第二列是压力

2 个答案:

答案 0 :(得分: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

的频率

答案 1 :(得分: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])