【问题标题】:What is the impact of argument n in numpy.fft.fftnumpy.fft.fft 中参数 n 的影响是什么
【发布时间】:2020-05-09 07:26:10
【问题描述】:

我想将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)

numpy.fft.fft 上的scipy 文档中,它指出

numpy.fft.fft(a, n=None, axis=-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 值?此外,为什么输出值是复数?任何帮助表示赞赏。

以下是时间序列图供参考:

【问题讨论】:

    标签: python numpy scipy signal-processing fft


    【解决方案1】:

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

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

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

    对于“n

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

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

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

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

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

    【讨论】:

    • 感谢您的回答。我可以再问一些问题吗?关于第二个亮点:“非常长的平稳序列”是什么意思,例如恒定均值/方差?和“短测量”?由于我只想通过提取最低 5 个主频率分量来预测 y 值来获得时间序列的主要模式,你认为我最好省略 n 吗?关于第三个亮点:我有点担心在模型训练中使用复数特征。这些数字代表频率吗?
    • 评论继续:我已经发布了我的时间序列数据(水温与时间)的图供您参考。我认为鉴于它们独特的形状,将它们分类为偶数/奇数信号可能无关紧要?如您所见,大多数输出​​都是复数。如果我将它们用作特征,您对处理复数有什么建议/建议吗?例如,是否有一种有效的替代方法来提取时间序列的主要模式(例如频率/幅度)?非常感谢!
    • “非常长的静止”:是的,cst 均值和方差。就像 Ornstein Uhlenbeck 过程,或者有噪声的数据通道,你对噪声感兴趣。这显然不是你的情况。然而,主频率的自动计算可能是一项敏感的任务。关于复数,您应该查找“功率谱”。它是变换的“平方范数”,是您应该用于频率检测的标准。
    • 关于模式匹配,有一些实用的细节,比如平滑,会使其更加健壮。
    • @nilsinelabore:“你认为我最好省略 n 吗?”是的,除非您有充分的理由这样做并了解后果,否则不要使用 n 参数。设置n 指示您可以测量哪些频率。一个非常小的n 使得您只能测量非常高的频率。请注意,在应用转换之前,数据会被截断为 n 样本。您的数据的第一个n 样本对您要表征的信号有何影响?你还能看到感兴趣的模式吗?
    猜你喜欢
    • 2020-08-30
    • 2012-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-25
    • 2011-09-01
    相关资源
    最近更新 更多