📄 g729a_pitch_a.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 + -