Python 为什么scipy.fftpack.rfft返回实际值?

Python 为什么scipy.fftpack.rfft返回实际值?,python,scipy,fft,Python,Scipy,Fft,我无法理解scipy的这种行为。从中我了解到,fft的输出显然很复杂,形状如下: [y(0),y(1),..,y(n/2),y(1-n/2),...,y(-1)] if n is even [y(0),y(1),..,y((n-1)/2),y(-(n-1)/2),...,y(-1)] if n is odd 因此,如果你绘制类似于np.abs(fft(信号))的曲线,你就得到了fft的幅度 如果我的信号是实值的,那么负频率就不提供任何信息,因此可以使用rfft来加快速度。我不

我无法理解
scipy
的这种行为。从中我了解到,
fft
的输出显然很复杂,形状如下:

[y(0),y(1),..,y(n/2),y(1-n/2),...,y(-1)]         if n is even
[y(0),y(1),..,y((n-1)/2),y(-(n-1)/2),...,y(-1)]  if n is odd
因此,如果你绘制类似于
np.abs(fft(信号))
的曲线,你就得到了fft的幅度

如果我的信号是实值的,那么负频率就不提供任何信息,因此可以使用
rfft
来加快速度。我不明白的是:
rfft
的输出为什么是实值的,形状很奇怪:

[y(0),Re(y(1)),Im(y(1)),...,Re(y(n/2))]              if n is even
[y(0),Re(y(1)),Im(y(1)),...,Re(y(n/2)),Im(y(n/2))]   if n is odd
实际上,在这个定义中,
np.abs(rfft(signal))
给了你垃圾(你可以交替得到FFT的实部和虚部的绝对值…),你需要一些技巧才能得到FFT的幅度。为什么
rfft
它不简单地将复数
y(j)
s输出为:

[y(0),y(1),..,y(n/2)]        if n is even
[y(0),y(1),..,y((n-1)/2)]    if n is odd
这样事情就可以像fft一样很好地工作了(正如人们所期望的那样)

我错过了什么


编辑:正在讨论的问题不是一个很好的原因,但一个可能的原因是将独立自由度的数量与变换函数的输入和输出中的变量数量相匹配。如果仅从严格实数输入输出复数向量元素,则Im(y(0))和Im(y(N/2))始终为零(对于偶数N),因此,通过使输出的两个元素分量大于输入,复数函数返回将浪费内存,同时不携带任何附加信息,即使自由度应该完全相同

输入和输出向量内存大小相等还允许在不需要任何额外内存分配的情况下执行就地RFFT,这在内存相对于FFT大小受限的实时系统中可能很重要


而FFTW通常在大型系统上运行,程序员在大型系统上使用(浪费?)的内存量比理论上所需的最小内存量要多。

感谢这些非常有趣的观察结果。但是,可以简单地添加一个选项来控制输出格式。这可能(我猜)是因为numpy的复数表示。您看到的两个float64组成了complex128数据。最后的转换可能缺失了。