使用 Python 的 FFT - 意外的低频
FFT using Python - unexpected low frequencies
我仍在尝试使用 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)|')
但结果给出:
所以我的问题是:
1) 为什么根本没有频率?数据周期性明显
2) 为什么频谱这么低? (0 - 0.009)
3) 也许我应该尝试不同的过滤技术?
有什么见解吗?
谢谢!!!
这些频率看起来如此低的部分原因是因为振幅图中的时间轴缩放得很奇怪。如果你真的每 60 秒有一个样本,那么 x 轴的范围应该在 0 到 1690260 秒之间(即 ~20 天!)。
肉眼看来,您似乎每 50000 秒就有一个小峰值(每天约 2 个),这对应于大约 2x10⁻⁵ 赫兹的频率。因此,考虑到 x 轴的比例有多大,你的周期图对我来说看起来很合理。
1) Why there are no frequencies at all ? The data is clearly periodic.
嗯,有频率内容,只是因为它的结构不完全可见。尝试更改绘制频谱的线,从 ax[1].plot(frq,abs(Y),'r')
到 ax[1].semilogy(frq,abs(Y),'r')
这将导致:
我们现在应用了一个简单的转换来提升低值并限制高值。有关详细信息,请参阅 this link。当然,删除 DC(就像您在代码的第 3 行所做的那样)也有帮助。
这看起来仍然有点模糊,但如果我们放大到频谱的较低部分,我们会看到:
显示大约 2.3e-05 Hz 处的尖峰,对应大约 12 小时。
2) Why the frequency spectrum is so low ? (0 - 0.009)
因为你每 60 秒采样一次,所以你的采样频率是(大约)0.016 赫兹。您的频谱包含 DC (0Hz) 和 0.0083Hz 之间的所有频率。更多信息,请参阅this link
3) Maybe I should try different filtering technique?
如果您无法解决谐波问题,您可以尝试加窗,但看起来这里不需要它。
希望这对您有所帮助。
我仍在尝试使用 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)|')
但结果给出:
所以我的问题是:
1) 为什么根本没有频率?数据周期性明显
2) 为什么频谱这么低? (0 - 0.009)
3) 也许我应该尝试不同的过滤技术?
有什么见解吗?
谢谢!!!
这些频率看起来如此低的部分原因是因为振幅图中的时间轴缩放得很奇怪。如果你真的每 60 秒有一个样本,那么 x 轴的范围应该在 0 到 1690260 秒之间(即 ~20 天!)。
肉眼看来,您似乎每 50000 秒就有一个小峰值(每天约 2 个),这对应于大约 2x10⁻⁵ 赫兹的频率。因此,考虑到 x 轴的比例有多大,你的周期图对我来说看起来很合理。
1) Why there are no frequencies at all ? The data is clearly periodic.
嗯,有频率内容,只是因为它的结构不完全可见。尝试更改绘制频谱的线,从 ax[1].plot(frq,abs(Y),'r')
到 ax[1].semilogy(frq,abs(Y),'r')
这将导致:
我们现在应用了一个简单的转换来提升低值并限制高值。有关详细信息,请参阅 this link。当然,删除 DC(就像您在代码的第 3 行所做的那样)也有帮助。
这看起来仍然有点模糊,但如果我们放大到频谱的较低部分,我们会看到:
显示大约 2.3e-05 Hz 处的尖峰,对应大约 12 小时。
2) Why the frequency spectrum is so low ? (0 - 0.009)
因为你每 60 秒采样一次,所以你的采样频率是(大约)0.016 赫兹。您的频谱包含 DC (0Hz) 和 0.0083Hz 之间的所有频率。更多信息,请参阅this link
3) Maybe I should try different filtering technique?
如果您无法解决谐波问题,您可以尝试加窗,但看起来这里不需要它。
希望这对您有所帮助。