0

3D DFT を実装しようとしていますが、問題が発生しています。私がすべきことは、各方向に 1 つずつ、3 つの連続した 1D 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 に拡張すると、結果が一致しなくなりました。誰が何が悪いのか知っていますか?

4

1 に答える 1

2

の最初のインスタンスself.dftがインデントされすぎています。

それ以外は、提供されたコードに問題はありません。

補足numpyとして、コードが示すように使用している場合は、組み込みの DFT/FFT に頼らなくても、コードを大幅に簡素化できます。

たとえば、 のような 3D numpy 配列にインデックスを付けることができますdata3D[i, j, k]。for ループ内で個々の要素を一度に 1 つずつ割り当てる代わりに、、、、などをdata3D[:, j, k]実行data3D[i, :, k]してスライスできます。data3D[:, :, k]

于 2012-02-03T04:15:40.330 に答える