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

📄 g729a_dspfunc.c

📁 DSP上优化的G.729A代码
💻 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 + -