Python 用Numpy实现脉动压力的FFT

Python 用Numpy实现脉动压力的FFT,python,numpy,fft,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(

我试图对随时间变化的压力变化进行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

其中第一列是时间,第二列是压力,这里显示了fft分析的一个非常简单的示例

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()


这应该让你开始。注意25和475处的峰值,这是我们定义为F的频率,只是为了补充@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])

StackOverflow是一个问答网站。在这里,你不是在问一个真正的问题,而是在问一个代码审查。不过,作为对你问题的回答:了解你的代码是否正常工作的一个好方法是在一些测试数据上运行它,即在你知道预期结果的数据上运行它。这种方法将比仅仅查看代码更好地工作,并捕获更多的问题。如果你这样做了,但没有得到你期望的结果,并且不知道如何解决它,那么这可能是一个提出这样一个问题的好时机。@tom10,你能详细说明一下吗?@nagordon感谢你对代码的解释,尽管我的回答很慢。