为什么 FFT 不自动产生以零频率为中心的输出?
Why doesn't FFT automatically produce a zero-frequency centered output?
在 DFT 之后执行一个名为 Shift 的操作,将零频分量带到频谱的中心。
关于这个操作我有两个问题:
- 为什么 DFT 不自动将零频分量居中?t/can
- 如果我们在 DFT 之后不执行 Shift 操作会怎样? IE。它如何影响我们的其他图像处理任务?
- 任何人都可以向我提供一些 material 来了解这个名为 Shift 的特定操作吗?
参考文献:
-
-
DFT, by definition,使用n=0..N-1
和k=0..N-1
,其中n
是时域信号的索引,k
是时域信号的索引频域信号。 k
也对应频率。 DFT 的定义类似于傅里叶级数。
由于DFT中的频率是周期性的,所以可以想到k=N-1
来对应k=-1
。因此,移位函数将频率的上半部分移动到原点的左侧,因此它们可以更容易地解释为负频率。但这只是为了方便显示,因为它把频域信号变成了我们更熟悉的形式(这可能是因为它使一些傅里叶分析更容易解释,因此教科书上这样显示,因此我们通过查看原点在中间的频率图来了解傅里叶。
对于图像处理中的大多数任务,我们不需要移动原点。还是那句话,只是为了展示,方便又好看
例如,计算互相关:
cc = ifft( fft(img1) * conj(fft(img2)) )
此处,cc
的左上角像素为原点。如果img1==img2
,左上角的像素将是最大值。如果我们有一个 fft
函数将原点移到中间,那么互相关图像 cc
的原点也会在中间。找到峰值后,我们需要做一些计算来计算 img1
和 img2
之间的偏移量。 (并不是说这很复杂,而是说明shifting不一定是有利的。)
卷积时,通常有一个空间域内核,原点在中间(例如 )。在这种情况下,必须在计算 DFT 之前将原点移动到左上角。但是移动频域信号的原点只是为了将它们相乘然后取消移动是没有意义的。可以简单地直接将原点在左上角的信号相乘:
kernel = ifftshift(kernel)
filtered = ifft( fft(img) * fft(kernel) )
请注意,有两种不同的移位函数,通常称为 fftshift
和 ifftshift
。一个将原点从左上角移到中间,另一个将原点从中间移到左上角。这两个函数对偶数大小的信号(图像)执行完全相同的操作,但如果大小为奇数则不同。
在 DFT 之后执行一个名为 Shift 的操作,将零频分量带到频谱的中心。
关于这个操作我有两个问题:
- 为什么 DFT 不自动将零频分量居中?t/can
- 如果我们在 DFT 之后不执行 Shift 操作会怎样? IE。它如何影响我们的其他图像处理任务?
- 任何人都可以向我提供一些 material 来了解这个名为 Shift 的特定操作吗?
参考文献:
-
-
DFT, by definition,使用n=0..N-1
和k=0..N-1
,其中n
是时域信号的索引,k
是时域信号的索引频域信号。 k
也对应频率。 DFT 的定义类似于傅里叶级数。
由于DFT中的频率是周期性的,所以可以想到k=N-1
来对应k=-1
。因此,移位函数将频率的上半部分移动到原点的左侧,因此它们可以更容易地解释为负频率。但这只是为了方便显示,因为它把频域信号变成了我们更熟悉的形式(这可能是因为它使一些傅里叶分析更容易解释,因此教科书上这样显示,因此我们通过查看原点在中间的频率图来了解傅里叶。
对于图像处理中的大多数任务,我们不需要移动原点。还是那句话,只是为了展示,方便又好看
例如,计算互相关:
cc = ifft( fft(img1) * conj(fft(img2)) )
此处,cc
的左上角像素为原点。如果img1==img2
,左上角的像素将是最大值。如果我们有一个 fft
函数将原点移到中间,那么互相关图像 cc
的原点也会在中间。找到峰值后,我们需要做一些计算来计算 img1
和 img2
之间的偏移量。 (并不是说这很复杂,而是说明shifting不一定是有利的。)
卷积时,通常有一个空间域内核,原点在中间(例如
kernel = ifftshift(kernel)
filtered = ifft( fft(img) * fft(kernel) )
请注意,有两种不同的移位函数,通常称为 fftshift
和 ifftshift
。一个将原点从左上角移到中间,另一个将原点从中间移到左上角。这两个函数对偶数大小的信号(图像)执行完全相同的操作,但如果大小为奇数则不同。