Y
对于长度向量N, 在哪里N是偶数,共轭对称性需要满足以下性质:
Y[k]=Y[N−k]∗
为了k=1,...,N−1和Y0是真实的。(见这个。)这里∗表示复共轭。
[1,2,3,3,2,1]
这个共轭对称属性不成立的数组。'symmetric'
当您使用非共轭对称的输入向量时, Matlab 做了什么?它假装几乎[1,2,3,3,2,1]
是共轭对称的†并将其替换为最接近的共轭对称向量,即[1,2,3,3,3,2]
.
如果你在 Python 中尝试这个:
Y = np.array([1,2,3,3,3,2])
y = np.fft.ifft(Y)
您的答案将匹配 Matlab 的答案'symmetric'
和[1,2,3,3,2,1]
. 请注意,会有一些舍入问题,您可以验证y
Python 中的虚部实际上为零。这是我的输出:
In [8]: np.fft.ifft(np.array([1,2,3,3,3,2]))
Out[8]:
array([ 2.33333333e+00 +0.00000000e+00j,
-5.00000000e-01 -1.48029737e-16j,
-1.66666667e-01 +0.00000000e+00j,
1.11022302e-16 +2.90348171e-16j,
-1.66666667e-01 +0.00000000e+00j, -5.00000000e-01 -1.42318434e-16j])
In [9]: np.real(np.fft.ifft(np.array([1,2,3,3,3,2])))
Out[9]:
array([ 2.33333333e+00, -5.00000000e-01, -1.66666667e-01,
1.11022302e-16, -1.66666667e-01, -5.00000000e-01])
In [10]: np.imag(np.fft.ifft(np.array([1,2,3,3,3,2])))
Out[10]:
array([ 0.00000000e+00, -1.48029737e-16, 0.00000000e+00,
2.90348171e-16, 0.00000000e+00, -1.42318434e-16])
现在是您的主要问题:您如何将其移植到 Python?
第 1 步:获取输入向量Y=[1,2,3,3,2,1]
第 2 步:通过循环并将向量的右半部分更改为等于左半部分的复共轭,强制它是共轭对称的。将此修改后的向量称为Y_new = [1,2,3,3,3,2]
。
第 3 步:计算np.fft.ifft(Y_new)
并丢弃它的虚部。(你可以做一个assert
并确保虚部有一个非常小的范数。)
或者,当N是偶数,步骤 2 和 3 可以替换为更快np.fft.irfft(Y[0:N/2+1])
的 endolith 在下面的评论中建议。
另请参阅:https : //blogs.mathworks.com/steve/2010/07/16/complex-surprises-from-fft/N很奇怪。
†AFAIK,在数学上,没有这样的事情是“近共轭对称”。向量要么是共轭对称的,要么不是!我希望 Matlab 的文档更清楚地说明它在幕后所做的事情。