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

📄 g729a_pitch_a.c

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

Word16 G729APitch_ol_fast(Word16 signal[], Word16   pit_max, Word16   L_frame)
{
	Word16  i, j;
	Word16  max1, max2, max3;
	Word16  max_h, max_l, ener_h, ener_l;
	Word16  T1, T2, T3;
	Word16  *p, *p1;
	Word32  max, sum, L_temp;
	
	Word16 scaled_signal[G729A_L_FRAME+G729A_PIT_MAX];
	Word16 *scal_sig;
	
	scal_sig = &scaled_signal[pit_max];
	
	G729AOverflow = 0;
	sum = 0;
	
	for(i= -pit_max; i< L_frame; i+=2)
		sum = G729AL_mac(sum, signal[i], signal[i]);
	
	if(G729AOverflow == 1)
	{
		for(i=-pit_max; i<L_frame; i++)
		{
			scal_sig[i] = G729Ashr_s(signal[i], 3);
		}
	}
	else {
		L_temp = G729AL_sub(sum, (Word32)1048576L);
		if ( L_temp < (Word32)0 )  
		{
			for(i=-pit_max; i<L_frame; i++)
			{
				scal_sig[i] = G729Ashl_s(signal[i], 3);
			}
		}
		else
		{
			for(i=-pit_max; i<L_frame; i++)
			{
				scal_sig[i] = signal[i];
			}
		}
	}
		
    max = G729AMIN_32;
    T1  = 20;    
    for (i = 20; i < 40; i++) {
        p  = scal_sig;
        p1 = &scal_sig[-i];
        sum = 0;
        for (j=0; j<L_frame; j+=2, p+=2, p1+=2)
            sum = _sadd(sum, _smpy(*p, *p1));
        L_temp = _ssub(sum, max);
        if (L_temp > 0) { max = sum; T1 = i;   }
    }
	
    sum = 1;                   
    p = &scal_sig[-T1];
    for(i=0; i<L_frame; i+=2, p+=2)
        sum = _sadd(sum, _smpy(*p, *p));
	
    sum = G729AInv_sqrt(sum);             
    max_h = max >> 16;
	max_l = (Word16)_ssub(_sshvr(max, 1), _smpy(max_h, 16384));
	
	ener_h = sum >> 16;
	ener_l = (Word16)_ssub(_sshvr(sum, 1), _smpy(ener_h, 16384));
	
	sum = _smpy(max_h, ener_h);
	sum = _sadd(sum, _smpy(_smpy(max_h, ener_l)>>16, 1));
	sum = _sadd(sum, _smpy(_smpy(max_l, ener_h)>>16, 1));
	max1 = (Word16)sum;
	
    max = G729AMIN_32;
    T2  = 40;    
    for (i = 40; i < 80; i++) 
    {
        p  = scal_sig;
        p1 = &scal_sig[-i];
        sum = 0;
        for (j=0; j<L_frame; j+=2, p+=2, p1+=2)
            sum = _sadd(sum, _smpy(*p, *p1));
        L_temp = _ssub(sum, max);
        if (L_temp > 0) { max = sum; T2 = i;   }
    }
	
    sum = 1;                   
    p = &scal_sig[-T2];
	for(i=0; i<L_frame; i+=2, p+=2)
        sum = _sadd(sum, _smpy(*p, *p));
	
    sum = G729AInv_sqrt(sum);           
	max_h = max >> 16;
	max_l = (Word16)_ssub(_sshvr(max, 1), _smpy(max_h, 16384));
	
	ener_h = sum >> 16;
	ener_l = (Word16)_ssub(_sshvr(sum, 1), _smpy(ener_h, 16384));
	
    sum = _smpy(max_h, ener_h);
	sum = _sadd(sum, _smpy(_smpy(max_h, ener_l)>>16, 1));
	sum = _sadd(sum, _smpy(_smpy(max_l, ener_h)>>16, 1));
	max2 = (Word16)sum;
	
    max = G729AMIN_32;
    T3  = 80;    
    for (i = 80; i < 143; i+=2) 
    {
        p  = scal_sig;
        p1 = &scal_sig[-i];
        sum = 0;
        for (j=0; j<L_frame; j+=2, p+=2, p1+=2)
            sum = _sadd(sum, _smpy(*p, *p1));
        L_temp = _ssub(sum, max);
        if (L_temp > 0) { max = sum; T3 = i;   }
    }
	
	i = T3;
	p  = scal_sig;
	p1 = &scal_sig[-(i+1)];
	sum = 0;
	for (j=0; j<L_frame; j+=2, p+=2, p1+=2)
		sum = _sadd(sum, _smpy(*p, *p1));
	L_temp = _ssub(sum, max);
	if (L_temp > 0) { max = sum; T3 = i+(Word16)1;   }
	
	p  = scal_sig;
	p1 = &scal_sig[-(i-1)];
	sum = 0;
	for (j=0; j<L_frame; j+=2, p+=2, p1+=2)
		sum = _sadd(sum, _smpy(*p, *p1));
	L_temp = _ssub(sum, max);
	if (L_temp > 0) { max = sum; T3 = i-(Word16)1;   }
	
    sum = 1;                   
    p = &scal_sig[-T3];
	for(i=0; i<L_frame; i+=2, p+=2)
        sum = _sadd(sum, _smpy(*p, *p));
    sum = G729AInv_sqrt(sum);            
    max_h = max >> 16;
	max_l = (Word16)_ssub(_sshvr(max, 1), _smpy(max_h, 16384));
	
	ener_h = sum >> 16;
	ener_l = (Word16)_ssub(_sshvr(sum, 1), _smpy(ener_h, 16384));
	
    sum = _smpy(max_h, ener_h);
	sum = _sadd(sum, _smpy(_smpy(max_h, ener_l)>>16, 1));
	sum = _sadd(sum, _smpy(_smpy(max_l, ener_h)>>16, 1));
	max3 = (Word16)sum;
    i = G729Asub_s(G729Ashl_s(T2,1), T3);
    j = G729Asub_s(G729Aabs_s(i), 5);
    if(j < 0)
		max2 = G729Aadd_s(max2, G729Ashr_s(max3, 2));
		
    i = G729Aadd_s(i, T2);
    j = G729Asub_s(G729Aabs_s(i), 7);
    if(j < 0)
		max2 = G729Aadd_s(max2, G729Ashr_s(max3, 2));
	
    i = G729Asub_s(G729Ashl_s(T1,1), T2);
    j = G729Asub_s(G729Aabs_s(i), 5);
    if(j < 0)
		max1 = G729Aadd_s(max1, G729Amult(max2, 6554));
	
    i = G729Aadd_s(i, T1);
    j = G729Asub_s(G729Aabs_s(i), 7);
    if(j < 0)
		max1 = G729Aadd_s(max1, G729Amult(max2, 6554));
		
    if( G729Asub_s(max1, max2) < 0 ) {max1 = max2; T1 = T2;  }
    if( G729Asub_s(max1, max3) <0 )  {T1 = T3; }
	
    return T1;
}

Word32 G729ADot_Product(Word16   x[], Word16   y[], Word16   lg)
{
	Word16 i;
	Word32 sum;
	
	sum = 0;
	for(i=0; i<lg; i++)
		sum = _sadd(sum, _smpy(x[i], y[i]));
	
	return sum;
}

Word16 G729APitch_fr3_fast(Word16 exc[], Word16 xn[], Word16 h[], Word16 L_subfr, Word16 t0_min, Word16 t0_max, Word16 i_subfr, Word16 *pit_frac)
{
	Word16 t, t0;
	Word16 Dn[G729A_L_SUBFR];
	Word16 exc_tmp[G729A_L_SUBFR];
	Word32 max, corr, L_temp;
	
	G729ACor_h_X(h, xn, Dn);
	
	max = G729AMIN_32;
	t0 = t0_min; 
	
	for(t=t0_min; t<=t0_max; t++)
	{
		corr = G729ADot_Product(Dn, &exc[-t], L_subfr);
		L_temp = G729AL_sub(corr, max);
		if(L_temp > 0) {max = corr; t0 = t;  }
	}
	
	G729APred_lt_3(exc, t0, 0, L_subfr);
	max = G729ADot_Product(Dn, exc, L_subfr);
	*pit_frac = 0;
	
	if( (i_subfr == 0) && (G729Asub_s(t0, 84) > 0) )
		return t0;
	
	G729ACopy(exc, exc_tmp, L_subfr);
	
	G729APred_lt_3(exc, t0, -1, L_subfr);
	corr = G729ADot_Product(Dn, exc, L_subfr);
	L_temp = G729AL_sub(corr, max);
	if(L_temp > 0) 
	{
		max = corr;
		*pit_frac = -1;
		G729ACopy(exc, exc_tmp, L_subfr);
	}
	
	G729APred_lt_3(exc, t0, 1, L_subfr);
	corr = G729ADot_Product(Dn, exc, L_subfr);
	L_temp = G729AL_sub(corr, max);
	if(L_temp > 0) {
		max = corr;
		*pit_frac =  1;
	}
	else
		G729ACopy(exc_tmp, exc, L_subfr);
	
	return t0;
}

Word16 G729AG_pitch(Word16 xn[], Word16 y1[], Word16 g_coeff[], Word16 L_subfr)
{
	Word16 i;
	Word16 xy, yy, exp_xy, exp_yy, gain;
	Word32 s;
	
	Word16 scaled_y1[G729A_L_SUBFR];
	
	for(i=0; i<L_subfr; i++)
		scaled_y1[i] = G729Ashr_s(y1[i], 2);
	
	G729AOverflow = 0;
	s = 1;                    
	for(i=0; i<L_subfr; i++)
		s = G729AL_mac(s, y1[i], y1[i]);
	
	if (G729AOverflow == 0) 
	{
		exp_yy = G729Anorm_l(s);
		yy     = G729Around( G729AL_shl(s, exp_yy) );
	}
	else 
	{
		s = 1;                  
		for(i=0; i<L_subfr; i++)
			s = G729AL_mac(s, scaled_y1[i], scaled_y1[i]);
		exp_yy = G729Anorm_l(s);
		yy     = G729Around( G729AL_shl(s, exp_yy) );
		exp_yy = G729Asub_s(exp_yy, 4);
	}
	
	G729AOverflow = 0;
	s = 0;
	for(i=0; i<L_subfr; i++)
		s = G729AL_mac(s, xn[i], y1[i]);
	
	if (G729AOverflow == 0) 
	{
		exp_xy = G729Anorm_l(s);
		xy     = G729Around( G729AL_shl(s, exp_xy) );
	}
	else 
	{
		s = 0;
		for(i=0; i<L_subfr; i++)
			s = G729AL_mac(s, xn[i], scaled_y1[i]);
		exp_xy = G729Anorm_l(s);
		xy     = G729Around( G729AL_shl(s, exp_xy) );
		exp_xy = G729Asub_s(exp_xy, 2);
	}
	
	g_coeff[0] = yy;
	g_coeff[1] = G729Asub_s(15, exp_yy);
	g_coeff[2] = xy;
	g_coeff[3] = G729Asub_s(15, exp_xy);
	
	if (xy <= 0)
	{
		g_coeff[3] = -15; 
		return( (Word16) 0);
	}
	
	xy = G729Ashr_s(xy, 1);            
	gain = G729Adiv_s( xy, yy);
	
	i = G729Asub_s(exp_xy, exp_yy);
	gain = G729Ashr_s(gain, i);         
	
	if( G729Asub_s(gain, 19661) > 0)
	{
		gain = 19661;
	}
	
	
	return(gain);
}

Word16 G729AEnc_lag3(Word16 T0, Word16 T0_frac, Word16 *T0_min, Word16 *T0_max, Word16 pit_min, Word16 pit_max, Word16 pit_flag)
{
	Word16 index, i;
	
	if (pit_flag == 0)   
	{
		if (G729Asub_s(T0, 85) <= 0)
		{
			i = G729Aadd_s(G729Aadd_s(T0, T0), T0);
			index = G729Aadd_s(G729Asub_s(i, 58), T0_frac);
		}
		else {
			index = G729Aadd_s(T0, 112);
		}
		
		*T0_min = G729Asub_s(T0, 5);
		if (G729Asub_s(*T0_min, pit_min) < 0)
		{
			*T0_min = pit_min;
		}
		
		*T0_max = G729Aadd_s(*T0_min, 9);
		if (G729Asub_s(*T0_max, pit_max) > 0)
		{
			*T0_max = pit_max;
			*T0_min = G729Asub_s(*T0_max, 9);
		}
	}
	else      
	{  
		i = G729Asub_s(T0, *T0_min);
		i = G729Aadd_s(G729Aadd_s(i, i), i);
		index = G729Aadd_s(G729Aadd_s(i, 2), T0_frac);
	}
	
	
	return index;
}

⌨️ 快捷键说明

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