TI工程师,您好,我在阅读optimizing loops on the c66x dsp时,遇到一个问题不太明白:
在3.1.5中有个例程中出现了以下计算
1.f/(float)sqrt(a-sqr)
1.5f-(a-sqr/2.f)* oneOverAbs_a
我刚做dsp开发,第一次遇到这样的写法,不太明白,还请您帮忙解答一下。
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
TI工程师,您好,我在阅读optimizing loops on the c66x dsp时,遇到一个问题不太明白:
在3.1.5中有个例程中出现了以下计算
1.f/(float)sqrt(a-sqr)
1.5f-(a-sqr/2.f)* oneOverAbs_a
我刚做dsp开发,第一次遇到这样的写法,不太明白,还请您帮忙解答一下。
您好,请问1.5后面的f是表征浮点类型是吗?
在手册中有一例子, 求复数序列 |a[i]| 和 ejangle(a[i]) ,代码如下 :
void example1_gc(cplxf_t *a, cplxf_t *ejalpha, float *abs_a, int n)
{
int i;
float a_sqr, oneOverAbs_a;
for ( i = 0; i < n; i++)
{
a_sqr =a[i].real * a[i].real + a[i].imag * a[i].imag;
oneOverAbs_a =1.f/(float)sqrt(a_sqr);
abs_a[i] = a_sqr * oneOverAbs_a;
ejalpha[i].real =a[i].real * oneOverAbs_a;
ejalpha[i].imag =a[i].imag * oneOverAbs_a;
}
}
优化后的代码如下:
_nassert(n % 4 == 0);
_nassert((int) a % 8 == 0);
_nassert((int) ejalpha % 8 == 0);
_nassert((int) abs_a % 8 == 0);
#pragma MUST_ITERATE(4,100, 4);
#pragma UNROLL(2);
for ( i = 0; i < n; i++)
{
a_sqr = a[i].real * a[i].real + a[i].imag * a[i].imag;
oneOverAbs_a = _rsqrsp(a_sqr); /* 1/sqrt() instruction 8-bit mantissa precision*/
/* One interpolation*/
oneOverAbs_a = oneOverAbs_a * (1.5f - (a_sqr/2.f)* oneOverAbs_a *oneOverAbs_a);
abs_a[i]= a_sqr * oneOverAbs_a;
ejalpha[i].real =a[i].real * oneOverAbs_a;
ejalpha[i].imag =a[i].imag * oneOverAbs_a;
}
有以下几点不太明白的:
1。求复数模,是Q 和 I平方和再开根号。
oneOverAbs_a =1.f/(float)sqrt(a_sqr);
abs_a[i] = a_sqr * oneOverAbs_a;
这两条语句的目的是什么?
2。在优化之后的代码中,又改写成了
oneOverAbs_a = _rsqrsp(a_sqr); /* 1/sqrt() instruction 8-bit mantissa precision*/
/* One interpolation*/
oneOverAbs_a = oneOverAbs_a * (1.5f - (a_sqr/2.f)* oneOverAbs_a *oneOverAbs_a);
_rsqrsp 这个函数调用明白,但下一条oneOVerAbs_a为什么改成这样的写法?原理是什么?
3。e jangle(a[i]) 这个是求什么值?