2012-02-03 2 views
0

3D DFT를 구현하려고하지만 약간의 문제가 있습니다. 내가해야한다고 믿는 것은 3 방향의 1D 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] 

내가 파이썬에서이 버전에서이 내장되어 있습니다 알고 있지만, 나는 그를 사용할 수 없습니다 : 1 차원 DFT가 올바른지 가정하면,이 코드에 어떤 문제가 있는지 확인할 수 있습니다. 파이썬에서 알고리즘을 테스트하고 있으므로 알고리즘과 내장 알고리즘의 결과를 비교할 수 있습니다. 지금까지 내가 1D와 2D 변환 모두에 대해 잘 작동한다고 말할 수 있었지만 일단 3D로 확장하면 결과가 더 이상 일치하지 않습니다. 누가 잘못되었는지 아는 사람 있습니까?

답변

2

self.dft의 첫 번째 인스턴스가 너무 들여 쓰기됩니다.

그 외, 제공된 코드에서 아무 것도 잘못 본 것이 없습니다.

코드에서 제안하는대로 numpy을 사용하는 경우에는 내장 된 DFT/FFT를 사용하지 않고도 코드를 크게 단순화 할 수 있습니다.

예를 들어 data3D[i, j, k]과 같은 3D 숫자 배열을 색인 할 수 있습니다. for 루프 내에서 개별 요소를 한 번에 하나씩 할당하는 대신 data3D[:, j, k], data3D[i, :, k], data3D[:, :, k] 등으로 슬라이스 할 수 있습니다.

+0

오 마이. 그것은 어리석은 무엇이어야했다. 정말 고맙습니다. 당신은 오늘의 영웅입니다. numpy에 대한 도움말을 주셔서 감사합니다. – Feryla

+1

numpy 축을 굴려 3 개의 별도 루프를 작성할 필요가 없습니다. – DSM