สร้างผลลัพธ์ 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