Mercurial > libavcodec.hg
annotate lpc.c @ 9003:b595a8a59967 libavcodec
Change the type of pblocks from pointers to short array into
pointers to array of 64 DCTELEM, similarly to other block fields.
This also get rid of some casts and fixes a warning.
author | iive |
---|---|
date | Sun, 22 Feb 2009 09:02:06 +0000 |
parents | bffe8e6cb10e |
children | 94595d0e617c |
rev | line source |
---|---|
3353
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
1 /** |
7589
8b695a99e8df
flacenc, lpc: Move LPC code from flacenc.c to new lpc.[ch] files.
ramiro
parents:
7588
diff
changeset
|
2 * LPC utility code |
7594
cd6217c9ce92
update my email address to one which does not depend on my service provider
jbr
parents:
7593
diff
changeset
|
3 * Copyright (c) 2006 Justin Ruggles <justin.ruggles@gmail.com> |
3353
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
4 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3481
diff
changeset
|
5 * This file is part of FFmpeg. |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3481
diff
changeset
|
6 * |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3481
diff
changeset
|
7 * FFmpeg is free software; you can redistribute it and/or |
3353
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
8 * modify it under the terms of the GNU Lesser General Public |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
9 * License as published by the Free Software Foundation; either |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3481
diff
changeset
|
10 * version 2.1 of the License, or (at your option) any later version. |
3353
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
11 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3481
diff
changeset
|
12 * FFmpeg is distributed in the hope that it will be useful, |
3353
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
15 * Lesser General Public License for more details. |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
16 * |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
17 * You should have received a copy of the GNU Lesser General Public |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3481
diff
changeset
|
18 * License along with FFmpeg; if not, write to the Free Software |
3353
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
20 */ |
5b901881d6ed
first rudimentary version of (Justin Ruggles jruggle earthlink net) flac encoder
michael
parents:
diff
changeset
|
21 |
6763 | 22 #include "libavutil/lls.h" |
5737 | 23 #include "dsputil.h" |
7788
ffd4b1364b62
Avoid duplicating compute_lpc_coefs() function in both the RA288 and AAC decoders.
vitor
parents:
7753
diff
changeset
|
24 |
ffd4b1364b62
Avoid duplicating compute_lpc_coefs() function in both the RA288 and AAC decoders.
vitor
parents:
7753
diff
changeset
|
25 #define LPC_USE_DOUBLE |
7589
8b695a99e8df
flacenc, lpc: Move LPC code from flacenc.c to new lpc.[ch] files.
ramiro
parents:
7588
diff
changeset
|
26 #include "lpc.h" |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
27 |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
28 |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
29 /** |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
30 * Quantize LPC coefficients |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
31 */ |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
32 static void quantize_lpc_coefs(double *lpc_in, int order, int precision, |
7588
f6a1bff47a3b
flacenc: Allow more flexible shift calculation in LPC.
ramiro
parents:
7451
diff
changeset
|
33 int32_t *lpc_out, int *shift, int max_shift, int zero_shift) |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
34 { |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
35 int i; |
3464 | 36 double cmax, error; |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
37 int32_t qmax; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
38 int sh; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
39 |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
40 /* define maximum levels */ |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
41 qmax = (1 << (precision - 1)) - 1; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
42 |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
43 /* find maximum coefficient value */ |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
44 cmax = 0.0; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
45 for(i=0; i<order; i++) { |
3389 | 46 cmax= FFMAX(cmax, fabs(lpc_in[i])); |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
47 } |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
48 |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
49 /* if maximum value quantizes to zero, return all zeros */ |
7588
f6a1bff47a3b
flacenc: Allow more flexible shift calculation in LPC.
ramiro
parents:
7451
diff
changeset
|
50 if(cmax * (1 << max_shift) < 1.0) { |
f6a1bff47a3b
flacenc: Allow more flexible shift calculation in LPC.
ramiro
parents:
7451
diff
changeset
|
51 *shift = zero_shift; |
3389 | 52 memset(lpc_out, 0, sizeof(int32_t) * order); |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
53 return; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
54 } |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
55 |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
56 /* calculate level shift which scales max coeff to available bits */ |
7588
f6a1bff47a3b
flacenc: Allow more flexible shift calculation in LPC.
ramiro
parents:
7451
diff
changeset
|
57 sh = max_shift; |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
58 while((cmax * (1 << sh) > qmax) && (sh > 0)) { |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
59 sh--; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
60 } |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
61 |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
62 /* since negative shift values are unsupported in decoder, scale down |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
63 coefficients instead */ |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
64 if(sh == 0 && cmax > qmax) { |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
65 double scale = ((double)qmax) / cmax; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
66 for(i=0; i<order; i++) { |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
67 lpc_in[i] *= scale; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
68 } |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
69 } |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
70 |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
71 /* output quantized coefficients and level shift */ |
3464 | 72 error=0; |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
73 for(i=0; i<order; i++) { |
7788
ffd4b1364b62
Avoid duplicating compute_lpc_coefs() function in both the RA288 and AAC decoders.
vitor
parents:
7753
diff
changeset
|
74 error -= lpc_in[i] * (1 << sh); |
4594 | 75 lpc_out[i] = av_clip(lrintf(error), -qmax, qmax); |
3464 | 76 error -= lpc_out[i]; |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
77 } |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
78 *shift = sh; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
79 } |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
80 |
7593 | 81 static int estimate_best_order(double *ref, int min_order, int max_order) |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
82 { |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
83 int i, est; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
84 |
7593 | 85 est = min_order; |
86 for(i=max_order-1; i>=min_order-1; i--) { | |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
87 if(ref[i] > 0.10) { |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
88 est = i+1; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
89 break; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
90 } |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
91 } |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
92 return est; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
93 } |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
94 |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
95 /** |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
96 * Calculate LPC coefficients for multiple orders |
8824
9f929379bbca
lpc: Document the use_lpc parameter to ff_lpc_calc_coefs().
jbr
parents:
7788
diff
changeset
|
97 * |
9f929379bbca
lpc: Document the use_lpc parameter to ff_lpc_calc_coefs().
jbr
parents:
7788
diff
changeset
|
98 * @param use_lpc LPC method for determining coefficients |
9f929379bbca
lpc: Document the use_lpc parameter to ff_lpc_calc_coefs().
jbr
parents:
7788
diff
changeset
|
99 * 0 = LPC with fixed pre-defined coeffs |
9f929379bbca
lpc: Document the use_lpc parameter to ff_lpc_calc_coefs().
jbr
parents:
7788
diff
changeset
|
100 * 1 = LPC with coeffs determined by Levinson-Durbin recursion |
9f929379bbca
lpc: Document the use_lpc parameter to ff_lpc_calc_coefs().
jbr
parents:
7788
diff
changeset
|
101 * 2+ = LPC with coeffs determined by Cholesky factorization using (use_lpc-1) passes. |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
102 */ |
7589
8b695a99e8df
flacenc, lpc: Move LPC code from flacenc.c to new lpc.[ch] files.
ramiro
parents:
7588
diff
changeset
|
103 int ff_lpc_calc_coefs(DSPContext *s, |
7592 | 104 const int32_t *samples, int blocksize, int min_order, |
105 int max_order, int precision, | |
106 int32_t coefs[][MAX_LPC_ORDER], int *shift, int use_lpc, | |
107 int omethod, int max_shift, int zero_shift) | |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
108 { |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
109 double autoc[MAX_LPC_ORDER+1]; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
110 double ref[MAX_LPC_ORDER]; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
111 double lpc[MAX_LPC_ORDER][MAX_LPC_ORDER]; |
3467
33af013504d5
optionally (use_lpc=2) support Cholesky factorization for finding the lpc coeficients
michael
parents:
3464
diff
changeset
|
112 int i, j, pass; |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
113 int opt_order; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
114 |
8825
51274aff81fe
Assert that ff_lpc_calc_coefs() is called with a valid LPC method.
jbr
parents:
8824
diff
changeset
|
115 assert(max_order >= MIN_LPC_ORDER && max_order <= MAX_LPC_ORDER && use_lpc > 0); |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
116 |
3467
33af013504d5
optionally (use_lpc=2) support Cholesky factorization for finding the lpc coeficients
michael
parents:
3464
diff
changeset
|
117 if(use_lpc == 1){ |
7588
f6a1bff47a3b
flacenc: Allow more flexible shift calculation in LPC.
ramiro
parents:
7451
diff
changeset
|
118 s->flac_compute_autocorr(samples, blocksize, max_order, autoc); |
3467
33af013504d5
optionally (use_lpc=2) support Cholesky factorization for finding the lpc coeficients
michael
parents:
3464
diff
changeset
|
119 |
7788
ffd4b1364b62
Avoid duplicating compute_lpc_coefs() function in both the RA288 and AAC decoders.
vitor
parents:
7753
diff
changeset
|
120 compute_lpc_coefs(autoc, max_order, &lpc[0][0], MAX_LPC_ORDER, 0, 1); |
ffd4b1364b62
Avoid duplicating compute_lpc_coefs() function in both the RA288 and AAC decoders.
vitor
parents:
7753
diff
changeset
|
121 |
ffd4b1364b62
Avoid duplicating compute_lpc_coefs() function in both the RA288 and AAC decoders.
vitor
parents:
7753
diff
changeset
|
122 for(i=0; i<max_order; i++) |
ffd4b1364b62
Avoid duplicating compute_lpc_coefs() function in both the RA288 and AAC decoders.
vitor
parents:
7753
diff
changeset
|
123 ref[i] = fabs(lpc[i][i]); |
3467
33af013504d5
optionally (use_lpc=2) support Cholesky factorization for finding the lpc coeficients
michael
parents:
3464
diff
changeset
|
124 }else{ |
33af013504d5
optionally (use_lpc=2) support Cholesky factorization for finding the lpc coeficients
michael
parents:
3464
diff
changeset
|
125 LLSModel m[2]; |
8826
bffe8e6cb10e
lpc: Remove false positive compilation warning about weight being
jbr
parents:
8825
diff
changeset
|
126 double var[MAX_LPC_ORDER+1], av_uninit(weight); |
3467
33af013504d5
optionally (use_lpc=2) support Cholesky factorization for finding the lpc coeficients
michael
parents:
3464
diff
changeset
|
127 |
33af013504d5
optionally (use_lpc=2) support Cholesky factorization for finding the lpc coeficients
michael
parents:
3464
diff
changeset
|
128 for(pass=0; pass<use_lpc-1; pass++){ |
3470 | 129 av_init_lls(&m[pass&1], max_order); |
3467
33af013504d5
optionally (use_lpc=2) support Cholesky factorization for finding the lpc coeficients
michael
parents:
3464
diff
changeset
|
130 |
3473
fa545ed305c9
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
michael
parents:
3470
diff
changeset
|
131 weight=0; |
3467
33af013504d5
optionally (use_lpc=2) support Cholesky factorization for finding the lpc coeficients
michael
parents:
3464
diff
changeset
|
132 for(i=max_order; i<blocksize; i++){ |
33af013504d5
optionally (use_lpc=2) support Cholesky factorization for finding the lpc coeficients
michael
parents:
3464
diff
changeset
|
133 for(j=0; j<=max_order; j++) |
33af013504d5
optionally (use_lpc=2) support Cholesky factorization for finding the lpc coeficients
michael
parents:
3464
diff
changeset
|
134 var[j]= samples[i-j]; |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
135 |
3467
33af013504d5
optionally (use_lpc=2) support Cholesky factorization for finding the lpc coeficients
michael
parents:
3464
diff
changeset
|
136 if(pass){ |
5743 | 137 double eval, inv, rinv; |
3473
fa545ed305c9
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
michael
parents:
3470
diff
changeset
|
138 eval= av_evaluate_lls(&m[(pass-1)&1], var+1, max_order-1); |
3467
33af013504d5
optionally (use_lpc=2) support Cholesky factorization for finding the lpc coeficients
michael
parents:
3464
diff
changeset
|
139 eval= (512>>pass) + fabs(eval - var[0]); |
5743 | 140 inv = 1/eval; |
141 rinv = sqrt(inv); | |
3467
33af013504d5
optionally (use_lpc=2) support Cholesky factorization for finding the lpc coeficients
michael
parents:
3464
diff
changeset
|
142 for(j=0; j<=max_order; j++) |
5743 | 143 var[j] *= rinv; |
144 weight += inv; | |
3473
fa545ed305c9
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
michael
parents:
3470
diff
changeset
|
145 }else |
fa545ed305c9
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
michael
parents:
3470
diff
changeset
|
146 weight++; |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
147 |
3467
33af013504d5
optionally (use_lpc=2) support Cholesky factorization for finding the lpc coeficients
michael
parents:
3464
diff
changeset
|
148 av_update_lls(&m[pass&1], var, 1.0); |
33af013504d5
optionally (use_lpc=2) support Cholesky factorization for finding the lpc coeficients
michael
parents:
3464
diff
changeset
|
149 } |
3473
fa545ed305c9
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
michael
parents:
3470
diff
changeset
|
150 av_solve_lls(&m[pass&1], 0.001, 0); |
3467
33af013504d5
optionally (use_lpc=2) support Cholesky factorization for finding the lpc coeficients
michael
parents:
3464
diff
changeset
|
151 } |
33af013504d5
optionally (use_lpc=2) support Cholesky factorization for finding the lpc coeficients
michael
parents:
3464
diff
changeset
|
152 |
3473
fa545ed305c9
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
michael
parents:
3470
diff
changeset
|
153 for(i=0; i<max_order; i++){ |
fa545ed305c9
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
michael
parents:
3470
diff
changeset
|
154 for(j=0; j<max_order; j++) |
7788
ffd4b1364b62
Avoid duplicating compute_lpc_coefs() function in both the RA288 and AAC decoders.
vitor
parents:
7753
diff
changeset
|
155 lpc[i][j]=-m[(pass-1)&1].coeff[i][j]; |
3473
fa545ed305c9
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
michael
parents:
3470
diff
changeset
|
156 ref[i]= sqrt(m[(pass-1)&1].variance[i] / weight) * (blocksize - max_order) / 4000; |
fa545ed305c9
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
michael
parents:
3470
diff
changeset
|
157 } |
fa545ed305c9
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
michael
parents:
3470
diff
changeset
|
158 for(i=max_order-1; i>0; i--) |
fa545ed305c9
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
michael
parents:
3470
diff
changeset
|
159 ref[i] = ref[i-1] - ref[i]; |
3467
33af013504d5
optionally (use_lpc=2) support Cholesky factorization for finding the lpc coeficients
michael
parents:
3464
diff
changeset
|
160 } |
3477
30ac8a424448
Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents:
3473
diff
changeset
|
161 opt_order = max_order; |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
162 |
3477
30ac8a424448
Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents:
3473
diff
changeset
|
163 if(omethod == ORDER_METHOD_EST) { |
7593 | 164 opt_order = estimate_best_order(ref, min_order, max_order); |
3477
30ac8a424448
Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents:
3473
diff
changeset
|
165 i = opt_order-1; |
7588
f6a1bff47a3b
flacenc: Allow more flexible shift calculation in LPC.
ramiro
parents:
7451
diff
changeset
|
166 quantize_lpc_coefs(lpc[i], i+1, precision, coefs[i], &shift[i], max_shift, zero_shift); |
3477
30ac8a424448
Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents:
3473
diff
changeset
|
167 } else { |
7591
7dfb28d3ccd1
use limited range of lpc orders when quantizing coefficients
jbr
parents:
7590
diff
changeset
|
168 for(i=min_order-1; i<max_order; i++) { |
7588
f6a1bff47a3b
flacenc: Allow more flexible shift calculation in LPC.
ramiro
parents:
7451
diff
changeset
|
169 quantize_lpc_coefs(lpc[i], i+1, precision, coefs[i], &shift[i], max_shift, zero_shift); |
3477
30ac8a424448
Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents:
3473
diff
changeset
|
170 } |
30ac8a424448
Add lpc order search. This creates new compression levels 6 to 12.
jbr
parents:
3473
diff
changeset
|
171 } |
3385
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
172 |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
173 return opt_order; |
340e5d35b326
flac-lpc patch by (Justin Ruggles jruggle earthlink net)
michael
parents:
3384
diff
changeset
|
174 } |