Вы определили свойство для перевода/перехода в 1D. Для 2D это немного отличается, но основано на том же принципе. Для достижения перевода в 2D, это перевод/свойство сдвига, который определяется как:
x0,y0
будет сдвиг вы хотите ввести. Таким образом, положительное значение x0
переместит ваш 2D-сигнал вправо, а отрицательное значение сдвинется влево. Аналогично, положительное значение y0
перенесет ваш 2D-изображение вниз, в то время как отрицательное значение сдвинется вверх.
Поэтому, учитывая ваше преобразование Фурье в 2D, вам нужно будет добавить дополнительный показатель экспоненте. Кроме того, вы должны нормализовать на N
или размер вашего двумерного сигнала. Это предполагает, что ваш двумерный сигнал имеет одинаковое количество строк и столбцов. Если это не так, то вам нужно будет принять 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
, тогда x0
может быть любым, что вы хотите, если хотите горизонтальный перевод.
просто сказал, не проще ли использовать 'circshift'? – bla
Да, это так. Но в принципе это можно сделать, используя описанный метод, в котором я заинтересован. (: – Pythonice
@CeciliaGuerra - Я согласен с 'circshift', но я предполагаю, что вы делаете это как демонстрацию способности перевода/сдвига преобразования Фурье. В любом случае, я написал ответ. – rayryeng