본문 바로가기

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

(36)
07-2. FFT 예제를 손으로 풀어보며 이해하기 $y(n)={0,0,0,0,1,1,1,1}$인 값에 대해 FFT 수식을 이용해서 단계별로 손으로 문제를 풀듯이 계산해보자. 먼저 이 값을 DFT 수식을 이용해서 엑셀에서 구해보면 다음과 같다. $$ DFT: \; \; Y(k)=\sum_{n=0}^{N-1}{y(n)e^{-i\frac{2\pi}{N}kn}}, \; \; 0\leq k < N \tag {1} $$ $$ IDFT: \; \; y(n) = \frac{1}{N} \sum_{k=0}^{N-1}Y(k) e^{i\frac{2\pi}{N}kn}, \; \; 0 \le n < N \tag{2} $$ FFT를 이용해서 구해보자. FFT의 수식은, $$ \begin{align}Y(k) = P(k) + W^kQ(k), \; &0 \le k \le {\frac{..
07-1. FFT 유도 이 페이지에서는 DFT를 고속 계산하게 해 주는 쿨리-튜키 알고리즘을 소개한다. 쿨리-튜키 알고리즘은 분할정복(Divide and Conquer)기반 알고리즘이다. 분할정복은 $O(N^2)$의 계산량을 $O(N\log{N})$으로 만들어주는 대표적인 알고리즘 유형이다. N개의 데이터를 $\frac{N}{2}$개씩의 데이터로 나누면서 계산해서 계산량을 줄이면서도, 원래의 결괏값이 나오도록 하는 알고리즘인데, 꽤 이해하기 힘든 알고리즘이다. 분할 정복 알고리즘 분할정복 알고리즘이 성립하려면, N개의 데이터를 $\frac{N}{2}$씩 2개로 나눠서 계산한 후 상수 시간 안에 합쳐서, 원래 N개일 때의 계산과 동일해야 한다. 또한, 데이터가 2개일 때의 계산이 간단해야 한다. 분할 정복 알고리즘을 적용할 수 ..
07. FFT (Fast Fourier Transform, 고속 푸리에 변환) 앞에서 살펴봤던 DFT의 수식을 그대로 이용해서, 실제 신호에 대한 푸리에 변환을 하기에는 무리가 있다. 계산량이 너무 많기 때문이다. $$ DFT: \; \; Y(k)=\sum_{n=0}^{N-1}{y(n)e^{-i\frac{2\pi}{N}kn}}, \; \; 0\leq k < N \tag {1} $$ 식(1)의 DFT 수식에 따르면 실수와 복소수와의 곱 연산을 $N^2$회 수행하고, 덧셈 연산은 N(N-1)회 이루어진다. $N=4096$ 으로 하면, 신호 한 블록에 대해 16,777,216번의 연산이 필요하고, 이러한 연산을 1초 안에 수행하기에는 고속의 CPU를 사용해도 무리가 따른다. (펜티엄 2.2 GHz의 경우, 일반 실수에 대한 곱 연산을 초당 $8 \times 10^7$개 정도 수행할 수 ..
06-7. 엑셀을 이용한 DFT 계산(4/4) [예제 4] N값을 크게 해서 주파수 분해능을 높이기 두 개의 코사인 파가 합쳐진 신호를 가지고 분석해 볼 것이다. 신호 수식: 1 kHz와 1.1kHz의 정현파가 합쳐진 신호 --> $\cos{2\pi \cdot 1000t} + \cos{2\pi \cdot 1100t}$ 샘플링 주파수($f_s$): 8kHz y(n)에 대한 수식: =ROUND(COS(2*PI()*(1/8)*B14)+COS(2*PI()*(11/80)*B14),2) 주파수 샘플링에 대한 주기 N=32로 해서 계산해보자. W(n,k)를 구하기 위해 셀 "E14"에 수식을 적고, 자동채우기로 나머지 셀에 대해서도 값을 구한다. 셀 "E14"의 수식: =ROUND(COS(2*PI()*(1/8)*B14)+COS(2*PI()*(11/80)*B14)..
06-6. 엑셀을 이용한 DFT 계산(3/4) 예제 3. 주파수 1 kHz 파형에 대한 DFT 계산 예제3에 대한 엑셀 자료는, 엑셀파일 "DFT예제_3.xlsm"의 Sheet "3" 참조. 엑셀파일은 이 페이지 제일 밑에 보면 있음 앞의 예제에서는 코사인 파형 1개 주기에 대한 계산을 위해, 좀 비현실적인 주파수 및 샘플링 주파수를 사용했다. (주파수가 1/64인 파형을 가정했는데, 사람의 목소리가 4kHz 정도되기에, $\frac{1}{64}Hz$는 엄청나게 낮은 주파수이다. ) 이번에는 주파수가 1KHz이고, 샘플링을 8KHz로해서 신호를 생성하고, 이 신호에 대해서 주기 N=32 및 64로 변환하면서 DFT를 해보겠다. 이렇게 하면 N 값의 의미를 보다 확실하게 파악할 수 있을것이다. (N의 값을 32라던가 64, 128, 256 처럼 2의 ..
06-5. 엑셀을 이용한 DFT 계산(2/4) 이번 페이지에서는 정현파에 대한 신호값을 생성하고, 이 신호값에 대한 DFT를 엑셀을 이용해서 수작업으로 계산해볼 것이다. (수작업이라고 표현한 이유는, 엑셀에 내장되어 있는 FFT함수를 써서 계산하지 않고, DFT의 수식을 있는 그대로 사용해서 하나씩 계산해본다는 의미) 엑셀 자체의 기능보다는, 신호값에 대해서 어떻게 DFT 수식이 적용되는지에 집중해서 보면 되겠다. 기본적인 방법은 앞 페이지에서 4개의 값에 대한 DFT 구하는 것과 동일. [예제 2] 단순 정현파에 대한 DFT 계산 이 예제에 대한 엑셀은, 이 페이지 하단부에 첨부된 "DFT예제_2.xlsm"의 Sheet "2"에서 확인할 수 있음 가장 단순한 정현파 신호를 만들자. 하나의 코사인 파형이면, 가장 단순하다고 할 수 있겠다. 코사인 파..
06-4. 엑셀을 이용한 DFT 계산(1/4) 어떤 신호값에 대해 실제로 DFT 및 IDFT 계산을 해보면 수식의 의미를 더 깊게 이해할 수 있다. 앞 페이지에서 아주 간단한 형태의 가상 신호값을 이용해서 DFT 계산을 해봤는데, 이렇게 간단한 값의 경우에도 손으로 계산하기는 쉽지 않고, 실제에 가까운 신호값에 대해서는 손으로 DFT 계산을 하는 것은 불가능하다. 해서, 이번 챕터에서는 DFT를 엑셀을 이용해서 계산하는 것을 해보겠다. 엑셀로도, 실제 신호에 대한 DFT 변환값을 계산해내는 것이 좀 버겁다. 이유는, 사용되는 데이터가 복소수 형태인데다가, 데이터 개수가 N의 경우 $O(N^2)$의 계산 복잡도가 발생하기 때문이다. 해서, DFT의 계산량을 줄인 FFT 알고리즘이 나오게되었고, 이 FFT는 이후 챕터에서 다룰 것이다. 여기에서 사용한 ..
06-3. DFT의 수식 이해 앞 페이지까지 DFT의 수식이 어떻게 유도되는지 알아봤고, 그 수식은 다음과 같다. $$ DFT: \; \; Y(k)=\sum_{n=0}^{N-1}{y(n)e^{-i\frac{2\pi}{N}kn}}, \; \; 0\leq k < N \tag {1} $$ $$ IDFT: \; \; y(n) = \frac{1}{N} \sum_{k=0}^{N-1}Y(k) e^{i\frac{2\pi}{N}kn}, \; \; 0 \le n < N \tag{2} $$ 식 (1)은 시간에 대한 신호값 $y(n)$이 있을 때, 이를 주파수에 대한 수식으로 바꿔주는 것이고, 식 (2)는 반대로 주파수에 대한 신호값 $Y(k)$에 대해 시간에 대한 수식으로 바꿔주는 것이다. 예를 들어, 주기 $N=4$이고 $y[n]={1,3,-1,2}$..
06-2. 이산 푸리에 변환(DFT, Discrete Fourier Transform) 앞 페이지에서 이산 시간 푸리에 변환(DTFT)까지 유도했고, 이제 주파수까지 이산인 이산 푸리에 변환(DFT)을 유도해본다. 시간을 '이산'으로 만드는 것은, 어떤 아날로그 신호에 대해서 연속된 시간으로 값을 측정할 수 없는 현실적인 이유 때문이었다. 현실에서는, 아무리 시간을 잘게 쪼게도 연속된 시간에 대한 값을 잴 수도 저장할 수도 없다. 주파수에 대해서도 마찬가지로, 연속된 주파수 값을 가지는 것을 현실에서 측정하거나 저장할 수 없다. (컴퓨터 등에서 디지털 적으로 처리할 수 없다는 말이다.) 따라서, 주파수에 대해서도 연속된 것이 아닌, 간격이 존재하는 이산 주파수의 형태로 다뤄줘야 한다. 위 그림은 주파수 사이를 $\frac {1}{6}$ 간격으로 샘플링하는 것을 보여준다. 이렇게 샘플링하게 ..
06-1. 이산시간 푸리에 변환(DTFT, Discrete Time Fourier Transform) 시간은 드문드문한 '이산시간'으로, 주파수는 연속으로 가정해서 푸리에 변환하는 것이다. 앞에 챕터 5까지는 연속시간 및 연속주파수를 기준으로 해서 푸리에 변환을 했고, 이것이 푸리에 변환이 모든 것이다. 그런데, 실제 컴퓨터를 이용해서 푸리에 트랜스폼을 하려고 할 때는, 시간이 이산이고 주파수도 이산으로 처리해야만 계산이 가능하다. 신호 자체는 연속 시간대에 신호 값이 존재한다고 할지라도, 어차피 컴퓨터에서는 유한한 시간으로 잘라서(예를 들어 1ms 단위로) 신호 값을 저장하고 처리할 수밖에 없고, 주파수의 단위도 연속된 주파수가 아닌 어떤 간격을 가지는 이산 주파수 단위를 사용할 수밖에 없기 때문이다. 따라서, 이러한 이유로 이산 시간 및 이산 주파수일 때 푸리에 변환이 어떻게 이루어지는지를 알아야한다..