您确定了一维平移/移动的属性。对于 2D,它略有不同,但基于相同的原理。实现2D平移,这是translation/shift属性,定义为:
x0,y0
将是您要介绍的转变。因此,正值x0
会将您的 2D 信号向右移动,而负值将向左移动。类似地,正值y0
会将您的 2D 图像向下移动,而负值将向上移动。
因此,鉴于您的二维傅立叶变换,您需要在指数中添加一个附加项。此外,您必须N
按2D 信号的大小进行归一化。这是假设您的 2D 信号具有相同的行数和列数。如果不是这种情况,那么您将不得不u*x0
除以列数并v*y0
除以行数。
现在,您对上述代码感到困惑的原因F
是您不确定如何在 2D 中定义它。您必须为 2D 网格中的每个点定义一个频率值。由于您的fftshift
来电,我们将定义x
和y
值介于 -100 和 99 之间,因为您的 2D 信号大小为 200 x 200,这将使我们的 2D 信号居中位于中间。这实际上fftshift
是在做什么。同样,ifftshift
撤消由 完成的居中fftshift
。为了在 2D 中定义这些点,我使用meshgrid
. 定义这些点后,您将获取每对(x,y)
坐标,然后创建复指数,如您在上述属性中看到的那样。
因此,您的代码必须以这种方式进行修改。请记住,我摆脱了您原始代码中的冗余fftshift
和ifftshift
调用。您将调用fft
,然后fftshift
将频谱居中。我还将您的变量更改input
为in
,就像input
MATLAB 中的函数一样,我们不想无意中用变量隐藏函数。
我还将x
偏移定义为-35,将y
偏移定义为-50。这意味着结果信号将向左移动 35,然后向上移动 50。
所以:
in=peaks(200); %// Define input signal
H=fftshift(fft2(in)); %// Compute 2D Fourier Transform
x0=-35; %// Define shifts
y0=-50;
%// Define shift in frequency domain
[xF,yF] = meshgrid(-100:99,-100:99);
%// Perform the shift
H=H.*exp(-1i*2*pi.*(xF*x0+yF*y0)/200);
%// Find the inverse Fourier Transform
IF_image=ifft2(ifftshift(H));
%// Show the images
figure;
subplot(1,2,1);
imshow(in);
subplot(1,2,2);
imshow(real(IF_image));
请注意,我显示了结果图像的真实组件。这是因为一旦你进行傅里叶逆变换,可能会有一些数值不精确,而且信号的复杂部分实际上非常小。我们可以通过仅使用信号的实部来忽略这一点。
这是我得到的图像:
正如你所看到的,图像确实正确地移动了,正如上面看到的属性所验证的那样。如果你想指定不同的班次,你只需要改变x0
并y0
适应你的口味。在您的情况下,您可以指定y0 = 0
, thenx0
可以是任何您想要的水平翻译。