|
|
| | -文章搜索 - 最新文章 - | |
C6000软件优化经验总结(3) |
| 发布时间:2006年7月29日 点击次数:617 |
| 来源:无忧电子开发网 作者: |
八、 1、源程序 for (k = 0; k < NB_PULSE; k++) { i = codvec[k]; j = sign[i]; index = mult(i, Q15_1_5); track = sub(i, extract_l(L_shr(L_mult(index, 5), 1))); if (j > 0) { if (i < l_subfr) code[i] = add(code[i], 4096); codvec[k] += (2 * L_SUBFR); } else { if (i < l_subfr) code[i] = sub(code[i], 4096); index = add(index, 16); } if (indx[track] < 0) { indx[track] = index; } else { if (((index ^ indx[track]) & 16) == 0) { if (sub(indx[track], index) <= 0) { indx[track] = shl((indx[track] & 16), 3) + shr(extract_l(L_mult((indx[track] & 15), NB_POS)), 1) + (index & 15); } else { indx[track] = shl((index & 16), 3) + shr(extract_l(L_mult((index & 15), NB_POS)), 1) + (indx[track] & 15); } } else { if (sub((indx[track] & 15), (index & 15)) <= 0) { indx[track] = shl((index & 16), 3) + shr(extract_l(L_mult((index & 15), NB_POS)), 1) + (indx[track] & 15); } else { indx[track] = shl((indx[track] & 16), 3) + shr(extract_l(L_mult((indx[track] & 15), NB_POS)), 1) + (index & 15); } } } } 2、优化后的程序 for (k = 0; k < 8; k++) { i = codvec[k]; j = sign[i]; index = _smpy(i, 6554)>>16; track = i - index*5; con = (j > 0); codvec[k] = codvec[k] + 110*con; index = index + (!con)*16; conn = (i < l_subfr); cono = (j > 0)? 1:-1; code[i] = code[i] + 4096*conn*cono; n0 = index; t0 = indx[track]; n1 = n0&16; t1 = t0&16; n2 = n0&15; t2 = t0&15; tmp0 = (_sshl(n1,19)>>16) + n2*NB_POS + t2; tmp1 = (_sshl(t1,19)>>16) + t2*NB_POS + n2; conp = (((n1 == t1)&&(t0 > n0)) ((n1 != t1)&&(t2 <= n2))); tmp = conp*tmp0 + (!conp)*tmp1; if (t0 < 0) indx[track] = n0; else indx[track] = tmp; } 3、优化说明 源程序中在循环中含有许多的if结构,在优化时对if结构首先进行化简,再将化简后的if结构用条件运算表达式进行改写,最后使循环可以Pipeline。 九、 1、源程序 for (i = 0; i < n; i++) { max = -32767; for (j = 0; j < n; j++) { if (sub (tmp2[j], max) >= 0) { max = tmp2[j]; ix = j; } } tmp2[ix] = -32768; tmp[i] = ix; } 2、优化后的程序 if (n0>n1) {temp=n0;n0=n1;n1=temp;} if (n1>n2) {temp=n1;n1=n2;n2=temp;} if (n2>n3) {temp=n2;n2=n3;n3=temp;} if (n3>n4) {temp=n3;n3=n4;n4=temp;} if (n0>n1) {temp=n0;n0=n1;n1=temp;} if (n1>n2) {temp=n1;n1=n2;n2=temp;} if (n2>n3) {temp=n2;n2=n3;n3=temp;} if (n0>n1) {temp=n0;n0=n1;n1=temp;} if (n1>n2) {return n1;} 3、优化说明 源程序也为一个求中值的问题,由于已知循环次数固定为5,因此将循环展开使用if语句直接求取中值。 十、 1、源程序 static Word16 Bin2int (Word16 no_of_bits, Word16 *bitstream) { Word16 value, i, bit;
value = 0; for (i = 0; i < no_of_bits; i++) { value = shl (value, 1); bit = *bitstream++; if (sub (bit, BIT_1) == 0) value = add (value, 1); } return (value); } for (i = 0; i < prmno[mode]; i++) { prm[i] = Bin2int (bitno[mode][i], bits); bits += bitno[mode][i]; } 2、优化后的程序 value = 0; bitsp = bits; bitnop= &bitno[mode][0]; j = *bitnop++; j1 = *bitnop++; j2 = *bitnop++; j3 = *bitnop++; j4 = *bitnop++; _nassert(loop[mode]>=35); for (i = 0; i < loop[mode]; i++) { value = value*2 + *bitsp++; j--; if (j == 0) { *prm++ = value; value = 0; j = j1; j1 = j2; j2 = j3; j3 = j4; j4 = *bitnop++; } } 3、优化说明 源程序按照数据位流定义取出参数,为双重循环结构,优化中采用重新根据位流的bit长度定义循环次数,化简为单重循环,然后优化循环,去除boundary,使pipeline的数目最小。
|
|
|
|
|
[DSP数字信号处理] 相关文章: 用DSP技术从模拟视频信号中获取数字图像简介: 引 言 图像处理系统中图像源获取手段有很多种,同样图像的传感器也是多种多样的。现在比较流行的传感器有CCD、CMOS、CIS等等。这些传感器对于图像数据输出的格式各不相同,例如CCD输出的是模拟信号,需要通过A/D的采样才能得到图像处理所需要的数字图像信号;而CMOS传感器则直接输出数字信号。这样必然会对图像处理系统的通用性造成很大的影响。当图像传感器更改或者图像的分辨率发生更改以后,都会导致图像处理系统做出相应的修改,这样在很大程度上限制了专用图像处理板的应用范围以及通用性。 ...... 德金融时报:英特尔利诱德零售商禁售AMD产品 C6000软件优化经验总结(2) C6000软件优化经验总结(1) DSP HPI口与PC104总线接口的FPGA设计 |
|
|
|