2012-02-03 35 views
0

我試圖實現3D DFT,但我遇到了一些麻煩。我相信我應該做的只是連續3次一維DFT,每個方向一個。假設一維DFT是正確的,你可以看到什麼是錯,此代碼:實現3D 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中測試我的算法,所以我可以比較我的算法和內置算法的結果。據我所知,對於1D和2D變換都行得通,但是一旦我將其擴展到3D,結果就不再匹配。有誰知道什麼是錯的?

回答

2

self.dft的第一個實例縮進了太多。

除此之外,我從所提供的代碼中看不出任何錯誤。作爲一個方面說明,如果您使用numpy作爲您的代碼建議,即使不使用內置的DFT/FFT,也可以顯着簡化代碼。

例如,您可以索引一個3D numpy數組,如data3D[i, j, k]。您可以通過執行data3D[:, j, k],data3D[i, :, k],data3D[:, :, k]等來分片,而不是在for循環內一次一個地分配單個元素。

+0

哦,我的。它必須是愚蠢的。非常感謝。你是當天的英雄。 另外,感謝關​​於numpy的提示。 – Feryla 2012-02-03 04:20:14

+1

您也可以滾動numpy座標軸,以便不需要編寫三個單獨的循環。 – DSM 2012-02-03 04:26:32