我仍在尝试使用Python中的FFT对这个data进行频率分析。
采样率为每分钟1个数据点。
我的代码是:

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

但结果是:
python - 使用Python进行FFT-意外的低频-LMLPHP
所以我的问题是:
1)为什么根本没有频率?数据显然是周期性的。
2)为什么频谱这么低?(0-0.009)
3)也许我应该尝试不同的过滤技术?
有什么见解吗?
谢谢!!!

最佳答案

1)为什么根本没有频率?数据显然是周期性的。
好吧,有频率的内容,因为它的结构,所以不太明显。尝试将绘制频谱的线从ax[1].plot(frq,abs(Y),'r')更改为ax[1].semilogy(frq,abs(Y),'r')
这将导致:
python - 使用Python进行FFT-意外的低频-LMLPHP
在这里,我们应用了一个简单的转换,它可以提高低值并限制高值。有关更多信息,请参见this link。当然,删除DC(就像在代码的第3行一样)也有帮助。
这看起来还是有点模糊,但如果我们放大光谱的较低部分,我们会看到:
python - 使用Python进行FFT-意外的低频-LMLPHP
其峰值约为2.3E-0.05Hz,相当于约12小时。
2)为什么频谱这么低?(0-0.009)
因为你每60秒采样一次,所以你的采样频率是(大约)0.016赫兹。你的频谱包含了直流电(0Hz)和0.0083Hz之间的一切。有关详细信息,请参见this link
3)也许我应该尝试不同的过滤技术?
如果你不能分辨出谐波,你可以试着开窗,但看起来这里不需要。
希望这有帮助。

08-24 12:39