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

📄 enh40.h

📁 Reference Implementation of G.711 standard and other voice codecs
💻 H
📖 第 1 页 / 共 2 页
字号:
 *
 *  Purpose :
 *
 *    Rounds the lower 16 bits of the 40 bit input number. Returns the 40 bit
 *    result with bits 15-0 cleared.
 *    Calls the macro L40_UNDERFLOW_OCCURED() in case of underflow on 40-bit.
 *    Calls the macro L40_OVERFLOW_OCCURED()  in case of overflow  on 40-bit.
 *
 *
 *  Complexity weight : 1
 *
 *  Inputs :
 *
 *    L40_var1    40 bit long signed integer (Word40) whose value falls in the
 *                range : MIN_40 <= L40_var1 <= MAX_40.
 *
 *
 *  Outputs :
 *
 *    none
 *
 *  Return Value :
 *
 *    L40_var_out 40 bit long signed integer (Word40) whose value falls in
 *                the range : MIN_40 <= L40_var_out <= MAX_40.
 *
 *****************************************************************************/
__inline Word40 L40_round( Word40 L40_var1) {
   Word40 L40_var_out;
   Word40 L40_constant = L40_set( 0xffffff0000);

   L40_var_out = L40_add( 0x8000, L40_var1);
   L40_var_out = L40_var_out & L40_constant;

   #if (WMOPS)
   multiCounter[currCounter].L40_set--;
   multiCounter[currCounter].L40_add--;
   multiCounter[currCounter].L40_round++;
   #endif /* ifdef WMOPS */

   return( L40_var_out);
}   


/*****************************************************************************
 *
 *  Function Name : round40
 *
 *  Purpose :
 *
 *    Rounds the lower 16 bits of the 40 bit input number. Saturates the 40
 *    bit result to 32-bit and returns the resulting higher 16-bit.
 *    round40( L40_var1) = extract_h( L_saturate40( L40_round( L40_var1)))
 *    Calls the macro L40_UNDERFLOW_OCCURED() in case of underflow on 40-bit.
 *    Calls the macro L40_OVERFLOW_OCCURED()  in case of overflow  on 40-bit.
 *
 *
 *  Complexity weight : 1
 *
 *  Inputs :
 *
 *    L40_var1    40 bit long signed integer (Word40) whose value falls in the
 *                range : MIN_40 <= L40_var1 <= MAX_40.
 *
 *
 *  Outputs :
 *
 *    none
 *
 *  Return Value :
 *
 *    var_out     16 bit short signed integer (Word16) whose value falls in 
 *                the range 0xffff 8000 <= var_out <= 0x0000 7fff.
 *
 *****************************************************************************/
__inline Word16 round40( Word40 L40_var1) {
   Word16 var_out;

   var_out = extract_h( L_saturate40( L40_round( L40_var1)));

   #if (WMOPS)
   multiCounter[currCounter].L40_round--;
   multiCounter[currCounter].L_saturate40--;
   multiCounter[currCounter].extract_h--;
   multiCounter[currCounter].round40++;
   #endif /* ifdef WMOPS */

   return( var_out);
}   


/*****************************************************************************
 *
 *  Function Name : L40_mult
 *
 *  Purpose :
 *
 *    Multiplies var1 by var2 and shifts the result left by 1. Returns the
 *    full precision result on 40-bit.
 *    L40_mult( var1, var2) = shiftleft(( var1 times var2), 1)
 *
 *  Complexity weight : 1
 *
 *  Inputs :
 *
 *    var1        16 bit short signed integer (Word16) whose value falls in 
 *                the range : MIN_16 <= var1 <= MAX_16.
 *
 *    var2        16 bit short signed integer (Word16) whose value falls in 
 *                the range : MIN_16 <= var2 <= MAX_16.
 *
 *  Outputs :
 *
 *    none
 *
 *  Return Value :
 *
 *    L40_var_out 40 bit long signed integer (Word40) whose value falls in
 *                the range : MIN_40 <= L40_var_out <= MAX_40.
 *
 *****************************************************************************/
__inline Word40 L40_mult( Word16 var1, Word16 var2) {
   Word32 L_var_out;
   Word40 L40_var_out;

   L_var_out = ( Word32) var1 * ( Word32) var2;
   L40_var_out = ( Word40) L_var_out;

   /* Below line can not overflow, so we can use << instead of L40_shl. */
   L40_var_out = L40_var_out << 1;

   #if (WMOPS)
   multiCounter[currCounter].L40_mult++;
   #endif /* ifdef WMOPS */

   return( L40_var_out);
}












/*****************************************************************************
 *
 *  Function Name : L40_mac
 *
 *  Purpose :
 *
 *    Multiplies var2 by var3. Shifts left the 40-bit result by 1 and adds
 *    the result to L40_var1. Returns a 40 bit result.
 *    L40_mac( L40_var1, var2, var3)
 *    = L40_add( L40_var1, L40_mult( var2, var3))
 *    Calls the macro L40_UNDERFLOW_OCCURED() in case of underflow on 40-bit.
 *    Calls the macro L40_OVERFLOW_OCCURED()  in case of overflow  on 40-bit.
 *
 *  Complexity weight : 1
 *
 *  Inputs :
 *
 *    L40_var1    40 bit long signed integer (Word40) whose value falls in the
 *                range : MIN_40 <= L40_var1 <= MAX_40.
 *
 *    var2        16 bit short signed integer (Word16) whose value falls in 
 *                the range : MIN_16 <= var2 <= MAX_16.
 *
 *    var3        16 bit short signed integer (Word16) whose value falls in 
 *                the range : MIN_16 <= var3 <= MAX_16.
 *
 *  Outputs :
 *
 *    none
 *
 *  Return Value :
 *
 *    L40_var_out 40 bit long signed integer (Word40) whose value falls in
 *                the range : MIN_40 <= L40_var_out <= MAX_40.
 *
 *****************************************************************************/
__inline Word40 L40_mac( Word40 L40_var1, Word16 var2, Word16 var3) {
   Word40 L40_var_out;

   L40_var_out = L40_mult( var2, var3);
   L40_var_out = L40_add( L40_var1, L40_var_out);

   #if (WMOPS)
   multiCounter[currCounter].L40_mult--;
   multiCounter[currCounter].L40_add--;
   multiCounter[currCounter].L40_mac++;
   #endif /* ifdef WMOPS */

   return( L40_var_out);
}   






/*****************************************************************************
 *
 *  Function Name : mac_r40
 *
 *  Purpose :
 *
 *    Multiplies var2 by var3. Shifts left the 40-bit result by 1 and adds
 *    the result to L40_var1. Rounds the lower 16 bits of the 40 bit result.
 *    Saturates the 40 bit result to 32-bit and returns the resulting higher
 *    16-bit.
 *    mac_r40( L40_var1, var2, var3)
 *    = round40( L40_mac( L40_var1, var2, var3))
 *    Calls the macro L40_UNDERFLOW_OCCURED() in case of underflow on 40-bit.
 *    Calls the macro L40_OVERFLOW_OCCURED()  in case of overflow  on 40-bit.
 *
 *  Complexity weight : 2
 *
 *  Inputs :
 *
 *    L40_var1    40 bit long signed integer (Word40) whose value falls in the
 *                range : MIN_40 <= L40_var1 <= MAX_40.
 *
 *    var2        16 bit short signed integer (Word16) whose value falls in 
 *                the range : MIN_16 <= var2 <= MAX_16.
 *
 *    var3        16 bit short signed integer (Word16) whose value falls in 
 *                the range : MIN_16 <= var3 <= MAX_16.
 *
 *  Outputs :
 *
 *    none
 *
 *  Return Value :
 *
 *    var_out     16 bit short signed integer (Word16) whose value falls in
 *                the range : MIN_16 <= var_out <= MAX_16.
 *
 *****************************************************************************/
__inline Word16 mac_r40( Word40 L40_var1, Word16 var2, Word16 var3) {
   Word40 L40_var_out;
   Word16 var_out;

   L40_var_out = L40_mac( L40_var1, var2, var3);
   var_out = round40( L40_var_out);

   #if (WMOPS)
   multiCounter[currCounter].L40_mac--;
   multiCounter[currCounter].round40--;
   multiCounter[currCounter].mac_r40++;
   #endif /* ifdef WMOPS */

   return( var_out);
}   






/*****************************************************************************
 *
 *  Function Name : L40_msu
 *
 *  Purpose :
 *
 *    Multiplies var2 by var3. Shifts left the 40-bit result by 1 and
 *    subtracts the result from L40_var1. Returns a 40 bit result.
 *    L40_msu( L40_var1, var2, var3)
 *    = L40_sub( L40_var1, L40_mult( var2, var3))
 *    Calls the macro L40_UNDERFLOW_OCCURED() in case of underflow on 40-bit.
 *    Calls the macro L40_OVERFLOW_OCCURED()  in case of overflow  on 40-bit.
 *
 *  Complexity weight : 1
 *
 *  Inputs :
 *
 *    L40_var1    40 bit long signed integer (Word40) whose value falls in the
 *                range : MIN_40 <= L40_var1 <= MAX_40.
 *
 *    var2        16 bit short signed integer (Word16) whose value falls in 
 *                the range : MIN_16 <= var2 <= MAX_16.
 *
 *    var3        16 bit short signed integer (Word16) whose value falls in 
 *                the range : MIN_16 <= var3 <= MAX_16.
 *
 *  Outputs :
 *
 *    none
 *
 *  Return Value :
 *
 *    L40_var_out 40 bit long signed integer (Word40) whose value falls in
 *                the range : MIN_40 <= L40_var_out <= MAX_40.
 *
 *****************************************************************************/
__inline Word40 L40_msu( Word40 L40_var1, Word16 var2, Word16 var3) {
   Word40 L40_var_out;

   L40_var_out = L40_mult( var2, var3);
   L40_var_out = L40_sub( L40_var1, L40_var_out);

   #if (WMOPS)
   multiCounter[currCounter].L40_mult--;
   multiCounter[currCounter].L40_sub--;
   multiCounter[currCounter].L40_msu++;
   #endif /* ifdef WMOPS */

   return( L40_var_out);
}   






/*****************************************************************************
 *
 *  Function Name : msu_r40
 *
 *  Purpose :
 *
 *    Multiplies var2 by var3. Shifts left the 40-bit result by 1 and
 *    subtracts the result from L40_var1. Rounds the lower 16 bits of the
 *    40 bit result. Saturates the 40 bit result to 32-bit and returns the
 *    resulting higher 16-bit.
 *    msu_r40( L40_var1, var2, var3)
 *    = round40( L40_msu( L40_var1, var2, var3))
 *    Calls the macro L40_UNDERFLOW_OCCURED() in case of underflow on 40-bit.
 *    Calls the macro L40_OVERFLOW_OCCURED()  in case of overflow  on 40-bit.
 *
 *  Complexity weight : 2
 *
 *  Inputs :
 *
 *    L40_var1    40 bit long signed integer (Word40) whose value falls in the
 *                range : MIN_40 <= L40_var1 <= MAX_40.
 *
 *    var2        16 bit short signed integer (Word16) whose value falls in 
 *                the range : MIN_16 <= var2 <= MAX_16.
 *
 *    var3        16 bit short signed integer (Word16) whose value falls in 
 *                the range : MIN_16 <= var3 <= MAX_16.
 *
 *  Outputs :
 *
 *    none
 *
 *  Return Value :
 *
 *    var_out     16 bit short signed integer (Word16) whose value falls in
 *                the range : MIN_16 <= var_out <= MAX_16.
 *
 *****************************************************************************/
__inline Word16 msu_r40( Word40 L40_var1, Word16 var2, Word16 var3) {
   Word40 L40_var_out;
   Word16 var_out;

   L40_var_out = L40_msu( L40_var1, var2, var3);
   var_out = round40( L40_var_out);

   #if (WMOPS)
   multiCounter[currCounter].L40_msu--;
   multiCounter[currCounter].round40--;
   multiCounter[currCounter].msu_r40++;
   #endif /* ifdef WMOPS */

   return( var_out);
}   










































#endif //_ENH40_H


/* end of file */


⌨️ 快捷键说明

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