在学习信号处理的时候,线性预测是一个比较难理解的知识点,为了加快很多朋友的理解,这里给出Levinson-Durbin算法的线性预测实现和一个测试Demo,Demo中很明确的把输入信号、预测信号、预测误差打印了出来,这样就能以最直观的方式,把线性预测的实现与作用展示出来。话不多说,直接上代码!
typedef float OsFlt32;
typedef int OsInt32;
OsFlt32 lpc(const OsFlt32 *r,OsInt32 p,OsFlt32 *a)
{
OsInt32 i,j;
OsFlt32 err;
if(0 == r[0])
{
for(i = 0; i < p; i++) a[i] = 0;
return 0;
}
a[0] = 1.0;
err = r[0];
for(i = 0; i < p; i++)
{
OsFlt32 lambda = 0.0;
for(j = 0; j <= i; j++)
lambda -= a[j]*r[i+1-j];
lambda /= err;
// Update LPC coefficients and total error
for(j = 0; j <= (i+1)/2; j++)
{
OsFlt32 temp = a[i+1-j] + lambda * a[j];
a[j] = a[j]