More band caps updates.
authorTimothy B. Terriberry <tterribe@xiph.org>
Mon, 31 Jan 2011 06:18:12 +0000 (22:18 -0800)
committerJean-Marc Valin <jean-marc.valin@usherbrooke.ca>
Mon, 31 Jan 2011 06:37:51 +0000 (01:37 -0500)
Use measured cross-entropy to estimate the real cost of coding
 qtheta given the allocated qb parameter, instead of the entropy of
 the PDF.
This is generally much lower, and reduces waste at high rates.
This patch also removes some intermediate rounding from this
 computation.

libcelt/rate.c
libcelt/static_modes_fixed.c
libcelt/static_modes_float.c

index f3aa4c1..6023459 100644 (file)
@@ -159,7 +159,7 @@ void compute_pulse_cache(CELTMode *m, int LM)
             N0 = m->eBands[j+1]-m->eBands[j];
             /* N=1 bands only have a sign bit and fine bits. */
             if (N0<<i == 1)
-              max_bits = C*(1+MAX_FINE_BITS)<<BITRES;
+               max_bits = C*(1+MAX_FINE_BITS)<<BITRES;
             else
             {
                const unsigned char *pcache;
@@ -200,14 +200,14 @@ void compute_pulse_cache(CELTMode *m, int LM)
                       total/N */
                   offset = (m->logN[j]+(LM0+k<<BITRES)>>1)-QTHETA_OFFSET;
                   /* The number of qtheta bits we'll allocate if the remainder
-                      is to be max_bits. */
-                  num=(celt_int32)((2*N-1)*offset+max_bits)<<9;
-                  den=((celt_int32)(2*N-1)<<9)-495;
-                  qb = IMIN((num+(den>>1))/den, 8<<BITRES);
+                      is to be max_bits.
+                     The average measured cost for theta is 0.89701 times qb,
+                      approximated here as 459/512. */
+                  num=459*(celt_int32)((2*N-1)*offset+max_bits);
+                  den=((celt_int32)(2*N-1)<<9)-459;
+                  qb = IMIN((num+(den>>1))/den, 57);
                   celt_assert(qb >= 0);
-                  /* The average cost for theta when qn==256 is
-                      7.73246 bits for the triangular PDF. */
-                  max_bits += qb*495+256>>9;
+                  max_bits += qb;
                   N <<= 1;
                }
                /* Add in the cost of a stereo split, if necessary. */
@@ -216,13 +216,13 @@ void compute_pulse_cache(CELTMode *m, int LM)
                   max_bits <<= 1;
                   offset = (m->logN[j]+(i<<BITRES)>>1)-QTHETA_OFFSET_STEREO;
                   ndof = 2*N-1-(N==2);
-                  num = (celt_int32)(max_bits+ndof*offset)<<7;
-                  den = ((celt_int32)ndof<<7)-(N==2?128:125);
-                  qb = IMIN((num+(den>>1))/den, 8<<BITRES);
+                  /* The average measured cost for theta with the step PDF is
+                      0.95164 times qb, approximated here as 487/512. */
+                  num = (N==2?512:487)*(celt_int32)(max_bits+ndof*offset);
+                  den = ((celt_int32)ndof<<9)-(N==2?512:487);
+                  qb = IMIN((num+(den>>1))/den, (N==2?64:61));
                   celt_assert(qb >= 0);
-                  /* The average cost for theta when qn==256, N>2 is
-                      7.8174 bits for the step PDF. */
-                  max_bits += N==2 ? qb : (qb*125+64>>7);
+                  max_bits += qb;
                }
                /* Add the fine bits we'll use. */
                /* Compensate for the extra DoF in stereo */
@@ -248,7 +248,7 @@ void compute_pulse_cache(CELTMode *m, int LM)
    }
 }
 
-#endif /* !CUSTOM_MODES */
+#endif /* CUSTOM_MODES */
 
 
 #define ALLOC_STEPS 6
index 53186f6..ef189e1 100644 (file)
@@ -22,7 +22,7 @@ static const celt_int16 cache_index50[105] = {
 static const unsigned char cache_bits50[392] = {
 40, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 40, 15, 23, 28, 31, 34, 36, 38, 39, 41, 42, 43, 44, 45, 46, 47, 47, 49, 50, 51, 52, 53, 54, 55, 55, 57, 58, 59, 60, 61, 62, 63, 63, 65, 66, 67, 68, 69, 70, 71, 71, 40, 20, 33, 41, 48, 53, 57, 61, 64, 66, 69, 71, 73, 75, 76, 78, 80, 82, 85, 87, 89, 91, 92, 94, 96, 98, 101, 103, 105, 107, 108, 110, 112, 114, 117, 119, 121, 123, 124, 126, 128, 40, 23, 39, 51, 60, 67, 73, 79, 83, 87, 91, 94, 97, 100, 102, 105, 107, 111, 115, 118, 121, 124, 126, 129, 131, 135, 139, 142, 145, 148, 150, 153, 155, 159, 163, 166, 169, 172, 174, 177, 179, 35, 28, 49, 65, 78, 89, 99, 107, 114, 120, 126, 132, 136, 141, 145, 149, 153, 159, 165, 171, 176, 180, 185, 189, 192, 199, 205, 211, 216, 220, 225, 229, 232, 239, 245, 251, 21, 33, 58, 79, 97, 112, 125, 137, 148, 157, 166, 174, 182, 189, 195, 201, 207, 217, 227, 235, 243, 251, 17, 35, 63, 86, 106, 123, 139, 152, 165, 177, 187, 197, 206, 214, 222, 230, 237, 250, 25, 31, 55, 75, 91, 105, 117, 128, 138, 146, 154, 161, 168, 174, 180, 185, 190, 200, 208, 215, 222, 229, 235, 240, 245, 255, 16, 36, 65, 89, 110, 128, 144, 159, 173, 185, 196, 207, 217, 226, 234, 242, 250, 11, 41, 74, 103, 128, 151, 172, 191, 209, 225, 241, 255, 9, 43, 79, 110, 138, 163, 186, 207, 227, 246, 12, 39, 71, 99, 123, 144, 164, 182, 198, 214, 228, 241, 253, 9, 44, 81, 113, 142, 168, 192, 214, 235, 255, 7, 49, 90, 127, 160, 191, 220, 247, 6, 51, 95, 134, 170, 203, 234, 7, 47, 87, 123, 155, 184, 212, 237, 6, 52, 97, 137, 174, 208, 240, 5, 57, 106, 151, 192, 231, 5, 59, 111, 158, 202, 243, 5, 55, 103, 147, 187, 224, 5, 60, 113, 161, 206, 248, 4, 65, 122, 175, 224, 4, 67, 127, 182, 234, };
 static const unsigned char cache_caps50[168] = {
-18, 18, 18, 18, 18, 18, 18, 18, 28, 28, 28, 28, 55, 55, 55, 92, 92, 117, 149, 142, 140, 18, 18, 18, 18, 18, 18, 18, 18, 38, 38, 38, 38, 62, 62, 62, 99, 99, 125, 157, 147, 145, 14, 14, 14, 14, 14, 14, 14, 14, 27, 27, 27, 27, 58, 58, 58, 94, 94, 120, 153, 145, 142, 19, 19, 19, 19, 19, 19, 19, 19, 31, 31, 31, 31, 62, 62, 62, 98, 98, 124, 157, 148, 144, 13, 13, 13, 13, 13, 13, 13, 13, 29, 29, 29, 29, 60, 60, 60, 95, 95, 120, 154, 147, 143, 15, 15, 15, 15, 15, 15, 15, 15, 31, 31, 31, 31, 62, 62, 62, 97, 97, 122, 156, 148, 145, 14, 14, 14, 14, 14, 14, 14, 14, 30, 30, 30, 30, 60, 60, 60, 95, 95, 121, 154, 147, 144, 15, 15, 15, 15, 15, 15, 15, 15, 31, 31, 31, 31, 61, 61, 61, 96, 96, 122, 155, 148, 145, };
+18, 18, 18, 18, 18, 18, 18, 18, 28, 28, 28, 28, 55, 55, 55, 90, 90, 116, 148, 141, 139, 18, 18, 18, 18, 18, 18, 18, 18, 38, 38, 38, 38, 62, 62, 62, 98, 98, 123, 156, 146, 144, 14, 14, 14, 14, 14, 14, 14, 14, 27, 27, 27, 27, 58, 58, 58, 92, 92, 118, 151, 144, 141, 19, 19, 19, 19, 19, 19, 19, 19, 31, 31, 31, 31, 61, 61, 61, 96, 96, 122, 155, 147, 143, 13, 13, 13, 13, 13, 13, 13, 13, 29, 29, 29, 29, 59, 59, 59, 92, 92, 118, 152, 145, 142, 15, 15, 15, 15, 15, 15, 15, 15, 30, 30, 30, 30, 61, 61, 61, 94, 94, 120, 153, 147, 143, 14, 14, 14, 14, 14, 14, 14, 14, 29, 29, 29, 29, 59, 59, 59, 93, 93, 118, 152, 145, 142, 15, 15, 15, 15, 15, 15, 15, 15, 30, 30, 30, 30, 60, 60, 60, 94, 94, 119, 153, 146, 143, };
 #endif
 
 #ifndef FFT_TWIDDLES48000_960
index 92d40e2..9747aa5 100644 (file)
@@ -22,7 +22,7 @@ static const celt_int16 cache_index50[105] = {
 static const unsigned char cache_bits50[392] = {
 40, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 40, 15, 23, 28, 31, 34, 36, 38, 39, 41, 42, 43, 44, 45, 46, 47, 47, 49, 50, 51, 52, 53, 54, 55, 55, 57, 58, 59, 60, 61, 62, 63, 63, 65, 66, 67, 68, 69, 70, 71, 71, 40, 20, 33, 41, 48, 53, 57, 61, 64, 66, 69, 71, 73, 75, 76, 78, 80, 82, 85, 87, 89, 91, 92, 94, 96, 98, 101, 103, 105, 107, 108, 110, 112, 114, 117, 119, 121, 123, 124, 126, 128, 40, 23, 39, 51, 60, 67, 73, 79, 83, 87, 91, 94, 97, 100, 102, 105, 107, 111, 115, 118, 121, 124, 126, 129, 131, 135, 139, 142, 145, 148, 150, 153, 155, 159, 163, 166, 169, 172, 174, 177, 179, 35, 28, 49, 65, 78, 89, 99, 107, 114, 120, 126, 132, 136, 141, 145, 149, 153, 159, 165, 171, 176, 180, 185, 189, 192, 199, 205, 211, 216, 220, 225, 229, 232, 239, 245, 251, 21, 33, 58, 79, 97, 112, 125, 137, 148, 157, 166, 174, 182, 189, 195, 201, 207, 217, 227, 235, 243, 251, 17, 35, 63, 86, 106, 123, 139, 152, 165, 177, 187, 197, 206, 214, 222, 230, 237, 250, 25, 31, 55, 75, 91, 105, 117, 128, 138, 146, 154, 161, 168, 174, 180, 185, 190, 200, 208, 215, 222, 229, 235, 240, 245, 255, 16, 36, 65, 89, 110, 128, 144, 159, 173, 185, 196, 207, 217, 226, 234, 242, 250, 11, 41, 74, 103, 128, 151, 172, 191, 209, 225, 241, 255, 9, 43, 79, 110, 138, 163, 186, 207, 227, 246, 12, 39, 71, 99, 123, 144, 164, 182, 198, 214, 228, 241, 253, 9, 44, 81, 113, 142, 168, 192, 214, 235, 255, 7, 49, 90, 127, 160, 191, 220, 247, 6, 51, 95, 134, 170, 203, 234, 7, 47, 87, 123, 155, 184, 212, 237, 6, 52, 97, 137, 174, 208, 240, 5, 57, 106, 151, 192, 231, 5, 59, 111, 158, 202, 243, 5, 55, 103, 147, 187, 224, 5, 60, 113, 161, 206, 248, 4, 65, 122, 175, 224, 4, 67, 127, 182, 234, };
 static const unsigned char cache_caps50[168] = {
-18, 18, 18, 18, 18, 18, 18, 18, 28, 28, 28, 28, 55, 55, 55, 92, 92, 117, 149, 142, 140, 18, 18, 18, 18, 18, 18, 18, 18, 38, 38, 38, 38, 62, 62, 62, 99, 99, 125, 157, 147, 145, 14, 14, 14, 14, 14, 14, 14, 14, 27, 27, 27, 27, 58, 58, 58, 94, 94, 120, 153, 145, 142, 19, 19, 19, 19, 19, 19, 19, 19, 31, 31, 31, 31, 62, 62, 62, 98, 98, 124, 157, 148, 144, 13, 13, 13, 13, 13, 13, 13, 13, 29, 29, 29, 29, 60, 60, 60, 95, 95, 120, 154, 147, 143, 15, 15, 15, 15, 15, 15, 15, 15, 31, 31, 31, 31, 62, 62, 62, 97, 97, 122, 156, 148, 145, 14, 14, 14, 14, 14, 14, 14, 14, 30, 30, 30, 30, 60, 60, 60, 95, 95, 121, 154, 147, 144, 15, 15, 15, 15, 15, 15, 15, 15, 31, 31, 31, 31, 61, 61, 61, 96, 96, 122, 155, 148, 145, };
+18, 18, 18, 18, 18, 18, 18, 18, 28, 28, 28, 28, 55, 55, 55, 90, 90, 116, 148, 141, 139, 18, 18, 18, 18, 18, 18, 18, 18, 38, 38, 38, 38, 62, 62, 62, 98, 98, 123, 156, 146, 144, 14, 14, 14, 14, 14, 14, 14, 14, 27, 27, 27, 27, 58, 58, 58, 92, 92, 118, 151, 144, 141, 19, 19, 19, 19, 19, 19, 19, 19, 31, 31, 31, 31, 61, 61, 61, 96, 96, 122, 155, 147, 143, 13, 13, 13, 13, 13, 13, 13, 13, 29, 29, 29, 29, 59, 59, 59, 92, 92, 118, 152, 145, 142, 15, 15, 15, 15, 15, 15, 15, 15, 30, 30, 30, 30, 61, 61, 61, 94, 94, 120, 153, 147, 143, 14, 14, 14, 14, 14, 14, 14, 14, 29, 29, 29, 29, 59, 59, 59, 93, 93, 118, 152, 145, 142, 15, 15, 15, 15, 15, 15, 15, 15, 30, 30, 30, 30, 60, 60, 60, 94, 94, 119, 153, 146, 143, };
 #endif
 
 #ifndef FFT_TWIDDLES48000_960