// n: n点 FFT
// x: 输入采样数据
// x[2k + 1] ---- 第k个采样数据的实部
// x[2k] ---- 第k个采样数据的虚部
// w: 存储在ROM中已经计算好的旋转因子的值
// w[2k + 1] ---- 第k个旋转因子的虚部
// w[2k] ----第k个旋转因子的实部
void fft2(int n, float* x, float* w) { int n2 = 0; int start = 1; int step = 2; // 第一部分,计算旋转因子WN, j ≠ 0的所有蝶形 for (proc = n; proc > 2; proc /= 2) { // 超阶 n2++; for (twiddle = start; twiddle < n/2; twiddle += step) { // 调用旋转因子 co = w[twiddle*2 + 1]; // 旋转因子实部cos si = w[twiddle*2]; // 旋转因子虚部sin int n3 = n4 = n; for (stage = 0; stage < n2; stage++) { n4 /= 2; for (i0 = twiddle >> stage; i0 < n; i0 += n3) { //蝶形计算 i1 = i0 + n4; re0 = x[2 * i0] + x[2 * i1]; im0 = x[2*i0 + 1] + x[2*i1 + 1]; re1 = x[2 * i0] - x[2 * i1]; im1 = x[2*i0 + 1] - x[2*i1 + 1]; x[2 * i0] = re0; x[2*i0 + 1] = im0; x[2 * i1] = re1*co - im1*si; x[2*i1 + 1]= re1*si + im1*co; } n3 = n4; } } start *= 2; step *= 2; }
n2++; // 计算旋转因子WN 的所有蝶形 n3 = n4 = n; for (stage = 0; stage < n2; stage++) { n4 /= 2; for (i0 = 0; i0 < n; i0 += n3) { i1 = i0 + n4; re0 = x[2 * i0] + x[2 * i1]; im0 = x[2*i0 + 1] + x[2*i1 + 1]; re1 = x[2 * i0] - x[2 * i1]; im1 = x[2 *i0 + 1] - x[2*i1 + 1]; x[2 * i0] = re0; x[2*i0 + 1] = im0; x[2 * i1] = re1; x[2*i1 + 1] = im1; } n3 = n4; } }
码位倒置单元:对输出数据进行处理,调整输出顺序。函数 为:BitReverse(intsrc,intsize),参数int src为原始序号,参数int size为序号 的位数,返回值为倒序以后的数据。具体代码如下:
int BitReverse(int src , int size) { int tmp = src ; int des = 0 ; for (int i = size - 1 ;i > = 0 ;i--) { des = ( (tmp & 0x1) < < i) | des ; tmp = tmp > > 1 ; } return des ; }
|