首页 > 解决方案 > numpy.fft.fft 中参数 n 的影响是什么

问题描述

我想将fft我的时间序列数据应用于提取最低 5 个主要频率分量,以预测每个时间序列结束时的 y 值(细菌计数)。我的代码如下:

df = pd.read_csv('/content/drive/My Drive/df.csv', sep=',') 
X = df.iloc[0:2,0:10000]

dft_X = np.fft.fft(X)     # What should I fill in for argument n?
print(dft_X) 
print(len(dft_X))
plt.plot(dft_X)
plt.grid(True)
plt.show()

for i in dft_X: 

    m = i[np.argpartition(i,5)[:5]]
    n = i[np.argpartition(i,range(5))[:5]]

print(m,'\n',n)

scipydoc on 中numpy.fft.fft,它指出

numpy.fft.fft(a, n=None, 轴=-1, norm=None)

...

n:整数,可选

输出的变换轴的长度。如果 n 小于输入的长度,则裁剪输入。如果它更大,则用零填充输入。如果未给出 n,则使用沿轴指定的轴的输入长度。

但是我仍然不清楚参数 n 值对输出的影响以及如何决定使用什么值。

我注意到当 时n = 10,输出如下:

# n= 10
# [-1.5       -1.11022302e-16j -0.46352549-1.42658477e+00j
#  -1.21352549-8.81677878e-01j -1.21352549+8.81677878e-01j
#  -0.46352549+1.42658477e+00j] 
#  [-1.5       -1.11022302e-16j -1.21352549-8.81677878e-01j
#  -1.21352549+8.81677878e-01j -0.46352549-1.42658477e+00j
#  -0.46352549+1.42658477e+00j]

当 时n = 10000,输出如下:

# n= 10000
# [-4752.15448944 +4113.44846878j -5199.36419709 -1826.78753048j
#  -4659.45705354-13014.97971229j -4752.15448944 -4113.44846878j
#  -5199.36419709 +1826.78753048j] 
#  [-5199.36419709 -1826.78753048j -5199.36419709 +1826.78753048j
#  -4752.15448944 -4113.44846878j -4752.15448944 +4113.44846878j
#  -4659.45705354-13014.97971229j]

什么决定了使用正确的 n 值?此外,为什么输出值是复数?任何帮助表示赞赏。

以下是时间序列图供参考: 在此处输入图像描述

标签: pythonnumpyscipysignal-processingfft

解决方案


但是我仍然不清楚参数 n 值对输出的影响以及如何决定使用什么值。

对于“n = 输入大小”,结果是简单的离散傅立叶变换:它在频率空间中精确地表示持续时间 (T = n dt) 的信号。最低频率分量是波周期 2T 的正弦/余弦。

对于“n > 输入大小”,您执行信号的变换,该信号是附加了零的原始信号。因此可以表示的最低频率对应于较长的波周期2T。信号因此突然被切断为零。根据输入信号,这可能会引入不需要的更高频率分量。

对于“n < 输入大小”,您会截断信号。如果您有“固定信号”,则分析较短的样本(可能带有窗口)可能是有意义的。

什么决定了使用正确的 n 值?

这取决于应用和采样(非常长的固定系列,短的测量,...)。除非您有某些理由使用该选项,否则您可以省略 n。

此外,为什么输出值是复数?

实信号的傅里叶变换通常是复杂的。它只对偶数信号是真实的。

您可以使用具有简单信号(例如纯正弦或余弦)的 FFT 来理解这一点。


推荐阅读