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开发,第一次遇到这样的写法,不太明白,还请您帮忙解答一下。
Shine:
请问具体哪里不明白?
user6307690:
回复 Shine:
您好,请问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]) 这个是求什么值?