老古开发网首页
导航:老古开发网首页文章索引索引第2464页文章分类DSP数字信号处理第29页→[C6000软件优化经验总结(3)]
| -文章搜索 - 最新文章 - |

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设计
 
下一个:[新闻热点]李一男回归华为悬疑待解 内部盛传将接班任正非
简介:
  “任正非和李一男都是英雄,英雄应该是惜英雄的。港湾没有卖给别人,而是卖给了华为,我相信冥冥之中,任正非和李一男的心在靠近!”   “虽然还没有对外公布,但华为内部已经在盛传李一男要回到华为,并且很可能是担任接班人的角色。”一位熟悉华为内情的人士告诉《第一财经日报》,“毕竟他被誉为技术天才,对技术趋势的把握不是一般人能够比拟的,而且经过创业的洗礼,李一男比以前更加成熟。”   虽然华为官方没有确认这件事,但类似的传言已经在华为内部传开了,这也给李一男回归华为增添了诸......

上一个:[DSP数字信号处理]C6000软件优化经验总结(4)

老古开发网版权所有 2006年9月 asp.Net V2.0 设计:老古
页面缓存:否 执行时间:63毫秒