지난 시간까진 연속시간(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)

 

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

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

 

+ Recent posts