[Troubleshooting] Noise problem in convolution using cufft 2d r2c and c2r - cufft 2d의 r2c 및 c2r을 이용한 컨볼루션 연산의 노이즈 문제 해결
설명
cufft 라이브러리를 이용한 컨볼루션 연산에서 알 수 없는 노이즈가 발생하였음. 1차적으로 확인한 현상은 이미지의 사이즈에 따라서 정상적인 동작을 할 수 있다는 것이었음.
프로세스의 절차는 다음과 같았음:
- 이미지와 커널의 크기를 맞추기 위해 주어진 커널을 padding 하였음. 이 때 입력은 범위가 [-π,π)가 아닌 [0,2π)이므로, 커널의 값들을 각각의 모서리에 적절히 배치하도록 하였으며 나머지는 0으로 채웠음.
- R2C 플랜을 작성하였고, 커널에 대해 수행함.
- 이미지 역시 R2C 수행함.
- 둘을 pointwise로 곱하였으며, 이미지의 크기만큼 나누어서 정규화해주었음.
- 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로 상정하고 수행하였음.
댓글
댓글 쓰기