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

我无法理解这种scipy的行为.从
scipy.fftpack docs我知道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幅度.为什么不将它简单地输出复数值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一样正常工作(正如人们所期望的那样)?

我错过了什么?

编辑:该问题正在讨论here

最佳答案 这不是一个好理由,但一个可能的原因是将独立自由度的数量与变换函数的输入和输出中的变量数量相匹配.如果仅从严格实数输入中输出复杂的向量元素,那么Im(y(0))和Im(y(N / 2))总是为零(对于偶数N),因此复杂的函数返回会在运载时浪费内存通过使输出两个元素分量大于输入,没有附加信息,即使自由度应该完全相同.

输入和输出向量存储器大小的相等性还允许进行就地RFFT而不需要任何额外的存储器分配,这在具有相对于FFT大小的约束存储器的实时系统中可能是重要的.

而FFTW更典型地在大型系统上运行,而程序员使用(浪费?)大量内存比理论上最小的内存更常见.

点赞