본문 바로가기

분류 전체보기

(272)
07-6. Java로 FFT 알고리즘 충실히 구현하기 이번 페이지에서는 FFT 알고리즘을 Java 언어의 특성을 충실히 살리면서, 읽을 수 있는 수준의 알고리즘 구현을 해보고자 한다. Java 언어의 특성을 살린다는 의미는, 복소수의 표현을 Complex라는 객체를 만들어서 사용함으로써 표현의 간단함과 확장성을 늘리고, 에러 처리를 Exception을 사용해서 하고, 메서드 오버로딩을 통해서 fft의 다양한 호출이 가능하게 한다는 의미. 읽을 수 있는 수준의 알고리즘이라는 것은, FFT의 구현을 각 의미있는 부분에 대해 별도의 메서드를 만들어서 구분되게 하고, 가능한 알고리즘에서 표현된 방법으로 코딩을 했다는 의미이다. 그러나, 위와 같이만 하면 속도에 손해를 보기에, 수행 속도에 지대한 영향을 끼치는 부분은 코드 가독성이 좀 떨어지더라도, 효율적인 코드로..
[07-5 Code] Fastest FFT code for Java This page introduce very fast FFT code for Java. It will execute FFT calculation for 64 kBytes input data in 10ms. Execution result of Test_FFFT class ** test_simple_fft ** 8.0, 0, -2.0+4.82842712474619i, 0, 0, 0, -2.0+0.8284271247461898i, 0, 0, 0, -1.9999999999999998-0.8284271247461898i, 0, 0, 0, -1.9999999999999993-4.82842712474619i, 0, ** test_measure_time ** Execution Time(32kB): 5ms [0]17.4..
07-5. 가장 빠른 Java용 FFT 구현해보기 이 페이지는 Java로 구현하는 FFT, 그것도 수행 속도를 빠르게 하는 것에 목적을 둔 프로그래밍 코드를 소개한다. 전체 소스코드는 여기 참조 앞 페이지에서 엑셀로 만드는 FFT의 경우는, 속도는 느리지만 엑셀 자체에서 데이터를 다루거나 분석을 하고, 그래프를 그리고 등 부가적인 기능으로 해서, 필요성이 있어 FFT 프로그램을 만들어서 소개했다. Java로는 만들 생각을 안했었다. FFT가 주로 쓰이는 것이, 연구 목적으로 신호를 분석하거나(그래서 엑셀에서의 FFT가 유용), 실시간으로 신호를 FFT 변환을 해야 하는 것이기에, C나 C++을 이용해서 코드 수행을 빠르게 하는 게 중요하지, Java 같은 Virtual Machine 기반의 언어로는 유용성이 떨어질 것이기 때문이다. 그런데, 안드로이드에..
[07-4 Code] Fastest FFT code for Excel VBA This page explain FFT program made for Excel VBA. It is no limit of input data size, therefore you can calculate over 4096 size data and it will perform very fast. FFT Execution time in the Excel by self-made FFT program Computer Specification: 11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz Input data count FFT execution time [ms] 4 kBytes(4096) 62 8 kBytes 115 16 kBytes 235 64 kBytes 984 I thin..
07-4. 엑셀에서 직접 FFT 프로그램 만들기 이 페이지에서는 엑셀 VBA를 이용해서 FFT 프로그래밍을 하는 것을 설명할 것이다. 사실 엑셀에서 FFT 프로그래밍을 직접 한 것은 구글링을 해봐도 별로 없다. 없다는 것은 다 그 이유가 있는데, 가장 큰 이유는 굳이 따로 프로그래밍할 필요가 없다일 것 같다. 속도도 느린 엑셀 VBA를 이용해서 굳이 FFT를 해야 할 일도 없겠고, 또한 엑셀 자체로 FFT 함수가 있으니깐. 그렇지만, 내게는 다음과 같은 작성 이유가 있다. 신호 데이터를 분석하거나 할 때 엑셀만큼 좋은 툴이 없다. 해서, FFT도 엑셀에서 바로 수행하고, 그 결과 데이터를 엑셀에서 분석하면서 인사이트를 얻고 하면 좋겠다. 근데, 엑셀에 있는 FFT 함수는 4096개 데이터가 한계다. 그 이상의 데이터는 처리할 수 없다. 4096으로는 ..
07-3. 엑셀에서 FFT 계산하기 (엑셀 자체 FFT 기능) 엑셀에는 FFT 계산을 할 수 있는 기능이 있다. 디폴트 기능으로 오픈되어 있는 것은 아니고, 사용할 수 있도록 몇 가지 설정을 하면 FFT 계산을 할 수 있다. 엑셀에서 FFT 기능 활성화 하기 1. 엑셀 메뉴에서 "파일 - 옵션" 선택하고, "추가 기능"에서 "관리" 부분에서 'Excel 추가 기능'에 대해 "이동" 클릭 2. "추가 기능"에서 "분석 도구 - VBA"를 체크하고 "확인" 버튼 누른다. 이제 엑셀에서 FFT 함수를 사용할 수 있다. 엑셀에서 FFT 기능 사용해서 값 구하기 $y(n)={0,0,0,0,1,1,1,1}$에 대해 FFT를 수행해서 푸리에 변환값 $Y(k)$를 구해보자. 1. $y(n)$값을 아래와 같이 엑셀에 입력한다. 2. 엑셀 메뉴에서 "데이터" 선태하고, 우측 상단에 ..
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개일 때의 계산이 간단해야 한다. 분할 정복 알고리즘을 적용할 수 ..