Невозможно сопоставить результаты при реализации 3D DFT - PullRequest
0 голосов
/ 03 февраля 2012

Я пытаюсь реализовать 3D DFT, но у меня возникли проблемы.То, что я считаю, что я должен сделать, это просто сделать 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, результаты больше не совпадают.Кто-нибудь знает, что не так?

1 Ответ

2 голосов
/ 03 февраля 2012

Первый экземпляр self.dft имеет слишком большой отступ.

Кроме этого, я не вижу ничего плохого в предоставленном коде.

В качестве примечания: если вы используете numpy, как подсказывает ваш код, вы можете значительно упростить свой код, даже не прибегая к встроенному DFT / FFT.

Например, вы можете индексировать трехмерный массив, например data3D[i, j, k]. Вы можете нарезать, выполнив data3D[:, j, k], data3D[i, :, k], data3D[:, :, k] и т. Д. Вместо назначения отдельных элементов по одному в цикле for.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...