⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 g729ev_celp2s_acelp_ca.c

📁 最新的ITU-T的宽带语音编解码标准G.729.1,是对原先的G.729的最好的调整.码流输出速率可以进行自适应调整.满足未来通信要求.希望对大家有所帮助.
💻 C
📖 第 1 页 / 共 4 页
字号:
  p0 = rri0i1;  p1 = rri0i2;  p2 = rri0i3;  p3 = rri0i4;  /* Modify the rr[](rri0i1[], rri0i2[], rri0i3[], rri0i4[]) */  /* to take signs into account */  FOR(i0 = 0; i0 < G729EV_G729_L_SUBFR; i0 += G729EV_G729_STEP)  {    psign = sign_dn;    if (psign[i0] < 0)    {      psign = sign_dn_inv;    }    FOR(i1 = 1; i1 < G729EV_G729_L_SUBFR; i1 += G729EV_G729_STEP)    {      *p0 = mult(*p0, psign[i1]);      p0++;      *p1 = mult(*p1, psign[i1 + 1]);      p1++;      *p2 = mult(*p2, psign[i1 + 2]);      p2++;      *p3 = mult(*p3, psign[i1 + 3]);      p3++;#if (WMOPS)      move16();      move16();      move16();      move16();#endif    }  }  p0 = rri1i2;  p1 = rri1i3;  p2 = rri1i4;  /* Modify the rr[](rri1i2[], rri1i3[], rri1i4[]) */  /* to take signs into account */  FOR(i1 = 1; i1 < G729EV_G729_L_SUBFR; i1 += G729EV_G729_STEP)  {    psign = sign_dn;    if (psign[i1] < 0)    {      psign = sign_dn_inv;    }    FOR(i2 = 2; i2 < G729EV_G729_L_SUBFR; i2 += G729EV_G729_STEP)    {      *p0 = mult(*p0, psign[i2]);      p0++;      *p1 = mult(*p1, psign[i2 + 1]);      p1++;      *p2 = mult(*p2, psign[i2 + 2]);      p2++;#if (WMOPS)      move16();      move16();      move16();#endif    }  }  p0 = rri2i3;  p1 = rri2i4;  /* Modify the rr[](rri2i3[], rri2i4[]) to take signs into account */  FOR(i2 = 2; i2 < G729EV_G729_L_SUBFR; i2 += G729EV_G729_STEP)  {    psign = sign_dn;    if (psign[i2] < 0)    {      psign = sign_dn_inv;    }    FOR(i3 = 3; i3 < G729EV_G729_L_SUBFR; i3 += G729EV_G729_STEP)    {      *p0 = mult(*p0, psign[i3]);      p0++;      *p1 = mult(*p1, psign[i3 + 1]);      p1++;#if (WMOPS)      move16();      move16();#endif    }  }  /* Find initial positions of the 4 pulses which maximize b[] */  FOR(track = 0; track < 5; track++)  {#if (WMOPS)    move16();    move16();#endif    max = b[track];    ip[track] = track;    FOR(i = track + G729EV_G729_STEP; i < G729EV_G729_L_SUBFR; i += G729EV_G729_STEP)    {      IF(sub(b[i], max) > 0)      {#if (WMOPS)        move16();        move16();#endif        max = b[i];        ip[track] = i;      }    }  }  ptr_rri0i3_i4 = rri0i3;  ptr_rri1i3_i4 = rri1i3;  ptr_rri2i3_i4 = rri2i3;  ptr_rri3i3_i4 = rri3i3;  IF(sub(b[ip[3]], b[ip[4]]) < 0)  {#if (WMOPS)    move16();#endif    ip[3] = ip[4];    ptr_rri0i3_i4 = rri0i4;    ptr_rri1i3_i4 = rri1i4;    ptr_rri2i3_i4 = rri2i4;    ptr_rri3i3_i4 = rri4i4;  }  /* Compute Qk terms(square(correlation), energy) according to the initial pulses */  i0 = mult(ip[0], 6554);       /* ip[0]/5 */  i1 = mult(ip[1], 6554);       /* ip[1]/5 */  i2 = mult(ip[2], 6554);       /* ip[2]/5 */  i3 = mult(ip[3], 6554);       /* ip[3]/5 */  i0_offset = shl(i0, 3);  i1_offset = shl(i1, 3);  i2_offset = shl(i2, 3);  i3_offset = shl(i3, 3);  p0 = rri0i1 + i0_offset + i1;  p1 = rri0i2 + i0_offset + i2;  p2 = ptr_rri0i3_i4 + i0_offset + i3;  p3 = rri1i2 + i1_offset + i2;  p4 = ptr_rri1i3_i4 + i1_offset + i3;  p5 = ptr_rri2i3_i4 + i2_offset + i3;  xtmp16 = add(dn[ip[0]], dn[ip[1]]);  ytmp16 = add(dn[ip[2]], dn[ip[3]]);  Ck = add(xtmp16, ytmp16);  Ek = L_mult0(rri0i0[i0], G729EV_CELP2S_FCB_1_8);  Ek = L_mac0(Ek, rri1i1[i1], G729EV_CELP2S_FCB_1_8);  Ek = L_mac0(Ek, rri2i2[i2], G729EV_CELP2S_FCB_1_8);  Ek = L_mac0(Ek, ptr_rri3i3_i4[i3], G729EV_CELP2S_FCB_1_8);  Ek = L_mac0(Ek, *p0, G729EV_CELP2S_FCB_1_4);  Ek = L_mac0(Ek, *p1, G729EV_CELP2S_FCB_1_4);  Ek = L_mac0(Ek, *p2, G729EV_CELP2S_FCB_1_4);  Ek = L_mac0(Ek, *p3, G729EV_CELP2S_FCB_1_4);  Ek = L_mac0(Ek, *p4, G729EV_CELP2S_FCB_1_4);  Ek = L_mac0(Ek, *p5, G729EV_CELP2S_FCB_1_4);#if (WMOPS)  move16();  move16();  move16();  move16();#endif  num_max = mult(Ck, Ck);  den_max = round(Ek);  prev_num_max = num_max;  prev_den_max = den_max;  track = 5;  p_max = 0;  /****************************************************************/  /* Perform one pulse replacement for each track and select     */  /* pulse positions which maximize square(correlation)/energy */  /* The number of repetition is G729EV_CELP2S_FCB_REPEAT         */  /****************************************************************/  FOR(j = 0; j < G729EV_CELP2S_FCB_REPEAT; j++)  {    /* If previously searched track is not 0 */    IF(track != 0)    {      p0 = rri1i1 + i1;      p1 = rri2i2 + i2;      p2 = ptr_rri3i3_i4 + i3;      p3 = rri1i2 + i1_offset + i2;      p4 = ptr_rri1i3_i4 + i1_offset + i3;      p5 = ptr_rri2i3_i4 + i2_offset + i3;      xtmp16 = add(dn[ip[1]], dn[ip[2]]);      Ck_share = add(xtmp16, dn[ip[3]]);      Ek_share = L_mult0(*p0, G729EV_CELP2S_FCB_1_8);      Ek_share = L_mac0(Ek_share, *p1, G729EV_CELP2S_FCB_1_8);      Ek_share = L_mac0(Ek_share, *p2, G729EV_CELP2S_FCB_1_8);      Ek_share = L_mac0(Ek_share, *p3, G729EV_CELP2S_FCB_1_4);      Ek_share = L_mac0(Ek_share, *p4, G729EV_CELP2S_FCB_1_4);      Ek_share = L_mac0(Ek_share, *p5, G729EV_CELP2S_FCB_1_4);      p0 = rri0i0;      p1 = rri0i1 + i1;      p2 = rri0i2 + i2;      p3 = ptr_rri0i3_i4 + i3;      FOR(i = 0; i < G729EV_G729_L_SUBFR; i += G729EV_G729_STEP)      {        Ck = add(Ck_share, dn[i]);        Ek = L_mac0(Ek_share, *p0, G729EV_CELP2S_FCB_1_8);        Ek = L_mac0(Ek, *p1, G729EV_CELP2S_FCB_1_4);        Ek = L_mac0(Ek, *p2, G729EV_CELP2S_FCB_1_4);        Ek = L_mac0(Ek, *p3, G729EV_CELP2S_FCB_1_4);        p0++;        p1 += G729EV_G729_NB_POS;        p2 += G729EV_G729_NB_POS;        p3 += G729EV_G729_NB_POS;        num = mult(Ck, Ck);        den = round(Ek);        xtmp32 = L_msu0(L_mult0(num, den_max), num_max, den);        IF(xtmp32 > 0)        {#if (WMOPS)          move16();          move16();          move16();#endif          num_max = num;          den_max = den;          p_max = i;        }      }    }    /* If previously searched track is not 1 */    IF(sub(track, 1) != 0)    {      p0 = rri0i0 + i0;      p1 = rri2i2 + i2;      p2 = ptr_rri3i3_i4 + i3;      p3 = rri0i2 + i0_offset + i2;      p4 = ptr_rri0i3_i4 + i0_offset + i3;      p5 = ptr_rri2i3_i4 + i2_offset + i3;      xtmp16 = add(dn[ip[0]], dn[ip[2]]);      Ck_share = add(xtmp16, dn[ip[3]]);      Ek_share = L_mult0(*p0, G729EV_CELP2S_FCB_1_8);      Ek_share = L_mac0(Ek_share, *p1, G729EV_CELP2S_FCB_1_8);      Ek_share = L_mac0(Ek_share, *p2, G729EV_CELP2S_FCB_1_8);      Ek_share = L_mac0(Ek_share, *p3, G729EV_CELP2S_FCB_1_4);      Ek_share = L_mac0(Ek_share, *p4, G729EV_CELP2S_FCB_1_4);      Ek_share = L_mac0(Ek_share, *p5, G729EV_CELP2S_FCB_1_4);      p0 = rri1i1;      p1 = rri0i1 + i0_offset;      p2 = rri1i2 + i2;      p3 = ptr_rri1i3_i4 + i3;      FOR(i = 1; i < G729EV_G729_L_SUBFR; i += G729EV_G729_STEP)      {        Ck = add(Ck_share, dn[i]);        Ek = L_mac0(Ek_share, *p0, G729EV_CELP2S_FCB_1_8);        Ek = L_mac0(Ek, *p1, G729EV_CELP2S_FCB_1_4);        Ek = L_mac0(Ek, *p2, G729EV_CELP2S_FCB_1_4);        Ek = L_mac0(Ek, *p3, G729EV_CELP2S_FCB_1_4);        p0++;        p1++;        p2 += G729EV_G729_NB_POS;        p3 += G729EV_G729_NB_POS;        num = mult(Ck, Ck);        den = round(Ek);        xtmp32 = L_msu0(L_mult0(num, den_max), num_max, den);        IF(xtmp32 > 0)        {#if (WMOPS)          move16();          move16();          move16();#endif          num_max = num;          den_max = den;          p_max = i;        }      }    }    /* If previously searched track is not 2 */    IF(sub(track, 2) != 0)    {      p0 = rri0i0 + i0;      p1 = rri1i1 + i1;      p2 = ptr_rri3i3_i4 + i3;      p3 = rri0i1 + i0_offset + i1;      p4 = ptr_rri0i3_i4 + i0_offset + i3;      p5 = ptr_rri1i3_i4 + i1_offset + i3;      xtmp16 = add(dn[ip[0]], dn[ip[1]]);      Ck_share = add(xtmp16, dn[ip[3]]);      Ek_share = L_mult0(*p0, G729EV_CELP2S_FCB_1_8);      Ek_share = L_mac0(Ek_share, *p1, G729EV_CELP2S_FCB_1_8);      Ek_share = L_mac0(Ek_share, *p2, G729EV_CELP2S_FCB_1_8);      Ek_share = L_mac0(Ek_share, *p3, G729EV_CELP2S_FCB_1_4);      Ek_share = L_mac0(Ek_share, *p4, G729EV_CELP2S_FCB_1_4);      Ek_share = L_mac0(Ek_share, *p5, G729EV_CELP2S_FCB_1_4);      p0 = rri2i2;      p1 = rri0i2 + i0_offset;      p2 = rri1i2 + i1_offset;      p3 = ptr_rri2i3_i4 + i3;      FOR(i = 2; i < G729EV_G729_L_SUBFR; i += G729EV_G729_STEP)      {        Ck = add(Ck_share, dn[i]);        Ek = L_mac0(Ek_share, *p0, G729EV_CELP2S_FCB_1_8);        Ek = L_mac0(Ek, *p1, G729EV_CELP2S_FCB_1_4);        Ek = L_mac0(Ek, *p2, G729EV_CELP2S_FCB_1_4);        Ek = L_mac0(Ek, *p3, G729EV_CELP2S_FCB_1_4);        p0++;        p1++;        p2++;        p3 += G729EV_G729_NB_POS;        num = mult(Ck, Ck);        den = round(Ek);        xtmp32 = L_msu0(L_mult0(num, den_max), num_max, den);        IF(xtmp32 > 0)        {#if (WMOPS)          move16();          move16();          move16();#endif          num_max = num;          den_max = den;          p_max = i;        }      }    }    /* If previously searched track is not 3 */    IF(sub(track, 3) != 0)    {      p0 = rri0i0 + i0;      p1 = rri1i1 + i1;      p2 = rri2i2 + i2;      p3 = rri0i1 + i0_offset + i1;      p4 = rri0i2 + i0_offset + i2;      p5 = rri1i2 + i1_offset + i2;      xtmp16 = add(dn[ip[0]], dn[ip[1]]);      Ck_share = add(xtmp16, dn[ip[2]]);      Ek_share = L_mult0(*p0, G729EV_CELP2S_FCB_1_8);      Ek_share = L_mac0(Ek_share, *p1, G729EV_CELP2S_FCB_1_8);      Ek_share = L_mac0(Ek_share, *p2, G729EV_CELP2S_FCB_1_8);      Ek_share = L_mac0(Ek_share, *p3, G729EV_CELP2S_FCB_1_4);      Ek_share = L_mac0(Ek_share, *p4, G729EV_CELP2S_FCB_1_4);      Ek_share = L_mac0(Ek_share, *p5, G729EV_CELP2S_FCB_1_4);      p0 = rri3i3;      p1 = rri0i3 + i0_offset;      p2 = rri1i3 + i1_offset;      p3 = rri2i3 + i2_offset;      FOR(i = 3; i < G729EV_G729_L_SUBFR; i += G729EV_G729_STEP)      {        Ck = add(Ck_share, dn[i]);        Ek = L_mac0(Ek_share, *p0, G729EV_CELP2S_FCB_1_8);        Ek = L_mac0(Ek, *p1, G729EV_CELP2S_FCB_1_4);        Ek = L_mac0(Ek, *p2, G729EV_CELP2S_FCB_1_4);        Ek = L_mac0(Ek, *p3, G729EV_CELP2S_FCB_1_4);        p0++;        p1++;        p2++;        p3++;        num = mult(Ck, Ck);        den = round(Ek);        xtmp32 = L_msu0(L_mult0(num, den_max), num_max, den);        IF(xtmp32 > 0)        {#if (WMOPS)          move16();          move16();          move16();#endif          num_max = num;          den_max = den;          p_max = i;        }        IF(sub(i, 38) == 0)        {#if (WMOPS)          move16();#endif          i = -1;          p0 = rri4i4;          p1 = rri0i4 + i0_offset;          p2 = rri1i4 + i1_offset;          p3 = rri2i4 + i2_offset;        }      }    }    xtmp32 = L_msu(L_mult(num_max, prev_den_max), prev_num_max, den_max);    ytmp32 = L_sub(xtmp32, G729EV_CELP2S_FCB_THRES);    IF(ytmp32 > 0)    {#if (WMOPS)      move16();      move16();#endif      prev_num_max = num_max;      prev_den_max = den_max;      xtmp16 = mult(p_max, 6554); /* track = p_max % 5 */      ytmp16 = add(xtmp16, shl(xtmp16, 2));      track = sub(p_max, ytmp16);#if (WMOPS)      move16();#endif      ip[track] = p_max;      IF(sub(track, 3) == 0)      {        ptr_rri0i3_i4 = rri0i3;        ptr_rri1i3_i4 = rri1i3;        ptr_rri2i3_i4 = rri2i3;        ptr_rri3i3_i4 = rri3i3;      }      IF(sub(track, 4) == 0)      {#if (WMOPS)        move16();        move16();#endif        ip[3] = ip[4];        track = 3;        ptr_rri0i3_i4 = rri0i4;        ptr_rri1i3_i4 = rri1i4;        ptr_rri2i3_i4 = rri2i4;        ptr_rri3i3_i4 = rri4i4;      }      i0 = mult(ip[0], 6554);      i1 = mult(ip[1], 6554);      i2 = mult(ip[2], 6554);      i3 = mult(ip[3], 6554);      i0_offset = shl(i0, 3);      i1_offset = shl(i1, 3);      i2_offset = shl(i2, 3);      i3_offset = shl(i3, 3);    }    ELSE    {      BREAK;    }  }  /* Set the sign of impulses */#if (WMOPS)  move16();  move16();  move16();  move16();#endif  i0 = sign_dn[ip[0]];  i1 = sign_dn[ip[1]];  i2 = sign_dn[ip[2]];  i3 = sign_dn[ip[3]];  /* Find the codeword corresponding to the selected positions */  p0 = cod;  FOR(i = 0; i < G729EV_G729_L_SUBFR; i++)  {#if (WMOPS)    move16();#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -