对于每个维度,索引样本数应为 -n/2 ... 0 ... n/2 -1,因此如果维度为奇数,则以中间为中心。如果维度是偶数,则居中,以便在新 0 之前比新 0 之后多一个样本。
例如。 -4、-3、-2、-1、0、1、2、3(宽度/高度为 8)或 -3、-2、-1、0、1、2、3(宽度/高度为 7) 。
FFT是相对于中间的,其尺度上有负点。
在内存中,点是 0...n-1,但 FFT 将它们视为 -ceil(n/2)...floor(n/2),其中 0 是 -ceil(n/2) 和 n- 1 是楼层(n/2)
单位矩阵是一个由 0 组成的矩阵,其中 1 位于 0,0 位置(中心 - 根据上面的编号)。 (在空间域中。)
在频域中,单位矩阵应该是一个常数(所有实数值为 1 或 1/(N*M),所有虚数值为 0)。
如果您没有收到此结果,则识别矩阵可能需要以不同方式填充(向左和向下而不是围绕所有边) - 这可能取决于 FFT 实现。
Center 每个维度分别(这是索引居中,实际内存没有变化)。
您可能需要填充图像(居中后)每个维度的 2 的整数次幂(2^n * 2^m,其中 n 不必等于 m)。
通过在源图像和目标图像中使用基于中心的索引(例如 (0,0) 到 (0,0))将现有像素复制到新的较大图像中,相对于 FFT 的 0,0 位置(到中心,而不是角)进行填充, (0,1) 至 (0,1), (1,-2) 至 (1,-2))
假设您的 FFT 使用常规浮点单元而不是复杂单元,复杂的图像即使您不需要 2 的整数幂,大小也必须为 2*ceil(2/n) * 2*ceil(2/m)(因为它有一半的样本,但样本很复杂)。
如果你的图像有多个颜色通道,您首先必须重塑它,以便通道在子像素排序中最重要,而不是最不重要。您可以一次性重塑和填充,以节省时间和空间。
不要忘记FFTSHIFTIFFT 后。 (交换象限。)
IFFT 的结果是 0...n-1。您必须采用像素 Floor(n/2)+1..n-1 并将它们移动到 0...floor(n/2) 之前。
这是通过将像素复制到新图像、将 Floor(n/2)+1 复制到内存位置 0、将 Floor(n/2)+2 复制到内存位置 1、...、将 n-1 复制到内存- 来完成的。位置floor(n/2),然后0到内存位置ceil(n/2),1到内存位置ceil(n/2)+1,...,floor(n/2)到内存位置n -1。
当你在频域中相乘,请记住,样本是复杂的(一个细胞实数,一个细胞虚数),因此您必须使用复数乘法。
结果可能需要除以 N^2*M^2,其中 N 是填充后 n 的大小(对于 M 和 m 也是如此)。 - 您可以通过(a. 查看单位矩阵的频域值,b. 将结果与输入进行比较。)来判断这一点。