我试图通过操作 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)