737 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			737 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|  | /* Copyright (c) 2007-2008 CSIRO
 | ||
|  |    Copyright (c) 2007-2009 Xiph.Org Foundation | ||
|  |    Copyright (c) 2007-2009 Timothy B. Terriberry | ||
|  |    Written by Timothy B. Terriberry and Jean-Marc Valin */ | ||
|  | /*
 | ||
|  |    Redistribution and use in source and binary forms, with or without | ||
|  |    modification, are permitted provided that the following conditions | ||
|  |    are met: | ||
|  | 
 | ||
|  |    - Redistributions of source code must retain the above copyright | ||
|  |    notice, this list of conditions and the following disclaimer. | ||
|  | 
 | ||
|  |    - Redistributions in binary form must reproduce the above copyright | ||
|  |    notice, this list of conditions and the following disclaimer in the | ||
|  |    documentation and/or other materials provided with the distribution. | ||
|  | 
 | ||
|  |    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
|  |    ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
|  |    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||
|  |    A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR | ||
|  |    CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | ||
|  |    EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | ||
|  |    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR | ||
|  |    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF | ||
|  |    LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING | ||
|  |    NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
|  |    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
|  | */ | ||
|  | 
 | ||
|  | #ifdef HAVE_CONFIG_H
 | ||
|  | #include "config.h"
 | ||
|  | #endif
 | ||
|  | 
 | ||
|  | #include "os_support.h"
 | ||
|  | #include <stdlib.h>
 | ||
|  | #include <string.h>
 | ||
|  | #include "cwrs.h"
 | ||
|  | #include "mathops.h"
 | ||
|  | #include "arch.h"
 | ||
|  | 
 | ||
|  | /*Guaranteed to return a conservatively large estimate of the binary logarithm
 | ||
|  |    with frac bits of fractional precision. | ||
|  |   Tested for all possible 32-bit inputs with frac=4, where the maximum | ||
|  |    overestimation is 0.06254243 bits.*/ | ||
|  | int log2_frac(celt_uint32 val, int frac) | ||
|  | { | ||
|  |   int l; | ||
|  |   l=EC_ILOG(val); | ||
|  |   if(val&val-1){ | ||
|  |     /*This is (val>>l-16), but guaranteed to round up, even if adding a bias
 | ||
|  |        before the shift would cause overflow (e.g., for 0xFFFFxxxx).*/ | ||
|  |     if(l>16)val=(val>>l-16)+((val&(1<<l-16)-1)+(1<<l-16)-1>>l-16); | ||
|  |     else val<<=16-l; | ||
|  |     l=l-1<<frac; | ||
|  |     /*Note that we always need one iteration, since the rounding up above means
 | ||
|  |        that we might need to adjust the integer part of the logarithm.*/ | ||
|  |     do{ | ||
|  |       int b; | ||
|  |       b=(int)(val>>16); | ||
|  |       l+=b<<frac; | ||
|  |       val=val+b>>b; | ||
|  |       val=val*val+0x7FFF>>15; | ||
|  |     } | ||
|  |     while(frac-->0); | ||
|  |     /*If val is not exactly 0x8000, then we have to round up the remainder.*/ | ||
|  |     return l+(val>0x8000); | ||
|  |   } | ||
|  |   /*Exact powers of two require no rounding.*/ | ||
|  |   else return l-1<<frac; | ||
|  | } | ||
|  | 
 | ||
|  | #ifndef SMALL_FOOTPRINT
 | ||
|  | 
 | ||
|  | 
 | ||
|  | #define MASK32 (0xFFFFFFFF)
 | ||
|  | 
 | ||
|  | /*INV_TABLE[i] holds the multiplicative inverse of (2*i+1) mod 2**32.*/ | ||
|  | static const celt_uint32 INV_TABLE[64]={ | ||
|  |   0x00000001,0xAAAAAAAB,0xCCCCCCCD,0xB6DB6DB7, | ||
|  |   0x38E38E39,0xBA2E8BA3,0xC4EC4EC5,0xEEEEEEEF, | ||
|  |   0xF0F0F0F1,0x286BCA1B,0x3CF3CF3D,0xE9BD37A7, | ||
|  |   0xC28F5C29,0x684BDA13,0x4F72C235,0xBDEF7BDF, | ||
|  |   0x3E0F83E1,0x8AF8AF8B,0x914C1BAD,0x96F96F97, | ||
|  |   0xC18F9C19,0x2FA0BE83,0xA4FA4FA5,0x677D46CF, | ||
|  |   0x1A1F58D1,0xFAFAFAFB,0x8C13521D,0x586FB587, | ||
|  |   0xB823EE09,0xA08AD8F3,0xC10C9715,0xBEFBEFBF, | ||
|  |   0xC0FC0FC1,0x07A44C6B,0xA33F128D,0xE327A977, | ||
|  |   0xC7E3F1F9,0x962FC963,0x3F2B3885,0x613716AF, | ||
|  |   0x781948B1,0x2B2E43DB,0xFCFCFCFD,0x6FD0EB67, | ||
|  |   0xFA3F47E9,0xD2FD2FD3,0x3F4FD3F5,0xD4E25B9F, | ||
|  |   0x5F02A3A1,0xBF5A814B,0x7C32B16D,0xD3431B57, | ||
|  |   0xD8FD8FD9,0x8D28AC43,0xDA6C0965,0xDB195E8F, | ||
|  |   0x0FDBC091,0x61F2A4BB,0xDCFDCFDD,0x46FDD947, | ||
|  |   0x56BE69C9,0xEB2FDEB3,0x26E978D5,0xEFDFBF7F, | ||
|  |   /*
 | ||
|  |   0x0FE03F81,0xC9484E2B,0xE133F84D,0xE1A8C537, | ||
|  |   0x077975B9,0x70586723,0xCD29C245,0xFAA11E6F, | ||
|  |   0x0FE3C071,0x08B51D9B,0x8CE2CABD,0xBF937F27, | ||
|  |   0xA8FE53A9,0x592FE593,0x2C0685B5,0x2EB11B5F, | ||
|  |   0xFCD1E361,0x451AB30B,0x72CFE72D,0xDB35A717, | ||
|  |   0xFB74A399,0xE80BFA03,0x0D516325,0x1BCB564F, | ||
|  |   0xE02E4851,0xD962AE7B,0x10F8ED9D,0x95AEDD07, | ||
|  |   0xE9DC0589,0xA18A4473,0xEA53FA95,0xEE936F3F, | ||
|  |   0x90948F41,0xEAFEAFEB,0x3D137E0D,0xEF46C0F7, | ||
|  |   0x028C1979,0x791064E3,0xC04FEC05,0xE115062F, | ||
|  |   0x32385831,0x6E68575B,0xA10D387D,0x6FECF2E7, | ||
|  |   0x3FB47F69,0xED4BFB53,0x74FED775,0xDB43BB1F, | ||
|  |   0x87654321,0x9BA144CB,0x478BBCED,0xBFB912D7, | ||
|  |   0x1FDCD759,0x14B2A7C3,0xCB125CE5,0x437B2E0F, | ||
|  |   0x10FEF011,0xD2B3183B,0x386CAB5D,0xEF6AC0C7, | ||
|  |   0x0E64C149,0x9A020A33,0xE6B41C55,0xFEFEFEFF*/ | ||
|  | }; | ||
|  | 
 | ||
|  | /*Computes (_a*_b-_c)/(2*_d+1) when the quotient is known to be exact.
 | ||
|  |   _a, _b, _c, and _d may be arbitrary so long as the arbitrary precision result | ||
|  |    fits in 32 bits, but currently the table for multiplicative inverses is only | ||
|  |    valid for _d<128.*/ | ||
|  | static inline celt_uint32 imusdiv32odd(celt_uint32 _a,celt_uint32 _b, | ||
|  |  celt_uint32 _c,int _d){ | ||
|  |   return (_a*_b-_c)*INV_TABLE[_d]&MASK32; | ||
|  | } | ||
|  | 
 | ||
|  | /*Computes (_a*_b-_c)/_d when the quotient is known to be exact.
 | ||
|  |   _d does not actually have to be even, but imusdiv32odd will be faster when | ||
|  |    it's odd, so you should use that instead. | ||
|  |   _a and _d are assumed to be small (e.g., _a*_d fits in 32 bits; currently the | ||
|  |    table for multiplicative inverses is only valid for _d<=256). | ||
|  |   _b and _c may be arbitrary so long as the arbitrary precision reuslt fits in | ||
|  |    32 bits.*/ | ||
|  | static inline celt_uint32 imusdiv32even(celt_uint32 _a,celt_uint32 _b, | ||
|  |  celt_uint32 _c,int _d){ | ||
|  |   celt_uint32 inv; | ||
|  |   int           mask; | ||
|  |   int           shift; | ||
|  |   int           one; | ||
|  |   celt_assert(_d>0); | ||
|  |   shift=EC_ILOG(_d^_d-1); | ||
|  |   celt_assert(_d<=256); | ||
|  |   inv=INV_TABLE[_d-1>>shift]; | ||
|  |   shift--; | ||
|  |   one=1<<shift; | ||
|  |   mask=one-1; | ||
|  |   return (_a*(_b>>shift)-(_c>>shift)+ | ||
|  |    (_a*(_b&mask)+one-(_c&mask)>>shift)-1)*inv&MASK32; | ||
|  | } | ||
|  | 
 | ||
|  | #endif /* SMALL_FOOTPRINT */
 | ||
|  | 
 | ||
|  | /*Although derived separately, the pulse vector coding scheme is equivalent to
 | ||
|  |    a Pyramid Vector Quantizer \cite{Fis86}. | ||
|  |   Some additional notes about an early version appear at | ||
|  |    http://people.xiph.org/~tterribe/notes/cwrs.html, but the codebook ordering
 | ||
|  |    and the definitions of some terms have evolved since that was written. | ||
|  | 
 | ||
|  |   The conversion from a pulse vector to an integer index (encoding) and back | ||
|  |    (decoding) is governed by two related functions, V(N,K) and U(N,K). | ||
|  | 
 | ||
|  |   V(N,K) = the number of combinations, with replacement, of N items, taken K | ||
|  |    at a time, when a sign bit is added to each item taken at least once (i.e., | ||
|  |    the number of N-dimensional unit pulse vectors with K pulses). | ||
|  |   One way to compute this is via | ||
|  |     V(N,K) = K>0 ? sum(k=1...K,2**k*choose(N,k)*choose(K-1,k-1)) : 1, | ||
|  |    where choose() is the binomial function. | ||
|  |   A table of values for N<10 and K<10 looks like: | ||
|  |   V[10][10] = { | ||
|  |     {1,  0,   0,    0,    0,     0,     0,      0,      0,       0}, | ||
|  |     {1,  2,   2,    2,    2,     2,     2,      2,      2,       2}, | ||
|  |     {1,  4,   8,   12,   16,    20,    24,     28,     32,      36}, | ||
|  |     {1,  6,  18,   38,   66,   102,   146,    198,    258,     326}, | ||
|  |     {1,  8,  32,   88,  192,   360,   608,    952,   1408,    1992}, | ||
|  |     {1, 10,  50,  170,  450,  1002,  1970,   3530,   5890,    9290}, | ||
|  |     {1, 12,  72,  292,  912,  2364,  5336,  10836,  20256,   35436}, | ||
|  |     {1, 14,  98,  462, 1666,  4942, 12642,  28814,  59906,  115598}, | ||
|  |     {1, 16, 128,  688, 2816,  9424, 27008,  68464, 157184,  332688}, | ||
|  |     {1, 18, 162,  978, 4482, 16722, 53154, 148626, 374274,  864146} | ||
|  |   }; | ||
|  | 
 | ||
|  |   U(N,K) = the number of such combinations wherein N-1 objects are taken at | ||
|  |    most K-1 at a time. | ||
|  |   This is given by | ||
|  |     U(N,K) = sum(k=0...K-1,V(N-1,k)) | ||
|  |            = K>0 ? (V(N-1,K-1) + V(N,K-1))/2 : 0. | ||
|  |   The latter expression also makes clear that U(N,K) is half the number of such | ||
|  |    combinations wherein the first object is taken at least once. | ||
|  |   Although it may not be clear from either of these definitions, U(N,K) is the | ||
|  |    natural function to work with when enumerating the pulse vector codebooks, | ||
|  |    not V(N,K). | ||
|  |   U(N,K) is not well-defined for N=0, but with the extension | ||
|  |     U(0,K) = K>0 ? 0 : 1, | ||
|  |    the function becomes symmetric: U(N,K) = U(K,N), with a similar table: | ||
|  |   U[10][10] = { | ||
|  |     {1, 0,  0,   0,    0,    0,     0,     0,      0,      0}, | ||
|  |     {0, 1,  1,   1,    1,    1,     1,     1,      1,      1}, | ||
|  |     {0, 1,  3,   5,    7,    9,    11,    13,     15,     17}, | ||
|  |     {0, 1,  5,  13,   25,   41,    61,    85,    113,    145}, | ||
|  |     {0, 1,  7,  25,   63,  129,   231,   377,    575,    833}, | ||
|  |     {0, 1,  9,  41,  129,  321,   681,  1289,   2241,   3649}, | ||
|  |     {0, 1, 11,  61,  231,  681,  1683,  3653,   7183,  13073}, | ||
|  |     {0, 1, 13,  85,  377, 1289,  3653,  8989,  19825,  40081}, | ||
|  |     {0, 1, 15, 113,  575, 2241,  7183, 19825,  48639, 108545}, | ||
|  |     {0, 1, 17, 145,  833, 3649, 13073, 40081, 108545, 265729} | ||
|  |   }; | ||
|  | 
 | ||
|  |   With this extension, V(N,K) may be written in terms of U(N,K): | ||
|  |     V(N,K) = U(N,K) + U(N,K+1) | ||
|  |    for all N>=0, K>=0. | ||
|  |   Thus U(N,K+1) represents the number of combinations where the first element | ||
|  |    is positive or zero, and U(N,K) represents the number of combinations where | ||
|  |    it is negative. | ||
|  |   With a large enough table of U(N,K) values, we could write O(N) encoding | ||
|  |    and O(min(N*log(K),N+K)) decoding routines, but such a table would be | ||
|  |    prohibitively large for small embedded devices (K may be as large as 32767 | ||
|  |    for small N, and N may be as large as 200). | ||
|  | 
 | ||
|  |   Both functions obey the same recurrence relation: | ||
|  |     V(N,K) = V(N-1,K) + V(N,K-1) + V(N-1,K-1), | ||
|  |     U(N,K) = U(N-1,K) + U(N,K-1) + U(N-1,K-1), | ||
|  |    for all N>0, K>0, with different initial conditions at N=0 or K=0. | ||
|  |   This allows us to construct a row of one of the tables above given the | ||
|  |    previous row or the next row. | ||
|  |   Thus we can derive O(NK) encoding and decoding routines with O(K) memory | ||
|  |    using only addition and subtraction. | ||
|  | 
 | ||
|  |   When encoding, we build up from the U(2,K) row and work our way forwards. | ||
|  |   When decoding, we need to start at the U(N,K) row and work our way backwards, | ||
|  |    which requires a means of computing U(N,K). | ||
|  |   U(N,K) may be computed from two previous values with the same N: | ||
|  |     U(N,K) = ((2*N-1)*U(N,K-1) - U(N,K-2))/(K-1) + U(N,K-2) | ||
|  |    for all N>1, and since U(N,K) is symmetric, a similar relation holds for two | ||
|  |    previous values with the same K: | ||
|  |     U(N,K>1) = ((2*K-1)*U(N-1,K) - U(N-2,K))/(N-1) + U(N-2,K) | ||
|  |    for all K>1. | ||
|  |   This allows us to construct an arbitrary row of the U(N,K) table by starting | ||
|  |    with the first two values, which are constants. | ||
|  |   This saves roughly 2/3 the work in our O(NK) decoding routine, but costs O(K) | ||
|  |    multiplications. | ||
|  |   Similar relations can be derived for V(N,K), but are not used here. | ||
|  | 
 | ||
|  |   For N>0 and K>0, U(N,K) and V(N,K) take on the form of an (N-1)-degree | ||
|  |    polynomial for fixed N. | ||
|  |   The first few are | ||
|  |     U(1,K) = 1, | ||
|  |     U(2,K) = 2*K-1, | ||
|  |     U(3,K) = (2*K-2)*K+1, | ||
|  |     U(4,K) = (((4*K-6)*K+8)*K-3)/3, | ||
|  |     U(5,K) = ((((2*K-4)*K+10)*K-8)*K+3)/3, | ||
|  |    and | ||
|  |     V(1,K) = 2, | ||
|  |     V(2,K) = 4*K, | ||
|  |     V(3,K) = 4*K*K+2, | ||
|  |     V(4,K) = 8*(K*K+2)*K/3, | ||
|  |     V(5,K) = ((4*K*K+20)*K*K+6)/3, | ||
|  |    for all K>0. | ||
|  |   This allows us to derive O(N) encoding and O(N*log(K)) decoding routines for | ||
|  |    small N (and indeed decoding is also O(N) for N<3). | ||
|  | 
 | ||
|  |   @ARTICLE{Fis86, | ||
|  |     author="Thomas R. Fischer", | ||
|  |     title="A Pyramid Vector Quantizer", | ||
|  |     journal="IEEE Transactions on Information Theory", | ||
|  |     volume="IT-32", | ||
|  |     number=4, | ||
|  |     pages="568--583", | ||
|  |     month=Jul, | ||
|  |     year=1986 | ||
|  |   }*/ | ||
|  | 
 | ||
|  | #ifndef SMALL_FOOTPRINT
 | ||
|  | 
 | ||
|  | /*Compute U(1,_k).*/ | ||
|  | static inline unsigned ucwrs1(int _k){ | ||
|  |   return _k?1:0; | ||
|  | } | ||
|  | 
 | ||
|  | /*Compute V(1,_k).*/ | ||
|  | static inline unsigned ncwrs1(int _k){ | ||
|  |   return _k?2:1; | ||
|  | } | ||
|  | 
 | ||
|  | /*Compute U(2,_k).
 | ||
|  |   Note that this may be called with _k=32768 (maxK[2]+1).*/ | ||
|  | static inline unsigned ucwrs2(unsigned _k){ | ||
|  |   return _k?_k+(_k-1):0; | ||
|  | } | ||
|  | 
 | ||
|  | /*Compute V(2,_k).*/ | ||
|  | static inline celt_uint32 ncwrs2(int _k){ | ||
|  |   return _k?4*(celt_uint32)_k:1; | ||
|  | } | ||
|  | 
 | ||
|  | /*Compute U(3,_k).
 | ||
|  |   Note that this may be called with _k=32768 (maxK[3]+1).*/ | ||
|  | static inline celt_uint32 ucwrs3(unsigned _k){ | ||
|  |   return _k?(2*(celt_uint32)_k-2)*_k+1:0; | ||
|  | } | ||
|  | 
 | ||
|  | /*Compute V(3,_k).*/ | ||
|  | static inline celt_uint32 ncwrs3(int _k){ | ||
|  |   return _k?2*(2*(unsigned)_k*(celt_uint32)_k+1):1; | ||
|  | } | ||
|  | 
 | ||
|  | /*Compute U(4,_k).*/ | ||
|  | static inline celt_uint32 ucwrs4(int _k){ | ||
|  |   return _k?imusdiv32odd(2*_k,(2*_k-3)*(celt_uint32)_k+4,3,1):0; | ||
|  | } | ||
|  | 
 | ||
|  | /*Compute V(4,_k).*/ | ||
|  | static inline celt_uint32 ncwrs4(int _k){ | ||
|  |   return _k?((_k*(celt_uint32)_k+2)*_k)/3<<3:1; | ||
|  | } | ||
|  | 
 | ||
|  | /*Compute U(5,_k).*/ | ||
|  | static inline celt_uint32 ucwrs5(int _k){ | ||
|  |   return _k?(((((_k-2)*(unsigned)_k+5)*(celt_uint32)_k-4)*_k)/3<<1)+1:0; | ||
|  | } | ||
|  | 
 | ||
|  | /*Compute V(5,_k).*/ | ||
|  | static inline celt_uint32 ncwrs5(int _k){ | ||
|  |   return _k?(((_k*(unsigned)_k+5)*(celt_uint32)_k*_k)/3<<2)+2:1; | ||
|  | } | ||
|  | 
 | ||
|  | #endif /* SMALL_FOOTPRINT */
 | ||
|  | 
 | ||
|  | /*Computes the next row/column of any recurrence that obeys the relation
 | ||
|  |    u[i][j]=u[i-1][j]+u[i][j-1]+u[i-1][j-1]. | ||
|  |   _ui0 is the base case for the new row/column.*/ | ||
|  | static inline void unext(celt_uint32 *_ui,unsigned _len,celt_uint32 _ui0){ | ||
|  |   celt_uint32 ui1; | ||
|  |   unsigned      j; | ||
|  |   /*This do-while will overrun the array if we don't have storage for at least
 | ||
|  |      2 values.*/ | ||
|  |   j=1; do { | ||
|  |     ui1=UADD32(UADD32(_ui[j],_ui[j-1]),_ui0); | ||
|  |     _ui[j-1]=_ui0; | ||
|  |     _ui0=ui1; | ||
|  |   } while (++j<_len); | ||
|  |   _ui[j-1]=_ui0; | ||
|  | } | ||
|  | 
 | ||
|  | /*Computes the previous row/column of any recurrence that obeys the relation
 | ||
|  |    u[i-1][j]=u[i][j]-u[i][j-1]-u[i-1][j-1]. | ||
|  |   _ui0 is the base case for the new row/column.*/ | ||
|  | static inline void uprev(celt_uint32 *_ui,unsigned _n,celt_uint32 _ui0){ | ||
|  |   celt_uint32 ui1; | ||
|  |   unsigned      j; | ||
|  |   /*This do-while will overrun the array if we don't have storage for at least
 | ||
|  |      2 values.*/ | ||
|  |   j=1; do { | ||
|  |     ui1=USUB32(USUB32(_ui[j],_ui[j-1]),_ui0); | ||
|  |     _ui[j-1]=_ui0; | ||
|  |     _ui0=ui1; | ||
|  |   } while (++j<_n); | ||
|  |   _ui[j-1]=_ui0; | ||
|  | } | ||
|  | 
 | ||
|  | /*Compute V(_n,_k), as well as U(_n,0..._k+1).
 | ||
|  |   _u: On exit, _u[i] contains U(_n,i) for i in [0..._k+1].*/ | ||
|  | static celt_uint32 ncwrs_urow(unsigned _n,unsigned _k,celt_uint32 *_u){ | ||
|  |   celt_uint32 um2; | ||
|  |   unsigned      len; | ||
|  |   unsigned      k; | ||
|  |   len=_k+2; | ||
|  |   /*We require storage at least 3 values (e.g., _k>0).*/ | ||
|  |   celt_assert(len>=3); | ||
|  |   _u[0]=0; | ||
|  |   _u[1]=um2=1; | ||
|  | #ifndef SMALL_FOOTPRINT
 | ||
|  |   if(_n<=6 || _k>255) | ||
|  | #endif
 | ||
|  |  { | ||
|  |     /*If _n==0, _u[0] should be 1 and the rest should be 0.*/ | ||
|  |     /*If _n==1, _u[i] should be 1 for i>1.*/ | ||
|  |     celt_assert(_n>=2); | ||
|  |     /*If _k==0, the following do-while loop will overflow the buffer.*/ | ||
|  |     celt_assert(_k>0); | ||
|  |     k=2; | ||
|  |     do _u[k]=(k<<1)-1; | ||
|  |     while(++k<len); | ||
|  |     for(k=2;k<_n;k++)unext(_u+1,_k+1,1); | ||
|  |   } | ||
|  | #ifndef SMALL_FOOTPRINT
 | ||
|  |   else{ | ||
|  |     celt_uint32 um1; | ||
|  |     celt_uint32 n2m1; | ||
|  |     _u[2]=n2m1=um1=(_n<<1)-1; | ||
|  |     for(k=3;k<len;k++){ | ||
|  |       /*U(N,K) = ((2*N-1)*U(N,K-1)-U(N,K-2))/(K-1) + U(N,K-2)*/ | ||
|  |       _u[k]=um2=imusdiv32even(n2m1,um1,um2,k-1)+um2; | ||
|  |       if(++k>=len)break; | ||
|  |       _u[k]=um1=imusdiv32odd(n2m1,um2,um1,k-1>>1)+um1; | ||
|  |     } | ||
|  |   } | ||
|  | #endif /* SMALL_FOOTPRINT */
 | ||
|  |   return _u[_k]+_u[_k+1]; | ||
|  | } | ||
|  | 
 | ||
|  | /*Returns the _i'th combination of _k elements (at most 32767) chosen from a
 | ||
|  |    set of size 1 with associated sign bits. | ||
|  |   _y: Returns the vector of pulses.*/ | ||
|  | static inline void cwrsi1(int _k,celt_uint32 _i,int *_y){ | ||
|  |   int s; | ||
|  |   s=-(int)_i; | ||
|  |   _y[0]=_k+s^s; | ||
|  | } | ||
|  | 
 | ||
|  | #ifndef SMALL_FOOTPRINT
 | ||
|  | 
 | ||
|  | /*Returns the _i'th combination of _k elements (at most 32767) chosen from a
 | ||
|  |    set of size 2 with associated sign bits. | ||
|  |   _y: Returns the vector of pulses.*/ | ||
|  | static inline void cwrsi2(int _k,celt_uint32 _i,int *_y){ | ||
|  |   celt_uint32 p; | ||
|  |   int           s; | ||
|  |   int           yj; | ||
|  |   p=ucwrs2(_k+1U); | ||
|  |   s=-(_i>=p); | ||
|  |   _i-=p&s; | ||
|  |   yj=_k; | ||
|  |   _k=_i+1>>1; | ||
|  |   p=ucwrs2(_k); | ||
|  |   _i-=p; | ||
|  |   yj-=_k; | ||
|  |   _y[0]=yj+s^s; | ||
|  |   cwrsi1(_k,_i,_y+1); | ||
|  | } | ||
|  | 
 | ||
|  | /*Returns the _i'th combination of _k elements (at most 32767) chosen from a
 | ||
|  |    set of size 3 with associated sign bits. | ||
|  |   _y: Returns the vector of pulses.*/ | ||
|  | static void cwrsi3(int _k,celt_uint32 _i,int *_y){ | ||
|  |   celt_uint32 p; | ||
|  |   int           s; | ||
|  |   int           yj; | ||
|  |   p=ucwrs3(_k+1U); | ||
|  |   s=-(_i>=p); | ||
|  |   _i-=p&s; | ||
|  |   yj=_k; | ||
|  |   /*Finds the maximum _k such that ucwrs3(_k)<=_i (tested for all
 | ||
|  |      _i<2147418113=U(3,32768)).*/ | ||
|  |   _k=_i>0?isqrt32(2*_i-1)+1>>1:0; | ||
|  |   p=ucwrs3(_k); | ||
|  |   _i-=p; | ||
|  |   yj-=_k; | ||
|  |   _y[0]=yj+s^s; | ||
|  |   cwrsi2(_k,_i,_y+1); | ||
|  | } | ||
|  | 
 | ||
|  | /*Returns the _i'th combination of _k elements (at most 1172) chosen from a set
 | ||
|  |    of size 4 with associated sign bits. | ||
|  |   _y: Returns the vector of pulses.*/ | ||
|  | static void cwrsi4(int _k,celt_uint32 _i,int *_y){ | ||
|  |   celt_uint32 p; | ||
|  |   int           s; | ||
|  |   int           yj; | ||
|  |   int           kl; | ||
|  |   int           kr; | ||
|  |   p=ucwrs4(_k+1); | ||
|  |   s=-(_i>=p); | ||
|  |   _i-=p&s; | ||
|  |   yj=_k; | ||
|  |   /*We could solve a cubic for k here, but the form of the direct solution does
 | ||
|  |      not lend itself well to exact integer arithmetic. | ||
|  |     Instead we do a binary search on U(4,K).*/ | ||
|  |   kl=0; | ||
|  |   kr=_k; | ||
|  |   for(;;){ | ||
|  |     _k=kl+kr>>1; | ||
|  |     p=ucwrs4(_k); | ||
|  |     if(p<_i){ | ||
|  |       if(_k>=kr)break; | ||
|  |       kl=_k+1; | ||
|  |     } | ||
|  |     else if(p>_i)kr=_k-1; | ||
|  |     else break; | ||
|  |   } | ||
|  |   _i-=p; | ||
|  |   yj-=_k; | ||
|  |   _y[0]=yj+s^s; | ||
|  |   cwrsi3(_k,_i,_y+1); | ||
|  | } | ||
|  | 
 | ||
|  | /*Returns the _i'th combination of _k elements (at most 238) chosen from a set
 | ||
|  |    of size 5 with associated sign bits. | ||
|  |   _y: Returns the vector of pulses.*/ | ||
|  | static void cwrsi5(int _k,celt_uint32 _i,int *_y){ | ||
|  |   celt_uint32 p; | ||
|  |   int           s; | ||
|  |   int           yj; | ||
|  |   p=ucwrs5(_k+1); | ||
|  |   s=-(_i>=p); | ||
|  |   _i-=p&s; | ||
|  |   yj=_k; | ||
|  |   /* A binary search on U(5,K) avoids the need for 64-bit arithmetic */ | ||
|  |   { | ||
|  |     int kl=0; | ||
|  |     int kr=_k; | ||
|  |     for(;;){ | ||
|  |       _k=kl+kr>>1; | ||
|  |       p=ucwrs5(_k); | ||
|  |       if(p<_i){ | ||
|  |         if(_k>=kr)break; | ||
|  |         kl=_k+1; | ||
|  |       } | ||
|  |       else if(p>_i)kr=_k-1; | ||
|  |       else break; | ||
|  |     }   | ||
|  |   } | ||
|  |   _i-=p; | ||
|  |   yj-=_k; | ||
|  |   _y[0]=yj+s^s; | ||
|  |   cwrsi4(_k,_i,_y+1); | ||
|  | } | ||
|  | #endif /* SMALL_FOOTPRINT */
 | ||
|  | 
 | ||
|  | /*Returns the _i'th combination of _k elements chosen from a set of size _n
 | ||
|  |    with associated sign bits. | ||
|  |   _y: Returns the vector of pulses. | ||
|  |   _u: Must contain entries [0..._k+1] of row _n of U() on input. | ||
|  |       Its contents will be destructively modified.*/ | ||
|  | static void cwrsi(int _n,int _k,celt_uint32 _i,int *_y,celt_uint32 *_u){ | ||
|  |   int j; | ||
|  |   celt_assert(_n>0); | ||
|  |   j=0; | ||
|  |   do{ | ||
|  |     celt_uint32 p; | ||
|  |     int           s; | ||
|  |     int           yj; | ||
|  |     p=_u[_k+1]; | ||
|  |     s=-(_i>=p); | ||
|  |     _i-=p&s; | ||
|  |     yj=_k; | ||
|  |     p=_u[_k]; | ||
|  |     while(p>_i)p=_u[--_k]; | ||
|  |     _i-=p; | ||
|  |     yj-=_k; | ||
|  |     _y[j]=yj+s^s; | ||
|  |     uprev(_u,_k+2,0); | ||
|  |   } | ||
|  |   while(++j<_n); | ||
|  | } | ||
|  | 
 | ||
|  | 
 | ||
|  | /*Returns the index of the given combination of K elements chosen from a set
 | ||
|  |    of size 1 with associated sign bits. | ||
|  |   _y: The vector of pulses, whose sum of absolute values is K. | ||
|  |   _k: Returns K.*/ | ||
|  | static inline celt_uint32 icwrs1(const int *_y,int *_k){ | ||
|  |   *_k=abs(_y[0]); | ||
|  |   return _y[0]<0; | ||
|  | } | ||
|  | 
 | ||
|  | #ifndef SMALL_FOOTPRINT
 | ||
|  | 
 | ||
|  | /*Returns the index of the given combination of K elements chosen from a set
 | ||
|  |    of size 2 with associated sign bits. | ||
|  |   _y: The vector of pulses, whose sum of absolute values is K. | ||
|  |   _k: Returns K.*/ | ||
|  | static inline celt_uint32 icwrs2(const int *_y,int *_k){ | ||
|  |   celt_uint32 i; | ||
|  |   int           k; | ||
|  |   i=icwrs1(_y+1,&k); | ||
|  |   i+=ucwrs2(k); | ||
|  |   k+=abs(_y[0]); | ||
|  |   if(_y[0]<0)i+=ucwrs2(k+1U); | ||
|  |   *_k=k; | ||
|  |   return i; | ||
|  | } | ||
|  | 
 | ||
|  | /*Returns the index of the given combination of K elements chosen from a set
 | ||
|  |    of size 3 with associated sign bits. | ||
|  |   _y: The vector of pulses, whose sum of absolute values is K. | ||
|  |   _k: Returns K.*/ | ||
|  | static inline celt_uint32 icwrs3(const int *_y,int *_k){ | ||
|  |   celt_uint32 i; | ||
|  |   int           k; | ||
|  |   i=icwrs2(_y+1,&k); | ||
|  |   i+=ucwrs3(k); | ||
|  |   k+=abs(_y[0]); | ||
|  |   if(_y[0]<0)i+=ucwrs3(k+1U); | ||
|  |   *_k=k; | ||
|  |   return i; | ||
|  | } | ||
|  | 
 | ||
|  | /*Returns the index of the given combination of K elements chosen from a set
 | ||
|  |    of size 4 with associated sign bits. | ||
|  |   _y: The vector of pulses, whose sum of absolute values is K. | ||
|  |   _k: Returns K.*/ | ||
|  | static inline celt_uint32 icwrs4(const int *_y,int *_k){ | ||
|  |   celt_uint32 i; | ||
|  |   int           k; | ||
|  |   i=icwrs3(_y+1,&k); | ||
|  |   i+=ucwrs4(k); | ||
|  |   k+=abs(_y[0]); | ||
|  |   if(_y[0]<0)i+=ucwrs4(k+1); | ||
|  |   *_k=k; | ||
|  |   return i; | ||
|  | } | ||
|  | 
 | ||
|  | /*Returns the index of the given combination of K elements chosen from a set
 | ||
|  |    of size 5 with associated sign bits. | ||
|  |   _y: The vector of pulses, whose sum of absolute values is K. | ||
|  |   _k: Returns K.*/ | ||
|  | static inline celt_uint32 icwrs5(const int *_y,int *_k){ | ||
|  |   celt_uint32 i; | ||
|  |   int           k; | ||
|  |   i=icwrs4(_y+1,&k); | ||
|  |   i+=ucwrs5(k); | ||
|  |   k+=abs(_y[0]); | ||
|  |   if(_y[0]<0)i+=ucwrs5(k+1); | ||
|  |   *_k=k; | ||
|  |   return i; | ||
|  | } | ||
|  | #endif /* SMALL_FOOTPRINT */
 | ||
|  | 
 | ||
|  | /*Returns the index of the given combination of K elements chosen from a set
 | ||
|  |    of size _n with associated sign bits. | ||
|  |   _y:  The vector of pulses, whose sum of absolute values must be _k. | ||
|  |   _nc: Returns V(_n,_k).*/ | ||
|  | celt_uint32 icwrs(int _n,int _k,celt_uint32 *_nc,const int *_y, | ||
|  |  celt_uint32 *_u){ | ||
|  |   celt_uint32 i; | ||
|  |   int           j; | ||
|  |   int           k; | ||
|  |   /*We can't unroll the first two iterations of the loop unless _n>=2.*/ | ||
|  |   celt_assert(_n>=2); | ||
|  |   _u[0]=0; | ||
|  |   for(k=1;k<=_k+1;k++)_u[k]=(k<<1)-1; | ||
|  |   i=icwrs1(_y+_n-1,&k); | ||
|  |   j=_n-2; | ||
|  |   i+=_u[k]; | ||
|  |   k+=abs(_y[j]); | ||
|  |   if(_y[j]<0)i+=_u[k+1]; | ||
|  |   while(j-->0){ | ||
|  |     unext(_u,_k+2,0); | ||
|  |     i+=_u[k]; | ||
|  |     k+=abs(_y[j]); | ||
|  |     if(_y[j]<0)i+=_u[k+1]; | ||
|  |   } | ||
|  |   *_nc=_u[k]+_u[k+1]; | ||
|  |   return i; | ||
|  | } | ||
|  | 
 | ||
|  | #ifdef CUSTOM_MODES
 | ||
|  | void get_required_bits(celt_int16 *_bits,int _n,int _maxk,int _frac){ | ||
|  |   int k; | ||
|  |   /*_maxk==0 => there's nothing to do.*/ | ||
|  |   celt_assert(_maxk>0); | ||
|  |   _bits[0]=0; | ||
|  |   if (_n==1) | ||
|  |   { | ||
|  |     for (k=1;k<=_maxk;k++) | ||
|  |       _bits[k] = 1<<_frac; | ||
|  |   } | ||
|  |   else { | ||
|  |     VARDECL(celt_uint32,u); | ||
|  |     SAVE_STACK; | ||
|  |     ALLOC(u,_maxk+2U,celt_uint32); | ||
|  |     ncwrs_urow(_n,_maxk,u); | ||
|  |     for(k=1;k<=_maxk;k++) | ||
|  |       _bits[k]=log2_frac(u[k]+u[k+1],_frac); | ||
|  |     RESTORE_STACK; | ||
|  |   } | ||
|  | } | ||
|  | #endif /* CUSTOM_MODES */
 | ||
|  | 
 | ||
|  | void encode_pulses(const int *_y,int _n,int _k,ec_enc *_enc){ | ||
|  |   celt_uint32 i; | ||
|  |   if (_k==0) | ||
|  |      return; | ||
|  |   switch(_n){ | ||
|  |     case 1:{ | ||
|  |       i=icwrs1(_y,&_k); | ||
|  |       celt_assert(ncwrs1(_k)==2); | ||
|  |       ec_enc_bits(_enc,i,1); | ||
|  |     }break; | ||
|  | #ifndef SMALL_FOOTPRINT
 | ||
|  |     case 2:{ | ||
|  |       i=icwrs2(_y,&_k); | ||
|  |       ec_enc_uint(_enc,i,ncwrs2(_k)); | ||
|  |     }break; | ||
|  |     case 3:{ | ||
|  |       i=icwrs3(_y,&_k); | ||
|  |       ec_enc_uint(_enc,i,ncwrs3(_k)); | ||
|  |     }break; | ||
|  |     case 4:{ | ||
|  |       i=icwrs4(_y,&_k); | ||
|  |       ec_enc_uint(_enc,i,ncwrs4(_k)); | ||
|  |     }break; | ||
|  |     case 5:{ | ||
|  |       i=icwrs5(_y,&_k); | ||
|  |       ec_enc_uint(_enc,i,ncwrs5(_k)); | ||
|  |     }break; | ||
|  | #endif
 | ||
|  |      default: | ||
|  |     { | ||
|  |       VARDECL(celt_uint32,u); | ||
|  |       celt_uint32 nc; | ||
|  |       SAVE_STACK; | ||
|  |       ALLOC(u,_k+2U,celt_uint32); | ||
|  |       i=icwrs(_n,_k,&nc,_y,u); | ||
|  |       ec_enc_uint(_enc,i,nc); | ||
|  |       RESTORE_STACK; | ||
|  |     }; | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | void decode_pulses(int *_y,int _n,int _k,ec_dec *_dec) | ||
|  | { | ||
|  |    if (_k==0) { | ||
|  |       int i; | ||
|  |       for (i=0;i<_n;i++) | ||
|  |          _y[i] = 0; | ||
|  |       return; | ||
|  |    } | ||
|  |    switch(_n){ | ||
|  |     case 1:{ | ||
|  |       celt_assert(ncwrs1(_k)==2); | ||
|  |       cwrsi1(_k,ec_dec_bits(_dec,1),_y); | ||
|  |     }break; | ||
|  | #ifndef SMALL_FOOTPRINT
 | ||
|  |     case 2:cwrsi2(_k,ec_dec_uint(_dec,ncwrs2(_k)),_y);break; | ||
|  |     case 3:cwrsi3(_k,ec_dec_uint(_dec,ncwrs3(_k)),_y);break; | ||
|  |     case 4:cwrsi4(_k,ec_dec_uint(_dec,ncwrs4(_k)),_y);break; | ||
|  |     case 5:cwrsi5(_k,ec_dec_uint(_dec,ncwrs5(_k)),_y);break; | ||
|  | #endif
 | ||
|  |       default: | ||
|  |     { | ||
|  |       VARDECL(celt_uint32,u); | ||
|  |       SAVE_STACK; | ||
|  |       ALLOC(u,_k+2U,celt_uint32); | ||
|  |       cwrsi(_n,_k,ec_dec_uint(_dec,ncwrs_urow(_n,_k,u)),_y,u); | ||
|  |       RESTORE_STACK; | ||
|  |     } | ||
|  |   } | ||
|  | } | ||
|  | 
 |