더북(TheBook)

OnFourierDft 함수에서 실제 푸리에 변환을 수행하는 부분은 IppFourier 클래스 타입의 변수 fourier를 선언하면서부터이다. 그리고 SetImage 멤버 함수를 통해 입력 영상을 등록하고, DFT 함수를 두 번 호출하여 푸리에 변환과 푸리에 역변환을 수행한다. 결국 푸리에 변환 과정 코드는 아래 네 줄이 핵심이다.

IppFourier fourier;
fourier.SetImage(img);
fourier.DFT(1);
fourier.DFT(-1);

소스 10-6의 OnFourierDft 함수에서는 두 번의 DFT 함수 호출 시작과 끝 부분에서 timeGetTime() 함수를 이용하여 연산 시간을 측정하는 코드가 추가되어 있다. timeGetTime 함수는 Windows 시스템 시간을 밀리초(ms) 단위로 받아오는 함수로서 함수 원형은 아래와 같다.

DWORD timeGetTime(void);

timeGetTime 함수는 winmm.lib 라이브러리에 정의되어 있기 때문에 이 함수를 사용하려면 프로젝트 설정에 winmm.lib 라이브러리를 추가해야 한다. 소스 10-6에서는 간단하게 소스 코드 상단에 #pragma comment(lib, "winmm.lib")를 추가하는 방식으로 winmm.lib를 사용할 수 있도록 설정하였다. 또한, 소스 코드 상단에 timeGetTime 함수 원형이 선언되어 있는 windows.h 파일도 함께 포함(#include)해주어야 한다. timeGetTime 함수를 이용하여 측정된 DFT 연산 시간은 AfxPrintInfo 함수를 통해 정보 출력창에 나타내었다.

OnFourierDft 함수 중간에 보면 #ifdef~#endif로 둘러 쌓인 코드 블록이 있다. 이 구간에는 푸리에 변환 결과의 스펙트럼 영상과 위상각 영상을 화면에 나타내는 코드가 추가되어 있다. #ifdef 구문 뒤에 나타나는 SHOW_SPECTRUM_PHASE_IMAGE는 소스 10-6 앞부분에 정의되어 있다. 그러므로 소스 10-6의 코드를 그대로 사용할 경우, DFT 또는 DFTRC 메뉴를 실행할 때 스펙트럼 영상과 위상각 영상도 함께 화면에 나타나게 된다. 만약 스펙트럼 영상과 위상각 영상을 보고 싶지 않다면 소스 코드 상단의 #define SHOW_SPECTRUM_PHASE_IMAGE 문장 자체를 삭제하면 된다. 만약 DFTDFTRC 함수의 동작 시간을 정확하게 측정하고자 할 때에는 이 부분의 코드가 실행되지 않도록 변경하여 시간을 측정하면 된다.

OnFourierDftrc 함수 또한 OnFourierDft 함수와 거의 유사한 구조를 가지고 있으며, 내부적으로 DFTRC 함수에 의한 푸리에 변환 및 역변환 시간을 ImageTool 정보 출력장에 나타내도록 하였다.

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