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

📄 g729a_acelp_ca.c

📁 在DSP上实现的G.729优化代码 编译过的 大家快来下载啊
💻 C
📖 第 1 页 / 共 2 页
字号:

#include "../Common/typedef.h"
#include "../Include/G729A_basic_op.h"
#include "../Include/G729A_ld8a.h"

static void G729ACor_h(Word16 *H, Word16 *rr );    
static Word16 G729AD4i40_17_fast(Word16 dn[], Word16 *rr, Word16 h[], Word16 cod[], Word16 y[], Word16 *sign);

Word16  G729AACELP_Code_A(Word16 x[], Word16 h[], Word16 T0, Word16 pitch_sharp, Word16 code[], Word16 y[], Word16 *sign)
{
	Word16 i, index, sharp;
	Word16 Dn[G729A_L_SUBFR];
	Word16 rr[G729A_DIM_RR];
	
	sharp = G729Ashl_s(pitch_sharp, 1);          
	if (T0 < G729A_L_SUBFR)
		for (i = T0; i < G729A_L_SUBFR; i++)     
			h[i] = G729Aadd_s(h[i], G729Amult(h[i-T0], sharp));
		
		G729ACor_h(h, rr);
		
		G729ACor_h_X(h, x, Dn);
		
		index = G729AD4i40_17_fast(Dn, rr, h, code, y, sign);
		
		if(T0 < G729A_L_SUBFR)
			for (i = T0; i < G729A_L_SUBFR; i++)    
				code[i] = G729Aadd_s(code[i], G729Amult(code[i-T0], sharp));
			
			return index;
}

static void G729ACor_h(Word16 *H, Word16 *rr)
{
	Word16 *rri0i0, *rri1i1, *rri2i2, *rri3i3, *rri4i4;
	Word16 *rri0i1, *rri0i2, *rri0i3, *rri0i4;
	Word16 *rri1i2, *rri1i3, *rri1i4;
	Word16 *rri2i3, *rri2i4;
	
	Word16 *p0, *p1, *p2, *p3, *p4;
	
	Word16 *ptr_hd, *ptr_hf, *ptr_h1, *ptr_h2;
	Word32 cor;
	Word16 i, k, ldec, l_fin_sup, l_fin_inf;
	Word16 h[G729A_L_SUBFR];
	Word32 L_result;
	
	cor = 0;

	if(G729Asub_s(G729Aextract_h(cor),32000) > 0)
	{
		for(i=0; i<G729A_L_SUBFR; i++) 
		{
			L_result = _sshvr((Word32)H[i], 1);
            h[i] = (Word16)_spack2(L_result, L_result);
		}
	}
	else
	{
		k = G729Anorm_l(cor);
		k = G729Ashr_s(k, 1);
		
		for(i=0; i<G729A_L_SUBFR; i++) 
		{
			L_result = _sshl((Word32)H[i], k);
            h[i] = (Word16)_spack2(L_result, L_result);
		}
	}

	rri0i0 = rr;
	rri1i1 = rri0i0 + G729A_NB_POS;
	rri2i2 = rri1i1 + G729A_NB_POS;
	rri3i3 = rri2i2 + G729A_NB_POS;
	rri4i4 = rri3i3 + G729A_NB_POS;
	rri0i1 = rri4i4 + G729A_NB_POS;
	rri0i2 = rri0i1 + G729A_MSIZE;
	rri0i3 = rri0i2 + G729A_MSIZE;
	rri0i4 = rri0i3 + G729A_MSIZE;
	rri1i2 = rri0i4 + G729A_MSIZE;
	rri1i3 = rri1i2 + G729A_MSIZE;
	rri1i4 = rri1i3 + G729A_MSIZE;
	rri2i3 = rri1i4 + G729A_MSIZE;
	rri2i4 = rri2i3 + G729A_MSIZE;
	
	p0 = rri0i0 + G729A_NB_POS-1;   
	p1 = rri1i1 + G729A_NB_POS-1;
	p2 = rri2i2 + G729A_NB_POS-1;
	p3 = rri3i3 + G729A_NB_POS-1;
	p4 = rri4i4 + G729A_NB_POS-1;
	
	ptr_h1 = h;
	cor    = 0;

	for(i=0;  i<G729A_NB_POS; i++)
	{
		cor = _sadd(cor, _smpy(*ptr_h1, *ptr_h1)); ptr_h1++;
		*p4-- = cor>>16;
		
		cor = _sadd(cor, _smpy(*ptr_h1, *ptr_h1)); ptr_h1++;
		*p3-- = cor>>16;
		
		cor = _sadd(cor, _smpy(*ptr_h1, *ptr_h1)); ptr_h1++;
		*p2-- = cor>>16;
		
		cor = _sadd(cor, _smpy(*ptr_h1, *ptr_h1)); ptr_h1++;
		*p1-- = cor>>16;
		
		cor = _sadd(cor, _smpy(*ptr_h1, *ptr_h1)); ptr_h1++;
		*p0-- = cor>>16;
	}
	
	l_fin_sup = G729A_MSIZE-1;
	l_fin_inf = l_fin_sup-(Word16)1;
	ldec = G729A_NB_POS+1;
	
	ptr_hd = h;
	ptr_hf = ptr_hd + 1;
	
	for(k=0; k<G729A_NB_POS; k++) 
	{
		
		p3 = rri2i3 + l_fin_sup;
		p2 = rri1i2 + l_fin_sup;
		p1 = rri0i1 + l_fin_sup;
		p0 = rri0i4 + l_fin_inf;
		
		cor = 0;
		ptr_h1 = ptr_hd;
		ptr_h2 =  ptr_hf;

		for(i=k+(Word16)1; i<G729A_NB_POS; i++ ) 
		{			
			cor = _sadd(cor, _smpy(*ptr_h1, *ptr_h2)); ptr_h1++; ptr_h2++;
			cor = _sadd(cor, _smpy(*ptr_h1, *ptr_h2)); ptr_h1++; ptr_h2++;
			*p3 = G729Aextract_h(cor);
			
			cor = _sadd(cor, _smpy(*ptr_h1, *ptr_h2)); ptr_h1++; ptr_h2++;
			*p2 = G729Aextract_h(cor);
			
			cor = _sadd(cor, _smpy(*ptr_h1, *ptr_h2)); ptr_h1++; ptr_h2++;
			*p1 = G729Aextract_h(cor);
			
			cor = _sadd(cor, _smpy(*ptr_h1, *ptr_h2)); ptr_h1++; ptr_h2++;
			*p0 = G729Aextract_h(cor);
			
			p3 -= ldec;
			p2 -= ldec;
			p1 -= ldec;
			p0 -= ldec;
		}
		cor = _sadd(cor, _smpy(*ptr_h1, *ptr_h2)); ptr_h1++; ptr_h2++;
		cor = _sadd(cor, _smpy(*ptr_h1, *ptr_h2)); ptr_h1++; ptr_h2++;
		*p3 = cor>>16;
		
		cor = _sadd(cor, _smpy(*ptr_h1, *ptr_h2)); ptr_h1++; ptr_h2++;
		*p2 = cor>>16;
		
		cor = _sadd(cor, _smpy(*ptr_h1, *ptr_h2)); ptr_h1++; ptr_h2++;
		*p1 = cor>>16;
		
		l_fin_sup -= G729A_NB_POS;
		l_fin_inf--;
		ptr_hf += G729A_STEP;
	}
	
	ptr_hd = h;
	ptr_hf = ptr_hd + 2;
	l_fin_sup = G729A_MSIZE-1;
	l_fin_inf = l_fin_sup-(Word16)1;
	for(k=0; k<G729A_NB_POS; k++) 
	{
		
		p4 = rri2i4 + l_fin_sup;
		p3 = rri1i3 + l_fin_sup;
		p2 = rri0i2 + l_fin_sup;
		p1 = rri1i4 + l_fin_inf;
		p0 = rri0i3 + l_fin_inf;
		
		cor = 0;
		ptr_h1 = ptr_hd;
		ptr_h2 =  ptr_hf;

		for(i=k+(Word16)1; i<G729A_NB_POS; i++ ) 
		{			
			cor = _sadd(cor, _smpy(*ptr_h1, *ptr_h2)); ptr_h1++; ptr_h2++;
			*p4 = cor>>16;
			
			cor = _sadd(cor, _smpy(*ptr_h1, *ptr_h2)); ptr_h1++; ptr_h2++;
			*p3 = cor>>16;
			
			cor = _sadd(cor, _smpy(*ptr_h1, *ptr_h2)); ptr_h1++; ptr_h2++;
			*p2 = cor>>16;
			
			cor = _sadd(cor, _smpy(*ptr_h1, *ptr_h2)); ptr_h1++; ptr_h2++;
			*p1 = cor>>16;
			
			cor = _sadd(cor, _smpy(*ptr_h1, *ptr_h2)); ptr_h1++; ptr_h2++;
			*p0 = cor>>16;
			
			p4 -= ldec;
			p3 -= ldec;
			p2 -= ldec;
			p1 -= ldec;
			p0 -= ldec;
		}
		cor = _sadd(cor, _smpy(*ptr_h1, *ptr_h2)); ptr_h1++; ptr_h2++;
		*p4 = cor>>16;
		
		cor = _sadd(cor, _smpy(*ptr_h1, *ptr_h2)); ptr_h1++; ptr_h2++;
		*p3 = cor>>16;
		
		cor = _sadd(cor, _smpy(*ptr_h1, *ptr_h2)); ptr_h1++; ptr_h2++;
		*p2 = cor>>16;
		
		l_fin_sup -= G729A_NB_POS;
		l_fin_inf--;
		ptr_hf += G729A_STEP;
	}
	
	ptr_hd = h;
	ptr_hf = ptr_hd + 3;
	l_fin_sup = G729A_MSIZE-1;
	l_fin_inf = l_fin_sup-(Word16)1;
	for(k=0; k<G729A_NB_POS; k++) 
	{		
		p4 = rri1i4 + l_fin_sup;
		p3 = rri0i3 + l_fin_sup;
		p2 = rri2i4 + l_fin_inf;
		p1 = rri1i3 + l_fin_inf;
		p0 = rri0i2 + l_fin_inf;
		
		ptr_h1 = ptr_hd;
		ptr_h2 =  ptr_hf;
		cor = 0;
		for(i=k+(Word16)1; i<G729A_NB_POS; i++ ) 
		{			
			cor = _sadd(cor, _smpy(*ptr_h1, *ptr_h2)); ptr_h1++; ptr_h2++;
			*p4 = cor>>16;
			
			cor = _sadd(cor, _smpy(*ptr_h1, *ptr_h2)); ptr_h1++; ptr_h2++;
			*p3 = cor>>16;
			
			cor = _sadd(cor, _smpy(*ptr_h1, *ptr_h2)); ptr_h1++; ptr_h2++;
			*p2 = cor>>16;
			
			cor = _sadd(cor, _smpy(*ptr_h1, *ptr_h2)); ptr_h1++; ptr_h2++;
			*p1 = cor>>16;
			
			cor = _sadd(cor, _smpy(*ptr_h1, *ptr_h2)); ptr_h1++; ptr_h2++;
			*p0 = cor>>16;
			
			p4 -= ldec;
			p3 -= ldec;
			p2 -= ldec;
			p1 -= ldec;
			p0 -= ldec;
		}
		cor = _sadd(cor, _smpy(*ptr_h1, *ptr_h2)); ptr_h1++; ptr_h2++;
		*p4 = cor>>16;
		
		cor = _sadd(cor, _smpy(*ptr_h1, *ptr_h2)); ptr_h1++; ptr_h2++;
		*p3 = cor>>16;
		
		l_fin_sup -= G729A_NB_POS;
		l_fin_inf--;
		ptr_hf += G729A_STEP;
	}
	
	ptr_hd = h;
	ptr_hf = ptr_hd + 4;
	l_fin_sup = G729A_MSIZE-1;
	l_fin_inf = l_fin_sup-(Word16)1;
	for(k=0; k<G729A_NB_POS; k++) 
	{		
		p3 = rri0i4 + l_fin_sup;
		p2 = rri2i3 + l_fin_inf;
		p1 = rri1i2 + l_fin_inf;
		p0 = rri0i1 + l_fin_inf;
		
		ptr_h1 = ptr_hd;
		ptr_h2 =  ptr_hf;
		cor = 0;
		for(i=k+(Word16)1; i<G729A_NB_POS; i++ ) 
		{			
			cor = _sadd(cor, _smpy(*ptr_h1, *ptr_h2)); ptr_h1++; ptr_h2++;
			*p3 = cor>>16;
			
			cor = _sadd(cor, _smpy(*ptr_h1, *ptr_h2)); ptr_h1++; ptr_h2++;
			cor = _sadd(cor, _smpy(*ptr_h1, *ptr_h2)); ptr_h1++; ptr_h2++;
			*p2 = cor>>16;
			
			cor = _sadd(cor, _smpy(*ptr_h1, *ptr_h2)); ptr_h1++; ptr_h2++;
			*p1 = cor>>16;
			
			cor = _sadd(cor, _smpy(*ptr_h1, *ptr_h2)); ptr_h1++; ptr_h2++;
			*p0 = cor>>16;
			
			p3 -= ldec;
			p2 -= ldec;
			p1 -= ldec;
			p0 -= ldec;
		}
		cor = _sadd(cor, _smpy(*ptr_h1, *ptr_h2)); ptr_h1++; ptr_h2++;
		*p3 = cor>>16;
		
		l_fin_sup -= G729A_NB_POS;
		l_fin_inf--;
		ptr_hf += G729A_STEP;
	}
	return;
}

static Word16 G729AD4i40_17_fast(Word16 dn[], Word16 rr[], Word16 h[], Word16 cod[], Word16 y[], Word16 *sign)
{
	Word16 i0, i1, i2, i3, ip0, ip1, ip2, ip3;
	Word16 i, j, ix, iy, track, trk, max;
	Word16 prev_i0, i1_offset;
	Word16 psk, ps, ps0, ps1, ps2, sq, sq2;
	Word16 alpk, alp, alp_16;
	Word32 s, alp0, alp1, alp2;
	Word16 *p0, *p1, *p2, *p3, *p4;
	Word16 sign_dn[G729A_L_SUBFR], sign_dn_inv[G729A_L_SUBFR], *psign;
	Word16 tmp_vect[G729A_NB_POS];
	Word16 *rri0i0, *rri1i1, *rri2i2, *rri3i3, *rri4i4;
	Word16 *rri0i1, *rri0i2, *rri0i3, *rri0i4;
	Word16 *rri1i2, *rri1i3, *rri1i4;
	Word16 *rri2i3, *rri2i4;
	
	Word16  *ptr_rri0i3_i4;
	Word16  *ptr_rri1i3_i4;
	Word16  *ptr_rri2i3_i4;
	Word16  *ptr_rri3i3_i4;
	
	rri0i0 = rr;
	rri1i1 = rri0i0 + G729A_NB_POS;
	rri2i2 = rri1i1 + G729A_NB_POS;
	rri3i3 = rri2i2 + G729A_NB_POS;
	rri4i4 = rri3i3 + G729A_NB_POS;
	rri0i1 = rri4i4 + G729A_NB_POS;
	rri0i2 = rri0i1 + G729A_MSIZE;
	rri0i3 = rri0i2 + G729A_MSIZE;
	rri0i4 = rri0i3 + G729A_MSIZE;
	rri1i2 = rri0i4 + G729A_MSIZE;
	rri1i3 = rri1i2 + G729A_MSIZE;
	rri1i4 = rri1i3 + G729A_MSIZE;
	rri2i3 = rri1i4 + G729A_MSIZE;
	rri2i4 = rri2i3 + G729A_MSIZE;

	for (i=0; i<G729A_L_SUBFR; i++)
	{
		sign_dn[i] = (dn[i] >= 0) ? G729AMAX_16 : G729AMIN_16;
		sign_dn_inv[i] = (dn[i] >= 0) ? G729AMIN_16 : G729AMAX_16;
		dn[i] = (dn[i] >= 0) ? dn[i] : G729Anegate(dn[i]);
	}
	
	p0 = rri0i1;
	p1 = rri0i2;
	p2 = rri0i3;
	p3 = rri0i4;

⌨️ 快捷键说明

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