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

📄 g729a_basic_op.c

📁 DSP上优化的G.729A代码
💻 C
字号:
#include "../Common/typedef.h"
#include "../Include/G729A_basic_op.h"

static Word16 G729Asature(Word32 L_var1);
static  Flag G729AOverMax = 0X00007fffL;
static  Flag G729AOverMin = 0xffff8000L;
Flag G729AOverflow =0;

static Word16 G729Asature(Word32 L_var1)
{   
	G729AOverflow = (L_var1 > G729AOverMax) + (L_var1 < G729AOverMin);
	return _ext(_spack2(L_var1, L_var1), 16, 16);
}

Word16 G729Aadd_s(Word16 var1,Word16 var2)
{
	Word32 L_somme;
	
	L_somme = _sadd(var1, var2);
	G729AOverflow = (L_somme > G729AOverMax) + (L_somme < G729AOverMin);
	return _ext(_spack2(L_somme, L_somme), 16, 16);
}

Word16 G729Asub_s(Word16 var1,Word16 var2)
{
	Word32 L_diff;
	
	L_diff = _ssub(var1, var2);
	G729AOverflow = (L_diff > G729AOverMax) + (L_diff < G729AOverMin);
	return _ext(_spack2(L_diff, L_diff), 16, 16);
}

Word16 G729Ashl_s(Word16 var1,Word16 var2)
{
	Word32 L_result;
    L_result = _sshvl((Word32)var1, (Word32)var2);
    G729AOverflow = (L_result > G729AOverMax) + (L_result < G729AOverMin);
    return (Word16)_spack2(L_result, L_result);
}

Word16 G729Ashr_s(Word16 var1,Word16 var2)
{

    Word16 var_out;
	
	if (var2 < 0)
	{
		var_out = G729Ashl_s(var1,-var2);
	}
	else
	{
		if (var2 >= 15)
        {
			var_out = (var1 < 0) ? (Word16)(-1) : (Word16)0;
        }
		else
        {
			if (var1 < 0)
			{
				var_out = ~(( ~var1) >> var2 );
			}
			else
			{
				var_out = var1 >> var2;
			}
        }
	}
	
	return(var_out);
}

Word16 G729Amult(Word16 var1, Word16 var2)
{
	Word16 var_out;
	Word32 L_produit;
	
	L_produit = (Word32)var1 * (Word32)var2;
	
	L_produit = (L_produit & (Word32) 0xffff8000L) >> 15;
	
	if (L_produit & (Word32) 0x00010000L)
		L_produit = L_produit | (Word32) 0xffff0000L;
	
	var_out = G729Asature(L_produit);
	return (var_out);

}

Word32 G729AL_mult(Word16 var1,Word16 var2)
{
	Word32 L_var_out;
	
	L_var_out = (Word32)var1 * (Word32)var2;
	if (L_var_out != (Word32)0x40000000L)
	{
		L_var_out *= 2;
	}
	else
	{
		G729AOverflow = 1;
		L_var_out = G729AMAX_32;
	}
	
	return(L_var_out);
}

Word16 G729Around(Word32 L_var1)
{
	Word16 var_out;
	Word32 L_arrondi;
	
	L_arrondi = G729AL_add(L_var1, (Word32)0x00008000);
	var_out = G729Aextract_h(L_arrondi);
	return(var_out);
}

Word32 G729AL_mac(Word32 L_var3, Word16 var1, Word16 var2)
{
	Word32 L_var_out;
	Word32 L_produit;
	
	L_produit = G729AL_mult(var1,var2);
	L_var_out = G729AL_add(L_var3,L_produit);
	return(L_var_out);
}

Word32 G729AL_msu(Word32 L_var3, Word16 var1, Word16 var2)
{
	Word32 L_var_out;
	Word32 L_produit;
	
	L_produit = G729AL_mult(var1,var2);
	L_var_out = G729AL_sub(L_var3,L_produit);
	return(L_var_out);
}

Word32 G729AL_add(Word32 L_var1, Word32 L_var2)
{
	Word32 L_var_out;
	
	L_var_out = L_var1 + L_var2;
	
	if (((L_var1 ^ L_var2) & G729AMIN_32) == 0)
	{
		if ((L_var_out ^ L_var1) & G729AMIN_32)
        {
			L_var_out = (L_var1 < 0) ? G729AMIN_32 : G729AMAX_32;
			G729AOverflow = 1;
        }
	}
	return(L_var_out);
}

Word32 G729AL_sub(Word32 L_var1, Word32 L_var2)
{
	Word32 L_var_out;
	
	L_var_out = L_var1 - L_var2;
	
	if (((L_var1 ^ L_var2) & G729AMIN_32) != 0)
	{
		if ((L_var_out ^ L_var1) & G729AMIN_32)
        {
			L_var_out = (L_var1 < 0L) ? G729AMIN_32 : G729AMAX_32;
			G729AOverflow = 1;
        }
	}
	return(L_var_out);
}

Word16 G729Amult_r(Word16 var1, Word16 var2)
{
	Word16 var_out;
	Word32 L_produit_arr;
	
	L_produit_arr = (Word32)var1 * (Word32)var2; 
	L_produit_arr += (Word32) 0x00004000;        
	L_produit_arr &= (Word32) 0xffff8000L;
	L_produit_arr >>= 15;                        
	
	if (L_produit_arr & (Word32) 0x00010000L)   
	{
		L_produit_arr |= (Word32) 0xffff0000L;
	}
	
	var_out = G729Asature(L_produit_arr);
	return(var_out);
}

Word32 G729AL_shl(Word32 L_var1, Word16 var2)
{
	Word32 L_var_out;
	
	L_var_out = 0L;
	
	if (var2 <= 0)
	{
		L_var_out = G729AL_shr(L_var1,-var2);
	}
	else
	{
		for(;var2>0;var2--)
        {
			if (L_var1 > (Word32) 0X3fffffffL)
			{
				G729AOverflow = 1;
				L_var_out = G729AMAX_32;
				break;
			}
			else
			{
				if (L_var1 < (Word32) 0xc0000000L)
				{
					G729AOverflow = 1;
					L_var_out = G729AMIN_32;
					break;
				}
			}
			L_var1 *= 2;
			L_var_out = L_var1;
        }
	}
	return(L_var_out);
}

Word32 G729AL_shr(Word32 L_var1, Word16 var2)
{
	Word32 L_var_out;
	
	if (var2 < 0)
	{
		L_var_out = G729AL_shl(L_var1,-var2);
	}
	else
	{
		if (var2 >= 31)
        {
			L_var_out = (L_var1 < 0L) ? -1 : 0;
        }
		else
        {
			if (L_var1<0)
			{
				L_var_out = ~((~L_var1) >> var2);
			}
			else
			{
				L_var_out = L_var1 >> var2;
			}
        }
	}
	return(L_var_out);
}

Word16 G729Ashr_r(Word16 var1, Word16 var2)
{
	Word16 var_out;
	
	if (var2>15)
	{
		var_out = 0;
	}
	else
	{
		var_out = G729Ashr_s(var1,var2);
		
		if (var2 > 0)
        {
			if ((var1 & ((Word16)1 << (var2-1))) != 0)
			{
				var_out++;
			}
        }
	}
	return(var_out);
}

Word32 G729AL_shr_r(Word32 L_var1,Word16 var2)
{
	Word32 L_var_out;
	
	if (var2 > 31)
	{
		L_var_out = 0;
	}
	else
	{
		L_var_out = G729AL_shr(L_var1,var2);
		if (var2 > 0)
        {
			if ( (L_var1 & ( (Word32)1 << (var2-1) )) != 0)
			{
				L_var_out++;
			}
        }
	}
	return(L_var_out);
}


⌨️ 快捷键说明

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