傅里叶逆变换 - 从 MATLAB 移植到 Python

信息处理 matlab Python IFFT
2022-02-19 15:44:29

我正在将一个脚本从 MATLAB 移植到 Python,但是在进行傅里叶逆变换时我失败了。

MATLAB (ifft) 中的函数包含一个“symflag”,它将数据视为共轭对称并确保输出是真实的。但是,numpy 中的等效函数没有类似的选项,因此我的输出不同。

'symflag' 清楚地掩盖了我的一些数学上的不足,如果能帮助我解决这个问题,我将不胜感激。我的目标是在 Python 中找到一个与 MATLAB 中的解决方案非常匹配的解决方案。

在 Matlab 中

Y = [complex(1), complex(2), complex(3), complex(3), complex(2), complex(1)]

y = ifft(Y, 'symmetric')

y = 2.33    -0.50   -0.16   0   -0.16   -0.50

在 Python 中

Y = np.array([1, 2, 3, 3, 2, 1], dtype='complex')

y = ifft(Y)

y = ?

提前谢谢了。

1个回答

Y对于长度向量N, 在哪里N是偶数,共轭对称性需要满足以下性质:

Y[k]=Y[Nk]
为了k=1,...,N1Y0是真实的。(见这个。)这里表示复共轭。

[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]. 请注意,会有一些舍入问题,您可以验证yPython 中的虚部实际上为零。这是我的输出:

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 的文档更清楚地说明它在幕后所做的事情。