Buat hasil fft2 dari array rfft2
Saya mencoba membuat ulang hasil fft2 penuh dengan memanipulasi hasil rfft2. Dokumentasi menyatakan bahwa rfft2 hanya menghitung koefisien positif karena koefisien negatif memiliki kesimetrisan dengan koefisien positif ketika inputnya nyata. Ini akan sangat berguna untuk array besar karena menghitung rfft2 jauh lebih cepat daripada fft2 penuh.
Jadi kode di bawah ini adalah saya mencoba membuat ulang fft2 dari output rfft2. Saya telah mencoba semua jenis manipulasi dari array "kiri" dan tidak bisa "sama" menjadi kenyataan di mana-mana. Ada ide?
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)))
Jawaban
Saya menemukan simetri dengan melakukan fft2 pada array 6x6 yang kemudian hanya memerlukan pemrograman fungsi untuk mengubah output dari rfft2 menjadi sama dengan fft2. Di bawah ini adalah fungsi dan gambar simetri itu.
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