더북(TheBook)

소스 10-2의 DFT1d 함수의 코드는 매우 직관적이다. 일단 함수의 시작 부분에서 입력 데이터인 reim 배열을 임시 배열인 trti 배열에 각각 복사한다. 그리고 실제 이산 푸리에 변환 과정에서는 trti 배열의 값을 참조하여 푸리에 변환을 수행하고, 결괏값을 다시 reim에 저장한다. 실제 이산 푸리에 변환 공식을 C/C++ 코드로 변환한 부분은 이중 for 루프 안의 코드이다.

temp = 2 * dir * PI * ((double)i * x / N);
sum_re += (tr[x] * cos(temp) + ti[x] * sin(temp));
sum_im += (ti[x] * cos(temp) - tr[x] * sin(temp));

위 코드에서 temp 변수에 저장된 값은 이산 푸리에 변환 공식에서 삼각 함수의 인자로 들어가는 에 해당한다. 만약 DFT1d 함수를 호출할 때 네 번째 인자인 dir을 +1로 설정하였다면, 앞에서 제시한 DFT 수식과 동일한 동작을 수행할 것이다. 그러나 dir을 -1로 설정하면 IDFT 수식에 해당하는 동작을 수행한다.

영상 신호와 같이 자연계에서 발생하는 대부분의 신호는 모두 실수만으로 구성되어 있기 때문에 보통 DFT1d 함수에 전달되는 im 배열의 값은 모두 0으로 설정한다. 또한 푸리에 역변환을 이용하여 입력 신호를 다시 복원할 경우에는 im 배열의 값은 이용하지 않고, 오직 re 배열에 저장된 값만을 참조한다. 실제로 DFT1d 함수를 이용하여 실수로 구성된 입력 신호를 DFT 한 후 곧바로 IDFT 할 경우, im 배열에도 0에 가까운 실숫값들이 저장될 수 있는데 이는 컴퓨터를 이용한 수치 연산에서 발생하는 오차에 의한 값이므로 무시한다.

그림 10-1은 64개의 데이터를 갖는 1차원 함수에 대하여 이산 푸리에 변환을 수행한 결과의 예이다. 그림 10-1에서 왼쪽의 그래프는 입력 신호를 나타내고, 오른쪽의 신호는 푸리에 변환된 신호를 나타낸다. 이때 푸리에 변환된 값이 복소수로 나타나기 때문에 여기에서는 복소수의 절댓값을 취하여 그래프로 표현하였다. 그림 10-1(a)의 입력 신호는 처음 4개의 값만 1이고, 나머지는 모두 0인 함수이다. 그림 10-1(b)의 입력 신호는 cos 함수를 이산화하여 얻은 신호이며, 오른쪽 푸리에 변환 결과에서 두드러지게 값이 크게 나타나는 위치는 입력 cos 함수의 주파수를 나타내는 값이다. 그림 10-1(C)의 입력 신호는 두 개의 다른 주파수를 갖는 cos 함수의 합으로 구성된 신호이며, 이 경우 푸리에 변환 결과에서 두 개의 주파수 성분이 대칭의 형태로 두드러지게 나타나는 것을 볼 수 있다. 세 가지 경우 모두 입력 함수의 값이 실수로만 구성되어 있기 때문에 이산 푸리에 변환 결과가 대칭적으로 나타나는 것이 특징이다.

그림 10-1 1차원 데이터에 대한 이산 푸리에 변환의 예
(a)
(b)
(c)
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.