extern float xx[16384]; extern float ww[8192]; µ÷Óùý³Ì£º gen_w_r2(ww, 8192)£» bit_rev(xx, 4196)£» DSPF_sp_cfftr2_dit(xx,ww, 8192)£» bit_rev(xx, 8192); void gen_w_r2(float*w, int n) { int i; float pi = 4.0 *atan(1.0); float e = pi *2.0 / n; for(i = 0; i < (n >> 1); i++) { w[2*i] = cos(i*e); w[2*i + 1] = sin(i*e); } } void bit_rev(float*x, int n) { int i, j, k; float rtemp, itemp; j = 0; for(i=1; i < (n-1); i++) { k = n >> 1; while(k <= j) { j -= k; k >>= 1; } j += k; if(i < j) { rtemp = x[j*2]; x[j*2] = x[i*2]; x[i*2] = rtemp; itemp = x[j*2+1]; x[j*2+1] = x[i*2+1]; x[i*2+1] = itemp; } } } void DSPF_sp_cfftr2_dit(float *x, float *w, short n) { short n2, ie, ia, i, j, k, m; float rtemp, itemp, c, s; n2 = n; ie = 1; for(k=n; k > 1; k >>= 1) { n2 >>= 1; ia = 0; for(j=0; j < ie; j++) { c = w[2*j]; s = w[2*j+1]; for(i=0; i < n2; i++) { m = ia + n2; rtemp = c*x[2*m] + s*x[2*m+1]; itemp = c*x[2*m+1] - s*x[2*m]; x[2*m] = x[2*ia] - rtemp; x[2*m+1] = x[2*ia+1] - itemp; x[2*ia] = x[2*ia] + rtemp; x[2*ia+1] = x[2*ia+1] + itemp; ia++; } ia += n2; } ie <<= 1; } }