FFT (Fast Fourier transform)는 이산 푸리에 변환(Discrete Fourier transform, DFT) 를 빠르게 하기 위한 알고리즘으로 요즘 세상에 알게 모르게 굉장히 많이 사용되고 있습니다.
그 응용이라고 하면 너무나 광범위 하죠~
우리가 거의 매일 사용하는 MP3 음악 파일은 DCT(discrete cosine transform) 를 이용한 손실 압축 방식인데 여기도 FFT 가 응용되고~ 요즘 한창 많이들 사용하고 있는 통신 방식인 LTE(Long Term Evolution)나 Wibro 등은 Orthogonal frequency-division multiplexing (OFDM)이라는 기술을 근간으로 하는데~ 이 OFDM 이라는 기술도 FFT 를 통해 구현 됩니다. WIFI 는 말 할 것도 없고 스펙트럼 분석에도 FFT 가 사용되죠~
http://ko.wikipedia.org/wiki/%EA%B3%A0%EC%86%8D_%ED%91%B8%EB%A6%AC%EC%97%90_%EB%B3%80%ED%99%98
FFT 는 요즘 그 쓰임이 많은 만큼 여러 언어에서 함수로 제공해 주는 경우가 많은데요~
그러한 툴들의 많은 경우가 오늘 소개해 드리는 FFTW 라는 라이브러리를 사용하곤 합니다.
FFTW 의 홈페이지는 다음과 같습니다.
FFTW 라는 명칭은 "Fastest Fourier Transform in the West" 라고 하네요~ 서부에서 가장 빠른 푸리에 트랜스폼이란건데..
속도에 대한 자부심이 느껴지네요.
FFTW 는 MIT 의 Matteo Frigo 와 Steven G. Johnson 라는 분이 만들었습니다.
소개를 보면 ~ one-dimensional 뿐만이 아니라 multi-dimensional transforms도 지원을 하고 임의의 크기에 대한 DFT 도 지원을 하는군요.
음성이나 이미지 쪽에서 많이 쓰이는 DCT 나 DST 등도 할 수 있고~ GNU GPL 라이센스의 Free 소프트웨어라고 설명되어 있네요.
Non-free licenses 는 MIT 를 통해 살 수 있다고 합니다.
FFTW 는 MATLAB 에도 들어있더군요. 물론 Mathworks 에서 Non-free licenses 로 구매한 거겠죠.
이전 포스팅에 소개했던 FreeMat 이란 프로그램에도 FFTW 를 사용했다고 하더군요.
2012/08/20 - [유틸] - MATLAB 과 유사한 Open Source 프로그램 FreeMat
아!! 뭔지 모르겠지만 상도 받았군요. 1999 J. H. Wilkinson Prize for Numerical Software 라는 상을 받았다고 하는데~ 상 받을 만 하니깐 받았겠죠~
저자들이 쓴 논문("A Fast Fourier Transform Compiler" (in PLDI 1999)) 도 2009년에 The Most Influential PLDI Paper award 라는 상을 받았군요.
소개는 대충 여기까지 하고 이제부터 Codeblock 을 이용해서 간단하게 사용해 보죠.
다운로드는 링크는 다음과 같습니다.
http://www.fftw.org/download.html
윈도우용 DLL 파일은 아래 주소에서 받을 수 있구요.
http://www.fftw.org/install/windows.html
32비트 64비트 버전이 있으니 각자 자신의 OS 에 맞게 다운로드 받으시기 바랍니다.
저는 윈도우 7, 32 비트라 fftw-3.3.2-dll32.zip 파일을 다운로드 받았습니다. 압축을 풀면 필요한 fftw3.h과 .dll 파일이 들어있습니다.
이제 Codeblock 에서 Console application 으로 프로젝트를 하나 생성하고~
fftw3.h 파일은 CodeBlocks 이 설치된 하위 폴더인 include 폴더에 넣어 줍니다. 저의 경우는 아래 경로에 넣었습니다. 각자 설치 경로에 맞게 넣어 주세요~
C:\Program Files\CodeBlocks\MinGW\include
그리고 libfftw3l-3.dll, libfftw3f-3.dll, libfftw3-3.dll 파일들은 위에서 생성한 project 폴더에 소스와 같이 넣었습니다.
예제는 다음과 같이 간단하게 1024 크기로 FFT 하는 예제 입니다.
한번 따라 해 보실~ 분들을 위해 파일로 첨부합니다.
#include <iostream>
#include <fftw3.h>
using namespace std;
int main()
{
fftw_complex *in, *out;
fftw_plan p;
int N=1024; // FFT size
in = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N); // input buffer
out = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N); // output buffer
p = fftw_plan_dft_1d(N, in, out, FFTW_FORWARD, FFTW_ESTIMATE); // FFT 준비
for (int n=0; n< N ; n++) // complex data sample 생성
{
in[n][0]=n; // real
in[n][1]=n; // imag
}
fftw_execute(p); // FFT 수행
cout << fixed;
cout.precision(10);
for (int n=0; n< N ; n++) // 결과 확인
{
cout << n << " real : " <<out[n][0] << " imag : " <<out[n][1] << endl ;
}
fftw_destroy_plan(p);
fftw_free(in); fftw_free(out);
return 0;
}
마지막으로 Codeblock 에서 아래 그림처럼 Settings >> Compiler and … 에 들어갑니다.
이제 아래 그림처럼 위에서 해당 폴더에 추가 했던 dll 파일들의 path 를 잡아줍니다.
이제 설정은 다 끝났습니다. F9 를 눌러서 실행해보면 다음과 같이 FFTW 라이브러리를 이용한 FFT 가 정상적으로 동작하는 것을 확인 할 수 있습니다. 요렇게요~
제대로 된 건가 해서 같은 입력 값에 대해 MATLAB으로 FFT 해서 비교해 보니 똑같이 나오더군요.
제가 한 예제는 아래 주소의 FFTW 의 매뉴얼에 있는 튜토리얼을 보고 따라 한 건데요~
http://www.fftw.org/fftw3_doc/
내용이 방대하니 필요한 부분만 쏙쏙~~ 골라서 보시기 바랍니다.
'컴퓨터일반' 카테고리의 다른 글
C/C++ 매개변수를 갖는 매크로, #, ## 연산자 (288) | 2012.10.29 |
---|---|
Mingw Makefile 을 사용한 빌드 (0) | 2012.10.28 |
KMPlayer 깔 때 짜증나는 것들... (0) | 2012.10.21 |
간단하게 동영상 codec 정보 알아보기 (0) | 2012.10.14 |
C++11 많이 좋아졌네요. (0) | 2012.08.26 |
deque 이용 Memory shift 실험 (2) | 2012.08.15 |
자바 환경변수 설정 (0) | 2012.08.11 |
C/C++ memmove() 함수 속도 실험 (4) | 2012.08.06 |
댓글