static float lpc_from_data(float[] data, float[] lpc,int n,int m){
    float[] aut=new float[m+1];
    float error;
    int i,j;

    // autocorrelation, p+1 lag coefficients

    j=m+1;
    while(j--!=0){
      float d=0;
      for(i=j;i<n;i++)d+=data[i]*data[i-j];
      aut[j]=d;
    }
  
    // Generate lpc coefficients from autocorr values

    error=aut[0];
    /*
    if(error==0){
      for(int k=0; k<m; k++) lpc[k]=0.0f;
      return 0;
    }
    */
  
    for(i=0;i<m;i++){
      float r=-aut[i+1];

      if(error==0){
        for(int k=0; k<m; k++) lpc[k]=0.0f;
        return 0;
      }

      // Sum up this iteration's reflection coefficient; note that in
      // Vorbis we don't save it.  If anyone wants to recycle this code
      // and needs reflection coefficients, save the results of 'r' from
      // each iteration.

      for(j=0;j<i;j++)r-=lpc[j]*aut[i-j];
      r/=error; 

      // Update LPC coefficients and total error
    
      lpc[i]=r;
      for(j=0;j<i/2;j++){
	float tmp=lpc[j];
	lpc[j]+=r*lpc[i-1-j];
	lpc[i-1-j]+=r*tmp;
      }
      if(i%2!=0)lpc[j]+=lpc[j]*r;
    
      error*=1.0-r*r;
    }
  
    // we need the error value to know how big an impulse to hit the
    // filter with later
  
    return error;
  }