지난 시간까진 연속시간(Continuous-Time)에서의 푸리에 변환에 대해 공부하였다. 이번 강의에서는 이산시간(Discrete-Time)에서의 푸리에 변환에 대해 공부해보자. 연속시간 푸리에 변환과 이산시간 푸리에 변환은 시간을 바라보는 관점에 있어서 큰 차이점이 있다. 즉 시간을 끊어지지 않고 연속적으로 이어져있는 형태로 보는지, 혹은 셀 수 있는 단위로 끊어서 이해하는지의 차이다. 쉽게 말해 아날로그로 보는지, 디지털로 보는지를 의미한다. 디지털로 본다는 관점은 결국 실세계에 존재하는 어떤 연속적인 형태의 문제를 일정한 크기의 단위로 쪼개서 근사해서 계산하겠다는 의지이다. 이러한 이산 시간에서의 푸리에 변환은 연속시간의 것과 어떤 공통점이 있고 차이점이 있는지 배워보자. 

 

 

 

1. 이산시간 푸리에 급수(Discrete-Time Fourier Series)

 

- Discrete Time Fourier Series for periodic signal

 

우리는 지난 강의에서 연속시간에서의 푸리에 급수 및 푸리에 변환에 대해 배웠다. 이산시간에 대한 푸리에 변환에 대해 공부하기 전에 먼저 이산시간 푸리에 급수에 대해 배워보도록 하자. 아래의 식은 이전 강의에서 배웠던 연속시간 푸리에 급수에 대한 수식이다. 

 

 

이미 알다시피 푸리에 급수는 주기신호(periodic signal)만 다룰 수 있기때문에 신호에 대한 함수 f(t)에 tilde를 붙여 표현하였다. 기존에 작성한 식과 한 가지 다른부분이 있는데 바로 기본진동수 앞에 곱해졌던 계수 n을 k로 바꾸었다. 이는 이산시간 푸리에 급수의 식과 비교할 때 혼동을 없애기 위함이다. 단지 표기만 바꾼것이므로 식에 문제는 없다. 이제 이 연속시간 푸리에 급수를 이산시간 푸리에 급수(Discrete-Time Fourier Series)로 표현해보자. 

 

 

식 (2.1)은 이산시간 푸리에 급수의 합성방정식(synthesis equation)이고, (2.2)는 분석방정식(analysis equation)을 나타낸다. 이산시간 푸리에 급수는 수식을 표현함에 있어서 기호를 비롯해 몇 가지 달라지는 부분이 있다. 우선 기본진동수(fundamental frequency)를 보면 연속시간에서는 소문자 오메가(small omega) $\omega_0$를 사용했고, 주기로 알파벳 T를 사용한 반면 이산시간에서는 대문자 오메가(capital omega) $\Omega_0$와 주기는 N을 사용했다. 이산시간에서는 데이터를 셀 수 있기 때문에 t 대신 number의 앞글자를 따서 알파벳 n을 사용한다. 또한 함수를 살펴보면 연속시간에서는 소괄호를 이용하여 f(t)와 같이 표현했지만, 이산시간에서는 대괄호를 이용하여 f[n]과 같이 표현한다. 즉 연속시간에서는 주로 소문자 기호를, 이산시간에서는 대문자 기호를 사용하는 것이 눈에 보이는 차이점이다. 

 

식 (2.1)의 우변을 보면 두 개의 상수 k와 n이 존재한다. k는 (1.1)의 k와 같은 역할을 하며 주파수에 대한 인덱스를 나타낸다. (2.1)의 n은 (1.1)의 t와 같은 의미이며 시간축에 대한 변수를 나타낸다. 연속시간 푸리에 급수에서는 k를 음의 무한대에서 부터 양의 무한대까지 변화시켜가며 합을 계산하는 반면, 이산시간 푸리에 급수에서 k는 0부터 k=0, 1, 2, .. 와 같이 증가해가며 계수 $a_k$와 지수함수의 곱의 선형조합으로 합성방정식이 정의된다. 여기서 $a_k$는 $k\Omega_0$의 주파수를 갖는 고조파(harmonic)가 해당 주기신호를 형성하는데에 얼마나 기여를 하는지를 의미한다. 즉 기본진동수 $\Omega_0$와 그의 정배수의 파형의 가중된 합(weighted sum)으로 정의할 수 있는 것이다. 사실 이 합성방정식의 k부분이 연속시간 푸리에 급수와 가장 큰 차이점을 만들게 되는데, 이 차이점에 대해선 잠시 후에 알아보도록 하자.  

 

식 (2.2)의 이산시간 푸리에 급수의 분석방정식을 살펴보면 시그마 기호에 <N>으로 표시된 것을 볼 수 있는데, 이는 시그마의 합을 주기 N만큼 한다는 것이다. 즉 식 (1.2)의 한 주기 T의 구간에서 적분한것과 같은 의미를 갖는다. 

 

이와 같이 연속시간 푸리에 급수는 이산시간 푸리에 급수와 기본적인 개념이 거의 동일하며, 수식의 형태도 거의 같기 때문에 연속시간 푸리에 급수를 이해한다면 따로 부연설명 없이도 이산시간 푸리에 급수를 이해할만하다. 그러나 앞서 잠깐 언급했듯이 연속시간과 이산시간 푸리에 급수 사이에는 큰 차이점이 존재한다. 그 차이점이 무엇인지 지금부터 알아보자. 

 

 

- Difference between CTFS and DTFS

 

연속시간 푸리에 급수와 이산시간 푸리에 급수 사이에는 한 가지 큰 차이점이 존재한다. 바로 푸리에 계수의 반복성(repeatability)이다. 즉 연속시간과는 달리 이산시간 푸리에 급수의 계수는 주기 N마다 같은 값으로 반복된다는 것이 둘 사이의 차이점이다. 아래의 식을 보자. 

 

 

식 (3)은 이산시간 푸리에 급수(Discrete-Time Fourier Series)의 복소지수함수부분을 나타낸 것이다. 이산시간 푸리에 급수의 주파수는 k를 변화시키면서 기본진동수(fundamental frequency) $\Omega_0$와 곱하여 정의할 수 있는데, 이때 k에 주기 N을 더한 (k+N)에 대한 주파수는 k에 대한 주파수와 같은 값을 가지게 된다. 즉 N의 주기로 반복된다는 것이다. 결국 이것이 의미하는 것은 우리가 이산시간 푸리에 급수를 정의할 때, 연속시간때 처럼 k를 무한대로 고려할 필요 없이 k=0~N-1구간만 고려하면 된다는 것이다. 0~N-1의 구간 밖에 존재하는 푸리에 계수는 어차피 반복되기 때문이다. 따라서 식 (2)에 정의했던 이산시간 푸리에 급수는 아래와 같이 다시 정의해야 한다. 

 

 

식 (4.1)은 (2.1)을 다시 정의한 것이다. 달라진 부분은 시그마의 아래쪽에 존재하는 k인덱스인데, <N>의 구간으로 k가 한정된 것을 볼 수 있다. 다시말하면 이산시간 푸리에 급수의 합성방정식에서 계수 $a_k$는 k=0~N-1구간에서만 고려하면 된다는 것이다. 구간은 k=0~N-1이나 k=1~N과 같이 shift된 구간을 선택해도 무관하다. 반복되기 때문이다. 푸리에 급수(Fourier Series)의 계수가 반복된다는 것은 결국 푸리에 변환(Fourier Transform)을 했을 때의 주파수에 대한 스펙트럼이 동일한 패턴으로 반복된다는 것이다. 이러한 이산시간에서의 계수, 혹은 주파수 스펙트럼의 주기성(periodicity)이 연속시간 푸리에 급수와 이산시간 푸리에 급수의 가장 큰 차이점이다. 

 

아래 그림은 연속시간과 이산시간 푸리에 변환의 주기성(periodicity)의 차이를 보여주는 그래프이다.

 

 

Fig. 1 연속시간 푸리에 변환과 이산시간 푸리에 변환의 주기성(periodicity)의 차이점. 

 

Fig. 1의 왼쪽은 0~1의 값을 가지는 사각파(square wave)의 연속시간 푸리에 변환의 모습을, 오른쪽은 -1~1의 값을 가지는 사각파의 이산시간 푸리에 변환의 모습을 각각 나타낸다. 연속시간의 경우엔 푸리에 변환을 한 스펙트럼의 결과가 단일 패턴의 연속적인 그래프의 형태로 나타나는 것을 볼 수 있다. 반면 이산시간 푸리에 변환의 경우엔 주기 <N>에 해당하는 주파수 스펙트럼이 동일한 형태로 반복되는 것을 볼 수 있다. Fig. 1의 오른쪽 아래의 주파수 스펙트럼 그래프에서 <N>에 해당하는 구간이 바로 이산시간 푸리에 변환의 한 주기 동안의 주파수 스펙트럼이다. 이러한 스펙트럼의 주기 <N>은 shift가 되어도 동일하게 성립한다. 즉 <N>=[1~8]이나 <N>=[3~10]이나 주기성의 성질은 똑같이 성립한다는 것이다. 

 

아래 표는 CTFS와 DTFS의 공통점과 차이점을 정리한 것이다. 

 

  Periodic in n( or t) Periodic in k
CTFS
O X
DTFS
O O

 

연속시간이나 이산시간 푸리에 급수 모두 시간텀(t or n)에 대해서는 주기성을 가진다. CTFS에서 변수 t와 DTFS에서 n은 어떤 주기신호에서 시간, 혹은 순서(sequence)를 의미하고 이 시간축에 대해서 신호는 주기적으로 반복된 값을 갖게 된다. 

 

반면 주파수에 대한 인덱스 k에 대해서는 서로 다른 특성을 보인다. 연속시간에서는 주파수 스펙트럼이 하나의 패턴으로 나타나는 반면, 이산시간에서는 주기 N에 대해 동일한 패턴의 주파수 스펙트럼이 반복적으로 나타나는 현상을 보인다. 즉 이산시간에서는 $a_k$가 반복적으로 나타나게 된다.

 

이와 같이 연속시간 푸리에 급수와 이산시간 푸리에 급수는 기본적인 개념은 동일하지만, 주파수 스펙트럼의 주기성(periodicity)이 가장 큰 차이점으로 나타난다. 주기성과 관련된 보다 자세한 사항이 궁금하다면 다음의 책[1]을 참고하기 바란다. 

 

[1] : The Intuitive Guide to Fourier Analysis and Spectral Estimation: with Matlab

 

 

 

2. 이산시간 푸리에 변환(Discrete-Time Fourier Transform)

 

- Continuous and Discrete-Time Fourier Transform 

 

우리는 지난 강의 Lecture 27-(1)에서 연속시간 푸리에 급수(Continuous Time Fourier Series)로부터 푸리에 변환(Fourier Transform)을 정의하는 방법을 배웠다. 푸리에 급수는 기본적으로 주기신호(periodic signal)만을 표현할 수 있으나, 두 가지 핵심 아이디어를 통해 비주기  신호(Aperiodic signal)를 다룰 수 있는 개념이 바로 푸리에 변환인 것이다. 

 

두 가지 핵심 아이디어는 비주기 신호와 주기신호는 한 주기 내에선 동일하다는 것, 그리고 비주기 신호를 양쪽에 동일한 패턴의 신호를 더해 주기 신호로 만든뒤, 주기를 무한대로 보내면 원래의 비주기 신호와 같아진다는 것이다. 이 아이디어는 이산시간 푸리에 급수 및 변환에도 동일하게 적용되며 아래와 같이 유사한 형태로 식을 정리할 수 있다. 

 

 

식 (5)와 (6)은 연속시간 푸리에 변환과 이산시간 푸리에 변환을 각각 나타낸 것이며, 실수부(real part)와 허수부(imaginary part), 혹은 크기(magnitude)와 각도(angle)로 각각 표현할 수 있음을 나타낸 것이다. 둘의 개념은 동일하며 단지 시간의 개념과 식에 사용된 기호가 다를 뿐이다. 

 

그런데 식 (6.1)의 이산시간 푸리에 변환을 살펴보면 시그마의 인덱스 n이 무한대에 걸쳐 정의되었다. 분명 앞서 이산시간 푸리에 급수의 분석방정식(analysis equation)은 한 주기 구간인 <N>에서만 정의되었고, 이로부터 유도된 푸리에 변환도 n이 한 구간에서만 정의될 것으로 생각되는데 말이다. 이는 연속시간 푸리에 변환에서와 마찬가지로 비주기 신호를 푸리에 급수로 다루기 위한 아이디어로부터 유도될 수 있다. 다음의 그림을 살펴보자. 

 

 

Fig. 2 이산시간 푸리에 변환의 아이디어

 

Fig. 2는 이산시간 푸리에 변환의 아이디어를 나타낸다. 최초의 비주기 신호(Aperiodic signal)에서 같은 패턴의 신호를 주기 T로 하여 더하여 주기신호(periodic signal)로 만들어주고, 다시 주기를 무한대로 보내면 비주기 신호를 푸리에 급수로 다룰 수 있다. 이 아이디어는 연속시간에서의 그것과 같다. 이를 식으로 나타내면 다음과 같다. 

 

 

최초의 이산시간 비주기 신호 f[n]으로부터 주기신호를 만들면 식 (7.1)과 같이 표현할 수 있고, 여기서 주기 T를 무한대로 보내면 주기신호는 다시 비주기 신호가 되고, 기본진동수(fundamental frequency)가 무한히 작아지게 된다. 기본진동수가 무한히 작아진다면 k=1, 2, 3, ... 으로 가면서 $1\Omega_0, 2\Omega_0, 3\Omega_0, ...$의 변화값이 아주 작은 변화량으로 증가하게 된다. 따라서 $\Omega=k\Omega_0$와 같이 주파수를 연속변수로 정의할 수 있고 식 (7.2)와 같이 정리할 수 있다. 

 

지금까지 공부한 내용을 토대로 연속시간 푸리에 변환과의 눈에 띄는 차이점을 정리하면 다음과 같다.

 



연속시간 푸리에 변환은 시간 영역(time domain)에서 정의하는 신호가 비주기적(Aperiodic)이고 신호의 시간이 연속적(continuous)이다. 반면 주파수 영역(frequency domain)에서 정의되는 신호는 비주기적(Aperiodic)이고 주파수 영역에서의 포락선 함수(envelope function)의 형태는 연속(continuous)이다. 


이산시간 푸리에 변환은 시간 영역(time domain)에서 정의하는 신호가 비주기적(Aperiodic)이고 신호의 시간이 이산적(discrete)이다. 반면 주파수 영역(frequency domain)에서 정의되는 신호는 주기적(periodic)이고 주파수 영역에서의 포락선 함수(envelope function)의 형태는 연속(continuous)이다. 

 

연속시간과 이산시간의 푸리에 변환에 대한 공통점과 차이점을 잘 이해하도록 하자. 

 

 

- Implementation of the Discrete-Time Fourier Transform

 

지금부터는 앞서 연속시간 푸리에 변환 구현에 사용했던 사각파를 이산시간 푸리에 변환으로 구현해보도록 하겠다. 우선 이산시간으로 나타낸 사각파와 푸리에 변환의 모습은 아래와 같다. 

 

 

 

Fig. 3 서로 다른 주기에 따른 사각파 신호 및 푸리에 변환

 

Fig. 3은 사각파의 신호와 주기에 따른 푸리에 변환을 나타낸다. 주기가 커질 수록 푸리에 변환의 결과는 연속적으로 나타나는 것을 볼 수 있다. 연속시간과의 차이점은 앞서 언급했듯이 푸리에 변환 결과가 주기적인지 아닌지이다. 연속시간과는 달리 주파수 도메인으로의 변환 결과가 주기적으로 나타난다. 연속시간 푸리에 변환과 이론적인 배경은 같으므로 구체적인 설명은 하지 않도록 하겠다. 

 

아래는 MATLAB구현 코드이다. 연속시간의 식보다 이산시간 푸리에 변환식이 이해하기 쉽고 코드로 구현하기 수월하므로 구현 코드와 수식을 비교하면서 본다면 이해에 도움이 될 것이다. 코드는 최적으로 구현하기 보단 이해하기 쉽고 직관적으로 구현하려고 하였다. 코드를 참조하여 다른 형태의 신호나 비주기 신호도 임의로 만들어서 변환해보며 감을 익히도록 하자. 

 

 

 

 

3. 마치며

 

이번 강의에서는 이산시간 푸리에 변환(DTFT)에 대해서 공부하였다. 연속시간 푸리에 변환(CTFT)과 동일한 개념이지만 시간을 바라보는 관점, 그리고 주파수 도메인에서의 주기성이 가장 큰 차이점이라고 할 수 있다. 그러나 실무에서는 DTFT를 거의 사용하지 않는데 그 이유는 계산속도가 너무 느리기 때문이다. 샘플링한 신호가 많아질수록 계산량이 기하급수적으로 늘어나기 때문이다. 때문에 실무에서는 계산속도가 훨씬 빠른 고속푸리에변환(Fast Fourier Transform)을 이용하여 신호의 주파수 분석을 한다. 그러나 DTFT의 개념을 아는 것은 여전히 중요하므로 잘 공부하도록 하자. 

 

지난 시간에 우리는 비주기 신호에 대한 연속 시간 푸리에 변환을 공부하였다. 그러나 아직 주기 신호에 대한 푸리에 변환을 정의하지는 않았는데, 이번 강의에서 나머지 부분을 배워보도록 하자. 

 

 

 

5. 델타함수(delta function)와 임펄스 응답(Impulse Response)

 

- Step function and delta function

 

주기 신호에 대한 푸리에 변환을 배우기 전에 먼저 공부해야 할 것이 있다. 바로 델타함수(delta function)이다. Paul Dirac이라는 영국의 물리학자에 의해 널리 알려졌기 때문에 Dirac delta function이라고도 불린다. 델타함수는 계단 함수(step function)와 관련이 깊은데, 이 둘을 함께 공부해두면 좋다. 아래 그림을 보자. 

 

 

Fig. 4 스텝함수(좌)와 델타함수(우)의 모습

 

 

Fig. 4는 계단 함수(step function)와 델타함수(delta function)의 모습을 각각 나타낸다. 그림에서 보이는 것처럼 계단 함수는 t가 0보다 작을 경우 그에 대한 함수값 H(t)가 0이다가, t가 0을 넘어서는 순간 함수값 H(t)가 1이 되는 특성을 가진 함수이다. 반면에 델타함수는 0을 제외한 모든 구간에서 함수값이 0이고, t=0인 그 찰나의 순간에는 함수값이 무한대(infinite)인 특성을 보인다. 그래프의 모양은 굉장히 이상적(ideal)으로 표현된 것이고 실제로 이러한 완벽에 가까운 형태의 그래프를 만드는 것은 어렵다. 이들을 수식으로 표현하면 아래와 같다. 

 

 

식 (9.1)은 계단 함수의 수학적 정의를, (10.1)은 델타함수의 수학적 정의를 각각 나타낸다. 직관적으로 이해하기 어렵지 않을 것이다. 식 (10.2)는 델타함수의 특징을 나타내는데, 델타함수를 무한대의 t영역에서 적분을 하게 되면 그 값이 1이 된다는 것이다. 물론 t=0에서의 값이 무한대가 되긴 하지만, t=0인 순간이 무한대로 짧아진다고 생각해보면 결국 적분값이 1이 됨을 유추할 수 있다. 

 

이렇듯 공학도라면 한 번쯤은 듣거나 배운 이들함수는 그렇다면 무슨 관계가 있을까? 그것은 바로 계단 함수(step function)의 미분값이 델타함수라는 것이다. Fig. 4를 보면 계단 함수는 t가 0보다 작을땐 값에 변화가 전혀 없다. 즉 이때의 미분값은 0이다. 그러다 t가 0이 되는 그 순간 값이 아주 급격하게 1이 되어버린다. 즉 t=0에서의 미분값(변화량)은 거의 무한대가 된다는 의미다. 그러다가 t가 0을 지나는 그 다음 순간부터는 다시 1로 유지되어 값의 변화가 없다. 미분값이 다시 0이 된다는 의미다. 지금까지 설명한 계단 함수의 미분값을 그래프로 표현한것이 바로 델타함수이다. 이들의 관계를 수식으로 표현하면 아래와 같다. 

 

 

 

식 (11.1)은 계단 함수(step function)를 미분하면 델타함수(delta function)가 됨을 수식으로 표현한 것이다. 이 식에서 양변을 적분하면 (11.2)와 같이 정리할 수 있는데, 이때 계단 함수 H(t)는 양의 무한대와 음의 무한대의 영역에서 적분할 수 있다. 적분 결과값은 1이 되어 델타함수를 적분한 것과 결과가 같다. 결론적으로 계단 함수와 델타함수는 서로간에 미분/적분 관계에 있음을 확인하였다. 

 

 

- Step function and delta function (shifted)

 

계단 함수와 델타함수는 t=0을 기준으로 그 값에 변화가 있는데, 이들 함수는 어떤 시스템에 입력을 가해 그 응답을 확인하여 해당 시스템의 특성을 파악하는데에 종종 사용된다. 따라서 t=0 이외에도 임의의 시간 a에 대한 함수를 정의할 필요가 있다. 아래 그림은 a의 시간 만큼 이동(shift or delay)된 형태의 계단 함수와 델타함수를 나타낸다. 

 

 

Fig. 5 시간 a만큼 이동된(shifted) 형태의 계단함수와 델타함수

 

 

Fig. 5의 왼쪽은 a만큼 shift된 계단 함수를, 오른쪽은 a만큼 shift된 델타함수를 나타낸다. 이들 shift된 계단/델타함수는 아래와 같은 식으로 표현한다. 

 

 

식 (12.1)은 shift된 스텝함수를, (12.2)는 shift된 델타함수를 각각 나타낸다. 스텝함수의 경우 기존엔 t가 0보다 큰 경우에 값이 1이 되었지만, shift된 스텝함수는 a보다 커야 함수값이 1이 된다. 델타함수의 경우에도 마찬가지로 shift가 되면 t=0이 아닌 t=a에서 함수값이 존재하게 된다. 델타함수는 본래 t=0에서 값이 활성화되는데, shift가 된 경우 델타함수의 입력값을 0으로 만들기 위해선 t=a로 설정해야 δ(a-a)=δ(0)=1이 된다. 결국 shift된 델타함수를 통해 어떤 시스템의 임의의 시간 a에서의 임펄스 응답(Impulse response)을 확인할 수 있다. 

 

 

- Properties of delta function

 

이러한 계단함수와 델타함수는 어떤 시스템, 특히 선형-시불변 시스템(Linear Time-invariant system, LTI system)에 대한 응답을 확인하여 시스템의 특성을 파악하는데에 사용되는 중요한 개념의 함수인데, 이를 단위 스텝응답(Unit Step Response), 임펄스 응답(Impulse Response)이라고 각각 부른다. 이중 임펄스 응답은 흥미로운 특성을 가지고 있는데, 그것은 임펄스 응답에 사용되는 델타함수는 모든 주파수 영역에서 동일한 응답을 한다는 것이다. 델타함수를 푸리에 변환(Fourier Transform)해보면 아래 그림과 같이 1이 되는데, 이는 모든 주파수 영역에서 동일한 응답을 한다는 것을 의미한다. 

 

 

Fig. 6 델타함수의 푸리에 변환 결과

 

 

Fig. 6에 보인것과 같이 델타함수는 모든 주파수 영역에서 동일한 응답을 하기 때문에 어떤 시스템의 특성을 파악하는데에 훌륭한 도구가 될 수 있다. 아래 식은 델타함수의 푸리에 변환을 식으로 나타낸 것이다. 

 

 

델타함수의 경우 오직 t=0에서만 값을 가지는데, 이상적으로는 무한대의 값을 가지지만 보통 실제 문제에 적용하기 위해서는 이 값을 1로 간주한다. 이는 식 (10.2)와 같이 델타함수의 무한대 영역에서의 적분값이 1이기 때문에 t=0에서 1로 간주해도 무리가 없다. 1로 간주했을 때의 델타함수를 단위 임펄스 함수(Unit impulse function)라 한다. 

 

델타함수는 (13.1)과 같이 임의의 함수 f(t)에 곱해졌을 때 오직 f(0)에만 1이 곱해지고 나머지 영역, 예를 들면 f(-2.4), f(-1.7), f(31.678)등은 전부 0이 되기 때문에 결국 f(0)의 값이 δ(t)f(t)의 적분값이 된다. 중요한것은 (13.1)에서는 무한대의 영역에서 적분을 했지만, 어떤 임의의 구간 [a, b]구간에서 적분을 한다고 했을 때, 이 구간에 반드시 0이 포함되어 있어야 (13.1)이 성립한다. 즉 a≤0b를 만족해야만 한다. (13.1)에 따라 식 (13.2)의 델타함수의 푸리에 변환을 정의할 수 있고 그 값은 1이 된다.  

 

식 (13.3)은 a의 시간만큼 이동(shift)된 델타함수의 특성을 나타낸다. 함수 f(t)에 곱해졌을 때 그 적분결과는 f(a)와 같으며, 임의의 구간 [c, d]에서 적분한다면 a가 반드시 c와 d사이에 존재해야만 (13.3)이 만족된다. (c≤ad) 식 (13.3)으로부터 shift된 델타함수의 적분을 (13.4)와 같이 정의할 수 있다. 이와 같이 shift된 델타함수의 푸리에 변환 결과는 지수함수의 식으로 나온다. 

 

어떤 사람들은 이 식의 결과에 대해서 지수함수의 그래프를 그려놓고 값이 이상하게 나온다고 잘못 이해하는 경우도 있으나, 푸리에 변환 결과가 복소지수함수(complex exponential function)임을 기억하자. 즉 푸리에 변환을 크기(magnitude)와 위상(phase)의 관점에서 바라봐야한다. cos의 real축과 sin의 imaginary축으로 구성되는 2차원의 복소평면(complex plane)에서 크기는 벡터의 길이, 위상은 벡터의 각도이며 아래의 식으로 계산할 수 있다. 

 

 

결국 시간 영역에서 델타함수가 a만큼 shift됐다면, 푸리에 변환의 결과에선 크기는 변함이 없고 위상만 변하게된다. 식 (13.4)에서 임의의 a를 설정하여 실제로 계산해보면 크기는 여전히 1이고, a에 따라 위상만 변하는 것을 볼 수 있다. 

 

 

- Impulse response

 

앞서 언급했듯이 임펄스 응답은 선형성(Linearity)과 시불변성(Time-Invariance)을 만족하는 시스템인 선형-시불변 시스템(Linear Time-invariant system, LTI system)의 특성을 파악하는데에 이용될 수 있다. 아래의 그림을 보자. 

 

 

Fig. 7 LTI(Linear Time-Invariant) 시스템과 임펄스 응답(Impulse Response)

 

 

Fig. 7은 LTI 시스템과 임펄스 응답에 관한 내용을 나타낸다. 예를 들어 어떤 LTI시스템이 있고, 입력 신호 x(t)를 받아서 y(t)를 출력한다고 해보자. 그런데 여기서 우리는 아직 이 LTI 시스템이 어떤지 잘 모른다고 가정해보자. 이러한 상황에서 무작정 입력신호를 넣을 수는 없을 것이다. 왜냐하면 우리는 아직 이 시스템이 안정적인지, 혹은 불안정한 시스템인지 잘 모르기 때문이다. 

 

 

이와 같이 잘 알려지지 않은(unknown) 시스템의 특성을 파악하고자 할 때 임펄스 응답이 사용될 수 있다. 앞서 언급했듯이 임펄스 신호는 모든 주파수에 대해서 동일한 반응을 보이는 특성을 가졌고, 해당 시스템이 어떤 주파수의 신호에서 어떤 반응을 보일지 모르는 상황이다. 이때 아주 기본단위의 신호인 임펄스 신호를 해당 시스템에 가하고, 그에 대한 응답을 분석한다면 해당 시스템의 특성을 파악할 수 있다. 임펄스 응답은 h(t)로 표현한다.

 

시스템의 특성을 나타내는 임펄스 응답 h(t)는 입력 신호 x(t)와 콘볼루션(convolution)되어 출력 신호 y(t)를 산출한다. 결국 임펄스 응답 h(t)는 출력 신호 y(t)를 만들어내는 근거이기 때문에 시스템 그 자체라고 해도 과언이 아니다

 

그렇다면 임펄스 함수(Impulse function)는 임펄스 응답(Impulse response)을 통해 시스템을 기술하는데에만 사용될까? 그렇지않다. 임펄스 함수는 입력신호 x(t)를 분해하여 표현하는 데에도 사용된다. 다음의 예를 통해 임펄스 함수를 이용하여 입력신호 x(t)를 분해하는 과정, 그리고 임펄스 응답에 대해 알아보자. 

 

 

Fig. 8 임펄스 함수를 이용한 입력 신호의 분해(decomposition)와 임펄스 응답

 

 

Fig. 8은 임펄스 함수를 이용한 입력 신호의 분해와 LTI 시스템의 임펄스 응답을 나타낸것이다. 이해를 돕기 위해 연속시간(continuous time)이 아닌 이산 시간(discrete time)으로 표현하였다. 이산시간은 소괄호대신 대괄호를 이용하여 함수를 표현하며, 시간 축을 셀 수 있기 때문에 알파벳 n을 이용한다. 

 

그림의 위쪽을 보면 입력신호 x[n]이 시간 -1, 0, 1에 걸쳐 1, 3, 2의 값을 각각 갖는다. 이때 각 시간의 입력신호는 임펄스 함수를 이용하여 분해하여 표현할 수 있다. 입력 신호 x[n]은 k인덱스를 이용하여 모든 시간축의 신호들을 탐색하며 x[k]에 k만큼 shift된 델타함수 δ[n-k]를 곱한 것들을 모두 더하여 표현할 수 있다. 예를 들어 x[n=1]을 구한다고 했을 때, x[-1]δ[1-(-1)] + x[0]δ[1-0] + x[1]δ[1-1]과 같이 계산할 수 있는데, 이때 n=k인 경우에만 델타함수의 값이 1이고, 나머지는 모두 0이기 때문에 x[1]이 계산되어져 나온다. 결과적으로 델타함수를 이용하여 입력신호를 가중-지연 임펄스(weighted delayed impulse)의 선형조합(Linear combination)으로 분해하여 표현할 수 있다. 

 

그 아래를 보면 LTI 시스템에 대한 임펄스 응답이 나타나있다. 임펄스 응답은 알파벳 h를 써서 h[n]으로 표시한다. 예를 들어 어떤 시스템의 임펄스 응답이 Fig. 8의 파란 상자속 수식과 같이 정의되어 있다고 가정하자. 이때 u[n]은 단위스텝함수(unit step function)를 의미하는데, 이는 임펄스 신호가 시스템에 입력된 순간부터 그 이후의 지속적인 응답신호를 확인하기 위해 곱해져야 한다. 스텝함수의 미분이 임펄스 함수임을 생각해봤을 때 결국 지속적으로 찰나의 순간마다 shift된 임펄스 함수가 가해진다고 생각하면 된다. 그래프를 보면 n=0일 때 임펄스 신호(빨간색 화살표)가 가해졌고, 그 순간부터 시스템의 응답신호가 파란색 그래프로 표현되어져 있다. 그래프의 추이를 보면 점점 줄어드는 형태이고 안정적인 시스템인 것을 알 수 있다. 이렇게 하여 임펄스 응답 h[n]을 구하였다. 

 

임펄스 응답 h[n]은 입력신호 x[n]과 콘볼루션(convolution)되어 출력신호를 계산할 수 있다. 여기서 콘볼루션은 두 신호를 합성하는 것이고 기호 *(asterisk)를 써서 나타낸다. 신호처리를 공부하는 것이 아니기 때문에 콘볼루션의 자세한 사항은 다루지 않겠다. 결과적으로 시스템의 임펄스 응답을 안다면 해당 시스템이 입력신호에 대해 어떤 작용을 하는지, 즉 시스템의 특성이 어떤지 파악할 수 있게 된다.

 

아래의 식은 델타함수를 이용하여 표현한 입력신호와 출력신호를 나타낸다. 

 

 

식 (14.1)와 (14.3)은 각각 이산시간(discrete time)에서의 입력과 출력신호를, (14.2)와 (14.4)는 연속시간(continuous time)에서 표현한 것이다. 

 

임펄스 응답은 이론적으로는 어떤 시스템을 미분방정식으로 모델링하고 입력값을 f(t)대신 δ(t)로 두어 해를 구한 뒤, Z변환(Z-Transform)을 통해 구할 수 있다. 그러나 실질적으로 임펄스 신호에 대한 응답을 기록한 뒤, 푸리에 방법을 적용하기도 한다.

 

 

 

 

6. 주기신호의 연속시간 푸리에 변환

 

- Continuous Time Fourier Transform for periodic signal

 

이제 주기신호(periodic signal)의 연속시간 푸리에 변환(continuous time Fourier Transform)에 대해 공부해보자. 먼저 앞에서 정리했던 연속시간 푸리에 급수(Fourier Series) 식을 다시 써보자. 

 

 

식 (15.1)과 (15.2)는 앞서 정리했던 주기신호(f tilde)의 연속시간 푸리에 급수를 정리한 것이다. $2\pi/T$는 $\omega_0$로 치환하여 정리하였다. 이 주기신호에 대한 푸리에 급수를  푸리에 변환하면 아래와 같이 정리할 수 있다. 

 

 

식 (16.1)은 주기신호의 푸리에 급수를 푸리에 변환시키는 모습이다. 푸리에 변환시에 계수 cn은 주파수에 대한 함수가 아니기 때문에 밖으로 뺄 수 있다. 계수를 빼서 정리하면 (16.2)와 같이 정리할 수 있고, 결국 지수함수부만 푸리에 변환을 하면 된다. (16.2)의 푸리에 변환을 수행하면 (16.3)과 같이 2pi와 델타함수가 나오게 되는데, 이 과정은 어떻게 이루어졌을까? 우리는 이 과정을 이해하기 위해 지금까지 델타함수에 대해 공부하였다. 다음의 식을 보자. 

 

 

식 (7.1)은 역푸리에 변환(Inverse Fourier Transform)을 다시 쓴것이다. 식 (17.1)은 주파수 도메인에서 델타함수를 역푸리에 변환시킨 것이고, 주파수 오메가가 0일 때만 1이고 나머지는 0이므로 결과값은 $1/2\pi$가 나왔다((13.1)을 생각해보자). 여기서 델타함수앞에 $2\pi$를 곱해준뒤 역푸리에 변환을 시키면 (17.2)와 같이 앞의 분수가 상쇄되어 없어지고 그 결과가 1이 나오게 된다. 여기에 다시 오메가를 $n\omega_0$만큼 shift시킨 델타함수를 역푸리에 변환해주면 (17.3)과 같이 $n\omega_0$가 포함된 복소지수함수가 나오게 된다. 이것은 식 (13.4)에서 다루었던 a만큼 shift된 델타함수의 푸리에 변환과 같은 개념이며 단지 시간 영역이 아닌 주파수 영역에서 적분을 해준 것이 다르다. 결과적으로 (17.4)와 같이 복소지수함수$e^{jn{\omega_0}t}$를 푸리에 변환하면 shift된 주파수 영역의 델타함수가 나오게 된다. 이 결과값을 (16.2)에 대입하면 (16.3)이 나오게된다. 

 

이렇게하여 우리는 주기신호(periodic signal)에 대한 푸리에 변환을 정의하였다. 비주기신호(Aperiodic signal)의 푸리에 변환식과 주기신호(periodic signal)의 푸리에 변환식을 함께 정리해보자. 

 

 

식 (4.2)는 비주기신호에 대한 푸리에 변환식을, (16.3)은 주기신호에 대한 푸리에 변환식을 각각 나타낸다. 두 식의 차이점이 보이는가? 식 자체가 물론 다르긴 하지만 가장 큰 차이점은 바로 연속(continuous)과 이산(discrete)이다. 비주기신호에 대한 푸리에 변환식 (4.2)는 계산자체를 적분(integral)으로 하기때문에 결과가 연속이다. 반면 주기신호에 대한 푸리에 변환식은 시그마(summation)을 통해 계산하기 때문에 결과값이 이산이다. 즉 비주기신호의 푸리에 변환결과는 연속이고, 주기신호의 푸리에 변환결과는 이산이라는 것이 가장 큰 차이점이다. shift된 델타함수가 곱해졌다는 것은 곧 일정 shift마다 값을 뽑아낸다는 것을 의미하며, 이는 이산적인 결과를 도출해낸다. 

 

(16.3)을 보면 $n\omega_0$만큼씩 shift된 델타함수가 푸리에 계수(Fourier coefficient)에 곱해지고, 거기에 다시 $2\pi$가 곱해진다. 즉 주기신호의 푸리에 변환의 결과는 주파수들의 분포가 $\omega_0$의 간격으로 존재하며, $2\pi$배 만큼 증가된 결과가 나오게된다. 이들의 관계를 정리하면 아래와 같다. 

 



  비주기 신호(Aperiodic Signal)의 푸리에 변환 결과 ---> 연속(Continuous)


  주기 신호(Periodic Signal)의 푸리에 변환 결과 ---> 이산(Discrete)



 

 

- Continuous Time Inverse Fourier Transform for periodic signal

 

우리는 앞서 주기신호에 대한 푸리에 변환(Fourier Transform)을 정의했다. 이를 이용하여 역푸리에 변환(Inverse Fourier Transform)을 정의해보자. 역푸리에 변환식의 유도는 기존의 비주기신호의 역푸리에 변환식에 주기신호의 푸리에 변환식을 대입하여 정리하면 간단히 해결할 수 있다. 

 

 

식 (18.1)은 기존의 비주기신호의 푸리에 변환식에 주기신호 푸리에 변환식(F tilde)을 대입하여 주기신호의 역푸리에 변환식을 만든것이다. F tilde를 풀어서 정리하면 (18.2)와 같이 되고, 여기서 시그마를 푸리에 계수와 함께 앞쪽으로 빼고 적분기호를 뒤쪽으로 보내서 정리하면 (18.3)과 같이 된다. 앞의 $2\pi$는 상쇄되어 없어지고, 뒤의 적분은 (17.3)과 동일하기 때문에 $n\omega_0$를 기반으로하는 복소지수함수가 나오게된다. 최종적으로 식을 정리하면 (18.4)와 같이 쓸 수 있다. 

 

그런데 식을 정리하고보니 어디서 많이 본 형태이다. 그렇다. 주기신호의 역푸리에 변환식은 푸리에 급수(Fourier Series)식과 동일하다. 앞서 정리했던 푸리에 급수식 (15.1)과 비교해보면 완전히 동일한 것을 알 수 있다. 주기신호의 푸리에 변환식을 이용하여 역푸리에 변환식을 유도하였고, 그 결과 주기신호를 sin과 cos함수의 여러 주파수의 조합으로 표현할 수 있는 푸리에 급수식과 동일함을 확인하였다. 

 

 

- Fourier Transform of periodic square wave

 

주기신호의 푸리에 변환을 MATLAB을 이용하여 구현해 보도록 하자. 아래 그림은 사각파의 푸리에 변환을 주기신호에 대한 식을 이용하여 구현한 모습이다. 

 

 

Fig. 9 주기 신호인 사각파의 푸리에 변환

 

 

Fig. 9는 주기신호인 사각파를 푸리에 변환한 모습이다. 왼쪽은 약 T=12.56의 주기를 갖는 사각파형이고 오른쪽은 푸리에 변환을 통해 주파수 영역에서 신호를 분석한 모습이다. 이전의 비주기신호의 푸리에 변환과 달리 임펄스 신호들이 일렬로 나열되어있는 형태의 그래프를 얻을 수 있다. 임의의 펄스(pulse)가 지속적으로 나타나는 형태의 신호를 펄스 트레인(pulse train)이라 하는데, 펄스대신 임펄스 신호들이 나열되어있다면 이를 임펄스 트레인(Impulse train)이라 한다. 신호가 기차와같이 연결되어 나타난다고 생각하면된다. Fig. 9에서와 같이 주기신호의 푸리에 변환은 이산적인 임펄스 트레인 형태의 결과를 얻을 수 있음을 확인하였다. 

 

아래 그림은 MATLAB 구현코드이다. 

  • File name: "dd.m"

 

  • File name: "dds.m"

 

 

 

 

7. 마치며

 

이번 강의에서는 주기신호에대한 연속시간 푸리에 변환 방법을 공부하였다. 델타함수에 관한 내용을 공부하고, 이것의 역푸리에 변환을 통해 주기신호의 푸리에 변환을 유도하였다. shift된 델타함수가 식에 존재함으로인해 그 결과는 매 shift마다 값을 추출하는 이산(discrete)적인 결과를 보이게되고, 임펄스 트레인(Impulse train)형태의 주파수 영역 신호가 나타난다. 

푸리에 변환은 푸리에 급수로부터 유도된 개념이다. 이미 배웠듯이 푸리에 급수는 주기신호만 다룰 수 있고 비주기신호는 다루지 못하였다. 그러나 여기에 수학적 트릭을 더해서 비주기신호의 주파수 성분을 분석할 수 있는 푸리에 변환 방법을 유도하였고, 다시 여기서 주기신호를 다룰 수 있는 푸리에 변환 방법을 얻을 수 있었다. 또한 역푸리에 변환을 통해 주파수 영역의 데이터로부터 원래의 신호를 복원할 수 있는 방법까지 알게되었다. 결과적으로 우리는 주기신호와 비주기신호 모두를 다룰 수 있는 수학적 도구를 만든것이다. 

주기신호와 비주기신호를 다룰 수 있는 수학적 방법론을 하나의 프레임워크(framework)에 담아내는 것, 그것이 푸리에 변환이 갖는 중요한 의미 중 하나이다. 

 

지난 시간까진 임의의 주기함수를 sin과 cos함수와 같은 기저함수(basis function)의 선형조합(Linear combination)으로 표현하는 방법인 푸리에 급수(Fourier Series)를 배웠다. 또한 여기에 허수(imaginary number)를 도입하여 지수함수로 간단히 표현하는 방법인 복소푸리에급수(Complex Fourier Series)에 대해서도 공부하였다. 이제 이번 강의부터는 복소푸리에급수로부터 출발하여 시간 영역에서 수집된 신호를 주파수 영역으로 변환시키는 푸리에 변환(Fourier Transform)에 대해 공부하도록 하겠다. 

 

 

 

1. 푸리에 급수(Fourier Series)에서 푸리에 변환(Fourier Transform)으로

 

- Basic idea of Fourier Transform

 

지난 강의에서 배웠던 푸리에 급수는 임의의 주기함수(periodic signal)를 다루는 방법이다. 하지만 살다보면 주기함수보다 비주기함수(aperiodic signal)를 접할 경우가 훨씬 많다. 우리가 일상생활에서 대화할 때 내는 목소리, 콘서트장에서 듣는 가수의 음성, 자동차 경적 소리, 심지어 우리가 보는 창밖 풍경도 카메라로 찍어 2차원의 이미지로 변환했을 때의 신호는 비주기 신호이다. 이처럼 우리는 주기함수보다 비주기함수를 다루고 해석해야 할 일이 훨씬 많다. 그러나 푸리에 급수는 주기신호에만 작동하기 때문에 비주기 신호를 다룰 수 없다. 그렇다면 어떻게 비주기 신호를 다룰 수 있을까? 이러한 비주기 신호를 주기신호로 만들어주면 가능하다. 아래의 그림을 살펴보자. 

 

 

Fig. 1 비주기 신호[Up]를 주기 신호[Down]로 만드는 과정

 

 

Fig. 1의 첫 번째 그림은 -T1에서 T1의 시간 동안 측정된 어떤 비주기 신호 f(t)를 나타낸다. 가로축은 시간 t를 나타내고 세로축은 신호의 강도를 의미한다. 이 f(t)는 어떤 반복되는 패턴이 없이 불규칙한 파형을 보이는 비주기 신호이다. 이미 배웠듯이 이러한 상태로는 푸리에 급수를 이용하여 신호를 나타낼 수 없다. 따라서 이 비주기 신호를 주기신호로 만들어야 한다. 어떻게 만들 수 있을까? 

 

주기신호로 만들기 위한 핵심 아이디어는 바로 -T1~T1 사이의 신호를 하나의 주기 동안 반복되는 패턴이라고 생각하는 것이다. 즉 현재의 비주기 함수 f(t)를 기준으로 주기 T만큼 떨어진 곳에 똑같은 패턴의 신호를 놓는 것이다. 그렇게되면 원래의 비주기 함수 f(t)가 T주기로 계속 반복되는 패턴이 형성되어 결과적으로 주기신호가 만들어지는 것이다. 이렇게 만든 주기함수가 바로 Fig. 1의 아래쪽의 그래프이다. 

Fig. 1의 아래쪽에 보이는 비주기 신호 f(t)로부터 만들어진 주기 신호는 f(t)에 물결표시를 붙여서 $\tilde{f}(t)$ (f tilde로 발음)로 표기한다. 양의 방향과 음의 방향으로 각각 T의 주기마다 원래의 비주기 신호가 반복되는 모습이다. 

 

여기서 우리는 한 가지 매우 중요한 사실을 알 수 있는데, Fig. 1에서 한 주기 T의 구간만 놓고 봤을 때, 즉 -T/2~T/2 혹은 0~T에서는 주기신호와 비주기신호가 같다는 것이다. 별것 아닌 것으로 보이겠지만, 이는 매우 중요한 포인트이며 푸리에 급수에서 푸리에 변환으로 넘어가는 아주 핵심 개념이 된다. 이것이 첫 번째 핵심 아이디어이고, 두 번째 핵심 아이디어는 주기를 늘리는 것으로부터 시작한다. Fig. 1의 아래 그림에서 period T라고 표시된 주기를 점점 늘려나가는 상상을 해보자. 즉 가운데 있는 비주기신호와 그 다음 나타나는 비주기신호 사이의 거리가 점점 늘어나서 무한대로 멀어진다고 생각해보자. 이때의 그림은 바로 Fig. 1의 위에 나타난 비주기신호의 그림과 동일해질 것이다. 이와 같이 두 번째 핵심아이디어는 비주기신호로부터 만들어진 주기신호는 주기가 무한대로 증가할수록 원래의 비주기신호와 점점 같아진다는 것이다. 이 두 가지 핵심 아이디어를 식으로 표현하면 아래와 같다. 

 

 

식 (1.1)은  첫 번째 핵심아이디어를 나타낸다. 즉 t의 크기가 T/2보다 작다는 것은 t가 한 주기 T내에 존재할 때를 의미하며, 이때 주기신호와 비주기신호는 같으며, Fig. 1의 아래의 주기신호에서 가운데 -T/2~T/2사이의 신호만을 의미한다. 식 (1.2)는 두 번째 핵심 아이디어를 의미하며, 주기신호 f(t)의 주기 T가 무한대로 갈수록 주기신호는 비주기신호와 점점 같아진다는 것이다. T가 무한대로 간다는 것은 Fig. 1의 아래의 주기신호에서 가운데 신호와 양 옆의 신호들과의 간격이 점점 넓어지는 것을 의미한다. 이 두 가지 핵심 아이디어를 푸리에 급수에 적용하면 우리는 비주기신호를 다룰 수 있는 푸리에 변환(Fourier Transform)을 정의할 수 있다. 이제 푸리에 급수에 이 아이디어를 적용해보자. 

 

 

 

2. 분석방정식(Analysis equation)과 합성방정식(Synthesis equation)

 

- Analysis equation for Aperiodic signal

 

지금부터 공부할 내용은 앞서 배웠던 두 가지 아이디어를 푸리에 급수에 적용하여 분석방정식(Analysis equation)을 도출할 것이다. 분석방정식이라고 거창하게 이야기 했지만 사실 푸리에 급수의 계수를 구하는 식을 분석방정식이라 표현하는 것이므로 너무 어렵게 생각하지 말자. 우선 지난 시간에 배웠던 복소푸리에급수의 식을 다시 써보자. 

 

 

식 (2)는 지난 시간에 배웠던 복소푸리에급수의 일반식을 그대로 쓴 것이다. 지난 시간에는 주로 T=2PI인 경우를 가정하여 푸리에급수를 다루어 왔으나, 임의의 주기 T에 대한 일반화된 식은 (2)와 같이 쓸 수 있다. 여기서 시간에 관한 변수를 x로 작성했었는데, 보다 직관적인 표기를 위해 시간에 대한 변수를 x대신 t로 바꾸어서 쓰도록 하겠다. 또한 주기 신호와 비주기 신호를 구분해야 하기 때문에 f(t)대신 물결표시를 붙여 f tilde로 표기하도록 한다. 이렇게 바꾸어 작성하면 (3)과 같이 쓸 수 있다. 

 

식 (3.1)은 주기함수를 다룰 수 있는 푸리에급수에 관한 식을, (3.2)는 각 주파수 성분이 전체 신호에서 어느 정도의 기여를 하는지를 나타내는 가중치(weight), 혹은 계수(coefficient)를 구하는 식이다. 이때 (3.1)을 종합방정식(synthesis equation), 혹은 합성방정식이라 하고, (3.2)는 분석방정식(analysis equation)이라고 한다. (3.2)의 푸리에 급수 계수를 구하는 분석방정식들을 종합하여 합성방정식을 정의하고 이를 통해 어떤 주기신호에 대한 푸리에 급수를 정의할 수 있는 것이다. 

 

지금부터가 중요하니 집중해서 보도록 하자. (3.2)를 보면 적분이 분명 한 주기에 대한 구간, 즉 -T/2~T/2사이에서 일어나고 있다. 다시 말하면 어떤 주기신호에서 한 주기 T의 구간에서 진행되는 적분이다. 그런데 우리는 두 번째 아이디어에서 주기 신호의 주기를 무한대로 보내면 비주기 신호와 점점 같아진다고 하였고, 주기 신호와 비주기 신호는 적어도 한 구간 T에서는 같다고 정의하였다. 이는 다시 말하면 식 (3.2)의 주기 신호(periodic signal)의 한 구간에 대한 적분에서 주기 T를 무한대로 보낸 것은 비주기 신호(aperiodic signal)를 한 주기 T에 대해서 적분한 것과 같음을 의미하는 것인데, 이때 T를 무한대로 보냈으므로 비주기 신호를 무한대의 영역에 걸쳐 적분한 것과 같다. 확인을 위해 먼저 식 (3.2)의 적분식에서 주기 T를 무한대로 보내보자. 

 

(※ 참고로 식에 존재하는 T를 전부 한번에 무한대로 보내지는 않을 것이다. 이후에 합성방정식을 정리할 때 작용해야 할 부분들이 있기 때문에 T를 단계적으로 무한대로 보낼 것이다)

 

 

식 (3.2)는 주기 신호의 푸리에 급수의 계수를 구하는 식이다. 여기서 주기 T를 무한대로 보내면 각각 -T/2는 음의 무한대, T/2는 양의 무한대가 된다. 앞서 우리는 한 주기내에서는 주기와 비주기 신호가 같다고 정의했으므로 f tilde를 비주기 신호를 나타내는 문자 f(t)로 바꿔쓸 수 있다. 이렇게 하여 (3.3)과 같이 정리할 수 있는데, 여기서 1/T은 주파수 $f$와 같고, $2\pi/T$를 각주파수(Angular frequency)를 나타내는 기호인 오메가($\omega_0$)로 표기할 수 있다. 이렇게 하여 주기 신호(Periodic signal)의 푸리에 급수에 대한 계수 식 (3.2)를 (3.4)와 같이 비주기 신호(Aperiodic signal)에 대한 푸리에 급수 계수의 식으로 나타낼 수 있다

 

다시 말하면 식 (3.2)를 Fig. 1의 아래쪽 주기 신호에 대한 한 구간(-T/2~T/2)에서의 식으로, (3.4)를 Fig. 1의 위쪽의 비주기 신호에 대한 식을 나타낸 것으로 이해하면 된다. 이 둘은 식의 형태는 약간 다르지만 동일한 신호를 나타내는 것이다. f와 f tilde를 유의해서 보자. 

(※ 앞서 언급했지만 한 번더 강조하자면 여기서 적분기호 인테그랄 앞의 1/T과 복소지수함수에 존재하는 T는 아직 그대로 있는 것을 볼 수 있는데, 이들은 전체식을 유도할 때 다루기 위해 일단 그대로 두도록 하자. 전체 식과 같이 볼 때 어떤 작용을 하기 때문이다) 

 

이제 우리는 식 (3.4)를 통해 비주기 신호에 대한 푸리에 급수의 계수들을 구할 수 있게 되었다. 식 (3.4)는 매우 중요한 역할을 하는 식이며, 이 식으로부터 우리는 푸리에 변환(Fourier Transform)을 정의할 수 있다. 아래의 식을 보자. 

 

 

식 (3.4)는 앞서 말했듯이 비주기 신호 f(t)에 대한 푸리에 급수 계수를 구하는 식이다. 이제 식의 양변에 주기 T를 곱해주면 식 (4.1)과 같이 정리할 수 있는데, 아직까지는 지수함수의 지수부에 대한 입력 파라미터로 임의의 정수 n과 고정된 각주파수(angular frequency) $\omega_0$를 받는 것으로 정의되어 있다. 이 n과 $\omega_0$의 곱을 연속변수(continuous variable) 오메가($\omega$)로 정의하여 다시 식을 정리하면 (4.2)와 같이 정리할 수 있는데, 여기서 연속변수로 정의한다는 것은 각주파수 $\omega_0$가 0으로 가는 것을 의미한다. $\omega_0=2\pi/T$임을 생각해본다면 T를 무한대로 보냄에따라 $\omega_0$가 0으로 가고, 그에 따라 오메가가 연속 변수가 됨을 유추할 수 있다. 여기서 cn앞에 곱해져 있는 주기 T는 아직 무한대로 보내지 않은 상태이다. 여기까지 정리한 식 (4.2)가 바로 푸리에 변환(Fourier Transform)이다. 

 

식 (4.2)는 비주기 신호 f(t)를 무한대의 영역에서 적분하여 $F(\omega)$로 변환시키는데, 사실 식 (4.3)과 같이 $F(\omega)$를 주기 T로 나누어주면 푸리에 급수 계수 cn을 구할 수 있게 된다. 이는 매우 중요한 사실을 의미하는데, 원래의 푸리에 급수는 주기 신호만 다룰 수 있고, 주기 신호의 푸리에 급수 계수 cn만을 구할 수 있는데, 식 (4.2)를 통해서 비주기 신호에 대한 푸리에 급수 계수 cn을 구할 수 있게 된 것이다. 이것이 푸리에 변환이 하는 핵심 역할중 하나이다. 결국 는 비주기 신호 f(t)의 푸리에 급수 계수들에 대한 포락선 함수(envelope function)라 할 수 있다

 

여기서 다시 한 번 생각해보자. 푸리에 급수의 계수 cn을 구한다는 것은 어떤 의미인가? 계수 cn은 어떤 신호를 푸리에 급수로 표현했을 때, 특정 주파수가 그 신호를 만들어내는데에 있어 얼마만큼 기여하는지를 나타내는 수치이다. 어떤 신호에 대한 푸리에 계수 cn을 모두 구해서 주파수를 x축으로 하여 이 계수들을 전부 나열했다고 생각해보자. 이때의 그래프는 해당 신호의 주파수에 대한 분포를 나타내는 것이다. 결국 푸리에 계수 cn을 구한다는 것은 어떤 신호의 주파수 성분의 분포를 구하여 주파수의 분석이 가능하도록 만들어주는 수학적 도구라고 할 수 있다

 

이처럼 식 (4.2)의 비주기 신호에 대한 푸리에 변환을 할 때 구하고자 하는 주파수 성분의 계수를 구하기 위해선 입력값으로 $n\omega_0$를 넣어주면 계수 cn을 구할 수 있게 되는 것이다. (4.3)과 같이 은 주기 T가 곱해진 값이 구해지고, 실제 계수 cn을 구하기 위해선 T로 나누어주면 된다. 이러한 cn을 연속적으로(continuously)구해서 연결해주면 f(t)의 계수값들에 대한 포락선(envelope)이 구해진다. 포락선이란 쉽게 말해 임의의 신호의 최대값들을 연결하여 구성한 신호로 어떤 신호의 전체 외곽선(outline)을 나타낸 것으로 생각하면 된다(wiki 참조). 

 

이렇게하여 비주기 신호의 푸리에 급수의 계수를 정의할 수 있는 푸리에 변환을 정의하였다. 푸리에 변환은 다른 말로 분석방정식(Analysis equation)이라 하는데, 그 이유는 뒤이어 공부할 합성방정식의 내용에서 함께 설명하도록 하겠다. 비주기 신호의 푸리에 변환 (4)는 비주기 신호의 합성방정식을 정의하는데에 있어 매우 중요한 역할을 한다. 이제 이를 기반으로 비주기 신호의  합성방정식을 정의해보자. 

 

 

- Synthesis equation for Aperiodic signal

 

비주기 신호를 다룰 수 있는 푸리에 급수(합성방정식)를 정의하는 전략은 크게 두 단계로 나뉘는데, 먼저 비주기 신호의 양옆에 같은 패턴의 신호를 주기적으로 붙여서 주기 신호로 만들고, 그 다음 이렇게 만들어진 주기 신호의 주기를 무한대로 보내어 비주기 신호를 주기 신호와 같이 정의할 수 있도록 만드는 것이다. 즉 주기 신호에 대한 푸리에 급수식으로부터 비주기 신호의 푸리에 급수 식을 정의하는 것이다. 아래의 식을 보자. 

 

 

식 (5.1)은 주기 함수에 대한 푸리에 급수식이다. 여기서 $\omega_0=2\pi/T$와 식 (4)에서 정의했던 cn에 대한 식을 기존의 식에 각각 대체해주면 (5.2)와 같이 정리할 수 있다. 이때 cn에 대한 식은 오메가($\omega$) 를 아직 연속변수로 설정하지 않은 상태, 즉 식 (4.1)의 상태이다. 다음으로 주기 T를 $T=2\pi/\omega_0$와 같이 대체하여 (5.3)과 같이 정리하자. 이제 마지막으로 주기 T를 무한대로 보내자. 주기가 무한대로 감에 따라$\omega_0$가 0으로 수렴하고 결국 delta omega($d\omega$)가 된다. 이 delta omega에 의해 이산적인 합을 계산하는 시그마는 연속적인 합을 계산하는 적분(integral)으로 변화하게 되고, n과 곱해졌던 $\omega_0$들은 연속변수인 $\omega$로 쓸 수 있다. 이렇게 식을 정리하면 최종적으로 식 (5.4)와 같이 쓸 수 있다. 

 

식 (5.4)는 최초의 주기신호의 푸리에 급수 (5.1)에 푸리에 변환(Fourier Transform)식 (4.2)를 적용하여 유도한 것이다. 이렇게 유도된 식 (5.4)가 바로 역푸리에 변환(Inverse Fourier Transform)이다. 푸리에 변환과 역푸리에 변환을 다시 한 번에 정리해보자. 

 

 

식 (6.1)를 보면 비주기 신호의 함수 f(t)가 시간의 영역($dt$)에서 무한대에 걸쳐 적분이 이루어지고 있다. 그리고 그 결과는 입력 주파수 $\omega$에 대한 출력값 이다. 즉 를 그래프 상으로 보자면 수평(horizontal)축은 주파수$\omega$이고 수직(vertical)축은 해당 주파수가 얼마만큼의 강도를 갖는지에 대한 값 이다. 결과적으로 (6.1)의 푸리에 변환을 통해 시간 영역(time domain)에서 정의된 비주기 함수 f(t)를 주파수 영역(frequency domain)으로 변환시키는 꼴이 된다. 이렇게 변환을 시키게 되면 f(t)에 주파수들이 어떻게 분포해 있는지를 파악할 수 있다. 이와 같이 시간 영역에서의 신호를 주파수 영역에서 분석(Analysis)할 수 있도록 만들어 주는 것이 푸리에 변환(Fourier Transform)이고 이를 분석방정식(Analysis equation)이라 한다. 또한 식에 존재하는 허수로부터 푸리에 변환 결과가 식 (6.2)와 같이 복소수 형태로 나온다는 것을 유추할 수 있다. 혹은 (6.3)과 같이 푸리에 변환의 크기(magnitude)와 각도(angle)로 표현할 수 있다. 식 (6.3)의 크기와 각도는 각각 푸리에 스펙트럼(Fourier Spectrum)위상(phase)이라고 할 수 있는데, 경우에 따라서는 스펙트럼 못지않게 위상에도 중요한 정보가 담겨있는 경우가 많다. 

 

푸리에 변환식과는 반대로 식 (7.1)는 비주기 신호에 대한 주파수 영역의 함수 가 주파수 영역($d\omega$)에서 무한대에 걸쳐 적분이 이루어지고 있다. 그리고 그 결과는 원래의 시간 영역에서의 비주기 함수 f(t)이다. 이는 결과적으로 어떠한 비주기 신호의 주파수 영역에서의 값들을 적분하여 원래의 신호를 복원하는 것이다. 이것이 역푸리에 변환(Inverse Fourier Transform)이고 주파수 영역의 값들을 합성(synthesis)하여 시간 영역에서의 신호를 만들어주는 합성방정식(Synthesis equation)이다. 

 

이와 같이 푸리에 변환 및 역변환은 시간 영역에서 수집된 신호를 주파수 영역에서 분석할 수 있게 해주고, 주파수 영역의 값들을 이용해 다시 시간 영역의 신호로 합성할 수 있는 방법론을 제공해준다. 따라서 푸리에 변환이 분석방정식, 푸리에 역변환이 합성방정식으로 각각 불리는 것이다. 이러한 관계를 표현한 것이 식 (7.2)이다. 푸리에 변환/역변환을 이용하면 특정 주파수대의 신호를 제거하거나 더해주는 등 다양한 조작이 가능하며 실제로는 잡음(noise) 제거, 혹은 음성 변조 등의 응용이 가능하다. 

 

 

 

 

3. 연속시간 푸리에 변환의 예

 

- Continuous-Time Fourier Transform of Square wave

 

연속시간 푸리에 변환(Continuous Fourier Transform)의 이해를 돕기 위해 예를 들어보자. 마찬가지로 사각파(square wave)를 이용하도록 하겠다. 아래 그림은 임의의 비주기 사각파를 나타낸다. 

 

 

Fig. 2 비주기 사각파(Aperiodic square wave)를 주기 사각파로 만드는 과정

 

 

Fig. 2의 왼쪽 그림은 비주기 사각파를, 오른쪽은 양쪽에 일정 주기 T만큼 띄워서 동일한 패턴의 사각파를 놓아 주기 사각파(periodic square wave)로 만든 모습이다. 주기 신호로 만들었기 때문에 푸리에 급수로 위의 신호를 나타낼 수 있다. 이제 푸리에 급수를 적용하여 -T/2~T/2 구간에서 적분을 해보자. 

 

 

식 (8)은 Fig. 2의 주기 사각파의 푸리에 계수를 구하기 위한 분석방정식(Analysis equation)이다. -T/2~T/2 구간을 살펴보면 총 세 곳으로 나누어서 적분을 수행할 수 있다. 이렇게 나눈 구간으로 만든 적분식이 (8.1)인데, 이중 -T0~T0를 제외한 나머지 구간은 f(t) 값이 0이기 때문에 식을 생략할 수 있다. 생략한 나머지 구간에 대한 식은 (8.2)와 같이 정리할 수 있고, 적분을 수행하면 (8.3)과 같이 되는데, 지수함수(exponential)식에 오일러 공식을 적용하여 정리하면 (8.4)와 같이 정리할 수 있다. cos항은 상쇄되어 없어지고 sin항만 남게 되는데, 이 부분이 (8.5)이다. 이제 소거되는 항들을 없애주어 정리하면 사각파의 푸리에 급수 계수를 구하는 식은 최종적으로 (8.6)과 같이 정리할 수 있다. 

 

식 (8)에서 사각파에 대한 분석방정식을 도출하였으므로 이 식을 합성방정식(synthesis equation)에 대입하여 푸리에 급수로 표현하여 Fig. 2와 같이 사각파를 생성할 수 있다. 이제 이와 같이 생성한 사각파를 푸리에 변환(Fourier Transform)을 통해 주파수 영역으로 바꿔보자. 함수 f(t)를 만들었기 때문에 푸리에 변환식 (4.2)를 구현해주면 푸리에 변환을 할 수 있다. 아래 그림은 위의 사각파에 대한 푸리에 변환 결과이다. 

 

 

Fig. 3 사각파의 주기에 따른 푸리에 변환 결과

 

 

Fig. 3은 사각파 푸리에 변환 결과를 나타낸다. 그러면서 동시에 사각파의 주기를 점점 늘리면서 푸리에 변환의 결과가 어떻게 변하는지를 나타내고 있다. Fig. 3의 첫 번째 줄의 왼쪽 그림은 사각파의 주기가 T0의 4배일 때의 파형을 나타내고, 오른쪽은 푸리에 변환 결과 그래프를 나타낸다. 푸리에 변환 그래프를 보면 우선 0에 가까운 저주파 구역의 푸리에 계수들이 높은 값을 가지고 있고, 고주파로 갈 수록 상대적으로 낮은 값을 가지고 있는 것으로 보인다. 이것이 의미하는 것은 왼쪽의 사각파형을 만들기 위해서는 낮은 주파수의 성분이 상대적으로 더 높은 기여를 하고 있음을 의미한다. 

 

 

푸리에 변환 그래프에서 빨간색 그래프를 볼 수 있는데, 이는 각 푸리에 계수들의 극대값들을 이어 그린 포락선(envelope)이다. 이 포락선은 어떤 신호의 전반적인 패턴을 파악할 수 있는 신호로써 실제 신호처리에서도 신호분석을 위한 중요한 요소로써 사용되기도 한다. 

 

다음 두 번째 줄의 그래프는 T0의 8배에 해당하는 주기를 가졌다. 첫 번째 사각파보다 주기가 2배 길어진 셈인데, 그에 따른 오른쪽의 푸리에 변환 그래프를 보면 앞의 그래프에 비해 보다 촘촘한 형태를 띄는 것을 볼 수 있다. 왜 이런 현상이 발생하는 것일까? 이는 주기를 늘림에 따라 주파수가 줄어들기 때문이다. 사각파의 푸리에 계수를 구하는 식 (8.6)을 다시 써보자. 

 

 

1/T가 주파수 f와 같기 때문에 식 (8.6)의 주기 부분을 다시 정리해보면 (8.7)과 같이 정리할 수 있다. 주파수와 주기의 관계에 따라 주기가 증가할수록 주파수는 감소하기 때문에 똑같은 n=1일 때의 계수도 주기가 늘어날 수록 더 작은 주파수를 표현하는 셈이 되기 때문이다. 또한 푸리에 변환 그래프에서 값의 크기가 원래 사각파의 주기가 늘어남에 따라 줄어드는 모습을 볼 수 있는데, 이는 주파수를 보다 세밀한 영역에 걸쳐 표현했기 때문에 해당 주파수의 실제값에 근접하게 되는 것이다. 

 

Fig. 3의 마지막 줄의 그래프를 보면 사각파는 T0의 32배에 해당하는 주기를 가진 것이고, 이때의 푸리에 변환의 그래프는 보다 부드러운 형태가 된 것을 볼 수 있다. 이런식으로 주기 무한대까지 증가한다면 결과적으로 푸리에 변환의 포락선은 연속적(continuous)인 그래프의 형태에 가까워질 것이다. 이것이 연속시간 푸리에 변환(Continuous-Time Fourier Transform)이다. 

 

정리하자면 최초의 비주기 사각파에서 동일한 패턴의 신호들을 양쪽에 더해 주기 신호를 만들고, 여기에 푸리에 급수를 적용한다음, 다시 주기를 무한대로 보내서 푸리에 변환을 수행한 것이다. 식 (4.2)의 푸리에 변환식을 보면 비주기 함수 f(t)를 적분하여 푸리에 변환을 수행하는데, 이는 기존의 주기 신호의 주기를 무한대로 보내어 원래의 비주기 신호와 동일하게 만든것이다. 이러한 수학적 트릭을 통해 우리는 애초에 다룰 수 없었던 비주기 신호를 푸리에 급수로 다루는 것은 물론 푸리에 변환을 통해 주파수 영역에서 해석할 수 있는 기틀을 마련한 것이다

 

아래는 본문에서 다루었던 연속 시간 푸리에 변환을 구현한 MATLAB 코드이다. 코드의 마지막 부분에 역푸리에 변환(Inverse Fourier Transform)에 대한 코드도 작성하였으니 관심있다면 돌려보기 바란다. (※ 참고로 아래의 코드는 연속시간 푸리에 변환의 개념을 설명하기 위한 코드이므로 최적화된 코딩은 아니며, 수식을 최대한 직관적으로 구현하려고 노력하였다) 

 

 

 

 

4. 마치며(continue)

 

이번 강의에선 연속시간 푸리에 변환에 대해 공부하였다. 푸리에 변환의 주요 목적은 주파수 영역에서 신호를 해석하는 것, 그리고 비주기 함수를 다루는 것이다. 실생활에서 대부분이 비주기 신호이고, 이러한 비주기 신호는 푸리에 급수로는 다룰 수 없었다. 그러나 이를 주기 함수로 만들고, 다시 주기를 무한대로 보내는 등의 트릭을 이용하여 우리는 비주기 함수를 푸리에 변환시킬 수 있었다. 

그러나 아직 주기함수를 푸리에 변환시키는 것에 대해서는 이야기하지 않았다. 다음 강의에서는 주기함수의 푸리에 변환에 대해 배우고 이산 푸리에 변환으로 넘어가도록 하자. 

 

이번 강의에선 지난 강의에 이어서 푸리에 급수(Fourier Series)에 관한 이야기를 좀더 하겠다. 푸리에 급수와 선형대수와의 유사성을 살펴보고 이어서 푸리에 급수의 계산 및 표현방식에 있어서 훨씬 효율적인 형태인 오일러 공식에 대해 설명하도록 하겠다. 

 

 

 

4. 정규직교기저의 확장과 푸리에 급수의 직교성

 

- Orthonormal basis expansion

 

Lecture 26-(1)에서 설명했듯이 푸리에 급수는 선형대수의 연산으로 설명할 수 있다. 이를 위해 먼저 알아볼 것은 정규직교기저(orthonormal basis)를 이용한 투영(projection), 혹은 전개(expansion)이다. 정규직교벡터에 대한 내용은 Lecture 17-(1)을 참고하자. 

 

임의의 n차원에 대한 정규직교기저벡터(orthonormal basis vector)가 다음과 같이 존재한다고 가정해보자. 

 

 

식 (17.1)은 n차원 공간에 대한 정규직교기저벡터를, (17.2)는 이를 행렬(matrix)의 형태로 만든 것이고, 이때 Q의 크기는 nxn, rank=n이다. 이들 기저벡터들은 임의의 가중치(weight)를 각 기저에 곱하여 n차원 공간에 존재하는 어떠한 벡터로도 만들어질 수 있다. 이 벡터를 v라고 했을 때 다음과 같이 식을 정리할 수 있다. 

 

 

식 (18.1)은 정규직교기저 q에 가중치 x가 각각 곱해진 형태를 전개(expansion)하여 표현한 것이고, 이를 행렬의 연산 형태로 표현한 것이 (18.2)이다. 즉 정규직교기저의 전개(Orthonormal basis expansion)라고 할 수 있다. 정규직교기저벡터가 있다면 위의 식과 같은 연산을 통해 우리는 n차원 공간의 어떠한 벡터 v도 만들 수 있다. 

 

여기서 우리가 궁금한 것은 어떤 벡터 v를 만들기 위해선 각각의 기저벡터에 얼마만큼의 가중치를 곱해야 하는가? 이다. 간단히 생각하면 Q의 역행렬(inverse matrix)을 구하여 (18.2)의 양변에 곱해주면 될 것이다. 더구나 Q는 정규직교벡터들로 이루어진 정방행렬(정규직교행렬)이기 때문에 역행렬은 Q의 전치(transpose)를 통해 아주 쉽게 구할 수 있다. 물론 맞는 얘기지만 푸리에 급수의 직교성(orthogonality)과 연결지어 이해하기 위해 좀 더 세부적으로 쪼개서 생각해보자. 

 

식 (18.1)을 봤을 때 가중치 벡터 x중에서 먼저 x1을 구하기 위해선 어떻게 해야할까? 가중치들이 곱해진 벡터들이 정규직교기저벡터임을 생각하면 이를 어렵지 않게 구할 수 있다. x1을 구하기 위해선 바로 (18.1)의 양변에 q1의 전치(transpose)를 곱해주면 된다. 아래의 식을 보자. 

 

 

식 (19.1)은 양변에 q1의 전치를 곱해준 모습이다. x1에 대한 항은 똑같은 정규직교기저를 곱한 것이기 때문에 이들의 내적은 1이 된다(동일한 벡터이기 때문에 두 벡터 사이의 각이 0도 이므로 cos(0)=1). q1을 제외한 나머지 벡터들은 전부 q1과 직교(orthogonal)하기 때문에 0이 된다. 따라서 각 가중치의 계산식은 (19.3)과 같이 정리할 수 있다. 여기까지 정리한 식 (19)가 푸리에 급수의 직교성과 연결지어 이해하기 위한 핵심 아이디어이다. 이 둘을 어떻게 연결지어 이해할 수 있을까? 푸리에 급수의 식을 다시 꺼내서 비교해 보도록 하자. 

 

 

 

 

- Orthonormal basis and Fourier series expansion

 

바로 이전 강의에서 다루었듯이 푸리에 급수의 식은 cos함수와 계수 an, sin함수와 계수 bn, 그리고 a0의 선형조합의 형태로 이루어진다. 이 식을 전개(expansion)한 것과 식 (18)에서 다루었던 정규직교기저(orthonormal basis)의 전개식과 비교를 해보자. 

 

 

식 (20.2)는 푸리에 전개식(Fourier expansion)을, 식 (21.2)는 정규직교기저의 전개(Orthonormal basis expansion)를 각각 나타낸다. 우리는 앞서 푸리에 급수의 계수를 구하기 위한 핵심아이디어가 직교성(orthogonality)라고 배웠다. 그런데 이 푸리에 급수의 직교성에 대한 성질은 식 (21)의 정규직교기저의 개념과 일맥상통한다. 푸리에 급수에서의 직교성이라 함은 예를 들어 cos(x)를 기준으로 봤을 때 cos(2x), cos(3x), ... 등과 sin(x), sin(2x), sin(3x), ... 등 모든 sin함수 및 다른 주파수를 가지고 있는 모든 cos함수와 직교(orthogonal)하다는 것이다. 이 말은 cos(x)와 cos(2x)와 같이 직교한 두 함수의 곱을 한 주기(-PI ~ PI or 0 ~ 2PI)의 구간에서 적분(integral)했을 때 0이 된다는 것이다. 정규직교기저의 경우에도 동일한데, 가령 q1과 q2를 내적(inner product)했을 때 결과가 0이 되고 이 둘은 직교한다고 할 수 있다. 

 

결국 cos(x)는 자기 자신과의 곱에 대한 적분은 1이 되고 나머지 모든 sin과 cos(kx)함수와의 곱의 적분에 대해서는 0이 되므로, 모든 cos(nx)와 sin(nx) (n은 정수)함수를 푸리에 급수의 기저(basis)로 봤을 때 이들은 선형대수의 정규직교기저와 같다고 할 수 있다. 이는 어떤 n차원 공간의 정규직교기저 q1, ... qn이 있을 때 q1은 자기 자신과의 내적은 1이 되고 나머지 qn과의 내적은 0이 되므로 이 둘은 완전히 같은 개념으로 볼 수 있는 것이다. 단지 직교성에 대한 개념을 벡터(vector)끼리의 내적(inner product)연산으로 표현한 것인지, 아니면 연속인(continuous) 함수의 적분(integral)으로 표현한 것인지가 그 차이라고 할 수 있다. (바로 지난 강의에서 적분은 내적을 연속적으로 표현한 것임을 기억하자)

 

 

- Coefficients

 

이제 계수(coefficient)에 대해 이야기 해보자. 푸리에 전개식 (20.2)에서 계수는 a0, an, bn등이다. 정규직교기저 전개식 (21.2)에서 계수는 x1, x2, ... 라고 할 수 있다. 푸리에 급수에선 계수들을 구하기 위해 f(x)의 식 양변에 구하고자 하는 계수에 해당하는 기저함수인 sin, 혹은 cos함수를 곱하고 적분하여 계산하였다. 정규직교기저의 경우에도 동일하게 구하고자 하는 계수에 대한 기저벡터를 식의 양변에 곱하여 계산하였다. 이 둘에 대한 식을 비교하여 살펴보자. 

 

 

 

식 (22)는 푸리에 계수 a1을 구하는 과정을 표현한 것이다. (22.1)은 푸리에 전개식의 양변에 a1에 대한 기저함수 cos(x)를 곱해준 모습이고 (22.2)는 이를 적분한 것이다. 적분한 결과 (22.3)과 같이 cos(x)cos(x)항을 제외한 나머지 항은 0이 되어 사라지고 (22.4)와 같이 a1에 대한 식이 정리된다. 

 

이번엔 식 (19)를 보자. 계수 x1을 구하기 위해 정규직교기저 전개식의 양변에 q1을 곱한 것이 (19.1)이다. 정규직교기저의 특성상 자기 자신과의 내적인 q1q1은 1이 되고 나머지는 수직(perpendicular)하기 때문에 (19.2)와 같이 0이 된다. 결과적으로 계수 x1에 대한 계산식은 (19.3)과 같이 정리할 수 있다. 푸리에 식과 비교해보면 a1은 x1과 같고, f(x)는 벡터 v, 기저벡터 q1은 cos(x)와 같다. 이와 같이 계수를 구하는 과정에서도 직교성(orthogonality)을 이용한다는 개념은 푸리에 급수나 선형대수의 정규직교기저나 동일하다

 

정리하자면 푸리에 급수는 선형대수와 연결지어 생각할 수 있으며 핵심 아이디어인 직교성(orthogonality)을 푸리에 급수에서는 sin과 cos이라는 함수(function)의 형태로써 사용한 것이고, 선형대수에서는 벡터로써 사용한 것이다. 이 둘은 모두 계수와 기저와의 선형조합(Linear combination)의 형태로써 표현되는데, 함수로 표현할 때는 적분, 벡터로 표현할 때는 내적이라는 연산을 적용한 것이다. 

 

이를 통해 우리는 어떤 주기함수를 여러 개의 주파수의 선형조합으로 표현하는 푸리에 급수와, 선형대수에서 정규직교기저의 선형조합을 통해 n차원의 임의의 벡터 v를 표현할 수 있다는 정규직교기저 확장(expansion)에 대한 개념사이의 연결고리를 찾을 수 있다. 그리고 그 연결고리는 바로 직교성(orthogonality)이다

 

 

 

 

 

5. 오일러 공식과 복소 푸리에 급수(Euler's formula and complex Fourier series)

 

- Euler's formula

 

지금부터 공부할 내용은 오일러 공식(Euler's formula)에 관한 내용이다. 오일러 공식을 공부하는 이유는 푸리에 급수의 계수에 대한 식을 굉장히 간단하고 계산하기 편리하게끔 바꿔주기 때문이고, 또한 이후에 공부할 푸리에 변환(Fourier Transform)을 하는데 있어서 없어서는 안될 개념이기 때문이다. 푸리에 급수에 적용하기에 앞서 오일러 공식에 대해 간단히 정리해보자. 

오일러 공식의 형태는 다음과 같다. 

 

 

식 (23)이 그 유명한 오일러 공식(Euler's formula)이다. 이공학도라면 반드시 한 번쯤은 공부했을 식이며 인터넷에서 방대한 자료를 쉽게 찾아볼 수 있다. 오일러 공식이 저렇게 생겼다는 것은 알겠는데, 왜 위와 같이 정의될 수 있는지 고민해본적은 많지 않을 것이다. 어떻게 위와 같이 정의할 수 있고, 또 의미하는 바가 무엇일까? 

 

일단 오일러 공식은 지수함수(exponential function) $e^x$로 부터 시작된다. 지수함수는 미분을 해도 자기 자신과 같아지는 굉장히 좋은 특성을 가진 함수이다. 지수함수는 테일러 급수(Taylor series)를 통해 정의할 수 있는데, Lecture 23-(2)에서 다룬 적이 있다. 지수함수의 정의를 다시 써보면 아래와 같다. 

 

 

식 (24)는 지수함수를 x=0에서의 테일러 급수를 통해 정의한 모습이다. 여기서 오일러는 지수함수의 지수부 x를 허수 jx로 만들어서 오일러 공식을 만들어냈다. x를 허수 jx로 바꾸면 어떻게 되는지 살펴보자. 

 

 

식 (25.1)과 (25.2)는 지수함수의 지수부를 허수 jx로 바꾸어 정리한 것이고, (25.3)은 이를 실수부(real part)와 허수부(imaginary part)로 분리하여 정리한 것이다. 그런데 이렇게 정리한 것이 어떻게 cos과 sin함수가 될 수 있을까? cos과 sin함수를 마찬가지로 테일러 급수로 정리해보면 그 형태가 보일것이다. 

 

 

식 (26.1)의 cos함수의 테일러 급수는 (25.3)의 지수함수의 실수부에 해당하고, (26.2)의 sin함수의 테일러 급수는 허수부에 해당한다. 따라서 복소지수함수는 cos과 sin함수의 조합으로 표현할 수 있다. 복소지수함수를 표현함에 있어서 보통 허수부는 알파벳 j나 i를 사용하고, x는 각도를 나타내는 기호 세타(theta, $\theta$)로 표현하기도 한다. 또한 실수부를 x축, 허수부를 y축으로 하여 복소평면(complex plane)에 복소지수함수를 표현할 수도 있다. 이제 이 오일러 공식을 푸리에 급수에 적용해보자. 

 

 

 

 

- Complex Fourier Series

 

우리가 지금부터 할 일은 앞서 배웠던 푸리에 급수의 식을 오일러 공식을 이용하여 간단하게 만드는 것이다. 즉 아래의 식과 같이 만드는 것이 목적이다. 

 

 

식 (27)은 기존의 삼각함수의 선형조합의 형태로 이루어진 푸리에 급수의 식을 지수함수(Exponential function)가 포함된 복소 푸리에 급수에 대한 식으로 정리한 것이다. 삼각함수의 형태일 땐 구해야할 계수가 a0, an, bn등 총 3개인 반면, 복소 푸리에 급수식은 단 하나의 계수 cn에 대해서만 구하면 된다. 기존 방식에 비해 훨씬 식이 간결하고 효율적이다. 

 

그렇다면 어떻게 푸리에 급수의 식을 복소 푸리에 급수의 식으로 정리할 수 있을까? 바로 앞서 공부했던 오일러 공식을 이용하면 된다. 아래의 식을 보자. 

 

 

식 (28.1)은 기존의 오일러 공식을, (28.2)는 오일러 공식에서 허수부의 부호가 반대인 켤레(conjugate)를 나타낸다. 이 둘을 서로 더하거나 빼면 어떤 결과가 발생할까? 바로 아래의 식과 같이 될 것이다. 

 

 

식 (29.1)은 복소지수함수(complex exponential function)와 그의 켤레를 서로 더한 결과를, (29.2)는 서로 뺀 결과를 나타낸다. 이를 통해 우리는 sin과 cos함수를 복소지수함수의 연산으로 각각 표현할 수 있다. 눈치가 빠른 분들은 여기 까지 공부했다면 기존의 푸리에 급수식의 sin과 cos을 식 (29)의 복소지수함수의 식으로 대체하여 정리하면 되겠구나! 하고 생각할 것이다. 맞다. 하지만 그 과정에서 약간의 트릭이 필요하다. 일단 푸리에 급수에 (29)의 복소지수함수를 대입하여 정리해보자. 

 

 

먼저 푸리에 급수식에 (29)에서 정리한 식을 대입하기 전에 필요한 과정이 있다. 푸리에 급수에서 sin과 cos의 입력값 x는 임의의 주파수를 나타낼 수 있는 정수 n이 곱해진 nx이다. 따라서 (29)를 푸리에 급수에 대입하기 위해선 x를 nx로 바꾼 뒤 대입해야 한다. (29)의 x를 nx로 교체하면 (30.1)과 같이 정리할 수 있으며, 이를 푸리에 급수에 그대로 대입한 것이 (30.2)이다. 여기서 식을 전개하여 (30.3)과 같이 정리한 뒤, 복소지수함수와 그의 켤레로 각각 묶어서 정리해주면 (30.4)가 된다. 이때 계수 bn에는 1/2j가 곱해져 있는데 여기서 1/j는 분자, 분모에 똑같이 j를 곱해서 정리하면 -j가 되므로 분자를 -jbn으로 정리할 수 있다. 마지막으로 분모를 하나로 정리하면 (30.6)과 같이 정리할 수 있다. 

 

여기서 마지막 식인 (30.6)에서 첫 번째 시그마항과 두 번째 시그마항을 비교해보자. 첫 번째 시그마항의 계수는 (an-jbn)/2이고, 두 번째 시그마항의 계수는 (an+jbn)/2으로 허수부만 부호가 다르다. 마찬가지로 복소지수함수도 부호가 다른 것을 확인할 수 있다. 즉 두 항이 켤레의 관계임을 알 수 있다. 우리가 하고싶은 것은 이 켤레의 관계를 깨고 하나의 복소지수함수로 정리할 수 있도록 만드는 것이다. 어떻게 할 수 있을까? 힌트는 시그마의 인덱스 n에 있다. 

 

켤레의 관계를 없애고 식을 하나로 만들기 위해선 두 번째 시그마항의 복소지수함수의 부호를 +로 만들어주면 된다. 즉 $e^{-jnx}$를 $e^{jnx}$로 만들어야 한다. 이를 위해선 두 번째 시그마항의 n의 부호를 반대로 바꿔주면 된다. 어떻게 n의 부호를 반대로 만들어 줄 수 있을까? 일단 무작정 n을 -n으로 바꿔서 식을 정리해보자. 

 

 

식 (30.7)은 두 번째 시그마항의 n을 무작정 -n으로 치환하여 정리한 것이고, 두 번째 시그마의 -n을 n으로 바꾸어 순서대로 다시 정리한 것이 (30.8)이다. 여기서 두 번째 시그마항은 수평선을 기준으로 봤을 때 원래 1에서 무한대까지의 합을 y축을 기준으로 뒤집어서 음의 영역의 n인덱스로 바꾼 것으로 생각할 수 있다. 

 

이렇게 놓고 보니 두 개의 시그마항을 하나의 시그마항으로 합칠 수 있을 것 같이 보인다. 왜냐하면 두 항 모두 양의 복소지수함수로 묶여있고, 첫 번째 시그마항은 1부터 무한대(infinite)까지 더하고, 두 번째 시그마항은 음의 무한대(negative infinite)부터 -1까지 더하기 때문이다. 또한 n=0에 대한 값은 a0로 생각할 수 있기 때문에 결과적으로 식 (30.10)에서와 같이 a0는 c0로, 첫 번째 계수항은 cn, 두 번째 계수항은 음의 인덱스에 대한 cn으로 생각하여 식을 하나로 합칠 수 있는 것이다. 

 

여기서 식 (30.8)에서 (30.9)로 넘어가는 과정이 조금 헷갈릴 수 있는데, an은 cos함수로 계산되는 계수이며 cos(x)=cos(-x)를 만족하는 우함수(even function)이다. 따라서 음의 입력값이 들어가도 결과값은 같기 때문에 $a_n=a_{-n}$으로 정리할 수 있다. 반면에 bn의 경우엔 -sin(x)=sin(-x)를 만족하는 기함수(odd function)를 통해 계산되므로 $-b_n=b_{-n}$으로 정리할 수 있으며 이렇게 정리한 것이 (30.9)이다. 두 시그마항의 계수가 같고 복소지수함수의 부호 또한 같기 때문에 식을 하나로 합쳐서 식 (30.11)과 같이 복소지수함수로 정리할 수 있다. 

 

이렇게 하여 sin과 cos함수로 복잡하게 이루어진 푸리에 급수의 식을 하나의 계수항과 복소지수함수(Complex exponential function)로 심플하게 구성된 복소 푸리에 급수(Complex Fourier Series)의 식으로 정리하였다. 

 

 

 

 

- Coefficient of Complex Fourier Series

 

이제 복소 푸리에 급수의 계수 cn을 구하는 방법을 공부해보자. cn을 구하는 방법은 두 가지가 있다. 첫 번째는 기존의 계수 an과 bn의 계산식을 cn의 계산식에 그대로 대입하여 정리하는 것이다. 두 번째 방법은 an과 bn을 구하던 방식과 같이 양변에 복소지수함수를 곱하여 적분해주는 것이다. 우선 첫 번째 방법으로 cn을 계산해보자. 

 

 

식 (31.1)과 (31.2)는 기존의 an과 bn을 구하기 위한 공식이다. 이 두 공식을 (31.3)의 cn에 그대로 대입하여 정리한 것이 (31.4)이다. 여기서 공통으로 포함된 pi와 f(x)와 같은 항들을 밖으로 빼서 정리해주면 (31.5)와 같이 정리할 수 있는데, 이때 괄호안의 식은 cos(nx)-jsin(nx)가 된다. 그런데 이 식은 앞서 살펴봤던 오일러 공식의 켤레(conjugate)인 (28.2)와 같은 것을 볼 수 있다. 따라서 오일러 공식의 켤레로 식을 대체해주면 식 (31.6)과 같이 cn을 구하는 공식을 정리할 수 있다. 

 

첫 번째 방식은 기존에 정리했던 공식을 활용하여 그대로 대입하여 계산하는 방식이다. 반면 지금부터 알아볼 두 번째 계산방식은 an과 bn을 계산하던 것 처럼 복소지수함수의 직교성(orthogonality)을 이용하여 계산하는 방법이다. 우선 복소지수함수의 직교성에 대해 알아보자. 

 

 

식 (32.1)은 복소지수함수와 그의 켤레의 곱을 $-\pi$ ~ $\pi$구간에서 적분한 것이다. 켤레를 곱한 이유는 곱의 결과가 실수(real number)가 나오도록 하기 위함이다. 원래의 복소지수함수와 그의 켤레는 서로 다른 주파수상수 n과 m이 각각 곱해져있다. 이를 적분한 식이 (32.2)이고, n-m을 k로 치환한 식이 (32.3)이다. 

 

이제 n과 m이 다른 경우와 n과 m이 같은 경우, 즉 주파수가 서로 다른 경우와 같은 경우를 비교하여 살펴보자. (32.4)는 n과 m이 다른 경우에 적분의 계산 결과를 나타낸다. 오일러 공식을 이용하여 삼각함수로 풀어서 계산하면 그 결과가 0이 된다. 이는 n과 m이 어떤 값이던 서로 다른 정수인 경우에 전부 해당된다. 

 

이와는 반대로 (32.5)는 n과 m이 같은 경우, 즉 주파수가 같은 경우의 적분계산결과이다. n과 m이 어떤 값이던 간에 값이 같다면, 적분의 결과는 $2\pi$가 된다. 따라서 (32.6)과 같이 n=m이면 $2\pi$, nm이면 0이 된다. 

 

정리하자면 복소지수함수와 그의 켤레에 대한 곱을 한 구간에서 적분을 한다는 것은 오일러 공식에 따라 두 개의 주기신호를 내적(inner product)한다는 의미고, 또한 선형결합(Linear combination)하는 것이다. 즉 두 주기 신호를 내적함에 있어서 오일러 공식을 이용하여 복소지수함수로 보다 간단히 표현하고 계산한 셈이다. 이렇게 복소지수함수를 이용하여 내적을 해도 두 신호의 주파수가 다르면(n과 m이 다르면) 내적 값이 0이 되어 직교(orthogonal)한다. 다시 말하면 복소지수함수도 직교성(orthogonality)을 만족한다는 것이다. 우리는 이와 같은 복소지수함수의 직교성을 이용하여 복소푸리에급수의 계수 cn을 계산할 수 있다. 계산 방법은 아래와 같다. 

 

 

복소푸리에급수(Complex Fourier series)의 식 (33.1)의 양변에 다른 주파수를 가진 켤레복소지수함수 $e^{-jmx}$를 곱하고 $-\pi$ ~ $\pi$구간에서 적분하여 (33.2)와 같이 정리한다. (33.2)의 우변의 적분식에서 시그마(sigma)와 계수 cn을 적분 밖으로 빼서 정리하면 (33.3)과 같이 된다. 이때 식 (32.6)에서 정리한 것과 같이 적분식은 n과 m이 같을 때에만 0이 아닌 수가 되어 살아남게된다. 따라서 시그마는 n=m일 때에만 고려하기 때문에 (33.4)와 같이 계수 cn과 n=m일 때의 적분값 2PI만이 남게 된다. 이때 좌변의 적분식에는 -jmx로 정리되어 있는데, n=m이기 때문에 -jnx로 정리할 수 있다. cn을 계산하는 최종식인 (33.5)는 앞서 an과 bn을 대입하여 정리한 식 (31.6)과 일치함을 볼 수 있다. 

 

이렇게 하여 우리는 삼각함수로 이루어져 있는 푸리에 급수의 식을 복소지수함수(Complex Exponential function)를 이용하여 복소푸리에급수(Complex Fourier Series)로 간단히 표현할 수 있었다. 마지막으로 푸리에 급수와 복소푸리에급수를 비교해보자. 

 

 

같은 기능을 하는 식이지만, 식의 형태만 봐도 (34.2)의 복소푸리에급수가 훨씬 간단한 형태임을 확인할 수 있다. 푸리에 급수는 계산해야 할 계수도 a0, an, bn등 총 3개인 반면, 복소푸리에급수는 cn 하나만 계산하면 된다. 식의 표현 방법이나 계산의 효율성 측면에서도 복소푸리에급수가 훨씬 우수하다. 하지만 푸리에 이론에 대한 깊은 이해를 위해선 삼각함수의 선형조합으로 구성된 푸리에 급수를 먼저 학습하고 이해하는 것이 더 좋다. 비록 실제 구현에는 복소푸리에급수가 사용되겠지만, 푸리에 이론, 나아가 라플라스 방정식(Laplace's equation)을 공부하기 위해서도 이러한 변환과정을 기초부터 잘 이해하는 것이 중요하다. 

 

식 (34.3)은 복소푸리에급수를 임의의 주기 T에 대해서 정리한 것이다. 보다 수월한 개념설명을 위해서 지금까지 주기를 $2\pi$로 가정하고 설명하였으나, 임의의 주기를 가진 함수를 정의하기 위해선 (34.3)과 같이 임의의 주기 T를 고려한 식을 사용하면 된다. 즉 지금까지의 식에는 T에 $2\pi$를 대입하면 결과적으로 같은 식이 된다. 

 

 

 

 

 

6. 복소 푸리에 급수의 구현(Implementation of Complex Fourier series)

 

- Square wave(Complex Fourier series)

 

바로 지난 강의에서 푸리에 급수로 구현했던 사각파(square wave)를 복소푸리에급수를 이용하여 구현해보자. 우선 지난 강의에서 다루었던 사각파의 정의에 관한 식을 이용하여 복소푸리에급수의 계수 cn을 계산해보자. 

 

 

식 (13.1)은 지난 강의에서 다루었던 사각파(square wave)에 대한 식이다. 사각파 함수 f(x)를 cn의 식에 대입하여 정리한것이 (35.1)이다. 지난 번과 마찬가지로 구간을 $-\pi$ ~ $0$와 $0$ ~ $-\pi$로 나누어 식을 정리하면 (35.2)와 같이 되고, 여기서 적분을 수행하여 정리하면 (35.3)을 거쳐 (35.4)가 된다. 

 

여기서 유의해야 할 포인트가 존재하는데, 바로 인덱스 n에 따라 분기가 발생한다는 점이다. 식 (35.4)의 복소지수함수를 오일러 공식(Euler's formula)을 이용하여 전개하면 (35.5)와 같이 정리할 수 있다. 이때 분기는 인덱스 n이 홀수(odd number)일 때 복소지수함수값이 -1, 짝수(even number)일 때 1이 된다는 것이다. 즉 n이 홀수면 cos(PI), cos(3*PI), ...가 됨에 따라 -1이 되고 sin함수의 값은 sin(PI), sin(3*PI), ...가 됨에 따라서 0이 되기 때문이다. 반대로 n이 짝수면 cos(2*PI), cos(4*PI), ... 는 전부 1이 되고 나머지 sin함수는 마찬가지로 0이 된다. 

 

이와 같이 n이 짝수냐, 홀수냐에 따라 복소지수함수의 값이 달라지고, 식 (35.4)를 이러한 분기에 따라 정리하면 아래 식과 같다. 

 

 

n이 홀수(odd number)인 경우 식 (35.7)과 같이 사각파의 계수 cn에 대한 계산식이 도출된다. 반면 n이 짝수(even number)인 경우엔 그 결과가 (35.9)와 같이 0이 되는 것을 볼 수 있다. 결과적으로 사각파에 대한 복소지수함수는 n이 홀수일때만 작용하게 된다. 다시 말하면 사각파에 대한 복소푸리에급수는 오직 홀수 조파(odd harmonics)만 갖는다는 것이다

 

또한 cn의 계산식 (35.7)을 보면 허수를 나타내는 j가 곱해져 있음을 볼 수 있다. 이는 곧 우리가 만들고자 하는 사각파가 오직 sin함수의 조합만으로 형성됨을 의미한다. 이전 강의에서 일반 푸리에 급수로 구현했을 때도 cos함수의 계수 an은 모두 0이고 sin함수의 계수 bn만이 살아남았음을 기억하자. 관련된 힌트는 sin함수의 테일러 급수식 (26.2)에서도 얻을 수 있는데, 식이 홀수항 만으로만 구성되었다는 것을 주목하자. 

 

마지막으로 살펴볼 것은 n=0일 때의 계수 c0이다. 보통 복소푸리에급수의 계수 cn을 계산할 때도 마찬가지로 c0를 따로 계산해봐야 한다. c0는 어떻게 계산되는지 살펴보도록 하자. 

 

 

식 (36)과 같이 c0는 0인 것을 볼 수 있다. 따라서 c0는 계산을 따로 하지 않아도 무관하다. 하지만 여기서 c0에 대해 언급을 하는 이유는 사각파의 계수계산식을 구현할 때 이 c0를 계산하는 부분을 주의해야하기 때문이다. 식 (35.7)의 cn 계산식을 보면 분모에 n이 있는데, 이 식을 이용하여 c0를 그대로 계산해버리면 0으로 나눔에 따라 값이 무한대(infinite)가 되어버린다. 따라서 구현할 때는 c0에 관한 처리를 따로 해주어야 한다. 이제 구현을 해보고 마무리 짓도록 하자. 

 

 

- MATLAB implementation

 

아래 그림은 사각파(square wave)를 복소푸리에급수(complex Fourier series)로 구현하여 나타낸 그래프이다. 

 

 

 

Fig. 5 복소푸리에급수(Complex Fourier Series)를 이용한 사각파의 구현

 

 

Fig. 5는 복소푸리에급수(Complex Fourier Series)를 이용하여 사각파를 구현한 것이다. 일반 푸리에 급수로 구현했을 때와 동일한 결과를 보이는 것을 알 수 있다. 아래는 MATLAB 구현 코드이다. 

 

 

 

for문 안은 홀수(odd number) 인덱스에만 연산을 하고 제로인덱스는 건너뛰기위한 처리가 추가되었다. 물론 위의 홀수와 제로인덱스 처리부를 넣지 않고 구현하는 방법도 존재하며 구현 방법은 다양하기 때문에 자신만의 방법대로 코드를 작성하면 되겠다. 

또한 임의의 주기를 갖는 사각파를 구현하려면 식 (34.3)을 이용하여 구현하면 된다. 적분의 범위와 지수함수의 인수에 임의의 주기 T를 적용하여 식을 계산하고 구현하면 임의의 주기를 갖는 사각파를 구현할 수 있다. 

 

 

7. 마치며

 

이번 강의에서는 선형대수의 정규직교기저(orthonormal basis)와 푸리에 급수 사이의 연관성을 공부하였다. 정규직교기저의 전개(expansion)와 푸리에 급수의 전개는 동일한 개념으로 설명할 수 있으며 그 핵심에는 직교성(orthogonality)이 있음을 배웠다. 또한 푸리에 급수를 오일러 공식(Euler's formula)을 이용하여 복소푸리에급수(Complex Fourier Series)로 확장하였으며, 기존의 삼각함수로 이루어진 식보다 훨씬 간결하다. 또한 다음 강의에서 다룰 푸리에 변환(Fourier Transform)을 공부하는데에 있어서 필수적인 과정이므로 잘 이해하고 넘어가도록 하자. 

 

이번 강의부터 몇 개에 걸쳐 푸리에 변환(Fourier Transform)과 선형대수에 대한 이야기를 하겠다. 푸리에 변환은 전자공학, 진동 해석, 음성, 통신 등 신호처리 분야 뿐만 아니라 영상, 그리고 양자역학(quantum mechanics) 등에서도 널리 활용되는 아주 중요한 개념이다. 인터넷에 이미 푸리에 변환에 대한 방대한 자료가 존재하지만, 이번 강의를 통해 간단히 개념을 잡고 선형대수와 관련지어 이해를 해보도록 하자. 푸리에 변환에 대해 공부하기 전에 먼저 푸리에 급수에 대한 개념을 잡고 가자.

 

 

 

1. 푸리에 급수와 직교성 (Fourier Series and orthogonality)

 

- What is the Fourier Series?

 

우리가 일상생활에서 말하는 음성을 녹음한 뒤 그 파형을 보면 굉장히 복잡한 형태의 파형이 나오는 것을 볼 수 있다. 이렇게 복잡한 형태의 신호가 나오는 이유는 다양한 주파수(frequency)를 가진 사인파형태(sinusoidal)의 신호들이 섞여있기 때문이다. 그런데 음성 신호를 분석하고 응용하기 위해선 음성신호들이 어떠한 주파수의 신호들로 이루어져 있는지를 알아내야 한다. 이때 이용할 수 있는 수학적 도구가 바로 푸리에 변환(Fourier Transform)이다. 이후에 자세히 다루겠지만 푸리에 변환은 시간 영역(time domain)에서 표현된 신호를 주파수 영역(frequency domain)에서 표현하여 해당 신호가 어떤 주파수 성분들로 구성되어 있는지를 알아내는 방법이다. 

 

그런데 푸리에 변환 이전에 먼저 알아야 할 이론이 있다. 바로 푸리에 급수(Fourier Series)이다. 푸리에 급수는 임의의 주기신호(periodic signal)를 sine과 cosine함수의 선형 조합으로 나타낼 수 있다는 이론이며, 프랑스의 수학자 Joseph Fourier(1768-1830)가 발견하였다. 원래는 열 방정식(Heat equation)의 문제를 풀기 위해 고안한 방법이었으나, 후에 푸리에 급수(Fourier series)로 불리게 되었다. 

 

푸리에 급수의 핵심은 어떤 복잡한 형태의 주기함수(periodic function)내지는 주기신호를 기저 함수(basis function)의 선형조합(linear combination)으로 표현하는 것이며, 여기에서 기저 함수는 삼각함수인 sine과 cosine함수이다. 이 말이 조금 어렵게 들릴 수도 있으나 천천히 알아보도록 하자. 먼저 주기함수는 아래의 식을 만족시키는 함수를 의미한다. 

 

 

식 (1.1)은 주기함수의 정의를 나타내는 함수이다. 좌변을 보면 함수 f의 입력값으로 x가 있고, 거기에 주기 P를 더하였다. 이렇게 원래의 입력값 x에 어떤 주기 P=2PI를 더한 함수 값이 원래의 함수값과 같다면, 그 함수는 주기함수(periodic function)라 할 수 있다. 대표적인 주기함수로는 sine함수가 있으며, 그 주기는 2PI가 된다. 실제로 sin(x+2PI) = sin(x)는 둘 다 0이므로 식을 만족한다. 

 

이제 이러한 주기함수를 어떻게 sine과 cosine의 선형조합으로 표현할 수 있는지, 즉 푸리에 급수(Fourier series)에 대해 자세히 알아보자. 아래의 식은 푸리에 급수의 식을 나타낸다. 

 

 

식 (2)를 보아하니 sin과 cos함수에 대한 항이 각각 존재하고, 각 항에 $a_n$과 $b_n$이라는 계수(coefficient)들이 곱해져있다. 그리고 시그마(sigma)기호를 통해 n=0부터 무한대까지 각 항들을 모두 더해주는 걸 보니 선형조합(linear combination)의 형태임을 알 수 있다. 지금까지 선형대수강의를 잘 공부했다면 선형조합이라는 단어는 익숙할 것이다. 

 

다음으로 sin함수와 cos함수의 입력값에는 n이 각각 곱해져있는데, n은 sin과 cos함수의 주파수(frequency)를 결정짓는 역할을 한다. 여기서 약간 헷갈릴 수 있는 것이 주기(period)와 주파수인데, sin과 cos함수는 기본적으로 -$\pi$ ~ $\pi$, 혹은 0 ~ 2$\pi$와 같이 2$\pi$의 주기를 가지고 있다. 즉 함수의 주기는 2$\pi$로 고정되어 있고, 식 (2)에서 n을 변경시켜서 주파수를 변경하면 n=1일 땐 2$\pi$의 주기 동안 1번의 순환 주기(cycle)를 마치는 것이고, n=2일 땐 2$\pi$의 주기 동안 2번의 순환 주기를 마치는 것이다. 아래 그림은 -$\pi$ ~ $\pi$동안의 cos(x)와 cos(2x)의 그래프를 나타낸다. 

 

 

Fig. 1 하나의 순환주기(-PI~PI, 2PI)에서 cos(x)와 cos(2x)의 그래프

 

파란색 그래프가 cos(x), 빨간색 그래프가 cos(2x)를 각각 나타내며, 주파수가 정확히 두 배 차이나는 것을 볼 수 있다. 여기서 주기를 계산하려면 삼각함수가 2$\pi$의 주기를 가지기 때문에 2$\pi$를 주파수 n으로 나눠주면 구할 수 있다. 

 

 

식 (3)을 통해 계산해보면 cos(x)의 주기는 2$\pi$/1=2$\pi$이고, cos(2x)의 주기는 2$\pi$/2=$\pi$이다. Fig. 1을 살펴보면 각 함수의 주기가 계산한대로 맞아떨어지는 것을 볼 수 있다. 이를 통해 결국 n이 실질적으로 결정짓는 것은 각주파수(Angular frequency)임을 알 수 있다. 그러나 보다 간결한 표현을 위해 앞으로 n을 주파수를 결정짓는 상수로 이야기 하도록 하겠다. 

 

 

 

 

- Fourier Series coefficient and orthogonality

 

다음으로 식 (2)에서 sin과 cos함수 앞에 각각 곱해지는 계수 $a_n$과 $b_n$에 대해 자세히 알아보자. 직관적으로 봤을 때 이들은 가중치(weight)정도로 이해할 수 있다. 하지만 이보다는 다음과 같이 이해하면 좋을 것 같다. 

 



푸리에 급수의 계수(Fourier Series coefficient) : 


어떤 복잡한 형태의 주기함수 f가 있고, f가 다양한 주파수를 가진 신호들의 조합으로 이루어져 있다고 하자. 이때 각 주파수 성분은 sin과 cos함수에 n을 조절하여 나타낼 수 있고, 이 주파수 성분들이 f에 얼마만큼 포함되어 있는지를 계수 과 이 나타낸다. 

 

결국 푸리에 급수에서 계수는 각 주파수 성분들의 가중치라고 할 수 있다. 그렇다면 이들 계수는 어떻게 구할 수 있을까? 계수를 구하기 위한 핵심 아이디어는 바로 직교성(orthogonality)에 있다. 직교(orthogonal)한다는 것은 선형대수에서는 두 벡터가 90도를 이루어 수직(perpendicular)인 상태를 의미하며, 이때 두 벡터의 내적(dot product)은 0이 된다. 그런데 우리가 풀고있던 문제는 벡터가 아닌 함수에 관한 내용이고, 함수 중에서도 삼각함수에 대한 내용이다. 삼각함수에 대한 직교성을 어떻게 이해해야 할까? 아래의 식을 보도록 하자. 

 

 

식 (4)는 두 개의 cos함수의 곱에 대한 적분(integral)을 나타낸다. 삼각함수의 주기가 2$\pi$이기 때문에 한 주기에 대한 직교성을 검증하기 위해 적분 구간이 -$\pi$ ~ $\pi$이다(또는 0 ~ 2$\pi$). 여기서 눈여겨 봐야 할 곳이 바로 cos함수의 입력값 부분이다. 첫 번째 cos함수의 입력값은 nx이고, 두 번째 cos함수의 입력값은 kx이다. 즉 두 개의 cos함수는 서로 다른 주파수를 가진 것이다. 식 (4)가 의미하는 것은 결국 같은 cos함수라도 주파수(frequency)가 다르면 두 함수는 직교(orthogonal)의 관계를 갖는다는 것이다. 왜 그런지 수학적 증명을 통해 확인해보자.  

 

 

먼저 확인해봐야 할 것은 식 (5.1)과 (5.2)에서와 같이 임의의 주파수를 가진 sin과 cos함수의 적분(integral)은 -$\pi$ ~ $\pi$구간, 혹은 0 ~ 2$\pi$구간에서 0이 된다는 것이다. 삼각함수의 미분/적분 관계를 이용하여 적분을 해보면 (5.3)과 (5.4)와 같이 적분값이 0이 됨을 증명할 수 있다. sin함수를 적분할 경우 (5.3)과 같이 cos함수가 되는데, x가 -$\pi$혹은 $\pi$라면 주파수 상수 k에 따라서 그 값이 1, 혹은 -1이 번갈아가며 나오게되고, 결과값은 0이 된다. 이때 주파수값 k는 어떤 정수(integer)라도 성립한다. 

 

이와 유사하게 (5.2)의 cos함수를 적분하면 (5.4)와 같이 sin함수가 나오고,  x가 -$\pi$ 혹은 $\pi$라면 주파수 상수 n이 변하여도 sin함수값은 항상 0이 나오게 된다. 이때 중요한 것은 n이 0이 아닌 정수여야 한다는 것이다. n이 0이 되면 cos함수의 값은 1이 되고 적분값은 2$\pi$가 될 것이다. 따라서 (5.2)의 n은 0이 아닌 정수여야 적분값이 0이 된다. 

 

결과적으로 식 (5)를 통해 sin과 cos함수는 임의의(cos은 0이 아닌 정수) 정수 주파수 상수 n에 대해 -$\pi$ ~ $\pi$ 구간, 혹은 0 ~ 2$\pi$구간에서의 적분값이 항상 0이 됨을 증명하였다. 

 

이제 식 (5)에서 증명한 사실을 이용해서 식 (4)의 서로 다른 주파수를 가진 cos함수의 직교성(orthogonality)을 확인해보자. 

 

 

식 (6.1)은 삼각함수의 덧셈공식(Angle sum identity)을 이용하여 유도한 공식이다. 고등학교때 배운 기억이 있을 것이다. 이 공식을 이용하여 식 (6.2)를 cos함수의 덧셈으로 바꾸어 각각 적분을 적용하면 (6.3), (6.4)와 같이 정리할 수 있다. (6.4)의 cos함수의 주파수 상수는 각각 n+k, n-k인데, n과 k가 임의의 정수이기 때문에 결과적으로 주파수값이 임의의 정수가 된다. 

 

 

 

 

여기서도 식이 성립하기 위한 조건이 붙는데, 바로 n과 k는 서로 다른 값이어야 한다는 것, 그리고 n과 k가 값은 같고 부호만 달라서는 안된다는 것이다. 만약 n이 k와 같다면 (6.4)의 cos(n-k)=cos(0)이 되어 2PI/2=PI가 되고, n과 k가 부호만 다르다면 cos(n+k)=cos(0)가 2PI/2=PI가 되어 적분값이 0이 되지 않는다. 다시 말하면 식 (5.2)에서 주파수 n이 0이 아닌 정수(non-zero integer)여야 한다는 조건을 의미하는 것이다. 이 조건만 만족한다면 서로 다른 주파수를 가진 두 cos함수의 곱의 적분값은 0이 된다. 아래 식은 식 (6.2)에 대해서 주파수가 같은 경우와 다른 경우에 대한 예시를 보여준다. 

 

 

식 (7.1)은 n=1, k=2로 서로 다른 주파수의 계산 결과를, 식 (7.2)는 n=2, k=2로 같은 주파수의 계산결과를 보여준다. 주파수가 서로 다른 (7.1)의 경우엔 적분 계산 결과가 0인 반면, 주파수가 같은 (7.2)의 경우엔 계산 결과가 0이 아닌 $\pi$가 나오는 것을 볼 수 있다. 

 

이처럼 n과 k가 서로 다른 값을 가질 경우엔 삼각함수의 한 주기(-$\pi$ ~ $\pi$)에 대해서 두 cos함수의 곱에 대한 적분값은 0이 된다. 그렇지 않을 경우(n과 k가 같거나, 부호만 다를 경우) 적분값은 $\pi$가 된다. 그런데 두 cos함수의 곱의 적분을 잘 생각해보면 우리가 지금까지 다뤄왔던 선형조합(Linear combination)과 매우 유사한 형태임을 알아챌 수 있다. 그 중에서도 내적(dot product)과 완전히 동일한 개념으로 생각할 수 있는데, 내적(dot product)의 함수(function)버전이라고 생각하면 된다. 아래 식을 보자. 

 

 

식 (8.1)은 서로 수직(perpendicular)인 두 벡터 a=[1, -2, 1]T와 b=[1, 1, 1]의 내적(dot product)을 나타낸다. 내적의 연산형태는 이미 많이 배웠기 때문에 익숙할 것이다. a와 b는 서로 수직이기 때문에 내적 연산의 결과값이 0이 된다. 

 

식 (8.2)는 주파수가 다른 두 cos함수의 곱에 대한 -$\pi$ ~ $\pi$구간에서의 적분을 나타낸다. 지금까지 적분이라고 하면 식 (5)나 (6)과 같이 적분 공식을 이용하여 값을 구하는 방법에 익숙할 것이다. 하지만 적분도 x의 변화량인 dx(delta x)를 유한한 구간으로 설정하면 유한개의 곱과 합으로 표현할 수 있다. 그런데 (8.2)의 연산과정을 살펴보면 (8.1)의 내적 연산과 같은 형태임을 알 수 있다. 즉 cos(x)와 cos(2x)의 내적인 것이다. 이때 cos함수의 벡터의 길이는 dx를 작게 설정할 수록 길어질 것이다. (8.2)에선 dx를 0.01로 설정했는데, 이는 -$\pi$ ~ $\pi$를 630개의 구간으로 나눈 것이다. 따라서 (8.2)는 cos(x)에 대한 1x630짜리 벡터와 cos(2x)에 대한 630x1벡터의 내적으로 생각할 수 있다. 이 두 함수의 내적은 앞서 살펴본 것과 같이 0이 되고, 결과적으로 cos(x)와 cos(2x)와 같이 주파수가 다른 두 cos함수는 직교(orthogonal)하다는 결론을 내릴 수 있다. 이 두 함수 이외에도 cos(8x)cos(19x)등 과 같이 주파수가 다른 경우에 결과값이 0이 됨을 알 수 있다. 

 

아래 그림은 cos함수의 직교성(orthogonality)을 MATLAB함수로 구현한 것이다. 주파수의 값을 바꾸어서 직접 테스트 해보면 서로 다른 주파수 값을 가지는 경우엔 0이 되어 직교성(orthogonality)을 만족하는 것을 알 수 있을 것이다.  

 

 

Fig. 2 주파수가 서로 다른 cos함수의 직교성(orthogonality) 검증을 위한 적분(integral) 구현 코드와 결과

 

 

Fig. 2는 cos함수의 직교성(orthogonality) 검증을 위한 MATLAB구현 코드이다. 구현은 두 가지 방법을 사용했는데, 첫 번째 방법은 MATLAB내부 함수인 integral()함수를 사용한 것이고, 두 번째는 이해를 돕기 위해 적분을 직접 for문을 사용하여 간단히 구현하였다. 적분 결과는 dx를 작게 할 수록 실제 값에 가까워 지는데, Fig. 2의 코드에선 -$\pi$ ~ $\pi$구간을 1000개로 분할하여 dx=0.0063정도가 된다. 내장 함수와 직접 구현한 코드 모두 0에 가까운 작은 수가 나오는 것을 볼 수 있다. 적분을 직접 구현한 두 번째 코드는 실제 적분값에서 약간의 오차가 발생하는데, 이는 적분을 구현하는 방식에서 발생하는 오차이다. 보다 자세한 사항은 구글에서 사다리꼴 규칙(Trapezoidal rule)을 검색하거나 아래의 첨부한 파일을 참고하기 바란다. 적분과 그 구현방법을 이해하는데 좋은 문서이다. 

 

Trapezoidal rule for integral.pdf
다운로드

 

 

 

 

- How to calculate Fourier Series coefficient?

 

앞서 푸리에 급수의 계수에 대한 이해를 했으니 이제 실제로 계수값을 어떻게 계산하는지 알아보도록 하자. 먼저 식 (2)를 다시 보자. 

 

 

계수 an과 bn을 구하는 방법은 식 (2)로 부터 출발하며, 앞서 배웠던 서로 다른 주파수를 가지는 cos함수의 직교성(orthogonality)을 이용하는 것이다. 그렇다면 어떻게 cos함수의 직교성을 이용하여 계수 an과 bn을 구할 수 있을까? 바로 식 (2)의 양변에 cos(kx)를 곱한 뒤, 의 구간에서 적분(integral)하는 것이다. 아래 식을 보자. 

 

 

식 (9)는 푸리에 급수 계수 $a_k$를 구하는 식을 유도하는 과정이다. (9.1)은 식 (2)에서 양변에 cos(kx)를 곱한 결과를 나타내고, (9.2)는 양변을 -$\pi$ ~ $\pi$의 구간에서 적분하는 과정을 각각 나타낸다. 그런데 (9.3)으로 넘어가면서 식이 매우 간단해 진 것을 볼 수 있다. 이는 삼각함수의 직교성에 의한 것인데, 우선 (9.2)에서 sin과 cos함수는 주파수에 상관없이 서로 직교(orthogonal)의 관계이기 때문에 두 함수의 곱에 대한 한 주기의 적분값은 언제나 0이 된다. 따라서 (9.2)의 sin(nx)cos(kx)부분은 임의의 n과 k에 대해 모두 0이 되기 때문에 식에서 생략할 수 있다. 이를 증명하는 방법은 식 (6)에서와 같이 삼각함수의 덧셈공식을 이용하여 적분을 계산해보면 알 수 있다.   

 

마찬가지로 (9.2)의 cos(nx)cos(kx)함수부분은 식 (6)에서 증명한것과 같이 서로 다른 주파수를 가진 cos함수는 직교성에 의해 적분값이 0이 된다. 다만 n=0에서 무한대까지 cos(nx)중에서 주파수 n이 cos(kx)의 주파수 k와 같은 경우, 즉 n=k인 경우에만 0이 아닌 값이 나온다. 결국 cos(kx)의 제곱이라고 볼 수 있는데, (7.2)에서와 같이 (9.3)의 적분값이 $a_k\pi$가 되고, (9.4)와 같이 $a_k$를 정의할 수 있다. 

 

그런데 cos함수의 계수인 a는 index k가 0일 때 (9.4)와는 다른 계산방식이 적용된다. k=0일 때를 가정하여 (9.4)를 다시 써보자. 

 

 

k=0일 땐 식 (10.1)과 같이 cos(0)=1이 되어 상수 1을 적분하는 꼴이 되고, (10.2)와 같이 cos함수가 사라진 형태로 정리할 수 있다. 기존의 (9.4)와 다른 점은 적분 앞의 상수가 PI에서 2PI로 바뀐 것 뿐이다. 여기서 a0를 구하는 식인 (10.2)를 잘 보면 f(x)를 에 걸쳐 적분을 해주고 이를 적분 구간과 같은 2PI로 나눠주는 것을 볼 수 있다. 이것이 의미하는 것은 결국 a0는 함수 f(x)의 평균값(average value)에 해당한다고 볼 수 있다. -$\pi$ ~ $\pi$의 구간에 걸쳐서 분포해있는 f(x)의 데이터들을 전부 더한 뒤(적분), 전체 구간 2PI로 나누어주었는데, 이 구간을 이산적으로(discrete)는 데이터 개수라고 볼 수 있다. 따라서 a0는 f(x)의 한 주기에서의 평균값(average value)으로 볼 수 있는 것이다. 

 

 

다음으로 sin함수의 계수에 해당되는 $b_k$를 구하는 방법을 알아보자. 이번에는 식 (2)의 양변에 sin함수를 곱해주고 양변을 한 주기(-$\pi$ ~ $\pi$)의 구간에서 적분을 해주면 된다. 아래의 식을 보자. 

 

 

식 (11.1)은 식 (2)의 양변에 sin함수를 곱한 모습, (11.2)는 양변을 삼각함수의 한 주기의 구간에서 적분을 하는 과정이다. (11.3)은 sin과 cos함수는 직교(orthogonal)이기 때문에 캔슬되고, sin(nx)sin(kx)와 같이 다른 주파수의 sin함수는 역시 직교의 관계이므로 0이 되어 제거되고, n=k일 때의 sin(kx)sin(kx)만 살아남은 모습이다. 이러한 과정을 거쳐 (11.4)와 같이 $b_k$를 구하는 식을 정리할 수 있다. $a_k$와 비교해보면 f(x)뒤에 곱해진 함수가 cos에서 sin으로 바뀌었을 뿐, 그 외의 것은 같다. 

 

이렇게 하여 푸리에 급수의 계수들을 구하는 방법에 대해 공부하였다. 푸리에 급수에 대한 식을 처음 정리했을 때는 식 (2)와 같은 형태였다. 하지만 a0의 경우엔 계산방식이 약간 다른 것을 배웠기 때문에 이를 고려하여 식을 다시 정리하면 아래와 같다. 

 

 

맨 처음 식 (2)에 표현했던 푸리에 급수 식에서 a0를 따로 앞으로 빼서 정리했기 때문에 (12.1)의 시그마에서 n=0이 n=1부터 시작하는 것을 볼 수 있다. 또는 함수 f가 어떤 임의의 주기 T를 가지는 함수라고 가정했을 때, (12.2)와 같이 일반적으로 표현할 수 있다. 즉 (12.2)에서 T=2PI인 경우가 (12.1)인 것이다. 또한 a0를 위한 식은 따로 있으나, b0에 대한 계산식이 따로 존재하지 않는 이유는 b0에 해당하는 값이 sin(0)=0이기 때문임을 기억하자. 이제 우리는 임의의 주기함수 f(x)를 위에서 정리한 계수 계산방법을 이용하여 sin과 cos함수의 선형결합(Linear combination)으로 표현할 수 있다. 다음 챕터에서 실제 주기 함수를 푸리에 급수를 이용하여 구현해보도록 하자. 

 

 

 

 

 

2. 푸리에 전개 및 구현(Fourier expansion and implementation)

 

- Square wave and Fourier expansion

 

Sine함수, Cosine함수 뿐만 아니라 세상에는 여러 가지 형태의 주기함수(periodic function)가 존재한다. 사각파(Square wave), 삼각파(Triangular wave), 톱니파(Sawtooth wave) 등 여러 가지 형태의 주기함수가 존재하지만, 그 중에 디지털 신호에서 가장 널리 사용되는 사각파를 푸리에 급수를 이용하여 만들어보자. 우리가 만들고자 하는 사각파의 형태는 아래 그림과 같다. 

 

 

Fig. 3 의 주기를 가지는 사각파(square wave)

 

 

Fig. 3은 사각파를 나타내며, 가로축은 시간축 t, 혹은 x로 나타내고, 세로축은 y혹은 진폭(Amplitude)의 A로 나타내기도 한다. 사각파는 2$\pi$의 주기를 가지며, -$\pi$ ~ 0의 구간에서는 -1의 진폭 값을, 0 ~ $\pi$구간에서는 1의 진폭값을 가진다. 

 

사각파를 구현하기 위해선 먼저 푸리에 급수를 이용하여 푸리에 전개(Fourier expansion)를 해야 한다. 이를 위해 사각파를 식으로 표현해보자. 

 

 

우리가 디지털 신호처리에서 많이 다뤄왔던 사각파의 정의는 (13.1)과 같다. 의 주기를 가지며, 0을 기준으로 좌측은 -1, 우측은 1의 값을 가진다. 이와 같은 패턴이 2PI를 주기로 반복되는 형태이다. 그러면서 동시에 사각파는 (13.2)를 만족시키는 기함수(odd function)이다. 기함수란 어떤 함수 f(x)에서 입력값인 x의 부호가 바뀌면 그에 대응되는 출력값 자체는 그대로이고 부호만 바뀌는 형태의 함수이며 -f(x)=f(-x)를 만족한다. 그래프상에서 보면 원점을 기준으로 대칭인 꼴이다. 대표적인 기함수로는 sin함수가 있으며 -sin(x)=sin(-x)를 만족한다. 

 

이와는 다르게 우함수(even function)인 것들도 존재하는데, f(x)=f(-x)를 만족하며, 함수 f의 입력값 x의 부호가 바뀌어도 출력값과 부호가 모두 동일한 함수를 의미한다. 그래프 상으로는 y축을 기준으로 대칭인 함수의 형태이며, 대표적인 우함수는 cos함수이고 cos(x)=cos(-x). 자세한 사항은 이곳을 참고하자. 

 

그런데 사각파가 기함수라는 것은 푸리에 급수에서 중요한 의미를 가지게 된다. 앞서 배웠듯이 푸리에 급수는 sin과 cos함수의 선형조합으로 표현할 수 있는데, 사각파는 기함수(odd function)이기 때문에 이를 표현하는데에 있어서 우함수인 cos함수는 존재할 필요가 없기 때문이다. 결국 사각파는 기함수인 sin함수와 계수 $b_k$들로만 구성이 된다. 과연 이것이 맞는지 확인하기 위해 실제로 계산을 해보자. 

 

 

식 (14.1)은 a0, (14.2)는 an의 계산식을 각각 나타낸다. a0와 an은 모두 푸리에 급수에서 cos함수에 곱해지는 계수인데, 계산 결과가 모두 0이 되는 것을 볼 수 있다. 결국 앞서 언급했듯이 사각파의 푸리에 급수에서 cos함수에 곱해지는 계수가 모두 0이 되기 때문에 cos함수는 무시할 수 있다. 식 (14.3)은 sin함수에 대한 계수 bn의 계산식을 나타낸다. an과 마찬가지로 사각파의 계수는 의 구간과 의 구간으로 나누어 계산하면 간단해진다. 

 

위의 계산식은 식 (12)에 정리한대로 계산하여 얻은 결과이다. 그런데 직접 계산을 해보지 않아도 어느 정도 예측할 수 있는 부분이 있다. 바로 기함수(odd function)와 우함수(even function)의 상관관계로 부터 유추할 수 있는 것이다. 아래는 기함수와 우함수의 연산과 적분에 관한 상관관계를 정리한 것이다. 

 



 기함수(odd function)와 우함수(even function)의 적분에 대한 상관관계 : 
  • 기함수와 우함수를 서로 곱하면 기함수가 된다. --- (15.1)
odd x even = odd
  • 기함수는 어떤 임의의 지점 L에 대하여 -L ~ L구간에서 적분하면 항상 0이 된다. --- (15.2)
  • 기함수와 기함수를 곱하면 우함수가 된다. --- (15.3)
odd x odd = even
  • 우함수는 어떤 임의의 지점 L에 대하여 -L ~ L구간에서 적분한 값은 0 ~ L구간에서 적분한 값의 2배가 된다. --- (15.4)
     
 

 

 

 

 


우선 정리 (15.1)은 식 (14.2)에 해당된다. 사각파 f(x)는 기함수(odd function)이고, cos은 우함수(even function)인데, 이 둘을 곱하면 기함수가 된다. 그런데 정리 (15.2)에서 기함수의 -L ~ L구간의 적분은 0이 된다고 하였고, 식 (14.2)의 결과 역시 0이 되었다. 종합해보면 사각파 f(x)와 cos의 곱은 기함수의 결과로 나타났으며, -L ~ L구간에서 적분한 결과가 0이 되는 것으로부터 이것이 기함수임을 확인할 수 있다.  또한 식 (14.1)은 사각파인 f(x)를 구간에서 적분한 것이 0이 된것인데, 사각파가 기함수이므로 정리 (15.2)에 의해 설명될 수 있음을 알 수 있다. 

 

식 (14.3)의 경우엔 기함수인 사각파 f(x)와 sin함수가 곱해졌다. 정리 (15.3)에 의하면 기함수와 기함수의 곱은 우함수가 되고, 정리 (15.4)에 의해 (14.3)의 의 적분이 구간에서의 적분의 2배임을 확인할 수 있다. (14.3)의 마지막 줄을 보면 앞에 2가 곱해져있는 것을 볼 수 있는데, 이것으로부터 정리 (15.4)가 성립함을 확인할 수 있다. 

 

이제 계수에 대한 식을 구했으니 사각파를 푸리에 전개(Fourier expansion)해 보도록 하자. 

 

 

식 (16.1)은 사각파에 대한 푸리에 급수식이다. cos함수의 계수인 an은 전부 0이 되기 때문에 cos함수에 대한 항은 모두 생략하였다. 식 (16.2)는 푸리에 급수를 전개한 것이다. n이 짝수일 때의 항은 전부 0이 되는 것을 볼 수 있고, 이를 정리하면 (16.3)과 같이 정리할 수 있다. n이 커짐에 따라 사각파에 점점 높은 주파수가 사각파에 섞여 사각파 형태를 이루게 된다. 

 

 

- MATLAB implementation

 

앞서 살펴봤던 사각파를 구현해보자. 아래는 사각파를 MATLAB 이용하여 구현한 모습이다.

 

 

 

Fig. 4 MATLAB을 이용하여 사각파(Square wave)를 구현한 모습

 

 

Fig. 4은 사각파(square wave)를 급수 항을 다르게 하여 그래프로 표현한 것을 나타낸다. 좌측 상단부터 우측 하단방향으로 급수 항을 늘려가며 그래프를 그린것이다. [1]번 그래프는 n=2까지 플롯한 모습인데, 그래프의 형태는 그냥 sin파와 동일해보인다. 이는 식 (16)에서와 같이 짝수 항은 0이 되어 사각파 형성에 아무런 영향을 끼치지 않기 때문이다. [2]번 그래프는 n=3까지 더한 모습인데, [1]번 그래프에 비해서 사각파 형태에 근접한 모습을 보인다. [3]번 그래프는 n=5까지, 마지막 [4]번 그래프는 n=10,000까지 더한 모습인데, 거의 완벽에 가까운 사각파의 모습을 보인다. n에 대한 항을 늘려나갈수록 고주파수의 sin파가 더해져서 우리가 원하는 모습의 파형을 만들어낼 수 있는 것이다. 

 

아래 그림은 사각파를 푸리에 급수(Fourier series)를 이용하여 구현한 MATLAB 코드이다. for문의 n을 비롯하여 각종 파라미터를 변경하여 테스트 해보도록 하자. 

 

 

 

 

3. 마치며(continue)

 

이번 강의에선 푸리에 급수와 직교성의 관계에 대해 공부했다. 푸리에 급수를 이용하여 복잡한 주기신호를 sin과 cos함수의 조합으로 표현할 수 있고, 그 핵심엔 sin과 cos의 직교성(orthogonality)이 있음을 배웠다. 또한 이 직교성은 선형대수에서 두 개의 서로 수직인 벡터의 내적으로 설명할 수 있음을 알아두자. 

다음 강의에선 이 직교성에 대해서 선형대수와 연결지어 추가적인 설명을 하도록 하고, 푸리에 급수의 sin과 cos 텀을 한 번에 처리할 수 있는 오일러 공식에 대해 배워보도록 하자. 

 

+ Recent posts