4.7.47. ETSI 基本运算

RVCT 支持原始 ETSI 基本运算系列(如 ETSI G.729 建议《使用共轭结构代数码激励线性预测 (CS-ACELP) 的 8 Kb/s 语音编码》所述)。

要在您自己的代码中使用 ETSI 基本运算,请包含标准头文件 dspfns.hTable 4.13 列出了 dspfns.h 中提供的内在函数。

Table 4.13. RVCT 中支持的 ETSI 基本运算 

内在函数
abs_s L_add_c L_mult L_sub_c norm_l
add L_deposit_h L_negate mac_r round
div_s L_deposit_l L_sat msu_r saturate
extract_h L_mac L_shl mult shl
extract_l L_macNs L_shr mult_r shr
L_abs L_msu L_shr_r negate shr_r
L_add L_msuNs L_sub norm_s sub

头文件 dspfns.h 还将某些状态标记作为全局变量公开,以便在 C 或 C++ 程序中使用。 Table 4.14 列出了 dspfns.h 公开的状态标记。

Table 4.14. RVCT 中公开的 ETSI 状态标记 

状态标记 说明
Overflow

溢出状态标记。

通常,饱和函数对溢出具有粘着效果。

Carry

进位状态标记。

示例


#include <limits.h>

#include <stdint.h>

#include <dspfns.h>       // include ETSI basic operations



int32_t C_L_add(int32_t a, int32_t b)

{

    int32_t c = a + b;



    if (((a ^ b) & INT_MIN) == 0)

    {

        if ((c ^ a) & INT_MIN)

        {

            c = (a < 0) ? INT_MIN : INT_MAX;

        }

    }



    return c;

}



__asm int32_t asm_L_add(int32_t a, int32_t b)

{

    qadd r0, r0, r1

    bx lr

}



int32_t foo(int32_t a, int32_t b)

{

    int32_t c, d, e, f;



    Overflow = 0;         // set global overflow flag



    c = C_L_add(a, b);    // C saturating add

    d = asm_L_add(a, b);  // assembly language saturating add

    e = __qadd(a, b);     // ARM intrinsic saturating add

    f = L_add(a, b);      // ETSI saturating add

    return Overflow ? -1 : c == d == e == f; // returns 1, unless overflow

}

另请参阅

  • 头文件 dspfns.h 中的 ETSI 基本运算定义,其形式为 C 代码和内在函数的组合。

  • 编译器用户指南中的第 3-6 页的ETSI 基本运算

  • ETSI 建议 G.191:《语音和音频编码标准化软件工具》

  • ETSI 建议 G.191 中包含的 《ITU-T 软件工具库 2005 用户手册》

  • ETSI 建议 G723.1:《5.3 和 6.3 kb/s 多媒体通信传输的双速率语音编码器》

  • ETSI 建议 G.729:《使用共轭结构代数码激励线性预测 (CS-ACELP) 的 8 Kb/s 语音编码》

Copyright © 2007 ARM Limited. All rights reserved. ARM DUI 0348AC
Non-Confidential