Như những người khác đã đề cập, thực hiện FFT 2D trên kernel sẽ cung cấp cho bạn đáp ứng tần số của bộ lọc. Tuy nhiên, điều đáng nói là các bộ lọc 2D có thể được phân tích bằng cách sử dụng biến đổi Z , có thể cung cấp hoặc không cung cấp cái nhìn sâu sắc hơn, tùy thuộc vào bộ lọc (và những gì bạn muốn biết).
Ví dụ, với hạt nhân bạn đã chỉ định, phương trình sai khác tương ứng sẽ là
y(n1,n2)=x(n1+1,n2)+x(n1,n2+1)+x(n1−1,n2)+x(n1,n2−1)−4x(n1,n2).
Biến đổi Z của nó là
Y(z1,z2)=z1X(z1,z2)+z2X(z1,z2)+z−11X(z1,z2)+z−12X(z1,z2)−4X(z1,z2),
mà sau khi sắp xếp lại, sẽ mang lại hàm truyền sau cho bộ lọc:
H(z1,z2)=Y(z1,z2)X(z1,z2)=z1+z2+z−11+z−12−4.
Để xác định đáp ứng cường độ, chỉ cần cắm một cặp số mũ phức tạp và đơn giản hóa, như sau:
H(eiw1,eiw2)|H(eiw1,eiw2)|=eiw1+eiw2+e−iw1+e−iw2−4=(eiw1+e−iw1)+(eiw2+e−iw2)−4=2cosw1+2cosw2−4=2(cosw1+cosw2−2)2−−−−−−−−−−−−−−−−−√.
Đánh giá đáp ứng cường độ ở tần số cực cao sẽ cho bạn cảm giác về đường cao so với đường thấp cho bộ lọc. Ví dụ,
|H(ei0,ei0)|=2(cos0+cos0−2)2−−−−−−−−−−−−−−−√=2(1+1−2)2−−−−−−−−−−√=0,
và
|H(eiπ,eiπ)|=2(cosπ+cosπ−2)2−−−−−−−−−−−−−−−√=2(−1−1−2)2−−−−−−−−−−−√=8.
Tất nhiên, hàm truyền có thể được đánh giá trực tiếp để vẽ đáp ứng cường độ của bộ lọc. Đây là một ví dụ sử dụng numpy :
import numpy as np
import pylab as py
from mpl_toolkits.mplot3d import axes3d
def H(z1,z2):
return z1 + z2 + 1./z1 + 1./z2 - 4.0
n = 100
w1 = w2 = np.linspace(-np.pi,np.pi, n)
mag = np.zeros((n,n))
for i1 in xrange(0,n):
for i2 in xrange(0,n):
z1 = np.exp(1j*w1[i1])
z2 = np.exp(1j*w2[i2])
mag[i1,i2] = np.abs(H(z1,z2))
fig = py.figure()
ax = fig.add_subplot(111, projection='3d')
X, Y = np.meshgrid(w1,w2)
ax.plot_surface(X, Y, mag, cmap='bone', alpha=.5)
py.show()
Hãy nhớ rằng nếu bạn sử dụng kỹ thuật FFT 2D hạt nhân, cường độ kết quả sẽ không nhất thiết phải tập trung ở mức 0 như âm mưu trên.