G729 之 基音

1. 开环基音  : 使用信号为感觉加权之后的语音信号!

// 开环基搜索
short Pitch_ol(short signal[], int pit_min, int pit_max, int L_frame )
{
int i=0;
int scaled_signal[L_FRAME+PIT_MAX] = {0};
int *scal_sig = &scaled_signal[pit_max];

for(i=-pit_max; i<L_frame; i++)
{
scal_sig[i] = signal[i];
}

double max1,max2,max3;
int p_max1,p_max2,p_max3;

p_max1 = Lag_max(scal_sig, L_FRAME, 80,143, &max1);
p_max2 = Lag_max(scal_sig, L_FRAME, 40,79, &max2);
p_max3 = Lag_max(scal_sig, L_FRAME, 20,39, &max3);

// 取能量最大值分段的位置为基音
if(max1*0.85 < max2)
{
max1 = max2;
p_max1 = p_max2;
}
if(max1*0.85 < max3)
{
max1 = max3;
p_max1 = p_max3;
}

return p_max1;
}

 // 取分段中能量最大的位置...并给出归一化的能量比..

int Lag_max( int signal[], int L_frame,int lag_max,int lag_min, double *cor_max)
{
int pmax = lag_max;
int max = MIN_32;
int i = 0;
int j = 0;
int p_max = lag_max;

int *pTmp1,*pTmp2;
int t0;

for (i = lag_max; i >= lag_min; i--)
{
pTmp1 = signal;
pTmp2 = &signal[-i];
t0 = 0;

for (j=0; j<L_frame; j++,pTmp1++,pTmp2++)
{
t0 = t0 + (*pTmp1)*(*pTmp2);
}
if(t0 >= max)
{
max = t0;
p_max = i;
}

}

//计算能量
t0 = 0;
pTmp1 = &signal[-p_max];
for(i=0; i<L_frame; i++, pTmp1++)
{
t0 += (*pTmp1) * (*pTmp1);
}

double tmp = Inv_sqrt(t0);
*cor_max = tmp * max;

return p_max;
}

2. 闭环基音 : 

闭环基音,是在开环基音基础之上,再进行搜索,  同时对小孩与女人的声音基音带进行了,sinc 插值处理..! 

 另外说一下,所谓的自适应编译,其实就是,第一子帧是固定,第二子帧,相对于第一子帧的位置偏量!  汗一下...差点被名词弄晕了!

作者微信号: xh66i88
原文地址:https://www.cnblogs.com/signal/p/2668978.html