FFTHIFT / IFFTSHIFT 是一种奇特的 CIRCSHIFT 方式。
您可以验证 FFTSHIFT 是否可以重写为 CIRCSHIFT,如下所示。
您可以在 C/C++ 中定义宏来将 FFTSHIFT 转换为 CIRCSHIFT。
A = rand(m, n);
mm = floor(m / 2);
nn = floor(n / 2);
% All three of the following should provide zeros.
circshift(A,[mm, nn]) - fftshift(A)
circshift(A,[mm, 0]) - fftshift(A, 1)
circshift(A,[ 0, nn]) - fftshift(A, 2)
可以找到 IFFTSHIFT 的类似等效项。
使用以下代码可以非常简单地实现循环移位(当然可以通过并行版本进行改进)。
template<class ty>
void circshift(ty *out, const ty *in, int xdim, int ydim, int xshift, int yshift)
{
for (int i = 0; i < xdim; i++) {
int ii = (i + xshift) % xdim;
for (int j = 0; j < ydim; j++) {
int jj = (j + yshift) % ydim;
out[ii * ydim + jj] = in[i * ydim + j];
}
}
}
然后
#define fftshift(out, in, x, y) circshift(out, in, x, y, (x/2), (y/2))
#define ifftshift(out, in, x, y) circshift(out, in, x, y, ((x+1)/2), ((y+1)/2))
这有点即兴。如果有任何格式/语法问题,请多多包涵。