본문 바로가기

푸리에 변환, 신호/푸리에 변환의 모든 것

06-4. 엑셀을 이용한 DFT 계산(1/4)

반응형

 

 

어떤 신호값에 대해 실제로 DFT 및 IDFT 계산을 해보면 수식의 의미를 더 깊게 이해할 수 있다.

 

앞 페이지에서 아주 간단한 형태의 가상 신호값을 이용해서 DFT 계산을 해봤는데, 이렇게 간단한 값의 경우에도 손으로 계산하기는 쉽지 않고, 실제에 가까운 신호값에 대해서는 손으로 DFT 계산을 하는 것은 불가능하다. 

해서, 이번 챕터에서는 DFT를 엑셀을 이용해서 계산하는 것을 해보겠다.

 

엑셀로도, 실제 신호에 대한 DFT 변환값을 계산해내는 것이 좀 버겁다. 이유는, 사용되는 데이터가 복소수 형태인데다가, 데이터 개수가 N의 경우 $O(N^2)$의 계산 복잡도가 발생하기 때문이다. 

해서, DFT의 계산량을 줄인 FFT 알고리즘이 나오게되었고, 이 FFT는 이후 챕터에서 다룰 것이다.
여기에서 사용한 엑셀 파일은, 이 페이지 제일 밑 쪽에서 다운로드할 수 있음.

DFT 계산을 위한 기본 엑셀 수식 

DFT 계산에 쓰이는 데이터가 복소지수형태이기에, 엑셀에서 복소수를 어떻게 다루는지 사전 지식이 필요하다. (기본적인 엑셀 사용법은 다루지 않겠다. 다만, 엑셀을 잘 쓰더라도 복소수를 다루는 것은 드문 일이기에, 간략하게나마 설명한다.)

 

복소수의 연산

엑셀에서 복소수는 기본적인 숫자형 데이터 타입이 아니다. 즉, 엑셀에서는 각 셀이 '정수값'을 가지거나 'Double형 숫자'를 가지거나 해서, 각 셀끼리의 사칙연산이 가능한데, 복소수의 경우에는 이처럼 각 셀에 대한 직접적인 사칙 연산이 안된다.  

 

아래처럼 복소수 $3+4i$와 $2+3i$가 있을 때, 이를 각 셀에다가 문자열처럼 $3+4i$와 $2+3i$를 타이핑하고, 이 두 셀에 있는 복소수의 덧셈을 "=IMSUM(A2,B2)"이라고 하면, 두 복소수의 합이 구해진다. (셀 A2에는 $3+4i$를, 셀 B2에는 $2+3i$를 입력한 경우이다.)

이처럼, 엑셀에서의 복소수는 "3+4i"처럼 그냥 문자열이다. 따라서, 이러한 문자열 끼리의 직접적인 사칙연산은 안되고(셀끼리 직접 더하거나 하는 것이 안된다는 것), 엑셀에서 제공하는 복소수용 연산함수를 써야 한다. 

 

기본적인 복소수 연산함수는 다음과 같다. (표에서 음영 표시되어 있는 함수는 DFT 계산에 사용되는, 꼭 알아야 하는 함수)

 

[표1] 엑셀에서 사용되는 복소수에 대한 함수

 

복소지수의 계산

위 표에서, 복소 지수의 경우 "IMEXP(A2)"는 $e^{3+4i}$와 같고, 이는 오일러 공식 $e^{i\theta}=\cos{\theta} + i\sin{\theta}$을 이용해서 계산될 수도 있다.  

 

$$ e^{3+4i} = e^{3}\cdot e^{4i} = e^{3}(\cos{(4)}+i\sin{(4)})$$

 

복소수의 변환

복소수에서 실수부와 허수부 값을 빼낼 수도 있는데, 실수부의 경우는 "IMREAL", 허수부의 경우는 "IMAGINARY"를 써서 빼낼 수 있다.

 

복소수의 생성은, 위 예제에서와 같이, 셀에다가 직접 "3+4i"처럼 타이핑해도 되고, COMPLEX함수에 정수부와 허수부 값을 입력하여 생성할 수도 있다.

 

편의상 직접 만든 함수

DFT를 계산할 때 필요한 함수 2개를 따로 만들었다.

 

VBA(Visual Basic for Application)를 이용해서 만든 것인데, 코드는 첨부된 엑셀에 있으니 참조가능한데, 이 소스코드를 이해하려고 노력할 필요는 없을 것 같다. 그냥 원래 있었던 엑셀 함수처럼 생각하고 사용하면 되겠다.  

"CTrim" 함수는, 복소수의 실수부와 허수부를 소숫점 셋째짜리에서 반올림해서 표현해준다. (물론, 반올림 자릿수를 지정할 수도 있다). 이 함수를 만들어서 사용하는 이유는, 엑셀에 있는 복소수 함수의 경우, 그 결괏값 자릿수가 너무 길어서 가독성이 떨어지기 때문에, 자릿수를 줄여서 표현하기 위해서 만들었다.

 

"CSumProduct"는 엑셀에 있는 SUMPRODUCT 함수처럼, 두 범위의 값들을 서로 합성곱(곱한 후 더하는)하는 복소수용 함수이다. SUMPRODUCT가 복소수를 지원하지 않기에 만들었다. 

 

위 그림에서 "CSumProduct(A2:A4,B2:B4)"을 하게 되면 두 영역의 합성곱 연산을 하게 된다.

 

$$ =CSumProduct(A2:A4,B2:B4) = (3+4i)(2+3i) + (4+5i)(3+4i)+(1)(2i) = -14+50i$$

 

 

[예제 1] 단순한 샘플 신호의 DFT 계산

앞 페이지 "06-3. DFT의 수식 이해"에서 손으로 DFT 계산을 해봤던 간단한 예제를, 엑셀을 사용해서 풀어보겠다.

 

주어진 문제는 다음과 같다.

주기 $N=4$이고 $y[n]=\{1,3,-1,-2\}$ 일 때, DFT 식을 이용하여 $Y(k)$값을 구하시오.

엑셀에서 아래와 같이 작성한다.

오른편 k값 아래부분은, k와 n에 따라 변하게 되는 $W(n,k)=e^{-i\frac{2\pi}{N}kn}$값이 계산되게 할 것이다. (임의로 W라는 함수로 이름 붙여서 정의했음. 파라미터로 N까지 넣어야되나, 식이 길어져서 생략했음)

엑셀에서 $e^{-i\frac{2\pi}{N}kn}$의 계산은 IMEXP함수를 사용하면 되고, IMEXP의 파라미터로 복소수 값이 들어가야 하기에, COMPLEX함수를 이용해서 복소수값을 만들어준다. 

그리고, 계산된 값의 자릿수가 너무 길게나와서 가독성이 안 좋기에, CTrim을 이용해서 자릿수를 줄여줄 것이다.

 

n=0이고 k=0일 때의 값은 다음 수식으로 계산된다. (나머지 셀에 대해 복사해서 자동으로 계산되게 하기 위해, 절대좌표를 나타내는 '$'를 사용했음에 유의)

=CTrim(IMEXP(COMPLEX(0,-2*PI()*F$5*$C6/$D$3)))

이 수식을 "F5" 셀에 입력하고, 오른쪽 "I5"까지 자동 계산되게 하고, 밑에 쪽 "I9"까지 자동 계산한다.

 

 

이제 $y(n)$과 곱할 파형값인 $W(k,n)=e^{-i\frac{2\pi}{N}kn}$가 계산되었다. 

 

푸리에 변환값인 $Y(k)$는 $y(n)$과 $W(k,n)$의 합성곱(콘볼루션)이다. 

합성곱을 구하기 위해, 일일이 수식을 써서 할 수도 있으나, 그 경우 복소수의 곱셈과 덧셈 함수를 쓰면서 해야 해서 복잡해지기에, 이 페이지의 위 쪽에서 소개한 CSumProduct을 이용해서 구하도록 한다.

수식을 보면, $y(n)$에 대한 범위는 절대좌표를 사용해서 고정시켰기에 "F10" 셀을 옆쪽으로 복사해서 사용해도 자동 계산이 될 것이다.

$Y(k)$의 값은 복소수 형태이다. 

이 복소수 값에서 실수부 값은 IMREAL을 이용해서, 허수부는 IMAGINARY 함수를 이용해서 구할 수 있고, 복소평면에서 해당 복소수의 원점에서의 거리에 해당하는 값은 거리 공식을 이용해서 구할 수 있다. 복소수 $a+bi$에 대한 거리 공식은, $\sqrt{a^2+b^2}$이다.

Y(k) =CSumProduct($D6:$D9,F6:F9)
Y(k)_re =IMREAL(F10)
Y(k)_im =IMAGINARY(F10)
Y(k)_magnitude =ROUND(SQRT(F11^2+F12^2),2)

 

 

이렇게 해서 어떤 신호값 $y(n)$이 있을 때, 이에 대한 DFT 변환값을 모두 구했다. 당연하겠지만, 앞 글에서 손으로 푼 결과가 동일하다.


이 페이지에서 사용한 엑셀 파일 :

DFT예제_1-update.xlsm
0.03MB


이번 글에서 풀어본 예제는 데이터의 개수가 3개인 너무 간단한 형태였다. 다음 글에서는 실제 파형에 가까운 예제를 가지고 DFT 변환 연습을 해 볼 것이다.

  

-끝-

 

 이전글: 06-3. DFT의 수식 이해
 다음글: 06-5. 엑셀을 이용한 DFT 계산(2/4)
 다음다음글: 06-6. 엑셀을 이용한 DFT 계산(3/4)

 

반응형