더북(TheBook)

소스 10-4 맨 뒤에 나오는 DFT 함수는 10.2절 맨 처음에 설명한 이산 푸리에 변환 공식을 그대로 C/C++ 코드로 구현한 함수이다. DFT 함수는 정수형 인자 dir을 하나 받는다. dir의 값이 1이면 이산 푸리에 변환을 수행하고, dir 값이 -1이면 이산 푸리에 역변환을 수행한다. 즉, 인자의 값에 따라 DFT를 수행하기도 하고, IDFT를 수행하기도 한다.

DFT 멤버 함수를 호출하려면 그 전에 SetImage 함수를 미리 호출하여 realimag 멤버 변숫값이 설정되어 있어야 한다. 그러므로 DFT 함수 맨 처음에 real.IsValid() 함수를 호출하여 입력 영상이 설정되어 있는지를 검사한다. 그리고 realimag 영상의 복사본을 생성하여 푸리에 변환을 수행하고, 그 결과를 다시 realimag에 저장한다.

DFT 함수의 중간에서 이산 푸리에 변환 수식을 그대로 C/C++ 코드로 변환한 부분을 찾을 수 있다. pRe[j][i], pIm[j][i] 값을 설정하기 위하여 영상 전체를 x, y 변수를 이용하여 스캔하는 for 루프를 볼 수 있다. 즉, DFT 함수에서는 4중 for 루프를 사용한다. 4중 for 루프 안에서는 다음과 같은 코드로 이산 푸리에 변환 수식을 표현하고 있다.

temp = 2 * dir * PI * (static_cast<double>(i) * x / width + static_cast<double>(j) * y / height);
sum_re += (pReCpy[y][x] * cos(temp) - pImCpy[y][x] * sin(temp));
sum_im += (pReCpy[y][x] * sin(temp) + pImCpy[y][x] * sin(temp));

위 코드에서 DFT 함수의 인자 dir이 1이면 이산 푸리에 변환(DFT)이 되고, -1이면 이산 푸리에 역변환(IDFT)을 수행한다.

Note | atan2 함수

소스 10-4의 GetPhaseImage 함수에서 위상각을 구하기 위하여 atan2 함수를 사용하였다. 이 함수는 math.h 파일에 선언되어 있으며, 함수의 원형은 다음과 같다.

double atan2(double y, double x);

atan2 함수는 tan-1(x, y) 수식을 계산하여 -π부터 π 사이의 값을 반환한다. 만약 입력된 값 중 x의 값이 0이면 0을 반환한다. atan2 함수를 사용할 때에는 분모와 분자의 순서에 유의하기 바란다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.