我无法理解Numpy关于奈奎斯特频率的行为。请考虑以下示例:
import numpy as np
x=np.linspace(0, 2*np.pi, 21)[:-1]
k=np.fft.rfftfreq(len(x), d=x[1]-x[0])
FFT=np.fft.rfft(x)
x1=np.fft.irfft(1j*k*FFT)
FFT[-1]+=1e5
x2=np.fft.irfft(1j*k*FFT)
print(np.allclose(x1,x2))
打印True
。显然,我对FFT
中的奈奎斯特频率做了什么并不重要,结果始终相同,忽略了变化。奇怪的是,当试图恢复功能时没有发生这种情况(没有推导):
x1=np.fft.irfft(FFT)
FFT[-1]+=1e5
x2=np.fft.irfft(FFT)
print(np.allclose(x1,x2))
打印False
。
我可能误解了奈奎斯特频率在这里(维基百科和其他来源不是很有帮助)但是这两种结果都不应该受到奈奎斯特频率变化的影响吗?我能找到的最接近的解释是奈奎斯特频率应该是一个实数,但似乎仍然无法解释这两种行为。
我问这个的原因是因为我试图通过Fortran code来重现我知道正确的结果,这些结果确实可以用奈奎斯特频率进行区分。我的结果总是大约1%,我猜这是罪魁祸首。
答案 0 :(得分:2)
r
中的np.fft.rfft()
表示您在实际输入中使用DFT。但如果这不是真的,那么你将获得像这样的意外的行为。只需将fft
函数用于复杂值即可。作为旁注,请始终尝试检查您的数据。
编辑(补充说明):
特别是,当您计算“真实输入的DFT”时,您要对数据强制执行某些属性,即实值函数的(D)FT,意味着(D)FT变换是厄米对称的,并且因此负(D)FT系数是冗余的,因此rfft
和更晚irfft
针对此假设下的计算进行了优化。
有关详细信息,请参阅其文档np.fft.rfft()
和np.fft.irfft()
。
简单地说,由于这个预期的奇偶校验,你的系数的一半(负数)将不会由np.fft.rfft()
计算,并且由于(D)FT变换的奇偶性,第一个分量是纯粹的(通过定义),最后一个组件也是纯粹的(为方便起见)。
由于1j
乘法,在随后的irfft
调用中,纯粹真实的东西现在纯粹是虚构的(反之亦然)。
由于irfft()
将忽略第一个和最后一个组件的虚部,因此您的语句不会影响其结果。