解決Pytorch傅里葉變換新舊版本如何互相替換的問題(torch.rfft與torch.fft.fft2)
? ? 目前主要是對torch.rfft與torch.fft.fft2進(jìn)行相互替換,torch.rfft適合于torch1.7及其之前的版本,torch.fft.fft2適合于1.7之后的版本

#(batch, c, h, w) → rfft → (batch, c, h, w/2+1, 2)
ffted = torch.rfft(x, signal_ndim=2, normalized=True)#torch1.7及之前版本
#(batch, c, h, w) →fft.rfft2→(batch, c, h, w//2+1)→stack→(batch, c, h, w/2+1, 2)
ffted = torch.fft.rfft2(x, dim=(-2, -1), norm="ortho")#torch1.7之后版本
ffted = torch.stack((ffted.real, ffted.imag), -1)

逆變換:
#?(batch,c, t, h, w/2+1, 2)→.irfft→(batch,c, t, h, w)
output = torch.irfft(ffted, signal_ndim=2,
? ? ?? ? ? ? ? ? ? ? ?signal_sizes=r_size[2:], normalized=True)#torch.1,7之前
#?(batch,c, t, h, w//2+1, 2)→complex_tensor:(batch,c, t, h, w//2+1)→fft.irfft2→(batch,c, t, h,?w)
real_part = ffted[..., 0]
imaginary_part = ffted[..., 1]
# 沿著最后一個維度進(jìn)行疊加
complex_tensor = real_part + 1j * imaginary_part
output = torch.fft.irfft2(complex_tensor, dim=(-2, -1), s=r_size[2:], norm="ortho")

#(1,3,6,6)?→?rfft?→?(1,3,6,4,2)
ffted =?torch.rfft(x, signal_ndim=2, normalized=True)#torch1.7及之前版本
x的樣子為:

其輸出ffted的樣子為:圖上下僅(1,1,6,4,2),還有兩個矩陣一致,沒有畫出了


#(1,3,6,6) →fft.rfft2→(1,3,6,4)→stack→(1,3,6,4,2)
ffted = torch.fft.rfft2(x, dim=(-2, -1), norm="ortho")#torch1.7之后版本
ffted = torch.stack((ffted.real, ffted.imag), -1)
經(jīng)過?torch.fft.rfft2之后的結(jié)果:

經(jīng)過stack之后的結(jié)果:


如有不足還請指正,歡迎分享