comparison flacenc.c @ 3473:fa545ed305c9 libavcodec

calculate all coefficients for several orders during cholesky factorization, the resulting coefficients are not strictly optimal though as there is a small difference in the autocorrelation matrixes which is ignored for the smaller orders
author michael
date Sat, 15 Jul 2006 23:43:38 +0000
parents c6071e607062
children 30ac8a424448
comparison
equal deleted inserted replaced
3472:0e0cffe06fb3 3473:fa545ed305c9
740 740
741 if(use_lpc == 1){ 741 if(use_lpc == 1){
742 compute_autocorr(samples, blocksize, max_order+1, autoc); 742 compute_autocorr(samples, blocksize, max_order+1, autoc);
743 743
744 compute_lpc_coefs(autoc, max_order, lpc, ref); 744 compute_lpc_coefs(autoc, max_order, lpc, ref);
745
746 opt_order = estimate_best_order(ref, max_order);
747 }else{ 745 }else{
748 LLSModel m[2]; 746 LLSModel m[2];
749 double var[MAX_LPC_ORDER+1], eval; 747 double var[MAX_LPC_ORDER+1], eval, weight;
750 748
751 for(pass=0; pass<use_lpc-1; pass++){ 749 for(pass=0; pass<use_lpc-1; pass++){
752 av_init_lls(&m[pass&1], max_order); 750 av_init_lls(&m[pass&1], max_order);
753 751
752 weight=0;
754 for(i=max_order; i<blocksize; i++){ 753 for(i=max_order; i<blocksize; i++){
755 for(j=0; j<=max_order; j++) 754 for(j=0; j<=max_order; j++)
756 var[j]= samples[i-j]; 755 var[j]= samples[i-j];
757 756
758 if(pass){ 757 if(pass){
759 eval= av_evaluate_lls(&m[(pass-1)&1], var+1); 758 eval= av_evaluate_lls(&m[(pass-1)&1], var+1, max_order-1);
760 eval= (512>>pass) + fabs(eval - var[0]); 759 eval= (512>>pass) + fabs(eval - var[0]);
761 for(j=0; j<=max_order; j++) 760 for(j=0; j<=max_order; j++)
762 var[j]/= sqrt(eval); 761 var[j]/= sqrt(eval);
763 } 762 weight += 1/eval;
763 }else
764 weight++;
764 765
765 av_update_lls(&m[pass&1], var, 1.0); 766 av_update_lls(&m[pass&1], var, 1.0);
766 } 767 }
767 av_solve_lls(&m[pass&1], 0.001); 768 av_solve_lls(&m[pass&1], 0.001, 0);
768 opt_order= max_order; //FIXME 769 }
769 } 770
770 771 for(i=0; i<max_order; i++){
771 for(i=0; i<opt_order; i++) 772 for(j=0; j<max_order; j++)
772 lpc[opt_order-1][i]= m[(pass-1)&1].coeff[i]; 773 lpc[i][j]= m[(pass-1)&1].coeff[i][j];
773 } 774 ref[i]= sqrt(m[(pass-1)&1].variance[i] / weight) * (blocksize - max_order) / 4000;
775 }
776 for(i=max_order-1; i>0; i--)
777 ref[i] = ref[i-1] - ref[i];
778 }
779 opt_order = estimate_best_order(ref, max_order);
774 780
775 i = opt_order-1; 781 i = opt_order-1;
776 quantize_lpc_coefs(lpc[i], i+1, precision, coefs[i], &shift[i]); 782 quantize_lpc_coefs(lpc[i], i+1, precision, coefs[i], &shift[i]);
777 783
778 return opt_order; 784 return opt_order;