Numpy 从rfft2数组创建fft2结果

Numpy 从rfft2数组创建fft2结果,numpy,fft,Numpy,Fft,我试图通过操纵rfft2的结果来重新创建完整fft2的结果。文件说明,rfft2仅计算正系数,因为输入为实时,负系数与正系数具有对称性。这对于大型阵列非常有用,因为rfft2的计算速度比完整的fft2快得多 下面的代码是我试图从rfft2输出重新创建fft2的代码。我已经尝试了“左”数组的各种操作,但不可能在任何地方都实现“相同”。有什么想法吗 import numpy as np import matplotlib.pyplot as plt from skimage.data import

我试图通过操纵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