Mercurial > libavcodec.hg
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; |