본문 바로가기

푸리에 변환, 신호

(38)
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{..
02. 엑셀로 WAV 파일 읽기 이번 글에서는 엑셀에서 WAV 파일을 읽어서, 해당 WAV 파일의 헤더 정보를 보여주고, 실제 소리 데이터를 엑셀 데이터로 만들어주는 프로그램을 짜 볼 것이다. 소리 신호에 대한 분석을 할 때 WAV 파일 정보를 보고자 할 때, 혹은 소리 데이터를 가지고 엑셀에서 가공하고 분석하고자 할 때 유용할 것으로 생각한다. 수행 방법 1. "WAV File Reader.xlsm" 파일을 열고, "Select WAV File" 버튼 클릭 2. 읽을 WAV 파일 선택 3. 새로운 엑셀 문서가 생성되고 WAV 파일 읽을 결과가 표출 됨. 데이터가 너무 커서 한 프레임에 표시 못하는 경우, 여러개의 프레임으로 표출한다. 한 개 프레임의 Row 크기는 100만개 엑셀 파일 (WAV File Reader.xlsm): -끝-
01. WAV 파일 구조 컴퓨터에서 소리를 담는 가장 기본적인 파일 구조가 WAV 파일 구조이다. 1999년 경부터 Microsoft와 IBM에 의해 파일 구조가 정의되어 사용되었고, PCM 방식으로 인코딩 된 디지털 신호를 압축되지 않은 형태로 가지고 있다. WAV 파일 자체는 압축도 지원한다고 하는데, 내가 본 적은 없다. 일반적으로 WAV 파일은 압축하지 않은 날것 그대로의 PCM 데이터 덩어리로, 해서, 파일 사이즈가 매우 크다. WAV 파일의 상세구조는 여기에 잘 정리되어 있다. 간략하게 핵심만을 테이블로 정리하면 아래와 같다. Offset Length Field Name Contents Endian Example 0 4 Chunk ID "RIFF"=0x52494646 Big 52 49 46 46 4 4 Chunk Si..
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}$..