[프로그램] FFT 알고리즘

 FFT 알고리즘

FFT 알고리즘

FFT 알고리즘

 FFT를 설명하기 위하여,
 1) 푸리에 급수와 변환에 관한 공식들을 정리하고,
 2) 이산 시간 푸리에 변환에 관하여 설명하고,
 3) 고속 푸리에 변환에 관하여 설명하고자 한다.

 참고사이트 :


| 푸리에 급수

 주기 함수 f(t)는 주기가 T 일 때, 다음과 같은 삼각급수로 표현될 수 있다.


 n이 증가함에 따라, 푸리에급수는 본 함수 f(x)에 가까워진다.
 이해를 돕기 위해 다음 주기함수를 푸리에급수로 표현한 예를 살펴보자.

 본래의 함수를 -180부터 180까지 그려보면 다음과 같다.


 이것의 푸리에급수의 계수는 암산해보면 다음과 같다.


 즉, 푸리에급수는 다음과 같은 함수가 계속적으로 더해져서 만들어진다.


 만약 이러한 주기 신호가 1초 걸렸다면,
 n=1 에 더해지는 함수는 1 Hz를 나타내고,
 n=3 에 더해지는 함수는 3 Hz를 나타낸다.


| 복소 푸리에급수

푸리에급수는 오일러(Euler) 공식에 의해 지수함수 형태로 표현될 수 있다.




| 푸리에 변환





| 이산 푸리에 변환 (Descrete Fourier tranform : DFT)

 함수 f(x)를 주기가 1인 주기함수라고 하고,
 일정하게 등간격으로 0 부터 N-1까지의 구간에서 f(x)값을 N개 측정(추출)했다고 하자.


 잘못된 신호(aliasing)를 피하기 위해서는 n 은 N/2보다 훨씬 작은 값을 사용해야 한다.



| 고속 푸리에 변환 (Fast Fourier Transform:FFT)

 FFT 소스:

  1. struct complex
  2. {
  3. double r,i;
  4. };
  5. int FFT(complex f[], int N)
  6. {
  7. int i,j,k,it,xp,xp2,j1,j2,r;
  8. double w,wr,wi,dr1,dr2,di1,di2,tr,ti,arg;
  9. /* 데이터 수는 2 이상 */
  10. if(N < 2) return -1;
  11.  
  12. r = log((double)N)/log(2.0); /* n=2^r */
  13. /* N이 2의 제곱수인가 검사 */
  14. j = 1;
  15. for(i=0; i < r; i++) j *= 2;
  16. if(fabs(n-j) > 1.0E-6) return -2;
  17. /* FFT */
  18. xp2 = N;
  19. for(it=0; it < r; it++)
  20. {
  21. xp = xp2;
  22. xp2 /= 2; /* 절반 */
  23. w = PI / xp2;
  24. for(k=0; k < xp2; k++)
  25. {
  26. arg = k * w;
  27. wr = cos(arg);
  28. wi = -sin(arg);
  29. i = k - xp;
  30. for(j=xp; j <= N; j+=xp)
  31. {
  32. j1 = j + i; /* j1 = k,...,N-k+xp */
  33. j2 = j1 + xp2; /* j1에서 xp2만틈 떨어진 */
  34. dr1 = f[j1].r;
  35. dr2 = f[j2].r;
  36. di1 = f[j1].i;
  37. di2 = f[j2].i;
  38. tr = dr1 - dr2;
  39. ti = di1 - di2;
  40. f[j1].r = dr1 + dr2;
  41. f[j1].i = di1 + di2; /* (a+bi)(c+di) = (ac-bd)+(bc+ad)i */
  42. f[j2].r = tr*wr - ti*wi; /* (ac-bd) */
  43. f[j2].i = ti*wr + tr*wi; /* (bc+ad) */
  44. }
  45. }
  46. }
  47. return 0;
  48. }



댓글

이 블로그의 인기 게시물

[컴퓨터] Office 무료 설치

[컴퓨터] iptime 관리자계정 찾기 및 설정

[주식] 레버리지 ETF/ETN 사전교육 이수방법 및 등록