Numpy 从rfft2数组创建fft2结果
我试图通过操纵rfft2的结果来重新创建完整fft2的结果。文件说明,rfft2仅计算正系数,因为输入为实时,负系数与正系数具有对称性。这对于大型阵列非常有用,因为rfft2的计算速度比完整的fft2快得多 下面的代码是我试图从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
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