(numpy)FFT'd阵列的幅度(?)错误?

toy*_*las 4 python numpy fft amplitude

我正在使用numpy和matplotlib来分析我的模拟中的数据输出.有一个(明显的)不一致,我找不到根源.它是以下内容:

我有一个给定能量a ^ 2~1的信号.当我使用rfft进行FFT并计算傅里叶空间中的能量时,它会显着增大.为了无法提供我的数据等细节,这里有一个简单的sin波示例:

from pylab import *
xx=np.linspace(0.,2*pi,128)
a=np.zeros(128)
for i in range(0,128):
    a[i]=sin(xx[i])
aft=rfft(a)
print mean(abs(aft)**2),mean(a**2) 
Run Code Online (Sandbox Code Playgroud)

原则上两个数字应该是相同的(至少在数字意义上),但这是我从这段代码中得到的:

62.523081632 0.49609375
Run Code Online (Sandbox Code Playgroud)

我试图通过numpy.fft文档,但找不到任何东西.这里的搜索给出了以下内容,但我无法理解那里的解释:

现有(合成)信号与滤波信号之间的大FFT幅度差

我错过了什么/误解了什么?在这方面的任何帮助/指针将不胜感激.

谢谢!

Jai*_*ime 8

亨利在非标准化部分是正确的,但还有一点,因为你正在使用rfft,而不是fft.以下是他的回答:

>>> x = np.linspace(0, 2 * np.pi, 128)
>>> y = 1 - np.sin(x)
>>> fft = np.fft.fft(y)
>>> np.mean((fft * fft.conj()).real)
191.49999999999991
>>> np.mean(y**2)
1.4960937500000004
>>> fft = fft / np.sqrt(len(fft))
>>> np.mean((fft * fft.conj()).real)
1.4960937499999991
Run Code Online (Sandbox Code Playgroud)

但是,如果你现在尝试相同的rfft东西,事情并没有完全解决:

>>> rfft = np.fft.rfft(y)
>>> np.mean((rfft * rfft.conj()).real)
314.58462009358772
>>> rfft /= np.sqrt(len(rfft))
>>> np.mean((rfft * rfft.conj()).real)
4.8397633860551954
65
>>> np.mean((rfft * rfft.conj()).real) / len(rfft)
4.8397633860551954
Run Code Online (Sandbox Code Playgroud)

但是,以下方法可以正常工作:

>>> (rfft[0] * rfft[0].conj() +
...  2 * np.sum(rfft[1:] * rfft[1:].conj())).real / len(y)
1.4960937873636722
Run Code Online (Sandbox Code Playgroud)

当你使用rfft你得到的东西时,数据的DFT不正确,但只有正数的一半,因为负数将与它对称.要计算均值,您需要考虑除DC分量之外的每个值两次,这是最后一行代码所做的.