지금 영상처리 fft소스 분석중인데요 2차원 fft에서 일차원 fft함수를 호출하는데 이해가 되질 않네요..
2차원 fft함수내부는 그래도 어느정도 알것는데...
아래보시는 소스가 일차원fft함수 인데요
이거 분석??아니 어느정도라도좀 가르처 주세요..이해가 되질 않네요..
밑에 소스에서 complex 로 선언된것은 실수부와 허수부를 가진 구조체로 만들어 놓은 변수이구요
topow함수는 지수승을 반환하는 함수입니다
cpx_complx함수는 실수값 및 허수값으로부터 복소수 값을 생성해서 린턴하는 함수구요
cpx_add 는 두복소수에 대한 덧셈연산의 결과를 리턴하는 함수
cpx_div는 두복소수에 대한 나눗셈 연산의 결과를 리턴하는 함수
cpx_conj는 켤레복소수를 리턴하는 함수
cpx_mult는 두 복소수에 대한 곱셈연산의 결과를 리턴하는 함수
cpx_sun는 두 복소수에 대한 뺄셈 연산의 결과를 리턴하는 함수
입니다...
아래 식은 일차원 fft함수라는데 이해가 되질 않네요...다 모르시더라도 아는데라도 해석 부탁드립니다
void fft(complex *x, int n, int id)
{
complex u,w,t;
int le,le1,nm1,nv2;
int i,j,l,k,m,ip;
if(n!=ToPow2(n)){
printf("\n\t[] not 2's power !!");
return;
}
m = (int)(log((double)n)/log(2.0)+0.1);
nm1 = (n-1);
nv2 = (n>>1);
for (i=j=0; i < nm1; ++i) {
if (i < j) {
t = *(x+j);
*(x+j) = *(x+i);
*(x+i) = t;
}
k = nv2;
while (k <= j) {
j -= k;
k >>= 1;
}
j += k;
}
le = 1;
for (l=1; l <= m; ++l) {
le1 = le;
le = (le1<<1);
u = CPX_cmplx(1.0,0.0);
w = CPX_cmplx(cos(PI/(double)le1),-sin(PI/(double)le1));
if (id != 0) w = CPX_conj(w);
for (j=0; j < le1; ++j) {
for (i=j; i < n; i += le) {
ip = i + le1;
t = CPX_mult(*(x+ip),u);
*(x+ip) = CPX_sub(*(x+i),t);
*(x+i) = CPX_add(*(x+i),t);
}
u = CPX_mult(u,w);
}
}
if (id != 0) {
u = CPX_cmplx((double)n,0.);
for (i=0; i < n; ++i)
*(x+i) = CPX_div(*(x+i),u);
}
}