📄 g729a_dspfunc.c
字号:
#include "../Common/typedef.h"
#include "../Include/G729A_basic_op.h"
#include "../Include/G729A_ld8a.h"
#include "../Include/G729A_tab_ld8a.h"
Word32 G729APow2(Word16 exponent, Word16 fraction)
{
Word16 exp, i, a, tmp;
Word32 L_x;
Word32 L_var_out;
L_x = _smpy(fraction, 32);
i = G729Aextract_h(L_x);
L_x = _sshvr(L_x, 1);
a = (Word16)L_x;
a = a & (Word16)0x7fff;
L_x = (Word32)G729A_tabpow[i] << 16;
tmp = _ssub(G729A_tabpow[i], G729A_tabpow[i+1]);
L_x = _ssub(L_x, _smpy(tmp, a));
exp = _ssub(30, exponent);
if (exp > 31)
{
return 0;
}
L_var_out = _sshvr(L_x, exp);
if (exp > 0)
{
if ( (L_x & ( (Word32)1 << (exp-1) )) != 0)
{
L_var_out++;
}
}
return(L_var_out);
}
void G729ALog2(Word32 L_x, Word16 *exponent, Word16 *fraction)
{
Word16 exp, i, a, tmp;
Word32 L_y;
if( L_x <= (Word32)0 )
{
*exponent = 0;
*fraction = 0;
return;
}
exp = G729Anorm_l(L_x);
L_x = _sshl(L_x, exp );
*exponent = _ssub(30, exp);
L_x = _sshvr(L_x, 9);
i = L_x >> 16;
L_x = _sshvr(L_x, 1);
a = (Word16)L_x;
a = a & (Word16)0x7fff;
i = _ssub(i, 32);
L_y = (Word32)G729A_tablog[i]<<16;
tmp = _ssub(G729A_tablog[i], G729A_tablog[i+1]);
L_y = _ssub(L_y, _smpy(tmp, a));
*fraction = L_y>>16;
return;
}
Word32 G729AInv_sqrt(Word32 L_x)
{
Word16 exp, i, a, tmp;
Word32 L_y;
if( L_x <= (Word32)0) return ( (Word32)0x3fffffffL);
exp = G729Anorm_l(L_x);
L_x = _sshl(L_x, exp );
exp = _ssub(30, exp);
if( (exp & 1) == 0 )
L_x = _sshvr(L_x, 1);
exp = _sshvr(exp, 1);
exp = _sadd(exp, 1);
L_x = _sshvr(L_x, 9);
i = L_x>>16;
L_x = _sshvr(L_x, 1);
a = (Word16)L_x;
a = a & (Word16)0x7fff;
i = _ssub(i, 16);
L_y = (Word32)G729A_tabsqr[i]<<16;
tmp = _ssub(G729A_tabsqr[i], G729A_tabsqr[i+1]);
L_y = _ssub(L_y, _smpy(tmp, a));
L_y = _sshvr(L_y, exp);
return(L_y);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -