สร้างผลลัพธ์ fft2 จากอาร์เรย์ rfft2
Nov 06 2020
ฉันพยายามสร้างผลลัพธ์ของ fft2 แบบเต็มใหม่โดยจัดการผลลัพธ์ของ rfft2 เอกสารประกอบระบุว่า rfft2 คำนวณเฉพาะสัมประสิทธิ์บวกเนื่องจากสัมประสิทธิ์เชิงลบมีความสมมาตรกับค่าบวกเมื่ออินพุตเป็นจริง สิ่งนี้จะมีประโยชน์อย่างมากสำหรับอาร์เรย์ขนาดใหญ่เนื่องจากการคำนวณ rfft2 นั้นเร็วกว่า fft2 เต็มมาก
ดังนั้นรหัสด้านล่างคือฉันพยายามสร้าง fft2 ขึ้นใหม่จากเอาต์พุต rfft2 ฉันได้ลองใช้อาร์เรย์ "ด้านซ้าย" ทุกรูปแบบแล้วและไม่สามารถทำให้ "เหมือนกัน" เป็นจริงได้ทุกที่ ความคิดใด ๆ ?
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)))
คำตอบ
1 Will.Evo Nov 09 2020 at 16:11
ฉันหาค่าความสมมาตรโดยทำ fft2 บนอาร์เรย์ 6x6 ซึ่งจำเป็นต้องมีการเขียนโปรแกรมฟังก์ชันเพื่อแปลงเอาต์พุตของ 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