实施3D DFT时无法匹配结果

时间:2012-02-03 03:49:19

标签: python fft dft

我正在尝试实施3D DFT,但我遇到了一些麻烦。我认为我应该做的是只做3个连续的一维DFT,每个方向一个。假设1D DFT是正确的,你能看出这段代码有什么问题:

def dft3d(self, real3d, img3d, nx, ny, nz, dir):

    #Transform depth
    for i in range(nx):
        for j in range(ny):
            real = numpy.zeros(nz)
            img = numpy.zeros(nz)
            for k in range(nz):
                real[k] = real3d[i][j][k]
                img[k] = img3d[i][j][k]
            self.dft(real, img, nz, 1) #This was indented too much. It should work now.
            for k in range(nz):
                real3d[i][j][k] = real[k]
                img3d[i][j][k] = img[k]

    #Transform cols
    for k in range(nz):
        for i in range(nx):
            real = numpy.zeros(ny)
            img = numpy.zeros(ny)
            for j in range(ny):
                real[j] = real3d[i][j][k]
                img[j] = img3d[i][j][k]
            self.dft(real, img, ny, 1)
            for j in range(ny):
                real3d[i][j][k] = real[j]
                img3d[i][j][k] = img[j]

    #Transform rows
    for j in range(ny):
        for k in range(nz):
            real = numpy.zeros(nx)
            img = numpy.zeros(nx)
            for i in range(nx):
                real[i] = real3d[i][j][k]
                img[i] = img3d[i][j][k]
            self.dft(real, img, nx, 1)
            for i in range(nx):
                real3d[i][j][k] = real[i]
                img3d[i][j][k] = img[i]

我知道python中有这个内置版本,但我不能使用它们。我只是在python中测试我的算法,所以我可以比较我的算法和内置算法的结果。据我所知,它对1D和2D变换都很好,但是一旦我将它扩展到3D,结果就不再匹配了。有谁知道出了什么问题?

1 个答案:

答案 0 :(得分:2)

self.dft的第一个实例缩进太多了。

除此之外,我认为所提供的代码没有错。

作为旁注,如果您使用numpy作为代码建议,即使不依靠内置的DFT / FFT,也可以显着简化代码。

例如,您可以索引像data3D[i, j, k]这样的3D numpy数组。您可以执行data3D[:, j, k]data3D[i, :, k]data3D[:, :, k]等切片,而不是在for循环中一次分配一个元素。