欢迎光临散文网 会员登陆 & 注册

解决Pytorch傅里叶变换新旧版本如何互相替换的问题(torch.rfft与torch.fft.fft2)

2023-08-25 13:15 作者:小xu在岸上等大家  | 我要投稿

    目前主要是对torch.rffttorch.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的样子为:

(1,3,6,6)

其输出ffted的样子为:图上下仅(1,1,6,4,2),还有两个矩阵一致,没有画出了

(1,3,6,4,2)上
(1,3,6,4,2)
(1,3,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之后的结果:

(1,3,6,4)

经过stack之后的结果:

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

解决Pytorch傅里叶变换新旧版本如何互相替换的问题(torch.rfft与torch.fft.fft2)的评论 (共 条)

分享到微博请遵守国家法律