levin.cpp
上传用户:jtjnyq9001
上传日期:2014-11-21
资源大小:3974k
文件大小:1k
源码类别:

3G开发

开发平台:

Visual C++

  1.  //
  2.  //  File = levin.cpp
  3.  //
  4. //#include "complex.h"
  5. #include <fstream>
  6. #include "levin.h"
  7. #include "overload.h"
  8. using namespace std;
  9. #ifdef _DEBUG
  10.    extern ofstream *DebugFile;
  11. #endif
  12.  int LevinsonRecursion( double *toeplitz,
  13.                         int ar_order,
  14.                         double *a_vector,
  15.                         double *driving_variance)
  16.  {
  17.    double sum, work, temp;
  18.    double drv_var;
  19.    int j, k, k_over_2, k_minus_j;
  20.    drv_var = toeplitz[0];
  21.    a_vector[0] = 1.0;
  22.    for(k=1; k<=ar_order; k++) a_vector[k]=0.0;
  23.    for(k=1; k<=ar_order; k++){
  24.       sum = toeplitz[k];
  25.       for(j=1; j<k; j++){
  26.          sum += a_vector[j] * toeplitz[k-j];
  27.       }
  28.       work = -sum/drv_var;
  29.       drv_var *= (1.0 - mag_sqrd(work));
  30.       a_vector[k] = work;
  31.       k_over_2 = k/2;
  32.       for(j=1; j<=k_over_2; j++){
  33.          k_minus_j = k-j;
  34.          temp = a_vector[j];
  35.          a_vector[j] = temp + work*conj(a_vector[k_minus_j]);
  36.          if(j!=k_minus_j){
  37.             a_vector[k_minus_j] += work * conj(temp);
  38.          }
  39.       }
  40.    } 
  41.    *driving_variance = drv_var;
  42.    return(0);
  43.  };