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 插值处理..!
另外说一下,所谓的自适应编译,其实就是,第一子帧是固定,第二子帧,相对于第一子帧的位置偏量! 汗一下...差点被名词弄晕了!