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

📄 g729a_acelp_ca.c

📁 DSP上优化的G.729A代码
💻 C
📖 第 1 页 / 共 2 页
字号:
	
	for(i0=0; i0<G729A_L_SUBFR; i0+=G729A_STEP)
	{
		psign = sign_dn;
		if (psign[i0] < 0) psign = sign_dn_inv;
		for(i1=1; i1<G729A_L_SUBFR; i1+=G729A_STEP)
		{
			*p0++ = _smpy(*p0, psign[i1])>>16;
			*p1++ = _smpy(*p1, psign[i1+1])>>16;
			*p2++ = _smpy(*p2, psign[i1+2])>>16;
			*p3++ = _smpy(*p3, psign[i1+3])>>16;
		}
	}
	
	p0 = rri1i2;
	p1 = rri1i3;
	p2 = rri1i4;
	
	for(i1=1; i1<G729A_L_SUBFR; i1+=G729A_STEP)
	{
		psign = sign_dn;
		if (psign[i1] < 0) psign = sign_dn_inv;
		for(i2=2; i2<G729A_L_SUBFR; i2+=G729A_STEP)
		{
			*p0++ = _smpy(*p0, psign[i2])>>16;
			*p1++ = _smpy(*p1, psign[i2+1])>>16;
			*p2++ = _smpy(*p2, psign[i2+2])>>16;
		}
	}
	
	p0 = rri2i3;
	p1 = rri2i4;
	
	for(i2=2; i2<G729A_L_SUBFR; i2+=G729A_STEP)
	{
		psign = sign_dn;
		if (psign[i2] < 0) psign = sign_dn_inv;
		for(i3=3; i3<G729A_L_SUBFR; i3+=G729A_STEP)
		{
			*p0++ = _smpy(*p0, psign[i3])>>16;
			*p1++ = _smpy(*p1, psign[i3+1])>>16;
		}
	}
	
	psk = -1;
	alpk = 1;
	
	ptr_rri0i3_i4 = rri0i3;
	ptr_rri1i3_i4 = rri1i3;
	ptr_rri2i3_i4 = rri2i3;
	ptr_rri3i3_i4 = rri3i3;
	
	ip0=0; ip1=1; ip2=2; ip3=3; ix=0; iy=0; ps=0;
	
	for (track=3, trk=0; track<5; track++, trk++)
	{
		sq = -1;
		alp = 1;
		
		prev_i0  = -1;
		
		for (i=0; i<2; i++)
		{
			max = -1;
			for (j=2; j<G729A_L_SUBFR; j+=G729A_STEP)
			{
				if ((G729Asub_s(dn[j], max) > 0) && (G729Asub_s(prev_i0,j) != 0))
				{
					max = dn[j];
					i0 = j;
				}
			}
			prev_i0 = i0;
			
			j = G729Amult(i0, 6554);       
			p0 = rri2i2 + j;
			
			ps1 = dn[i0];
			alp1 = G729AL_mult(*p0, G729A__1_4);
			
			p0 = ptr_rri2i3_i4 + G729Ashl_s(j, 3);
			p1 = ptr_rri3i3_i4;
			for (i1=track; i1<G729A_L_SUBFR; i1+=G729A_STEP)
			{
				ps2 = _sadd(ps1, dn[i1]);       
				
				alp2 = _sadd(alp1, _smpy(*p0++, G729A__1_2));
				alp2 = _sadd(alp2, _smpy(*p1++, G729A__1_4));
				
				sq2 = _smpy(ps2, ps2)>>16;
				alp_16 = (Word16)(_sadd(alp2, (Word32)0x00008000L)>>16);
				
				s = _ssub(_smpy(alp,sq2), _smpy(sq,alp_16));
				if (s > 0)
				{
					sq = sq2;
					ps = ps2;
					alp = alp_16;
					ix = i0;
					iy = i1;
				}
			}
		}
		
		i0 = ix;
		i1 = iy;
		i1_offset = G729Ashl_s(G729Amult(i1, 6554), 3);        
		
		ps0 = ps;
		alp0 = G729AL_mult(alp, G729A__1_4);
		
		sq = -1;
		alp = 1;
		
		p0 = rri1i2 + G729Amult(i0, 6554);
		p1 = ptr_rri1i3_i4 + G729Amult(i1, 6554);
		p2 = rri1i1;
		p3 = tmp_vect;
		for (i3=1; i3<G729A_L_SUBFR; i3+=G729A_STEP)
		{
			s = _smpy(*p0, G729A__1_4);        p0 += G729A_NB_POS;
			s = _sadd(s, _smpy(*p1, G729A__1_4));      p1 += G729A_NB_POS;
			s = _sadd(s, _smpy(*p2++, G729A__1_8));
			*p3++ = (Word16)(_sadd(s, (Word32)0x00008000L)>>16);
		}
		
		p0 = rri0i2 + G729Amult(i0, 6554);
		p1 = ptr_rri0i3_i4 + G729Amult(i1, 6554);
		p2 = rri0i0;
		p3 = rri0i1;
		
		for (i2=0; i2<G729A_L_SUBFR; i2+=G729A_STEP)
		{
			ps1 = G729Aadd_s(ps0, dn[i2]);         
			
			alp1 = G729AL_mac(alp0, *p0, G729A__1_8);       p0 += G729A_NB_POS;
			alp1 = G729AL_mac(alp1, *p1, G729A__1_8);       p1 += G729A_NB_POS;
			alp1 = G729AL_mac(alp1, *p2++,G729A__1_16);
						
			p4 = tmp_vect;
			
			for (i3=1; i3<G729A_L_SUBFR; i3+=G729A_STEP)
			{
				ps2 = G729Aadd_s(ps1, dn[i3]);       
				
				alp2 = G729AL_mac(alp1, *p3++, G729A__1_8);
				alp2 = G729AL_mac(alp2, *p4++, G729A__1_2);
				
				sq2 = G729Amult(ps2, ps2);
				alp_16 = G729Around(alp2);
				
				s = G729AL_msu(G729AL_mult(alp,sq2),sq,alp_16);
				if (s > 0)
				{
					sq = sq2;
					alp = alp_16;
					ix = i2;
					iy = i3;
				}
			}
		}
	
		s = G729AL_msu(G729AL_mult(alpk,sq),psk,alp);
		if (s > 0)
		{
			psk = sq;
			alpk = alp;
			ip2 = i0;
			ip3 = i1;
			ip0 = ix;
			ip1 = iy;
		}
	
		sq = -1;
		alp = 1;
				
		prev_i0  = -1;
		
		for (i=0; i<2; i++)
		{
			max = -1;
			for (j=track; j<G729A_L_SUBFR; j+=G729A_STEP)
			{
				if ((G729Asub_s(dn[j], max) > 0) && (G729Asub_s(prev_i0,j) != 0))
				{
					max = dn[j];
					i0 = j;
				}
			}
			prev_i0 = i0;
			
			j = G729Amult(i0, 6554);         
			p0 = ptr_rri3i3_i4 + j;
			
			ps1 = dn[i0];
			alp1 = G729AL_mult(*p0, G729A__1_4);
						
			p0 = ptr_rri0i3_i4 + j;
			p1 = rri0i0;
			
			for (i1=0; i1<G729A_L_SUBFR; i1+=G729A_STEP)
			{
				ps2 = G729Aadd_s(ps1, dn[i1]);       
				
				alp2 = G729AL_mac(alp1, *p0, G729A__1_2);       p0 += G729A_NB_POS;
				alp2 = G729AL_mac(alp2, *p1++, G729A__1_4);
				
				sq2 = G729Amult(ps2, ps2);
				alp_16 = G729Around(alp2);
				
				s = G729AL_msu(G729AL_mult(alp,sq2),sq,alp_16);
				if (s > 0)
				{
					sq = sq2;
					ps = ps2;
					alp = alp_16;
					ix = i0;
					iy = i1;
				}
			}
		}
		
		i0 = ix;
		i1 = iy;
		i1_offset = G729Ashl_s(G729Amult(i1, 6554), 3);       
	
		ps0 = ps;
		alp0 = G729AL_mult(alp, G729A__1_4);
		
		sq = -1;
		alp = 1;
				
		p0 = ptr_rri2i3_i4 + G729Amult(i0, 6554);
		p1 = rri0i2 + i1_offset;
		p2 = rri2i2;
		p3 = tmp_vect;
		
		for (i3=2; i3<G729A_L_SUBFR; i3+=G729A_STEP)
		{
			s = G729AL_mult(*p0, G729A__1_4);         p0 += G729A_NB_POS;
			s = G729AL_mac(s, *p1++, G729A__1_4);
			s = G729AL_mac(s, *p2++, G729A__1_8);
			*p3++ = G729Around(s);
		}
				
		p0 = ptr_rri1i3_i4 + G729Amult(i0, 6554);
		p1 = rri0i1 + i1_offset;
		p2 = rri1i1;
		p3 = rri1i2;
		
		for (i2=1; i2<G729A_L_SUBFR; i2+=G729A_STEP)
		{
			ps1 = G729Aadd_s(ps0, dn[i2]);        
			
			alp1 = G729AL_mac(alp0, *p0, G729A__1_8);       p0 += G729A_NB_POS;
			alp1 = G729AL_mac(alp1, *p1++, G729A__1_8);
			alp1 = G729AL_mac(alp1, *p2++, G729A__1_16);
						
			p4 = tmp_vect;
			
			for (i3=2; i3<G729A_L_SUBFR; i3+=G729A_STEP)
			{
				ps2 = G729Aadd_s(ps1, dn[i3]);      
				
				alp2 = G729AL_mac(alp1, *p3++, G729A__1_8);
				alp2 = G729AL_mac(alp2, *p4++, G729A__1_2);
				
				sq2 = G729Amult(ps2, ps2);
				alp_16 = G729Around(alp2);
				
				s = G729AL_msu(G729AL_mult(alp,sq2),sq,alp_16);
				if (s > 0)
				{
					sq = sq2;
					alp = alp_16;
					ix = i2;
					iy = i3;
				}
			}
		}
	
		s = G729AL_msu(G729AL_mult(alpk,sq),psk,alp);
		if (s > 0)
		{
			psk = sq;
			alpk = alp;
			ip3 = i0;
			ip0 = i1;
			ip1 = ix;
			ip2 = iy;
		}
		
		ptr_rri0i3_i4 = rri0i4;
		ptr_rri1i3_i4 = rri1i4;
		ptr_rri2i3_i4 = rri2i4;
		ptr_rri3i3_i4 = rri4i4;
		
  }
    
  i0 = sign_dn[ip0];
  i1 = sign_dn[ip1];
  i2 = sign_dn[ip2];
  i3 = sign_dn[ip3];
  
  for(i=0; i<G729A_L_SUBFR; i++) {
	  cod[i] = 0;
  }
  
  cod[ip0] = G729Ashr_s(i0, 2);          
  cod[ip1] = G729Ashr_s(i1, 2);
  cod[ip2] = G729Ashr_s(i2, 2);
  cod[ip3] = G729Ashr_s(i3, 2);
    
  for (i = 0; i < ip0; i++) y[i] = 0;
  
  if(i0 > 0)
	  for(i=ip0, j=0; i<G729A_L_SUBFR; i++, j++) y[i] = h[j];
	  else
		  for(i=ip0, j=0; i<G729A_L_SUBFR; i++, j++) y[i] = G729Anegate(h[j]);
		  
		  if(i1 > 0)
			  for(i=ip1, j=0; i<G729A_L_SUBFR; i++, j++) y[i] = G729Aadd_s(y[i], h[j]);
			  else
				  for(i=ip1, j=0; i<G729A_L_SUBFR; i++, j++) y[i] = G729Asub_s(y[i], h[j]);
				  
				  if(i2 > 0)
					  for(i=ip2, j=0; i<G729A_L_SUBFR; i++, j++) y[i] = G729Aadd_s(y[i], h[j]);
					  else
						  for(i=ip2, j=0; i<G729A_L_SUBFR; i++, j++) y[i] = G729Asub_s(y[i], h[j]);
						  
						  if(i3 > 0)
							  for(i=ip3, j=0; i<G729A_L_SUBFR; i++, j++) y[i] = G729Aadd_s(y[i], h[j]);
							  else
								  for(i=ip3, j=0; i<G729A_L_SUBFR; i++, j++) y[i] = G729Asub_s(y[i], h[j]);
								  
								  
								  i = 0;
								  if(i0 > 0) i = G729Aadd_s(i, 1);
								  if(i1 > 0) i = G729Aadd_s(i, 2);
								  if(i2 > 0) i = G729Aadd_s(i, 4);
								  if(i3 > 0) i = G729Aadd_s(i, 8);
								  *sign = i;
								  
								  ip0 = G729Amult(ip0, 6554);         
								  ip1 = G729Amult(ip1, 6554);         
								  ip2 = G729Amult(ip2, 6554);       
								  i   = G729Amult(ip3, 6554);         
								  j   = G729Aadd_s(i, G729Ashl_s(i, 2));        
								  j   = G729Asub_s(ip3, G729Aadd_s(j, 3));     
								  ip3 = G729Aadd_s(G729Ashl_s(i, 1), j);
								  
								  i = G729Aadd_s(ip0, G729Ashl_s(ip1, 3));
								  i = G729Aadd_s(i  , G729Ashl_s(ip2, 6));
								  i = G729Aadd_s(i  , G729Ashl_s(ip3, 9));
								  
								  return i;
}

⌨️ 快捷键说明

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