📄 lpcjisuan.txt
字号:
//////////////////////////////////////////////////////////////////////////////
//计算LPC系数,description:
//compute predictor coefficients from autocorrelations based on durbin recursion.
//Inputs:
//r-----autocorrelation vector(r[0...LPC_ORD])
//Outputs:
//a1----predictor parameters
//Returns:NULL
//LPC_ORD-----constant,predictive order
///*
void CSpeech::GetFrameLpc(double* r,double* a1)
{
int i,m,n;
double temp,alphap;
double a[LPC_ORD+1][LPC_ORD+1];
double k[LPC_ORD+1];
for(i=0;i<=LPC_ORD;i++)
{ k[i]=0;
for(n=0;n<=LPC_ORD;n++)
a[i][n]=0;
}
k[1]=-r[1]/r[0];
a[1][1]=k[1];
alphap=r[0]*(1-k[1]*k[1]);
for(m=2;m<=LPC_ORD;m++)
{ temp=0;
for(i=1;i<m;i++) temp+=a[m-1][i]*r[abs(i-m)];
k[m]=-(r[m]+temp)/alphap;
a[m][m]=k[m];
for(i=1;i<m;i++) a[m][i]=a[m-1][i]+k[m]*a[m-1][m-i];
alphap=alphap*(1-k[m]*k[m]);
}//m
for(i=0;i<=LPC_ORD;i++) a1[i]=a[LPC_ORD][i];
}
//////////////////////////////////////////////////////////////////
//计算1帧PLC_ORD+1阶自相关向量
void CSpeech::GetFrameR(double* pDataWin, //输入加窗数据
double* rf, //存储自相关向量
unsigned int nWinSize //窗长
)
{ unsigned int i,m;
for(i=0;i<=LPC_ORD;i++)
{
for(m=0;m<=(nWinSize-i-1);m++) rf[i]=rf[i]+pDataWin[m]*pDataWin[m+i];
}
}
//////////////////////////////////////
//计算所有帧的LPC系数
void CSpeech::GetLpc(
double* pDataIn, //输入加窗数据
double* aall, //存储所有的LPC系数,最终结果
unsigned int nWinSize,
unsigned int nInLen // 输入数据长度
)
{
unsigned int i,m,f,nframe;
unsigned int offset=0;
unsigned int offseta=0;
double* dataf=new double[nWinSize];
double* rf=new double[LPC_ORD+1];
double* af=new double[LPC_ORD+1];
for(i=0;i<=LPC_ORD;i++)
{rf[i]=0;
af[i]=0;
}
nframe=nInLen/nWinSize;
for(f=1;f<=nframe;f++)
{
for(i=0;i<=(nWinSize-1);i++) dataf[i]=pDataIn[i+offset];
CSpeech::GetFrameR(dataf,rf,nWinSize);
CSpeech::GetFrameLpc(rf,af);
for(m=0;m<=LPC_ORD;m++) aall[offseta+m]=af[m];
offset=offset+nWinSize;
offseta=offseta+LPC_ORD+1;
}
}//*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -