簡體   English   中英

如何實現快速傅里葉變換來關聯兩個2d陣列?

[英]How to implement the fast fourier transform to correlate two 2d arrays?

我想用更大的數組來做這個,但為了讓我能理解它,我將使用一個更小的例子。

假設我有以下數組:

    A = [[0, 0, 100],
         [0, 0, 0],
         [0, 0, 0]] 

如果我想通過乘以相應的條目來計算此數組與另一個數組的相關性。 例如,A * A將等於A(1 * 1 = 1,其他地方為零)。 我讀到快速傅里葉變換可以用來加速大型陣列。 根據我的閱讀,我得到的印象是,如果我想將兩個數組A和B相乘,就像在A * B中一樣,我可以使用以下內容(在python中使用numpy)更快地完成:

a = np.conj(np.fft.fftn(A))
b = np.fft.fftn(B)
c = np.fft.ifft(a*b)

因此,實際上,取A的fft,取B的fft,乘以兩個結果,然后得到該結果的倒數。 但是,我用上面給出的A的情況嘗試了它,乘以它自己。 我曾希望反向乘法會給我

[[0, 0, 10000],
 [0, 0, 0    ],
 [0, 0, 0    ]]

然而,我有點不同,更接近

[[10000, 0, 0],
 [10000, 0, 0],
 [10000, 0, 0]]

有誰知道發生了什么? 對不起,我猜我有一些關於fft的誤解。

您應該使用scipy.signal.fftconvolve

它已經實施並經過廣泛測試,特別是在處理邊界方面。 在2D中從卷積到相關運算符所需的唯一額外步驟是將濾波器陣列旋轉180°(參見本答案 )。

如果必須實現自己的,則應注意頻域中的乘法對應於時域中的循環卷積 要獲得所需的線性卷積,您需要用零填充兩個數組,其長度至少是原始矩陣1的兩倍:

s = [2*x for x in np.shape(A)]
a = np.conj(np.fft.fftn(A,s))
b = np.fft.fftn(B,s)
c = np.fft.ifftn(a*b)

嚴格來說, 1的大小為2n-1(而不是2n),但是當操作尺寸為小素因子的倍數時,FFT往往表現更好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM