FFT 高速傅里叶计算sp_cfftr2_dit 源码的一些疑问
FFT 快速傅里叶计算sp_cfftr2_dit 源码的一些疑问
本例是从基于TI DSP通用算法实现中Example3-3程序,执行的是浮点基-2FFT C代码。不知道本代码是从TI网站上下载的还是作者自己编写的,我看了之后总觉得有些问题:循环a是代表一共需要几级运算,第二级循环是确定本级的旋转因子,在第三级遍历使用相同的旋转旋转因子的蝶形结进行运算。请注意这个地方
m = ia + n2;
rtemp = c * x[2*m] + s * x[2*m+1];
itemp = c * x[2*m+1] - s * x[2*m];
在第一次循环的时候,ia = 0,n2 = n/2,难道不会越界吗?更何况后来ia还要增加。
/****************************************************************/
/* x --- pointer to input data array in normal order */
/* w --- pointer to the twiddle factor array */
/* n --- length of FFT */
/****************************************************************/
void 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){ /*** Loop (c) ***/
n2 >>= 1; ia = 0;
for(j=0; j < ie; j++){ /*** Loop (b) ***/
c = w[2*j];
s = w[2*j+1];
for(i=0; i < n2; i++){ /*** Loop (a) ***/
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;
}
}
------解决方案--------------------
FFT长度和缓冲区大小的关系,这段代码里,看不出来,所以无法确定
你可以测试一下,看会不会越界。
------解决方案--------------------
>ia = 0,n2 = n/2,难道不会越界吗?
ia<n2,所以ia+n2<2*n2=n,所以不会越界。
>更何况后来ia还要增加。
第一次循环的时候,ie==1,所以第二层循环只会迭代1次。
你如果想要学习FFT的话,先去学习FFT的递归写法,把那个搞懂了再来看这个代码。这个代码是递归算法的非递归写法。
本例是从基于TI DSP通用算法实现中Example3-3程序,执行的是浮点基-2FFT C代码。不知道本代码是从TI网站上下载的还是作者自己编写的,我看了之后总觉得有些问题:循环a是代表一共需要几级运算,第二级循环是确定本级的旋转因子,在第三级遍历使用相同的旋转旋转因子的蝶形结进行运算。请注意这个地方
m = ia + n2;
rtemp = c * x[2*m] + s * x[2*m+1];
itemp = c * x[2*m+1] - s * x[2*m];
在第一次循环的时候,ia = 0,n2 = n/2,难道不会越界吗?更何况后来ia还要增加。
/****************************************************************/
/* x --- pointer to input data array in normal order */
/* w --- pointer to the twiddle factor array */
/* n --- length of FFT */
/****************************************************************/
void 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){ /*** Loop (c) ***/
n2 >>= 1; ia = 0;
for(j=0; j < ie; j++){ /*** Loop (b) ***/
c = w[2*j];
s = w[2*j+1];
for(i=0; i < n2; i++){ /*** Loop (a) ***/
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;
}
}
------解决方案--------------------
FFT长度和缓冲区大小的关系,这段代码里,看不出来,所以无法确定
你可以测试一下,看会不会越界。
------解决方案--------------------
>ia = 0,n2 = n/2,难道不会越界吗?
ia<n2,所以ia+n2<2*n2=n,所以不会越界。
>更何况后来ia还要增加。
第一次循环的时候,ie==1,所以第二层循环只会迭代1次。
你如果想要学习FFT的话,先去学习FFT的递归写法,把那个搞懂了再来看这个代码。这个代码是递归算法的非递归写法。