我无法理解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(signal))
的内容,则可获得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)
输出为:
[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
答案 0 :(得分:1)
不是一个好理由,但一个可能的原因是将独立自由度的数量与变换函数的输入和输出中的变量数量相匹配。如果仅从严格实数输入中输出复杂的向量元素,那么Im(y(0))和Im(y(N / 2))总是为零(对于偶数N),因此复杂的函数返回会在运载时浪费内存通过使输出两个元素分量大于输入,没有附加信息,即使自由度应该完全相同。
输入和输出向量存储器大小的相等性还允许在不需要任何额外存储器分配的情况下进行就地RFFT,这对于具有相对于FFT大小的约束存储器的实时系统而言可能是重要的。
而FFTW通常在大型系统上运行,而程序员使用(浪费?)大量内存比理论上最小的内存更常见。