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

📄 g729a_lspgetq.c

📁 在DSP上实现的G.729优化代码 编译过的 大家快来下载啊
💻 C
字号:
#include "../Common/typedef.h"
#include "../Include/G729A_basic_op.h"
#include "../Include/G729A_ld8a.h"

void G729ALsp_get_quant(Word16 lspcb1[][G729A_M], Word16 lspcb2[][G729A_M], Word16 code0, Word16 code1, Word16 code2, Word16 fg[][G729A_M], Word16 freq_prev[][G729A_M], Word16 lspq[], Word16 fg_sum[])
{
	Word16 j;
	Word16 buf[G729A_M];           
	
	for ( j = 0 ; j < G729A_NC ; j++ )
		buf[j] = _sadd( lspcb1[code0][j], lspcb2[code1][j] );
	
	for ( j = G729A_NC ; j < G729A_M ; j++ )
		buf[j] = _sadd( lspcb1[code0][j], lspcb2[code2][j] );
		
	G729ALsp_expand_1_2(buf, G729A_GAP1);
	G729ALsp_expand_1_2(buf, G729A_GAP2);
	
	G729ALsp_prev_compose(buf, lspq, fg, freq_prev, fg_sum);
	
	G729ALsp_prev_update(buf, freq_prev);
	
	G729ALsp_stability( lspq );
	
	return;
}

void G729ALsp_expand_1(Word16 buf[], Word16 gap)
{
	Word16 j, tmp;
	Word16 diff;       
	for ( j = 1 ; j < G729A_NC ; j++ ) 
	{
		diff = _ssub( buf[j-1], buf[j] );
		tmp = _sshvr( _sadd( diff, gap), 1 );
		
		tmp = (tmp > 0) ? tmp : 0;
		buf[j-1] = _ssub( buf[j-1], tmp );
		buf[j]   = _sadd( buf[j], tmp );
	}
	return;
}

void G729ALsp_expand_2(Word16 buf[], Word16 gap)
{
	Word16 j, tmp;
	Word16 diff;       
	Word32 temp;
	for ( j = G729A_NC ; j < G729A_M ; j++ ) 
	{
		diff = _ssub( buf[j-1], buf[j] );
		temp = _sshvr( _sadd2( diff, gap), 1 );
		tmp = _spack2(temp, temp);
		
		tmp = (tmp > 0) ? tmp : 0;
		buf[j-1] = _ssub( buf[j-1], tmp );
		buf[j]   = _sadd2( buf[j], tmp );
	}
	return;
}

void G729ALsp_expand_1_2(Word16 buf[], Word16 gap)
{
	Word16 j, tmp;
	Word16 diff;        
	for ( j = 1 ; j < G729A_M ; j++ ) 
	{
		diff = _ssub( buf[j-1], buf[j] );
		tmp = _sshvr( _sadd2(diff, gap),1);
		
		tmp = (tmp > 0)? tmp : 0;
		buf[j-1] = _ssub( buf[j-1], tmp );
		buf[j]   = _sadd2( buf[j], tmp );
	}
	return;
}

void G729ALsp_prev_compose(Word16 lsp_ele[], Word16 lsp[], Word16 fg[][G729A_M], Word16 freq_prev[][G729A_M], Word16 fg_sum[])
{
	Word16 j, k;
	Word32 L_acc;                 
	for ( j = 0 ; j < G729A_M ; j++ ) 
	{
	    L_acc = _smpy(lsp_ele[j], fg_sum[j]);
		for ( k = 0 ; k < G729A_MA_NP ; k++ )
			L_acc = _sadd( L_acc, _smpy(freq_prev[k][j], fg[k][j]));
		
		lsp[j] = L_acc>>16;
	}
	return;
}

void G729ALsp_prev_extract(Word16 lsp[G729A_M], Word16 lsp_ele[G729A_M], Word16 fg[G729A_MA_NP][G729A_M], Word16 freq_prev[G729A_MA_NP][G729A_M], Word16 fg_sum_inv[G729A_M])
{
	Word16 j, k;
	Word32 L_temp0, L_temp1;               
	Word16 temp0, temp1;                 	
	for ( j = 0 ; j < G729A_M ; j+=2 ) 
	{
		L_temp0 = (Word32)lsp[j]<<16;
		L_temp1 = (Word32)lsp[j+1]<<16;
		
		for ( k = 0 ; k < G729A_MA_NP ; k++ )
		{
		    L_temp0 = _ssub(L_temp0, _smpy(freq_prev[k][j],   fg[k][j]));
		    L_temp1 = _ssub(L_temp1, _smpy(freq_prev[k][j+1], fg[k][j+1]));
		}
		temp0 = L_temp0>>16;
		temp1 = L_temp1>>16;
		L_temp0 = _smpy( temp0, fg_sum_inv[j] );
		L_temp1 = _smpy( temp1, fg_sum_inv[j+1] );
		lsp_ele[j] = _sshl(L_temp0, 3)>>16;	
		lsp_ele[j+1] = _sshl(L_temp1, 3)>>16;	
	}
	return;
}

void G729ALsp_prev_update(Word16 lsp_ele[G729A_M], Word16 freq_prev[G729A_MA_NP][G729A_M])
{
	Word16 k;
	
	for ( k = G729A_MA_NP-1 ; k > 0 ; k-- )
		G729ACopy2(freq_prev[k-1], freq_prev[k], G729A_M);
	
	G729ACopy2(lsp_ele, freq_prev[0], G729A_M);
	return;
}

void G729ALsp_stability(Word16 buf[])
{
	Word16 j;
	Word16 tmp;
	Word32 L_diff;
	Word32 L_acc, L_accb;
	
	for(j=0; j<G729A_M-1; j++) {
		L_acc = G729AL_deposit_l( buf[j+1] );
		L_accb = G729AL_deposit_l( buf[j] );
		L_diff = G729AL_sub( L_acc, L_accb );
		
		if( L_diff < 0L ) 
		{
			tmp      = buf[j+1];
			buf[j+1] = buf[j];
			buf[j]   = tmp;
		}
	}
	
	if( G729Asub_s(buf[0], G729A_L_LIMIT) <0 ) {
		buf[0] = G729A_L_LIMIT;
		printf("lsp_stability warning Low \n");
	}
	for(j=0; j<G729A_M-1; j++) {
		L_acc = G729AL_deposit_l( buf[j+1] );
		L_accb = G729AL_deposit_l( buf[j] );
		L_diff = G729AL_sub( L_acc, L_accb );
		
		if( G729AL_sub(L_diff, G729A_GAP3)<0L ) {
			buf[j+1] = G729Aadd_s( buf[j], G729A_GAP3 );
		}
	}
	
	if( G729Asub_s(buf[G729A_M-1],G729A_M_LIMIT)>0 ) {
		buf[G729A_M-1] = G729A_M_LIMIT;
		printf("lsp_stability warning High \n");
	}
	return;
}

⌨️ 快捷键说明

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