fft(고속 푸리에 변환) 소스인데요...이해가 잘 안갑니다...ㅜ.
글쓴이: leo~~~~ / 작성시간: 목, 2005/10/06 - 6:31오후
=======dft.h============
typedef struct { double real, imag; } COMPLEX; #define PI 3.141592 void fft(COMPLEX *,int); void ifft(COMPLEX *,int); void dft(COMPLEX *,COMPLEX *,int); void idft(COMPLEX *,COMPLEX *,int); void rfft(double *,COMPLEX *,int); void ham(COMPLEX *,int); void han(COMPLEX *,int); void triang(COMPLEX *,int); void black(COMPLEX *,int); void harris(COMPLEX *,int); int log2(unsigned int);
=========dft.c==========
#include <math.h> #include <stdlib.h> #include <stdio.h> #include "dft.h" void fft(COMPLEX *x, int m) { static COMPLEX *w; static int mstore = 0; static int n = 1; COMPLEX u,temp,tm; COMPLEX *xi,*xip,*xj,*wptr; int i,j,k,l,le,windex; double arg,w_real,w_imag,wrecur_real,wrecur_imag,wtemp_real; if(m != mstore) { if(mstore != 0) free(w); mstore = m; if(m == 0) return; n = 1 << m; le = n/2; w = (COMPLEX *) calloc(le-1,sizeof(COMPLEX)); if(!w) { printf("\nUnable to allocate complex W array\n"); exit(1); } arg = PI/le; wrecur_real = w_real = cos(arg); wrecur_imag = w_imag = -sin(arg); xj = w; for (j = 1 ; j < le ; j++) { xj->real = (double)wrecur_real; xj->imag = (double)wrecur_imag; xj++; wtemp_real = wrecur_real*w_real - wrecur_imag*w_imag; wrecur_imag = wrecur_real*w_imag + wrecur_imag*w_real; wrecur_real = wtemp_real; } } le = n; windex = 1; for (l = 0 ; l < m ; l++) { le = le/2; for(i = 0 ; i < n ; i = i + 2*le) { xi = x + i; xip = xi + le; temp.real = xi->real + xip->real; temp.imag = xi->imag + xip->imag; xip->real = xi->real - xip->real; xip->imag = xi->imag - xip->imag; *xi = temp; } wptr = w + windex - 1; for (j = 1 ; j < le ; j++) { u = *wptr; for (i = j ; i < n ; i = i + 2*le) { xi = x + i; xip = xi + le; temp.real = xi->real + xip->real; temp.imag = xi->imag + xip->imag; tm.real = xi->real - xip->real; tm.imag = xi->imag - xip->imag; xip->real = tm.real*u.real - tm.imag*u.imag; xip->imag = tm.real*u.imag + tm.imag*u.real; *xi = temp; } wptr = wptr + windex; } windex = 2*windex; } j = 0; for (i = 1 ; i < (n-1) ; i++) { k = n/2; while(k <= j) { j = j - k; k = k/2; } j = j + k; if (i < j) { xi = x + i; xj = x + j; temp = *xj; *xj = *xi; *xi = temp; } } } main(){ int i; COMPLEX com[1]; fft(com,1); for(i=0;i<sizeof(com);i++) printf("%f\n",com[i].real); }
이거 인데요.....
main() 함수는 제가 임의로 만든거구요....
도저히 이해가 안갑니다....
main()함수를 저렇게 하니까
16개의 데이터가 계산되어서 나오는데요...
무슨값이 계산되어서 나오는지 모르겠어요...
메인에서 입력해준것도 없는데요.....
이거하나로 벌써 며칠째인지....ㅜ.ㅜ
주석 좀 부탁드려요.....
Forums:
신호처리하시나요?결과가 나온다는 것은 com이라는 인스턴스에 먼저
신호처리하시나요?
결과가 나온다는 것은 com이라는 인스턴스에 먼저 들어가 있던 쓰레기값에 의한 것입니다.
사용하기전에 값을 주셔야지 됩니다.
com[0].real = ?
com[0].imag = ?
greedy 알고리즘
그냥 공부하고 만드세요.몇일째 이런소스로 헤딩하고 있다면.걍 알고
그냥 공부하고 만드세요.
몇일째 이런소스로 헤딩하고 있다면.
걍 알고리즘 좀 이해하고, 바로 만드는게 더 빠를겁니다.
16개의 값이 나오는 이유는 메인함수에서for(i=0;i<siz
16개의 값이 나오는 이유는 메인함수에서
for(i=0;i<sizeof(com);i++) //com의 사이즈만큼 i를 증가시킴
때문입니다.
구조체 COMPLEX는 double형 변수 두개가 들어가있는 자료이므로
8 * 2 = 16이 나옵니다. 그래서 for문에 감쌓여진 행동을 16번 수행하게 되는것이구요.
그 값은 역시 메인부의 fft(com,1); 라인때문입니다.
이 com이라는 구조체변수와 1이라는 정수가 fft 함수의 인자로 들어가
fft의 코드를 수행하고 나온 값이 com에 들어가겠지요.
주석을 달려고 했으나 질문의 내용에 16개 의 값이 출력되는 이유와,
그 결과값이 어째서 그렇게 나오는지 모르는 거라고 받아들여져서
일단 기본적으로 그런 결과가 출력되는 것에 대한 설명만 해드린것이란 겁니다.
구지 주석이 필요하진 않다고 보며, 주석이 꼭 필요한 이유를 이해 못하겠다는 것도 되겠지요..
예를들어 그냥 공부중에 보는 코드인데 이해가 안간다라는 건지,
아니면 갑자기 필요한 코드였는데 이해가 안간다는건지 몰라서말이지요..
가볍게 말하자면 주석달아주긴 귀찮은데, 질문내용을 보니까 아직
C언어에 대한 이해가 부족해서 일어나는 것같아서 그냥 씨언어를
따로 한단계 낮은거에서 부터 공부하셔야 될것같다는 제 의견이였답니다.
내 마음속의 악마가 자꾸만 나를 부추겨.
늘 해왔던 것에 만족하지 말고 뭔가 불가능해 보이는 것을 하라고 말야.
답변주신분들 감사합니다따끔한 충고도 감사하구요...^^제가 포인터
답변주신분들 감사합니다
따끔한 충고도 감사하구요...^^
제가 포인터랑 구조체를 잘 몰라서요....ㅜ.ㅜ
암튼 답변 주셔서 감사합니다~
신호처리 맞구요..다른건 다했구요...저게 마지막 단계인데....
신호처리 맞구요..다른건 다했구요...
저게 마지막 단계인데....
저기서 완전 막혀버려서요....ㅡ,.ㅡ;;
댓글 달기