从 rfft2 数组创建 fft2 结果

Create fft2 result from rfft2 array

我正在尝试通过操纵 rfft2 的结果来重新创建完整的 fft2 的结果。文档指出 rfft2 仅计算正系数,因为当输入为实数时负系数与正系数对称。这对于大型阵列非常有用,因为计算 rfft2 比完整的 fft2 快得多。

所以下面的代码是我试图从 rfft2 输出重新创建 fft2。我已经尝试了对“左”数组的各种操作,但无法完全使“相同”在所有地方都成立。有什么想法吗?

import numpy as np
import matplotlib.pyplot as plt

from skimage.data import camera

frame = camera()

full_fft = np.fft.fft2(frame)
real_fft = np.fft.rfft2(frame)

left = real_fft[:, :-1].copy()
right = np.flipud(left[:, ::-1])

sim_fft2 = np.hstack((left, right))

same = np.isclose(full_fft, sim_fft2)

plt.figure()
plt.imshow(same)

plt.figure()
plt.imshow(np.log(np.abs(full_fft)))

plt.figure()
plt.imshow(np.log(np.abs(sim_fft2)))

我通过在 6x6 数组上执行 fft2 计算出对称性,然后只需要编写一个函数来将 rfft2 的输出转换为与 fft2 相同。下面是该函数和对称图像。

def _rfft2_to_fft2(im_shape, rfft):
    fcols = im_shape[-1]
    fft_cols = rfft.shape[-1]

    result = numpy.zeros(im_shape, dtype=rfft.dtype)

    result[:, :fft_cols] = rfft

    top = rfft[0, 1:]

    if fcols%2 == 0:
        result[0, fft_cols-1:] = top[::-1].conj()
        mid = rfft[1:, 1:]
        mid = numpy.hstack((mid, mid[::-1, ::-1][:, 1:].conj()))
    else:
        result[0, fft_cols:] = top[::-1].conj()
        mid = rfft[1:, 1:]
        mid = numpy.hstack((mid, mid[::-1, ::-1].conj()))

    result[1:, 1:] = mid

    return result