{{ label!='' ? 'Label : ' : (q!='' ? '검색 : ' : '전체 게시글') }} {{ label }} {{ q }} {{ ('('+(pubs|date:'yyyy-MM')+')') }}

[Troubleshooting] Noise problem in convolution using cufft 2d r2c and c2r - cufft 2d의 r2c 및 c2r을 이용한 컨볼루션 연산의 노이즈 문제 해결

설명

  cufft 라이브러리를 이용한 컨볼루션 연산에서 알 수 없는 노이즈가 발생하였음. 1차적으로 확인한 현상은 이미지의 사이즈에 따라서 정상적인 동작을 할 수 있다는 것이었음.

  프로세스의 절차는 다음과 같았음:

  1. 이미지와 커널의 크기를 맞추기 위해 주어진 커널을 padding 하였음. 이 때 입력은 범위가 [-π,π)가 아닌 [0,2π)이므로, 커널의 값들을 각각의 모서리에 적절히 배치하도록 하였으며 나머지는 0으로 채웠음.
  2. R2C 플랜을 작성하였고, 커널에 대해 수행함.
  3. 이미지 역시 R2C 수행함.
  4. 둘을 pointwise로 곱하였으며, 이미지의 크기만큼 나누어서 정규화해주었음.
  5. C2R 플랜을 작성하였고, 4번의 결과에 대해 수행함.


원본 이미지

정상적인 결과

비정상적인 결과


원인

  cufft r2c의 경우 출력의 크기는 N/2임. c2r의 경우 입력의 크기가 N/2여야 함. 이는 2d에서 width를 기준으로 결정됨. 즉, complex 신호의 크기는 (w/2+1)*h임. 본인은 w*(h/2+1)로 계산하였으며 이로부터 예상치 못한 결과를 얻게 되었음.


해결

  complex 신호의 크기를 (w/2+1)*h로 상정하고 수행하였음.

댓글

이 블로그의 인기 게시물

[코딩의탑] 4층: 툰 쉐이딩

[코딩의탑] 3층: 바다 렌더링

[코딩의탑] 5층: 포탈(Portal), 더 나아가기