gpt4 book ai didi

numpy - 在NumPy中使用FFT时的频率单位

转载 作者:行者123 更新时间:2023-12-04 10:56:02 27 4
gpt4 key购买 nike

我正在NumPy中使用FFT函数来进行一些信号处理。我有一个名为signal的数组
每小时有一个数据点,总共有576个数据点。我在signal上使用以下代码来查看其傅立叶变换。

t = len(signal)
ft = fft(signal,n=t)
mgft=abs(ft)
plot(mgft[0:t/2+1])

我看到两个峰值,但是不确定x轴的单位是什么,即它们如何映射到小时数上?任何帮助,将不胜感激。

最佳答案

给定采样率FSample和transformblockize N,您可以使用以下关系式来计算频率分辨率deltaF,采样间隔deltaT和总捕获时间capT:

deltaT = 1/FSample = capT/N
deltaF = 1/capT = FSample/N

还要记住,FFT将值从 0返回到 FSample,或者等效地从 -FSample/2返回到 FSample/2。在您的绘图中,您已经将 -FSample/2拖放到 0部分。 NumPy包括一个帮助函数,可以为您计算所有这些信息: fftfreq

对于 deltaT = 1 hourN = 576的值,您将得到 deltaF = 0.001736 cycles/hour = 0.04167 cycles/day,从 -0.5 cycles/hour0.5 cycles/hour。因此,如果您在bin 48(和bin 528)处有一个幅度峰值,则它对应于 48*deltaF = 0.0833 cycles/hour = 2 cycles/day.处的频率分量

通常,应在计算FFT之前将 window function应用于时域数据,以减少 spectral leakage。 Hann窗口几乎从来都不是一个坏选择。您还可以使用 rfft函数跳过输出的 -FSample/2, 0部分。因此,您的代码将是:
ft = np.fft.rfft(signal*np.hanning(len(signal)))
mgft = abs(ft)
xVals = np.fft.fftfreq(len(signal), d=1.0) # in hours, or d=1.0/24 in days
plot(xVals[:len(mgft)], mgft)

关于numpy - 在NumPy中使用FFT时的频率单位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8573702/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com