对于每个维度,样本的索引应该从 -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,0 位置(中心 - 根据上述编号)为 1。(在空间域中。)
在频域中,单位矩阵应该是一个常数(所有实数值为 1 或 1/(N*M),所有虚数值为 0)。
如果您没有收到此结果,则识别矩阵可能需要不同的填充(向左和向下而不是围绕所有边) - 这可能取决于 FFT 实现。
分别居中每个维度(这是一个索引居中,实际内存没有变化)。
您可能需要在每个维度上将图像(居中后)填充为 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) (因为它有一半的样本,但样本很复杂)。
如果您的图像有多个颜色通道,则首先必须对其进行整形,以便通道在子像素排序中是最重要的,而不是最不重要的。您可以一次性重塑和填充,以节省时间和空间。
不要忘记IFFT之后的FFTSHIFT。(交换象限。)
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 到内存位置来完成的location 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.将结果与输入进行比较。)