Sen 1D değişen/çeviri için özellik belirledi. 2D için, biraz farklı ama aynı prensibe dayanıyor.

x0,y0
sen tanıtmak istiyorum kayması olacaktır: 2D çevirisini elde etmek için, bu gibi tanımlanır çeviri/vardiya tesistir. Bu şekilde, x0
'un pozitif değeri 2D sinyalinizi sağa kaydırırken, negatif bir değer sola kayar. Benzer şekilde, y0
'un pozitif değeri, 2B görüntünüzü aşağı doğru kaydırırken, negatif bir değer yukarı doğru kayardı.
nedenle, 2D olarak Transform senin Fourier göz önüne alındığında, üs için ek bir terim eklemeniz gerekir. Ayrıca, numaralı telefonun N
tarafından normalleştirilmesi veya 2B sinyalinizin boyutu. Bu, 2D sinyalinizin aynı sayıda satır ve sütuna sahip olduğunu varsayar. Bu durumda, o zaman u*x0
almak zorunda kalacaksınız ve sütun sayısına göre bölünecek ve v*y0
satırların sayısına bölünecektir. 2 boyutta bu nasıl tanımlanacağı emin olmadıklarından
Şimdi, yukarıdaki kodda F
kafası karıştı nedeni budur. 2D ızgarası'daki her nokta için frekans değerini tanımlamanız gerekir. 2D sinyal büyüklüğü 200 x 200 ve bu ortasında olmak bizim 2D sinyalini ortalamak gibi Çünkü senin fftshift
aramanın, biz, -100 ile 99 arasında x
ve y
değerleri tanımlamak olacaktır. Bu aslında fftshift
'un yapmasıdır. Benzer şekilde, ifftshift
, fftshift
tarafından yapılan merkezlemeyi kaldırır. Bu noktaları 2D olarak tanımlamak için meshgrid
kullanıyorum. Bu noktaları tanımladıktan sonra, her bir çift (x,y)
koordinatını alırsınız, daha sonra yukarıdaki özellikte gördüğünüz gibi karmaşık üsteli yaratırsınız.
Aynı şekilde, kod, bu şekilde modifiye edilmesi gerekir. Orijinal kodunuzda gereksiz fftshift
ve ifftshift
çağrılarından kurtuldum. fft
'u arayarak spektrumu ortalamak için fftshift
'u kullanırsınız. Ben de input
MATLAB'da bir fonksiyondur olarak, in
için değişken input
değişti ve biz istemeden bir değişkenle işlevi gölge istemiyoruz.
Ayrıca, x
geçişini -35 olarak tanımladım ve y
geçişi -50 olarak değişti. Bu, elde edilen sinyalin sola 35 ve 50'ye kalacağı anlamına gelir.Bu nedenle
: Ben sonuçta resmin gerçek bileşeni görüntülenen
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));
dikkate alın. Bunun nedeni, ters Fourier Dönüşümü'nü aldıktan sonra, bazı sayısal belirsizlikler olabilir ve sinyalin karmaşık kısmı aslında oldukça küçüktür. Sinyalin gerçek bileşenini kullanarak bunu görmezden gelebiliriz. Yukarıda görülen özelliği tarafından doğrulanmadı olarak

Gördüğünüz gibi, görüntü, düzgün vardiya vermedi:
Bu
alıyorum resimdir. Farklı vardiyaları belirtmek isterseniz, zevkinize uyacak şekilde x0
ve y0
'u değiştirmeniz gerekir. Sizin durumunuzda, y0 = 0
belirtecektiniz, daha sonra x0
yatay çeviri yapmak istediğiniz her şey olabilir.
sadece "circshift" kullanmak daha kolay değil mi? – bla
Evet, öyle. Ama prensipte, bu, ilgilendiğim açıklanan yöntemi kullanarak yapılabilir. (: – Pythonice
@CeciliaGuerra - "circshift" ile katılıyorum, ama bunu Fourier Transform'in çeviri/vardiya mülkünün bir gösterimi olarak yaptığınızı farz ediyorum. Her iki durumda da bir cevap yazdım. – rayryeng