国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

線性預測與Levinson-Durbin算法實現

2019-11-06 09:57:45
字體:
來源:轉載
供稿:網友

在學習信號處理的時候,線性預測是一個比較難理解的知識點,為了加快很多朋友的理解,這里給出Levinson-Durbin算法的線性預測實現和一個測試Demo,Demo中很明確的把輸入信號、預測信號、預測誤差打印了出來,這樣就能以最直觀的方式,把線性預測的實現與作用展示出來。話不多說,直接上代碼!

[html] view plain copy 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] + lambda * a[i+1-j];              a[i+1-j] = temp;          }          err *= (1.0 - lambda*lambda);      }      return err;  }    void autocorr(const OsFlt32 *x,OsInt32 n,OsFlt32 *r,OsInt32 k)  {      OsFlt32 d;      OsInt32 i,p;        for(p = 0; p <= k; p++)      {          for(i = 0,d = 0.0; i < n-p; i++)              d += x[i] * x[i+p];          r[p] = d;      }  }  [html] view plain copy #include "lpc.h"    int main(int argc,char **argv)  {      OsInt32 nLen = 128;      OsFlt32 *pOriginal,*pPRedicted;      OsInt32 i,j;      const OsInt32 order = 4;      OsFlt32 R[order+1] = {0.0};      OsFlt32 A[order+1] = {0.0};      OsFlt32 error;        pOriginal   = (OsFlt32*)calloc(nLen,sizeof(OsFlt32));      pPredicted  = (OsFlt32*)calloc(nLen,sizeof(OsFlt32));        for(i = 0; i < nLen; i++)          pOriginal[i] = sin(i*0.01) + 0.75 * sin(i*0.03) + 0.5 * sin(i*0.05) + 0.25 * sin(i*0.11);        autocorr(pOriginal,nLen,R,order);      lpc(R,order,A);            for(i = 1; i <= order; i++)          A[i-1] = A[i];        for(i = order; i < nLen; i++)      {          pPredicted[i] = 0.0;          for(j = 0; j < order; j++)              pPredicted[i] -= A[j] * pOriginal[i-1-j];      }            error = 0;      for(i = order; i < nLen; i++)      {          double delta = pPredicted[i] - pOriginal[i];          printf( "Index: %.2d / Original: %.6f / Predicted: %.6f/n",i,pOriginal[i],pPredicted[i]);          error += delta * delta;      }      printf("Forward Linear Prediction Approximation Error: %f/n",error);        free(pPredicted);      free(pOriginal);      return 0;  } 
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 秭归县| 平潭县| 礼泉县| 乌恰县| 洞口县| 宁河县| 静宁县| 仪陇县| 滨州市| 土默特左旗| 梁平县| 涿鹿县| 石楼县| 璧山县| 阜平县| 罗江县| 定西市| 鲜城| 富川| 芷江| 克拉玛依市| 敦煌市| 潮安县| 绥滨县| 凤翔县| 溆浦县| 沭阳县| 类乌齐县| 白朗县| 卢龙县| 石家庄市| 晋江市| 渭源县| 新闻| 含山县| 长乐市| 大同县| 桂东县| 木兰县| 察雅县| 筠连县|