首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

共同学习

共同学习

// 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 ;
}


返回列表