torch.fft.fftshift¶
- torch.fft.fftshift(input, dim=None) Tensor ¶
重新排列由
fftn()
提供的 n 维 FFT 数据,以便负频率项排在前面。这将对 n 维数据执行周期性移位,使得原点
(0, ..., 0)
移动到张量的中心。具体来说,在每个选定的维度中移动到input.shape[dim] // 2
。注意
按照惯例,FFT 首先返回正频率项,然后按反序返回负频率,因此在 Python 中对所有 的
f[-i]
给出负频率项。fftshift()
将所有频率重新排列为从负到正的升序,零频率项位于中心。注意
对于偶数长度,奈奎斯特频率位于
f[n/2]
可以被认为是负数或正数。fftshift()
始终将奈奎斯特项放在 0 索引处。这与fftfreq()
使用的约定相同。- 参数
示例
>>> f = torch.fft.fftfreq(4) >>> f tensor([ 0.0000, 0.2500, -0.5000, -0.2500])
>>> torch.fft.fftshift(f) tensor([-0.5000, -0.2500, 0.0000, 0.2500])
还要注意,奈奎斯特频率项位于
f[2]
已移动到张量的开头。这也适用于多维变换
>>> x = torch.fft.fftfreq(5, d=1/5) + 0.1 * torch.fft.fftfreq(5, d=1/5).unsqueeze(1) >>> x tensor([[ 0.0000, 1.0000, 2.0000, -2.0000, -1.0000], [ 0.1000, 1.1000, 2.1000, -1.9000, -0.9000], [ 0.2000, 1.2000, 2.2000, -1.8000, -0.8000], [-0.2000, 0.8000, 1.8000, -2.2000, -1.2000], [-0.1000, 0.9000, 1.9000, -2.1000, -1.1000]])
>>> torch.fft.fftshift(x) tensor([[-2.2000, -1.2000, -0.2000, 0.8000, 1.8000], [-2.1000, -1.1000, -0.1000, 0.9000, 1.9000], [-2.0000, -1.0000, 0.0000, 1.0000, 2.0000], [-1.9000, -0.9000, 0.1000, 1.1000, 2.1000], [-1.8000, -0.8000, 0.2000, 1.2000, 2.2000]])
fftshift()
也适用于空间数据。如果我们的数据是在以中心为基准的网格 ([-(N//2), (N-1)//2]
) 上定义的,那么我们可以使用在以非中心为基准的网格 ([0, N)
) 上定义的标准 FFT,方法是首先应用ifftshift()
。>>> x_centered = torch.arange(-5, 5) >>> x_uncentered = torch.fft.ifftshift(x_centered) >>> fft_uncentered = torch.fft.fft(x_uncentered)
类似地,我们可以通过应用
fftshift()
将频域分量转换为以中心为基准的约定。>>> fft_centered = torch.fft.fftshift(fft_uncentered)
从以中心为基准的傅里叶空间转换回以中心为基准的空间数据的逆变换可以通过按相反顺序应用逆移位来执行
>>> x_centered_2 = torch.fft.fftshift(torch.fft.ifft(torch.fft.ifftshift(fft_centered))) >>> torch.testing.assert_close(x_centered.to(torch.complex64), x_centered_2, check_stride=False)