📄 basic_op.c
字号:
* 0x0000 0000 <= swOut <= 0x0000 7fff.
*
* IMPLEMENTATION:
*
* Take the absolute value of the 16 bit input. An input of
* -0x8000 results in a return value of 0x7fff.
*
* KEYWORDS: absolute value, abs
*
*************************************************************************/
Word16 abs_s(Word16 var1)
{
Word16 swOut;
if (var1 == SW_MIN)
{
swOut = SW_MAX;
giOverflow = 1;
}
else
{
if (var1 < 0)
swOut = -var1;
else
swOut = var1;
}
#ifdef WMOPS_FX
counter_fx.abs_s++;
#endif
return (swOut);
}
/***************************************************************************
*
* FUNCTION NAME: add
*
* PURPOSE:
*
* Perform the addition of the two 16 bit input variable with
* saturation.
*
* INPUTS:
*
* var1
* 16 bit short signed integer (Word16) whose value
* falls in the range 0xffff 8000 <= var1 <= 0x0000 7fff.
* var2
* 16 bit short signed integer (Word16) whose value
* falls in the range 0xffff 8000 <= var2 <= 0x0000 7fff.
*
* OUTPUTS:
*
* none
*
* RETURN VALUE:
*
* swOut
* 16 bit short signed integer (Word16) whose value
* falls in the range
* 0xffff 8000 <= swOut <= 0x0000 7fff.
*
* IMPLEMENTATION:
*
* Perform the addition of the two 16 bit input variable with
* saturation.
*
* swOut = var1 + var2
*
* swOut is set to 0x7fff if the operation results in an
* overflow. swOut is set to 0x8000 if the operation results
* in an underflow.
*
* KEYWORDS: add, addition
*
*************************************************************************/
Word16 add(Word16 var1, Word16 var2)
{
Word32 L_sum;
Word16 swOut;
L_sum = (Word32) var1 + var2;
swOut = saturate(L_sum);
#ifdef WMOPS_FX
counter_fx.add++;
#endif
return (swOut);
}
/****************************************************************************
*
* FUNCTION NAME: clearOverflow
*
* PURPOSE:
*
* Clear the overflow flag
*
* INPUTS:
*
* none
*
*
* OUTPUTS: global overflow flag is cleared
* previous value stored in giOldOverflow
*
* RETURN VALUE: previous value of overflow
*
*
* KEYWORDS: saturation, limit, overflow
*
***************************************************************************/
int clearOverflow(void)
{
giOldOverflow = giOverflow;
giOverflow = 0;
#ifdef WMOPS_FX
counter_fx.clearOverflow++;
#endif
return (giOldOverflow);
}
/***************************************************************************
*
* FUNCTION NAME: divide_s
*
* PURPOSE:
*
* Divide var1 by var2. Note that both must be positive, and
* var1 >= var2. The output is set to 0 if invalid input is
* provided.
*
* INPUTS:
*
* var1
* 16 bit short signed integer (Word16) whose value
* falls in the range 0xffff 8000 <= var1 <= 0x0000 7fff.
* var2
* 16 bit short signed integer (Word16) whose value
* falls in the range 0xffff 8000 <= var2 <= 0x0000 7fff.
*
* OUTPUTS:
*
* none
*
* RETURN VALUE:
*
* swOut
* 16 bit short signed integer (Word16) whose value
* falls in the range
* 0xffff 8000 <= swOut <= 0x0000 7fff.
*
* IMPLEMENTATION:
*
* In the case where var1==var2 the function returns 0x7fff. The output
* is undefined for invalid inputs. This implementation returns zero
* and issues a warning via stdio if invalid input is presented.
*
* KEYWORDS: divide
*
*************************************************************************/
Word16 divide_s(Word16 var1, Word16 var2)
{
Word32 L_div;
Word16 swOut;
#ifdef WMOPS_FX
counter_fx.divide_s++;
#endif
if (var1 < 0 || var2 < 0 || var1 > var2)
{
/* undefined output for invalid input into divide_s */
return (0);
}
if (var1 == var2)
{
giOverflow = 1;
return (0x7fff);
}
L_div = ((0x00008000L * (Word32) var1) / (Word32) var2);
swOut = saturate(L_div);
return (swOut);
}
/***************************************************************************
*
* FUNCTION NAME: extract_h
*
* PURPOSE:
*
* Extract the 16 MS bits of a 32 bit Word32. Return the 16 bit
* number as a Word16. This is used as a "truncation" of a fractional
* number.
*
* INPUTS:
*
* L_var1
* 32 bit long signed integer (Word32) whose value
* falls in the range
* 0x8000 0000 <= L_var1 <= 0x7fff ffff.
*
* OUTPUTS:
*
* none
*
* RETURN VALUE:
*
* swOut
* 16 bit short signed integer (Word16) whose value
* falls in the range
* 0xffff 8000 <= swOut <= 0x0000 7fff.
*
* IMPLEMENTATION:
*
* KEYWORDS: assign, truncate
*
*************************************************************************/
Word16 extract_h(Word32 L_var1)
{
Word16 var2;
var2 = (Word16) (0x0000ffffL & (L_var1 >> 16));
#ifdef WMOPS_FX
counter_fx.extract_h++;
#endif
return (var2);
}
/***************************************************************************
*
* FUNCTION NAME: extract_l
*
* PURPOSE:
*
* Extract the 16 LS bits of a 32 bit Word32. Return the 16 bit
* number as a Word16. The upper portion of the input Word32
* has no impact whatsoever on the output.
*
* INPUTS:
*
* L_var1
* 32 bit long signed integer (Word32) whose value
* falls in the range
* 0x8000 0000 <= L_var1 <= 0x7fff ffff.
*
* OUTPUTS:
*
* none
*
* RETURN VALUE:
*
* swOut
* 16 bit short signed integer (Word16) whose value
* falls in the range
* 0xffff 8000 <= swOut <= 0x0000 7fff.
*
*
* KEYWORDS: extract, assign
*
*************************************************************************/
Word16 extract_l(Word32 L_var1)
{
Word16 var2;
var2 = (Word16) (0x0000ffffL & L_var1);
#ifdef WMOPS_FX
counter_fx.extract_l++;
#endif
return (var2);
}
/****************************************************************************
*
* FUNCTION NAME: isOverflow
*
* PURPOSE:
*
* Check to see whether an overflow/saturation/limiting has occurred
*
* INPUTS:
*
* none
*
*
* OUTPUTS: none
*
* RETURN VALUE: 1 if overflow has been flagged
* 0 otherwise
*
* KEYWORDS: saturation, limit, overflow
*
***************************************************************************/
int isOverflow(void)
{
return (giOverflow);
}
/***************************************************************************
*
* FUNCTION NAME: L_abs
*
* PURPOSE:
*
* Take the absolute value of the 32 bit input. An input of
* -0x8000 0000 results in a return value of 0x7fff ffff.
*
* INPUTS:
*
* L_var1
* 32 bit long signed integer (Word32) whose value
* falls in the range
* 0x8000 0000 <= L_var1 <= 0x7fff ffff.
*
* OUTPUTS:
*
* none
*
* RETURN VALUE:
*
* L_Out
* 32 bit long signed integer (Word32) whose value
* falls in the range
* 0x8000 0000 <= L_var1 <= 0x7fff ffff.
*
*
*
* KEYWORDS: absolute value, abs
*
*************************************************************************/
Word32 L_abs(Word32 L_var1)
{
Word32 L_Out;
if (L_var1 == LW_MIN)
{
L_Out = LW_MAX;
giOverflow = 1;
}
else
{
if (L_var1 < 0)
L_Out = -L_var1;
else
L_Out = L_var1;
}
#ifdef WMOPS_FX
counter_fx.L_abs++;
#endif
return (L_Out);
}
/***************************************************************************
*
* FUNCTION NAME: L_add
*
* PURPOSE:
*
* Perform the addition of the two 32 bit input variables with
* saturation.
*
* INPUTS:
*
* L_var1
* 32 bit long signed integer (Word32) whose value
* falls in the range
* 0x8000 0000 <= L_var1 <= 0x7fff ffff.
* L_var2
* 32 bit long signed integer (Word32) whose value
* falls in the range
* 0x8000 0000 <= L_var2 <= 0x7fff ffff.
*
* OUTPUTS:
*
* none
*
* RETURN VALUE:
*
* L_Out
* 32 bit long signed integer (Word32) whose value
* falls in the range
* 0x8000 0000 <= L_var1 <= 0x7fff ffff.
*
* IMPLEMENTATION:
*
* Perform the addition of the two 32 bit input variables with
* saturation.
*
* L_Out = L_var1 + L_var2
*
* L_Out is set to 0x7fff ffff if the operation results in an
* overflow. L_Out is set to 0x8000 0000 if the operation
* results in an underflow.
*
* KEYWORDS: add, addition
*
*************************************************************************/
Word32 L_add(Word32 L_var1, Word32 L_var2)
{
Word32 L_Sum;
double dSum;
dSum = (double) L_var1 + (double) L_var2;
L_Sum = L_var1 + L_var2;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -