如何实现快速傅里叶变换来关联两个2d阵列?

时间:2015-06-16 14:11:51

标签: python arrays numpy fft correlation

我想用更大的数组做这个,但为了让我能理解它,我将使用一个更小的例子。

假设我有以下数组:

    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的误解。

2 个答案:

答案 0 :(得分:3)

您应该使用http://mywebsite.com/appiphone/android/newsstand/psv/curl/posted.asp代替。

它已经实施并经过广泛测试,特别是在处理边界方面。从2D卷积到相关运算符所需的唯一额外步骤是将滤波器阵列旋转180°(参见scipy.signal.fftconvolve)。

答案 1 :(得分:2)

如果您必须实现自己的,则应注意频域中的乘法对应于时域中的circular convolution。要获得所需的线性卷积,您需要用零填充两个数组,其长度至少是原始矩阵 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往往表现更好。