解决Pytorch傅里叶变换新旧版本如何互相替换的问题(torch.rfft与torch.fft.fft2)
目前主要是对torch.rfft与torch.fft.fft2进行相互替换,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]
# 沿着最后一个维度进行叠加
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)
经过 torch.fft.rfft2之后的结果:

经过stack之后的结果:


如有不足还请指正,欢迎分享