wok-next diff asterisk/stuff/rfc3951.txt @ rev 21247
updated cyrus-imapd (2.4.17 -> 3.0.12)
author | Hans-G?nter Theisgen |
---|---|
date | Thu Dec 05 16:28:27 2019 +0100 (2019-12-05) |
parents | |
children |
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/asterisk/stuff/rfc3951.txt Thu Dec 05 16:28:27 2019 +0100 1.3 @@ -0,0 +1,10867 @@ 1.4 + 1.5 + 1.6 + 1.7 + 1.8 + 1.9 + 1.10 +Network Working Group S. Andersen 1.11 +Request for Comments: 3951 Aalborg University 1.12 +Category: Experimental A. Duric 1.13 + Telio 1.14 + H. Astrom 1.15 + R. Hagen 1.16 + W. Kleijn 1.17 + J. Linden 1.18 + Global IP Sound 1.19 + December 2004 1.20 + 1.21 + 1.22 + Internet Low Bit Rate Codec (iLBC) 1.23 + 1.24 +Status of this Memo 1.25 + 1.26 + This memo defines an Experimental Protocol for the Internet 1.27 + community. It does not specify an Internet standard of any kind. 1.28 + Discussion and suggestions for improvement are requested. 1.29 + Distribution of this memo is unlimited. 1.30 + 1.31 +Copyright Notice 1.32 + 1.33 + Copyright (C) The Internet Society (2004). 1.34 + 1.35 +Abstract 1.36 + 1.37 + This document specifies a speech codec suitable for robust voice 1.38 + communication over IP. The codec is developed by Global IP Sound 1.39 + (GIPS). It is designed for narrow band speech and results in a 1.40 + payload bit rate of 13.33 kbit/s for 30 ms frames and 15.20 kbit/s 1.41 + for 20 ms frames. The codec enables graceful speech quality 1.42 + degradation in the case of lost frames, which occurs in connection 1.43 + with lost or delayed IP packets. 1.44 + 1.45 + 1.46 + 1.47 + 1.48 + 1.49 + 1.50 + 1.51 + 1.52 + 1.53 + 1.54 + 1.55 + 1.56 + 1.57 + 1.58 + 1.59 + 1.60 + 1.61 +Andersen, et al. Experimental [Page 1] 1.62 + 1.63 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.64 + 1.65 + 1.66 +Table of Contents 1.67 + 1.68 + 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.69 + 2. Outline of the Codec . . . . . . . . . . . . . . . . . . . . . 5 1.70 + 2.1. Encoder. . . . . . . . . . . . . . . . . . . . . . . . . 5 1.71 + 2.2. Decoder. . . . . . . . . . . . . . . . . . . . . . . . . 7 1.72 + 3. Encoder Principles . . . . . . . . . . . . . . . . . . . . . . 7 1.73 + 3.1. Pre-processing . . . . . . . . . . . . . . . . . . . . . 9 1.74 + 3.2. LPC Analysis and Quantization. . . . . . . . . . . . . . 9 1.75 + 3.2.1. Computation of Autocorrelation Coefficients. . . 10 1.76 + 3.2.2. Computation of LPC Coefficients. . . . . . . . . 11 1.77 + 3.2.3. Computation of LSF Coefficients from LPC 1.78 + Coefficients . . . . . . . . . . . . . . . . . . 11 1.79 + 3.2.4. Quantization of LSF Coefficients . . . . . . . . 12 1.80 + 3.2.5. Stability Check of LSF Coefficients. . . . . . . 13 1.81 + 3.2.6. Interpolation of LSF Coefficients. . . . . . . . 13 1.82 + 3.2.7. LPC Analysis and Quantization for 20 ms Frames . 14 1.83 + 3.3. Calculation of the Residual. . . . . . . . . . . . . . . 15 1.84 + 3.4. Perceptual Weighting Filter. . . . . . . . . . . . . . . 15 1.85 + 3.5. Start State Encoder. . . . . . . . . . . . . . . . . . . 15 1.86 + 3.5.1. Start State Estimation . . . . . . . . . . . . . 16 1.87 + 3.5.2. All-Pass Filtering and Scale Quantization. . . . 17 1.88 + 3.5.3. Scalar Quantization. . . . . . . . . . . . . . . 18 1.89 + 3.6. Encoding the Remaining Samples . . . . . . . . . . . . . 19 1.90 + 3.6.1. Codebook Memory. . . . . . . . . . . . . . . . . 20 1.91 + 3.6.2. Perceptual Weighting of Codebook Memory 1.92 + and Target . . . . . . . . . . . . . . . . . . . 22 1.93 + 3.6.3. Codebook Creation. . . . . . . . . . . . . . . . 23 1.94 + 3.6.3.1. Creation of a Base Codebook . . . . . . 23 1.95 + 3.6.3.2. Codebook Expansion. . . . . . . . . . . 24 1.96 + 3.6.3.3. Codebook Augmentation . . . . . . . . . 24 1.97 + 3.6.4. Codebook Search. . . . . . . . . . . . . . . . . 26 1.98 + 3.6.4.1. Codebook Search at Each Stage . . . . . 26 1.99 + 3.6.4.2. Gain Quantization at Each Stage . . . . 27 1.100 + 3.6.4.3. Preparation of Target for Next Stage. . 28 1.101 + 3.7. Gain Correction Encoding . . . . . . . . . . . . . . . . 28 1.102 + 3.8. Bitstream Definition . . . . . . . . . . . . . . . . . . 29 1.103 + 4. Decoder Principles . . . . . . . . . . . . . . . . . . . . . . 32 1.104 + 4.1. LPC Filter Reconstruction. . . . . . . . . . . . . . . . 33 1.105 + 4.2. Start State Reconstruction . . . . . . . . . . . . . . . 33 1.106 + 4.3. Excitation Decoding Loop . . . . . . . . . . . . . . . . 34 1.107 + 4.4. Multistage Adaptive Codebook Decoding. . . . . . . . . . 35 1.108 + 4.4.1. Construction of the Decoded Excitation Signal. . 35 1.109 + 4.5. Packet Loss Concealment. . . . . . . . . . . . . . . . . 35 1.110 + 4.5.1. Block Received Correctly and Previous Block 1.111 + Also Received. . . . . . . . . . . . . . . . . . 35 1.112 + 4.5.2. Block Not Received . . . . . . . . . . . . . . . 36 1.113 + 1.114 + 1.115 + 1.116 + 1.117 +Andersen, et al. Experimental [Page 2] 1.118 + 1.119 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.120 + 1.121 + 1.122 + 4.5.3. Block Received Correctly When Previous Block 1.123 + Not Received . . . . . . . . . . . . . . . . . . 36 1.124 + 4.6. Enhancement. . . . . . . . . . . . . . . . . . . . . . . 37 1.125 + 4.6.1. Estimating the Pitch . . . . . . . . . . . . . . 39 1.126 + 4.6.2. Determination of the Pitch-Synchronous 1.127 + Sequences. . . . . . . . . . . . . . . . . . . . 39 1.128 + 4.6.3. Calculation of the Smoothed Excitation . . . . . 41 1.129 + 4.6.4. Enhancer Criterion . . . . . . . . . . . . . . . 41 1.130 + 4.6.5. Enhancing the Excitation . . . . . . . . . . . . 42 1.131 + 4.7. Synthesis Filtering. . . . . . . . . . . . . . . . . . . 43 1.132 + 4.8. Post Filtering . . . . . . . . . . . . . . . . . . . . . 43 1.133 + 5. Security Considerations. . . . . . . . . . . . . . . . . . . . 43 1.134 + 6. Evaluation of the iLBC Implementations . . . . . . . . . . . . 43 1.135 + 7. References . . . . . . . . . . . . . . . . . . . . . . . . . . 43 1.136 + 7.1. Normative References . . . . . . . . . . . . . . . . . . 43 1.137 + 7.2. Informative References . . . . . . . . . . . . . . . . . 44 1.138 + 8. ACKNOWLEDGEMENTS . . . . . . . . . . . . . . . . . . . . . . . 44 1.139 + APPENDIX A: Reference Implementation . . . . . . . . . . . . . . . 45 1.140 + A.1. iLBC_test.c. . . . . . . . . . . . . . . . . . . . . . . 46 1.141 + A.2 iLBC_encode.h. . . . . . . . . . . . . . . . . . . . . . 52 1.142 + A.3. iLBC_encode.c. . . . . . . . . . . . . . . . . . . . . . 53 1.143 + A.4. iLBC_decode.h. . . . . . . . . . . . . . . . . . . . . . 63 1.144 + A.5. iLBC_decode.c. . . . . . . . . . . . . . . . . . . . . . 64 1.145 + A.6. iLBC_define.h. . . . . . . . . . . . . . . . . . . . . . 76 1.146 + A.7. constants.h. . . . . . . . . . . . . . . . . . . . . . . 80 1.147 + A.8. constants.c. . . . . . . . . . . . . . . . . . . . . . . 82 1.148 + A.9. anaFilter.h. . . . . . . . . . . . . . . . . . . . . . . 96 1.149 + A.10. anaFilter.c. . . . . . . . . . . . . . . . . . . . . . . 97 1.150 + A.11. createCB.h . . . . . . . . . . . . . . . . . . . . . . . 98 1.151 + A.12. createCB.c . . . . . . . . . . . . . . . . . . . . . . . 99 1.152 + A.13. doCPLC.h . . . . . . . . . . . . . . . . . . . . . . . .104 1.153 + A.14. doCPLC.c . . . . . . . . . . . . . . . . . . . . . . . .104 1.154 + A.15. enhancer.h . . . . . . . . . . . . . . . . . . . . . . .109 1.155 + A.16. enhancer.c . . . . . . . . . . . . . . . . . . . . . . .110 1.156 + A.17. filter.h . . . . . . . . . . . . . . . . . . . . . . . .123 1.157 + A.18. filter.c . . . . . . . . . . . . . . . . . . . . . . . .125 1.158 + A.19. FrameClassify.h. . . . . . . . . . . . . . . . . . . . .128 1.159 + A.20. FrameClassify.c. . . . . . . . . . . . . . . . . . . . .129 1.160 + A.21. gainquant.h. . . . . . . . . . . . . . . . . . . . . . .131 1.161 + A.22. gainquant.c. . . . . . . . . . . . . . . . . . . . . . .131 1.162 + A.23. getCBvec.h . . . . . . . . . . . . . . . . . . . . . . .134 1.163 + A.24. getCBvec.c . . . . . . . . . . . . . . . . . . . . . . .134 1.164 + A.25. helpfun.h. . . . . . . . . . . . . . . . . . . . . . . .138 1.165 + A.26. helpfun.c. . . . . . . . . . . . . . . . . . . . . . . .140 1.166 + A.27. hpInput.h. . . . . . . . . . . . . . . . . . . . . . . .146 1.167 + A.28. hpInput.c. . . . . . . . . . . . . . . . . . . . . . . .146 1.168 + A.29. hpOutput.h . . . . . . . . . . . . . . . . . . . . . . .148 1.169 + A.30. hpOutput.c . . . . . . . . . . . . . . . . . . . . . . .148 1.170 + 1.171 + 1.172 + 1.173 +Andersen, et al. Experimental [Page 3] 1.174 + 1.175 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.176 + 1.177 + 1.178 + A.31. iCBConstruct.h . . . . . . . . . . . . . . . . . . . . .149 1.179 + A.32. iCBConstruct.c . . . . . . . . . . . . . . . . . . . . .150 1.180 + A.33. iCBSearch.h. . . . . . . . . . . . . . . . . . . . . . .152 1.181 + A.34. iCBSearch.c. . . . . . . . . . . . . . . . . . . . . . .153 1.182 + A.35. LPCdecode.h. . . . . . . . . . . . . . . . . . . . . . .163 1.183 + A.36. LPCdecode.c. . . . . . . . . . . . . . . . . . . . . . .164 1.184 + A.37. LPCencode.h. . . . . . . . . . . . . . . . . . . . . . .167 1.185 + A.38. LPCencode.c. . . . . . . . . . . . . . . . . . . . . . .167 1.186 + A.39. lsf.h. . . . . . . . . . . . . . . . . . . . . . . . . .172 1.187 + A.40. lsf.c. . . . . . . . . . . . . . . . . . . . . . . . . .172 1.188 + A.41. packing.h. . . . . . . . . . . . . . . . . . . . . . . .178 1.189 + A.42. packing.c. . . . . . . . . . . . . . . . . . . . . . . .179 1.190 + A.43. StateConstructW.h. . . . . . . . . . . . . . . . . . . .182 1.191 + A.44. StateConstructW.c. . . . . . . . . . . . . . . . . . . .183 1.192 + A.45. StateSearchW.h . . . . . . . . . . . . . . . . . . . . .185 1.193 + A.46. StateSearchW.c . . . . . . . . . . . . . . . . . . . . .186 1.194 + A.47. syntFilter.h . . . . . . . . . . . . . . . . . . . . . .190 1.195 + A.48. syntFilter.c . . . . . . . . . . . . . . . . . . . . . .190 1.196 + Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . .192 1.197 + Full Copyright Statement . . . . . . . . . . . . . . . . . . . . .194 1.198 + 1.199 +1. Introduction 1.200 + 1.201 + This document contains the description of an algorithm for the coding 1.202 + of speech signals sampled at 8 kHz. The algorithm, called iLBC, uses 1.203 + a block-independent linear-predictive coding (LPC) algorithm and has 1.204 + support for two basic frame lengths: 20 ms at 15.2 kbit/s and 30 ms 1.205 + at 13.33 kbit/s. When the codec operates at block lengths of 20 ms, 1.206 + it produces 304 bits per block, which SHOULD be packetized as in [1]. 1.207 + Similarly, for block lengths of 30 ms it produces 400 bits per block, 1.208 + which SHOULD be packetized as in [1]. The two modes for the 1.209 + different frame sizes operate in a very similar way. When they 1.210 + differ it is explicitly stated in the text, usually with the notation 1.211 + x/y, where x refers to the 20 ms mode and y refers to the 30 ms mode. 1.212 + 1.213 + The described algorithm results in a speech coding system with a 1.214 + controlled response to packet losses similar to what is known from 1.215 + pulse code modulation (PCM) with packet loss concealment (PLC), such 1.216 + as the ITU-T G.711 standard [4], which operates at a fixed bit rate 1.217 + of 64 kbit/s. At the same time, the described algorithm enables 1.218 + fixed bit rate coding with a quality-versus-bit rate tradeoff close 1.219 + to state-of-the-art. A suitable RTP payload format for the iLBC 1.220 + codec is specified in [1]. 1.221 + 1.222 + Some of the applications for which this coder is suitable are real 1.223 + time communications such as telephony and videoconferencing, 1.224 + streaming audio, archival, and messaging. 1.225 + 1.226 + 1.227 + 1.228 + 1.229 +Andersen, et al. Experimental [Page 4] 1.230 + 1.231 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.232 + 1.233 + 1.234 + Cable Television Laboratories (CableLabs(R)) has adopted iLBC as a 1.235 + mandatory PacketCable(TM) audio codec standard for VoIP over Cable 1.236 + applications [3]. 1.237 + 1.238 + This document is organized as follows. Section 2 gives a brief 1.239 + outline of the codec. The specific encoder and decoder algorithms 1.240 + are explained in sections 3 and 4, respectively. Appendix A provides 1.241 + a c-code reference implementation. 1.242 + 1.243 + The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", 1.244 + "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this 1.245 + document are to be interpreted as described in BCP 14, RFC 2119 [2]. 1.246 + 1.247 +2. Outline of the Codec 1.248 + 1.249 + The codec consists of an encoder and a decoder as described in 1.250 + sections 2.1 and 2.2, respectively. 1.251 + 1.252 + The essence of the codec is LPC and block-based coding of the LPC 1.253 + residual signal. For each 160/240 (20 ms/30 ms) sample block, the 1.254 + following major steps are performed: A set of LPC filters are 1.255 + computed, and the speech signal is filtered through them to produce 1.256 + the residual signal. The codec uses scalar quantization of the 1.257 + dominant part, in terms of energy, of the residual signal for the 1.258 + block. The dominant state is of length 57/58 (20 ms/30 ms) samples 1.259 + and forms a start state for dynamic codebooks constructed from the 1.260 + already coded parts of the residual signal. These dynamic codebooks 1.261 + are used to code the remaining parts of the residual signal. By this 1.262 + method, coding independence between blocks is achieved, resulting in 1.263 + elimination of propagation of perceptual degradations due to packet 1.264 + loss. The method facilitates high-quality packet loss concealment 1.265 + (PLC). 1.266 + 1.267 +2.1. Encoder 1.268 + 1.269 + The input to the encoder SHOULD be 16 bit uniform PCM sampled at 8 1.270 + kHz. It SHOULD be partitioned into blocks of BLOCKL=160/240 samples 1.271 + for the 20/30 ms frame size. Each block is divided into NSUB=4/6 1.272 + consecutive sub-blocks of SUBL=40 samples each. For 30 ms frame 1.273 + size, the encoder performs two LPC_FILTERORDER=10 linear-predictive 1.274 + coding (LPC) analyses. The first analysis applies a smooth window 1.275 + centered over the second sub-block and extending to the middle of the 1.276 + fifth sub-block. The second LPC analysis applies a smooth asymmetric 1.277 + window centered over the fifth sub-block and extending to the end of 1.278 + the sixth sub-block. For 20 ms frame size, one LPC_FILTERORDER=10 1.279 + linear-predictive coding (LPC) analysis is performed with a smooth 1.280 + window centered over the third sub-frame. 1.281 + 1.282 + 1.283 + 1.284 + 1.285 +Andersen, et al. Experimental [Page 5] 1.286 + 1.287 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.288 + 1.289 + 1.290 + For each of the LPC analyses, a set of line-spectral frequencies 1.291 + (LSFs) are obtained, quantized, and interpolated to obtain LSF 1.292 + coefficients for each sub-block. Subsequently, the LPC residual is 1.293 + computed by using the quantized and interpolated LPC analysis 1.294 + filters. 1.295 + 1.296 + The two consecutive sub-blocks of the residual exhibiting the maximal 1.297 + weighted energy are identified. Within these two sub-blocks, the 1.298 + start state (segment) is selected from two choices: the first 57/58 1.299 + samples or the last 57/58 samples of the two consecutive sub-blocks. 1.300 + The selected segment is the one of higher energy. The start state is 1.301 + encoded with scalar quantization. 1.302 + 1.303 + A dynamic codebook encoding procedure is used to encode 1) the 23/22 1.304 + (20 ms/30 ms) remaining samples in the two sub-blocks containing the 1.305 + start state; 2) the sub-blocks after the start state in time; and 3) 1.306 + the sub-blocks before the start state in time. Thus, the encoding 1.307 + target can be either the 23/22 samples remaining of the two sub- 1.308 + blocks containing the start state or a 40-sample sub-block. This 1.309 + target can consist of samples indexed forward in time or backward in 1.310 + time, depending on the location of the start state. 1.311 + 1.312 + The codebook coding is based on an adaptive codebook built from a 1.313 + codebook memory that contains decoded LPC excitation samples from the 1.314 + already encoded part of the block. These samples are indexed in the 1.315 + same time direction as the target vector, ending at the sample 1.316 + instant prior to the first sample instant represented in the target 1.317 + vector. The codebook is used in CB_NSTAGES=3 stages in a successive 1.318 + refinement approach, and the resulting three code vector gains are 1.319 + encoded with 5-, 4-, and 3-bit scalar quantization, respectively. 1.320 + 1.321 + The codebook search method employs noise shaping derived from the LPC 1.322 + filters, and the main decision criterion is to minimize the squared 1.323 + error between the target vector and the code vectors. Each code 1.324 + vector in this codebook comes from one of CB_EXPAND=2 codebook 1.325 + sections. The first section is filled with delayed, already encoded 1.326 + residual vectors. The code vectors of the second codebook section 1.327 + are constructed by predefined linear combinations of vectors in the 1.328 + first section of the codebook. 1.329 + 1.330 + As codebook encoding with squared-error matching is known to produce 1.331 + a coded signal of less power than does the scalar quantized start 1.332 + state signal, a gain re-scaling method is implemented by a refined 1.333 + search for a better set of codebook gains in terms of power matching 1.334 + after encoding. This is done by searching for a higher value of the 1.335 + gain factor for the first stage codebook, as the subsequent stage 1.336 + codebook gains are scaled by the first stage gain. 1.337 + 1.338 + 1.339 + 1.340 + 1.341 +Andersen, et al. Experimental [Page 6] 1.342 + 1.343 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.344 + 1.345 + 1.346 +2.2. Decoder 1.347 + 1.348 + Typically for packet communications, a jitter buffer placed at the 1.349 + receiving end decides whether the packet containing an encoded signal 1.350 + block has been received or lost. This logic is not part of the codec 1.351 + described here. For each encoded signal block received the decoder 1.352 + performs a decoding. For each lost signal block, the decoder 1.353 + performs a PLC operation. 1.354 + 1.355 + The decoding for each block starts by decoding and interpolating the 1.356 + LPC coefficients. Subsequently the start state is decoded. 1.357 + 1.358 + For codebook-encoded segments, each segment is decoded by 1.359 + constructing the three code vectors given by the received codebook 1.360 + indices in the same way that the code vectors were constructed in the 1.361 + encoder. The three gain factors are also decoded and the resulting 1.362 + decoded signal is given by the sum of the three codebook vectors 1.363 + scaled with respective gain. 1.364 + 1.365 + An enhancement algorithm is applied to the reconstructed excitation 1.366 + signal. This enhancement augments the periodicity of voiced speech 1.367 + regions. The enhancement is optimized under the constraint that the 1.368 + modification signal (defined as the difference between the enhanced 1.369 + excitation and the excitation signal prior to enhancement) has a 1.370 + short-time energy that does not exceed a preset fraction of the 1.371 + short-time energy of the excitation signal prior to enhancement. 1.372 + 1.373 + A packet loss concealment (PLC) operation is easily embedded in the 1.374 + decoder. The PLC operation can, e.g., be based on repeating LPC 1.375 + filters and obtaining the LPC residual signal by using a long-term 1.376 + prediction estimate from previous residual blocks. 1.377 + 1.378 +3. Encoder Principles 1.379 + 1.380 + The following block diagram is an overview of all the components of 1.381 + the iLBC encoding procedure. The description of the blocks contains 1.382 + references to the section where that particular procedure is further 1.383 + described. 1.384 + 1.385 + 1.386 + 1.387 + 1.388 + 1.389 + 1.390 + 1.391 + 1.392 + 1.393 + 1.394 + 1.395 + 1.396 + 1.397 +Andersen, et al. Experimental [Page 7] 1.398 + 1.399 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.400 + 1.401 + 1.402 + +-----------+ +---------+ +---------+ 1.403 + speech -> | 1. Pre P | -> | 2. LPC | -> | 3. Ana | -> 1.404 + +-----------+ +---------+ +---------+ 1.405 + 1.406 + +---------------+ +--------------+ 1.407 + -> | 4. Start Sel | ->| 5. Scalar Qu | -> 1.408 + +---------------+ +--------------+ 1.409 + 1.410 + +--------------+ +---------------+ 1.411 + -> |6. CB Search | -> | 7. Packetize | -> payload 1.412 + | +--------------+ | +---------------+ 1.413 + ----<---------<------ 1.414 + sub-frame 0..2/4 (20 ms/30 ms) 1.415 + 1.416 + Figure 3.1. Flow chart of the iLBC encoder 1.417 + 1.418 + 1. Pre-process speech with a HP filter, if needed (section 3.1). 1.419 + 1.420 + 2. Compute LPC parameters, quantize, and interpolate (section 3.2). 1.421 + 1.422 + 3. Use analysis filters on speech to compute residual (section 3.3). 1.423 + 1.424 + 4. Select position of 57/58-sample start state (section 3.5). 1.425 + 1.426 + 5. Quantize the 57/58-sample start state with scalar quantization 1.427 + (section 3.5). 1.428 + 1.429 + 6. Search the codebook for each sub-frame. Start with 23/22 sample 1.430 + block, then encode sub-blocks forward in time, and then encode 1.431 + sub-blocks backward in time. For each block, the steps in Figure 1.432 + 3.4 are performed (section 3.6). 1.433 + 1.434 + 7. Packetize the bits into the payload specified in Table 3.2. 1.435 + 1.436 + The input to the encoder SHOULD be 16-bit uniform PCM sampled at 8 1.437 + kHz. Also it SHOULD be partitioned into blocks of BLOCKL=160/240 1.438 + samples. Each block input to the encoder is divided into NSUB=4/6 1.439 + consecutive sub-blocks of SUBL=40 samples each. 1.440 + 1.441 + 1.442 + 1.443 + 1.444 + 1.445 + 1.446 + 1.447 + 1.448 + 1.449 + 1.450 + 1.451 + 1.452 + 1.453 +Andersen, et al. Experimental [Page 8] 1.454 + 1.455 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.456 + 1.457 + 1.458 + 0 39 79 119 159 1.459 + +---------------------------------------+ 1.460 + | 1 | 2 | 3 | 4 | 1.461 + +---------------------------------------+ 1.462 + 20 ms frame 1.463 + 1.464 + 0 39 79 119 159 199 239 1.465 + +-----------------------------------------------------------+ 1.466 + | 1 | 2 | 3 | 4 | 5 | 6 | 1.467 + +-----------------------------------------------------------+ 1.468 + 30 ms frame 1.469 + Figure 3.2. One input block to the encoder for 20 ms (with four sub- 1.470 + frames) and 30 ms (with six sub-frames). 1.471 + 1.472 +3.1. Pre-processing 1.473 + 1.474 + In some applications, the recorded speech signal contains DC level 1.475 + and/or 50/60 Hz noise. If these components have not been removed 1.476 + prior to the encoder call, they should be removed by a high-pass 1.477 + filter. A reference implementation of this, using a filter with a 1.478 + cutoff frequency of 90 Hz, can be found in Appendix A.28. 1.479 + 1.480 +3.2. LPC Analysis and Quantization 1.481 + 1.482 + The input to the LPC analysis module is a possibly high-pass filtered 1.483 + speech buffer, speech_hp, that contains 240/300 (LPC_LOOKBACK + 1.484 + BLOCKL = 80/60 + 160/240 = 240/300) speech samples, where samples 0 1.485 + through 79/59 are from the previous block and samples 80/60 through 1.486 + 239/299 are from the current block. No look-ahead into the next 1.487 + block is used. For the very first block processed, the look-back 1.488 + samples are assumed to be zeros. 1.489 + 1.490 + For each input block, the LPC analysis calculates one/two set(s) of 1.491 + LPC_FILTERORDER=10 LPC filter coefficients using the autocorrelation 1.492 + method and the Levinson-Durbin recursion. These coefficients are 1.493 + converted to the Line Spectrum Frequency representation. In the 20 1.494 + ms case, the single lsf set represents the spectral characteristics 1.495 + as measured at the center of the third sub-block. For 30 ms frames, 1.496 + the first set, lsf1, represents the spectral properties of the input 1.497 + signal at the center of the second sub-block, and the other set, 1.498 + lsf2, represents the spectral characteristics as measured at the 1.499 + center of the fifth sub-block. The details of the computation for 30 1.500 + ms frames are described in sections 3.2.1 through 3.2.6. Section 1.501 + 3.2.7 explains how the LPC Analysis and Quantization differs for 20 1.502 + ms frames. 1.503 + 1.504 + 1.505 + 1.506 + 1.507 + 1.508 + 1.509 +Andersen, et al. Experimental [Page 9] 1.510 + 1.511 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.512 + 1.513 + 1.514 +3.2.1. Computation of Autocorrelation Coefficients 1.515 + 1.516 + The first step in the LPC analysis procedure is to calculate 1.517 + autocorrelation coefficients by using windowed speech samples. This 1.518 + windowing is the only difference in the LPC analysis procedure for 1.519 + the two sets of coefficients. For the first set, a 240-sample-long 1.520 + standard symmetric Hanning window is applied to samples 0 through 239 1.521 + of the input data. The first window, lpc_winTbl, is defined as 1.522 + 1.523 + lpc_winTbl[i]= 0.5 * (1.0 - cos((2*PI*(i+1))/(BLOCKL+1))); 1.524 + i=0,...,119 1.525 + lpc_winTbl[i] = winTbl[BLOCKL - i - 1]; i=120,...,239 1.526 + 1.527 + The windowed speech speech_hp_win1 is then obtained by multiplying 1.528 + the first 240 samples of the input speech buffer with the window 1.529 + coefficients: 1.530 + 1.531 + speech_hp_win1[i] = speech_hp[i] * lpc_winTbl[i]; 1.532 + i=0,...,BLOCKL-1 1.533 + 1.534 + From these 240 windowed speech samples, 11 (LPC_FILTERORDER + 1) 1.535 + autocorrelation coefficients, acf1, are calculated: 1.536 + 1.537 + acf1[lag] += speech_hp_win1[n] * speech_hp_win1[n + lag]; 1.538 + lag=0,...,LPC_FILTERORDER; n=0,...,BLOCKL-lag-1 1.539 + 1.540 + In order to make the analysis more robust against numerical precision 1.541 + problems, a spectral smoothing procedure is applied by windowing the 1.542 + autocorrelation coefficients before the LPC coefficients are 1.543 + computed. Also, a white noise floor is added to the autocorrelation 1.544 + function by multiplying coefficient zero by 1.0001 (40dB below the 1.545 + energy of the windowed speech signal). These two steps are 1.546 + implemented by multiplying the autocorrelation coefficients with the 1.547 + following window: 1.548 + 1.549 + lpc_lagwinTbl[0] = 1.0001; 1.550 + lpc_lagwinTbl[i] = exp(-0.5 * ((2 * PI * 60.0 * i) /FS)^2); 1.551 + i=1,...,LPC_FILTERORDER 1.552 + where FS=8000 is the sampling frequency 1.553 + 1.554 + Then, the windowed acf function acf1_win is obtained by 1.555 + 1.556 + acf1_win[i] = acf1[i] * lpc_lagwinTbl[i]; 1.557 + i=0,...,LPC_FILTERORDER 1.558 + 1.559 + The second set of autocorrelation coefficients, acf2_win, are 1.560 + obtained in a similar manner. The window, lpc_asymwinTbl, is applied 1.561 + to samples 60 through 299, i.e., the entire current block. The 1.562 + 1.563 + 1.564 + 1.565 +Andersen, et al. Experimental [Page 10] 1.566 + 1.567 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.568 + 1.569 + 1.570 + window consists of two segments, the first (samples 0 to 219) being 1.571 + half a Hanning window with length 440 and the second a quarter of a 1.572 + cycle of a cosine wave. By using this asymmetric window, an LPC 1.573 + analysis centered in the fifth sub-block is obtained without the need 1.574 + for any look-ahead, which would add delay. The asymmetric window is 1.575 + defined as 1.576 + 1.577 + lpc_asymwinTbl[i] = (sin(PI * (i + 1) / 441))^2; i=0,...,219 1.578 + 1.579 + lpc_asymwinTbl[i] = cos((i - 220) * PI / 40); i=220,...,239 1.580 + 1.581 + and the windowed speech is computed by 1.582 + 1.583 + speech_hp_win2[i] = speech_hp[i + LPC_LOOKBACK] * 1.584 + lpc_asymwinTbl[i]; i=0,....BLOCKL-1 1.585 + 1.586 + The windowed autocorrelation coefficients are then obtained in 1.587 + exactly the same way as for the first analysis instance. 1.588 + 1.589 + The generation of the windows lpc_winTbl, lpc_asymwinTbl, and 1.590 + lpc_lagwinTbl are typically done in advance, and the arrays are 1.591 + stored in ROM rather than repeating the calculation for every block. 1.592 + 1.593 +3.2.2. Computation of LPC Coefficients 1.594 + 1.595 + From the 2 x 11 smoothed autocorrelation coefficients, acf1_win and 1.596 + acf2_win, the 2 x 11 LPC coefficients, lp1 and lp2, are calculated 1.597 + in the same way for both analysis locations by using the well known 1.598 + Levinson-Durbin recursion. The first LPC coefficient is always 1.0, 1.599 + resulting in ten unique coefficients. 1.600 + 1.601 + After determining the LPC coefficients, a bandwidth expansion 1.602 + procedure is applied to smooth the spectral peaks in the 1.603 + short-term spectrum. The bandwidth addition is obtained by the 1.604 + following modification of the LPC coefficients: 1.605 + 1.606 + lp1_bw[i] = lp1[i] * chirp^i; i=0,...,LPC_FILTERORDER 1.607 + lp2_bw[i] = lp2[i] * chirp^i; i=0,...,LPC_FILTERORDER 1.608 + 1.609 + where "chirp" is a real number between 0 and 1. It is RECOMMENDED to 1.610 + use a value of 0.9. 1.611 + 1.612 +3.2.3. Computation of LSF Coefficients from LPC Coefficients 1.613 + 1.614 + Thus far, two sets of LPC coefficients that represent the short-term 1.615 + spectral characteristics of the speech signal for two different time 1.616 + locations within the current block have been determined. These 1.617 + coefficients SHOULD be quantized and interpolated. Before this is 1.618 + 1.619 + 1.620 + 1.621 +Andersen, et al. Experimental [Page 11] 1.622 + 1.623 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.624 + 1.625 + 1.626 + done, it is advantageous to convert the LPC parameters into another 1.627 + type of representation called Line Spectral Frequencies (LSF). The 1.628 + LSF parameters are used because they are better suited for 1.629 + quantization and interpolation than the regular LPC coefficients. 1.630 + Many computationally efficient methods for calculating the LSFs from 1.631 + the LPC coefficients have been proposed in the literature. The 1.632 + detailed implementation of one applicable method can be found in 1.633 + Appendix A.26. The two arrays of LSF coefficients obtained, lsf1 and 1.634 + lsf2, are of dimension 10 (LPC_FILTERORDER). 1.635 + 1.636 +3.2.4. Quantization of LSF Coefficients 1.637 + 1.638 + Because the LPC filters defined by the two sets of LSFs are also 1.639 + needed in the decoder, the LSF parameters need to be quantized and 1.640 + transmitted as side information. The total number of bits required 1.641 + to represent the quantization of the two LSF representations for one 1.642 + block of speech is 40, with 20 bits used for each of lsf1 and lsf2. 1.643 + 1.644 + For computational and storage reasons, the LSF vectors are quantized 1.645 + using three-split vector quantization (VQ). That is, the LSF vectors 1.646 + are split into three sub-vectors that are each quantized with a 1.647 + regular VQ. The quantized versions of lsf1 and lsf2, qlsf1 and 1.648 + qlsf2, are obtained by using the same memoryless split VQ. The 1.649 + length of each of these two LSF vectors is 10, and they are split 1.650 + into three sub-vectors containing 3, 3, and 4 values, respectively. 1.651 + 1.652 + For each of the sub-vectors, a separate codebook of quantized values 1.653 + has been designed with a standard VQ training method for a large 1.654 + database containing speech from a large number of speakers recorded 1.655 + under various conditions. The size of each of the three codebooks 1.656 + associated with the split definitions above is 1.657 + 1.658 + int size_lsfCbTbl[LSF_NSPLIT] = {64,128,128}; 1.659 + 1.660 + The actual values of the vector quantization codebook that must be 1.661 + used can be found in the reference code of Appendix A. Both sets of 1.662 + LSF coefficients, lsf1 and lsf2, are quantized with a standard 1.663 + memoryless split vector quantization (VQ) structure using the squared 1.664 + error criterion in the LSF domain. The split VQ quantization 1.665 + consists of the following steps: 1.666 + 1.667 + 1) Quantize the first three LSF coefficients (1 - 3) with a VQ 1.668 + codebook of size 64. 1.669 + 2) Quantize the next three LSF coefficients 4 - 6 with VQ a codebook 1.670 + of size 128. 1.671 + 3) Quantize the last four LSF coefficients (7 - 10) with a VQ 1.672 + codebook of size 128. 1.673 + 1.674 + 1.675 + 1.676 + 1.677 +Andersen, et al. Experimental [Page 12] 1.678 + 1.679 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.680 + 1.681 + 1.682 + This procedure, repeated for lsf1 and lsf2, gives six quantization 1.683 + indices and the quantized sets of LSF coefficients qlsf1 and qlsf2. 1.684 + Each set of three indices is encoded with 6 + 7 + 7 = 20 bits. The 1.685 + total number of bits used for LSF quantization in a block is thus 40 1.686 + bits. 1.687 + 1.688 +3.2.5. Stability Check of LSF Coefficients 1.689 + 1.690 + The LSF representation of the LPC filter has the convenient property 1.691 + that the coefficients are ordered by increasing value, i.e., lsf(n-1) 1.692 + < lsf(n), 0 < n < 10, if the corresponding synthesis filter is 1.693 + stable. As we are employing a split VQ scheme, it is possible that 1.694 + at the split boundaries the LSF coefficients are not ordered 1.695 + correctly and hence that the corresponding LP filter is unstable. To 1.696 + ensure that the filter used is stable, a stability check is performed 1.697 + for the quantized LSF vectors. If it turns out that the coefficients 1.698 + are not ordered appropriately (with a safety margin of 50 Hz to 1.699 + ensure that formant peaks are not too narrow), they will be moved 1.700 + apart. The detailed method for this can be found in Appendix A.40. 1.701 + The same procedure is performed in the decoder. This ensures that 1.702 + exactly the same LSF representations are used in both encoder and 1.703 + decoder. 1.704 + 1.705 +3.2.6. Interpolation of LSF Coefficients 1.706 + 1.707 + From the two sets of LSF coefficients that are computed for each 1.708 + block of speech, different LSFs are obtained for each sub-block by 1.709 + means of interpolation. This procedure is performed for the original 1.710 + LSFs (lsf1 and lsf2), as well as the quantized versions qlsf1 and 1.711 + qlsf2, as both versions are used in the encoder. Here follows a 1.712 + brief summary of the interpolation scheme; the details are found in 1.713 + the c-code of Appendix A. In the first sub-block, the average of the 1.714 + second LSF vector from the previous block and the first LSF vector in 1.715 + the current block is used. For sub-blocks two through five, the LSFs 1.716 + used are obtained by linear interpolation from lsf1 (and qlsf1) to 1.717 + lsf2 (and qlsf2), with lsf1 used in sub-block two and lsf2 in sub- 1.718 + block five. In the last sub-block, lsf2 is used. For the very first 1.719 + block it is assumed that the last LSF vector of the previous block is 1.720 + equal to a predefined vector, lsfmeanTbl, obtained by calculating the 1.721 + mean LSF vector of the LSF design database. 1.722 + 1.723 + lsfmeanTbl[LPC_FILTERORDER] = {0.281738, 0.445801, 0.663330, 1.724 + 0.962524, 1.251831, 1.533081, 1.850586, 2.137817, 1.725 + 2.481445, 2.777344} 1.726 + 1.727 + 1.728 + 1.729 + 1.730 + 1.731 + 1.732 + 1.733 +Andersen, et al. Experimental [Page 13] 1.734 + 1.735 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.736 + 1.737 + 1.738 + The interpolation method is standard linear interpolation in the LSF 1.739 + domain. The interpolated LSF values are converted to LPC 1.740 + coefficients for each sub-block. The unquantized and quantized LPC 1.741 + coefficients form two sets of filters respectively. The unquantized 1.742 + analysis filter for sub-block k is defined as follows 1.743 + 1.744 + ___ 1.745 + \ 1.746 + Ak(z)= 1 + > ak(i)*z^(-i) 1.747 + /__ 1.748 + i=1...LPC_FILTERORDER 1.749 + 1.750 + The quantized analysis filter for sub-block k is defined as follows 1.751 + ___ 1.752 + \ 1.753 + A~k(z)= 1 + > a~k(i)*z^(-i) 1.754 + /__ 1.755 + i=1...LPC_FILTERORDER 1.756 + 1.757 + A reference implementation of the lsf encoding is given in Appendix 1.758 + A.38. A reference implementation of the corresponding decoding can 1.759 + be found in Appendix A.36. 1.760 + 1.761 +3.2.7. LPC Analysis and Quantization for 20 ms Frames 1.762 + 1.763 + As previously stated, the codec only calculates one set of LPC 1.764 + parameters for the 20 ms frame size as opposed to two sets for 30 ms 1.765 + frames. A single set of autocorrelation coefficients is calculated 1.766 + on the LPC_LOOKBACK + BLOCKL = 80 + 160 = 240 samples. These samples 1.767 + are windowed with the asymmetric window lpc_asymwinTbl, centered over 1.768 + the third sub-frame, to form speech_hp_win. Autocorrelation 1.769 + coefficients, acf, are calculated on the 240 samples in speech_hp_win 1.770 + and then windowed exactly as in section 3.2.1 (resulting in 1.771 + acf_win). 1.772 + 1.773 + This single set of windowed autocorrelation coefficients is used to 1.774 + calculate LPC coefficients, LSF coefficients, and quantized LSF 1.775 + coefficients in exactly the same manner as in sections 3.2.3 through 1.776 + 3.2.4. As for the 30 ms frame size, the ten LSF coefficients are 1.777 + divided into three sub-vectors of size 3, 3, and 4 and quantized by 1.778 + using the same scheme and codebook as in section 3.2.4 to finally get 1.779 + 3 quantization indices. The quantized LSF coefficients are 1.780 + stabilized with the algorithm described in section 3.2.5. 1.781 + 1.782 + From the set of LSF coefficients computed for this block and those 1.783 + from the previous block, different LSFs are obtained for each sub- 1.784 + block by means of interpolation. The interpolation is done linearly 1.785 + in the LSF domain over the four sub-blocks, so that the n-th sub- 1.786 + 1.787 + 1.788 + 1.789 +Andersen, et al. Experimental [Page 14] 1.790 + 1.791 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.792 + 1.793 + 1.794 + frame uses the weight (4-n)/4 for the LSF from old frame and the 1.795 + weight n/4 of the LSF from the current frame. For the very first 1.796 + block the mean LSF, lsfmeanTbl, is used as the LSF from the previous 1.797 + block. Similarly as seen in section 3.2.6, both unquantized, A(z), 1.798 + and quantized, A~(z), analysis filters are calculated for each of the 1.799 + four sub-blocks. 1.800 + 1.801 +3.3. Calculation of the Residual 1.802 + 1.803 + The block of speech samples is filtered by the quantized and 1.804 + interpolated LPC analysis filters to yield the residual signal. In 1.805 + particular, the corresponding LPC analysis filter for each 40 sample 1.806 + sub-block is used to filter the speech samples for the same sub- 1.807 + block. The filter memory at the end of each sub-block is carried 1.808 + over to the LPC filter of the next sub-block. The signal at the 1.809 + output of each LP analysis filter constitutes the residual signal for 1.810 + the corresponding sub-block. 1.811 + 1.812 + A reference implementation of the LPC analysis filters is given in 1.813 + Appendix A.10. 1.814 + 1.815 +3.4. Perceptual Weighting Filter 1.816 + 1.817 + In principle any good design of a perceptual weighting filter can be 1.818 + applied in the encoder without compromising this codec definition. 1.819 + However, it is RECOMMENDED to use the perceptual weighting filter Wk 1.820 + for sub-block k specified below: 1.821 + 1.822 + Wk(z)=1/Ak(z/LPC_CHIRP_WEIGHTDENUM), where 1.823 + LPC_CHIRP_WEIGHTDENUM = 0.4222 1.824 + 1.825 + This is a simple design with low complexity that is applied in the 1.826 + LPC residual domain. Here Ak(z) is the filter obtained for sub-block 1.827 + k from unquantized but interpolated LSF coefficients. 1.828 + 1.829 +3.5. Start State Encoder 1.830 + 1.831 + The start state is quantized by using a common 6-bit scalar quantizer 1.832 + for the block and a 3-bit scalar quantizer operating on scaled 1.833 + samples in the weighted speech domain. In the following we describe 1.834 + the state encoding in greater detail. 1.835 + 1.836 + 1.837 + 1.838 + 1.839 + 1.840 + 1.841 + 1.842 + 1.843 + 1.844 + 1.845 +Andersen, et al. Experimental [Page 15] 1.846 + 1.847 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.848 + 1.849 + 1.850 +3.5.1. Start State Estimation 1.851 + 1.852 + The two sub-blocks containing the start state are determined by 1.853 + finding the two consecutive sub-blocks in the block having the 1.854 + highest power. Advantageously, down-weighting is used in the 1.855 + beginning and end of the sub-frames, i.e., the following measure is 1.856 + computed (NSUB=4/6 for 20/30 ms frame size): 1.857 + 1.858 + nsub=1,...,NSUB-1 1.859 + ssqn[nsub] = 0.0; 1.860 + for (i=(nsub-1)*SUBL; i<(nsub-1)*SUBL+5; i++) 1.861 + ssqn[nsub] += sampEn_win[i-(nsub-1)*SUBL]* 1.862 + residual[i]*residual[i]; 1.863 + for (i=(nsub-1)*SUBL+5; i<(nsub+1)*SUBL-5; i++) 1.864 + ssqn[nsub] += residual[i]*residual[i]; 1.865 + for (i=(nsub+1)*SUBL-5; i<(nsub+1)*SUBL; i++) 1.866 + ssqn[nsub] += sampEn_win[(nsub+1)*SUBL-i-1]* 1.867 + residual[i]*residual[i]; 1.868 + 1.869 + where sampEn_win[5]={1/6, 2/6, 3/6, 4/6, 5/6}; MAY be used. The 1.870 + sub-frame number corresponding to the maximum value of 1.871 + ssqEn_win[nsub-1]*ssqn[nsub] is selected as the start state 1.872 + indicator. A weighting of ssqEn_win[]={0.8,0.9,1.0,0.9,0.8} for 30 1.873 + ms frames and ssqEn_win[]={0.9,1.0,0.9} for 20 ms frames; MAY 1.874 + advantageously be used to bias the start state towards the middle of 1.875 + the frame. 1.876 + 1.877 + For 20 ms frames there are three possible positions for the two-sub- 1.878 + block length maximum power segment; the start state position is 1.879 + encoded with 2 bits. The start state position, start, MUST be 1.880 + encoded as 1.881 + 1.882 + start=1: start state in sub-frame 0 and 1 1.883 + start=2: start state in sub-frame 1 and 2 1.884 + start=3: start state in sub-frame 2 and 3 1.885 + 1.886 + For 30 ms frames there are five possible positions of the two-sub- 1.887 + block length maximum power segment, the start state position is 1.888 + encoded with 3 bits. The start state position, start, MUST be 1.889 + encoded as 1.890 + 1.891 + start=1: start state in sub-frame 0 and 1 1.892 + start=2: start state in sub-frame 1 and 2 1.893 + start=3: start state in sub-frame 2 and 3 1.894 + start=4: start state in sub-frame 3 and 4 1.895 + start=5: start state in sub-frame 4 and 5 1.896 + 1.897 + 1.898 + 1.899 + 1.900 + 1.901 +Andersen, et al. Experimental [Page 16] 1.902 + 1.903 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.904 + 1.905 + 1.906 + Hence, in both cases, index 0 is not used. In order to shorten the 1.907 + start state for bit rate efficiency, the start state is brought down 1.908 + to STATE_SHORT_LEN=57 samples for 20 ms frames and STATE_SHORT_LEN=58 1.909 + samples for 30 ms frames. The power of the first 23/22 and last 1.910 + 23/22 samples of the two sub-frame blocks identified above is 1.911 + computed as the sum of the squared signal sample values, and the 1.912 + 23/22-sample segment with the lowest power is excluded from the start 1.913 + state. One bit is transmitted to indicate which of the two possible 1.914 + 57/58 sample segments is used. The start state position within the 1.915 + two sub-frames determined above, state_first, MUST be encoded as 1.916 + 1.917 + state_first=1: start state is first STATE_SHORT_LEN samples 1.918 + state_first=0: start state is last STATE_SHORT_LEN samples 1.919 + 1.920 +3.5.2. All-Pass Filtering and Scale Quantization 1.921 + 1.922 + The block of residual samples in the start state is first filtered by 1.923 + an all-pass filter with the quantized LPC coefficients as denominator 1.924 + and reversed quantized LPC coefficients as numerator. The purpose of 1.925 + this phase-dispersion filter is to get a more even distribution of 1.926 + the sample values in the residual signal. The filtering is performed 1.927 + by circular convolution, where the initial filter memory is set to 1.928 + zero. 1.929 + 1.930 + res(0..(STATE_SHORT_LEN-1)) = uncoded start state residual 1.931 + res((STATE_SHORT_LEN)..(2*STATE_SHORT_LEN-1)) = 0 1.932 + 1.933 + Pk(z) = A~rk(z)/A~k(z), where 1.934 + ___ 1.935 + \ 1.936 + A~rk(z)= z^(-LPC_FILTERORDER)+>a~k(i+1)*z^(i-(LPC_FILTERORDER-1)) 1.937 + /__ 1.938 + i=0...(LPC_FILTERORDER-1) 1.939 + 1.940 + and A~k(z) is taken from the block where the start state begins 1.941 + 1.942 + res -> Pk(z) -> filtered 1.943 + 1.944 + ccres(k) = filtered(k) + filtered(k+STATE_SHORT_LEN), 1.945 + k=0..(STATE_SHORT_LEN-1) 1.946 + 1.947 + The all-pass filtered block is searched for its largest magnitude 1.948 + sample. The 10-logarithm of this magnitude is quantized with a 6-bit 1.949 + quantizer, state_frgqTbl, by finding the nearest representation. 1.950 + 1.951 + 1.952 + 1.953 + 1.954 + 1.955 + 1.956 + 1.957 +Andersen, et al. Experimental [Page 17] 1.958 + 1.959 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.960 + 1.961 + 1.962 + This results in an index, idxForMax, corresponding to a quantized 1.963 + value, qmax. The all-pass filtered residual samples in the block are 1.964 + then multiplied with a scaling factor scal=4.5/(10^qmax) to yield 1.965 + normalized samples. 1.966 + 1.967 + state_frgqTbl[64] = {1.000085, 1.071695, 1.140395, 1.206868, 1.968 + 1.277188, 1.351503, 1.429380, 1.500727, 1.569049, 1.969 + 1.639599, 1.707071, 1.781531, 1.840799, 1.901550, 1.970 + 1.956695, 2.006750, 2.055474, 2.102787, 2.142819, 1.971 + 2.183592, 2.217962, 2.257177, 2.295739, 2.332967, 1.972 + 2.369248, 2.402792, 2.435080, 2.468598, 2.503394, 1.973 + 2.539284, 2.572944, 2.605036, 2.636331, 2.668939, 1.974 + 2.698780, 2.729101, 2.759786, 2.789834, 2.818679, 1.975 + 2.848074, 2.877470, 2.906899, 2.936655, 2.967804, 1.976 + 3.000115, 3.033367, 3.066355, 3.104231, 3.141499, 1.977 + 3.183012, 3.222952, 3.265433, 3.308441, 3.350823, 1.978 + 3.395275, 3.442793, 3.490801, 3.542514, 3.604064, 1.979 + 3.666050, 3.740994, 3.830749, 3.938770, 4.101764} 1.980 + 1.981 +3.5.3. Scalar Quantization 1.982 + 1.983 + The normalized samples are quantized in the perceptually weighted 1.984 + speech domain by a sample-by-sample scalar DPCM quantization as 1.985 + depicted in Figure 3.3. Each sample in the block is filtered by a 1.986 + weighting filter Wk(z), specified in section 3.4, to form a weighted 1.987 + speech sample x[n]. The target sample d[n] is formed by subtracting 1.988 + a predicted sample y[n], where the prediction filter is given by 1.989 + 1.990 + Pk(z) = 1 - 1 / Wk(z). 1.991 + 1.992 + +-------+ x[n] + d[n] +-----------+ u[n] 1.993 + residual -->| Wk(z) |-------->(+)---->| Quantizer |------> quantized 1.994 + +-------+ - /|\ +-----------+ | residual 1.995 + | \|/ 1.996 + y[n] +--------------------->(+) 1.997 + | | 1.998 + | +------+ | 1.999 + +--------| Pk(z)|<------+ 1.1000 + +------+ 1.1001 + 1.1002 + Figure 3.3. Quantization of start state samples by DPCM in weighted 1.1003 + speech domain. 1.1004 + 1.1005 + The coded state sample u[n] is obtained by quantizing d[n] with a 3- 1.1006 + bit quantizer with quantization table state_sq3Tbl. 1.1007 + 1.1008 + state_sq3Tbl[8] = {-3.719849, -2.177490, -1.130005, -0.309692, 1.1009 + 0.444214, 1.329712, 2.436279, 3.983887} 1.1010 + 1.1011 + 1.1012 + 1.1013 +Andersen, et al. Experimental [Page 18] 1.1014 + 1.1015 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.1016 + 1.1017 + 1.1018 + The quantized samples are transformed back to the residual domain by 1.1019 + 1) scaling with 1/scal; 2) time-reversing the scaled samples; 3) 1.1020 + filtering the time-reversed samples by the same all-pass filter, as 1.1021 + in section 3.5.2, by using circular convolution; and 4) time- 1.1022 + reversing the filtered samples. (More detail is in section 4.2.) 1.1023 + 1.1024 + A reference implementation of the start-state encoding can be found 1.1025 + in Appendix A.46. 1.1026 + 1.1027 +3.6. Encoding the Remaining Samples 1.1028 + 1.1029 + A dynamic codebook is used to encode 1) the 23/22 remaining samples 1.1030 + in the two sub-blocks containing the start state; 2) the sub-blocks 1.1031 + after the start state in time; and 3) the sub-blocks before the start 1.1032 + state in time. Thus, the encoding target can be either the 23/22 1.1033 + samples remaining of the 2 sub-blocks containing the start state, or 1.1034 + a 40-sample sub-block. This target can consist of samples that are 1.1035 + indexed forward in time or backward in time, depending on the 1.1036 + location of the start state. The length of the target is denoted by 1.1037 + lTarget. 1.1038 + 1.1039 + The coding is based on an adaptive codebook that is built from a 1.1040 + codebook memory that contains decoded LPC excitation samples from the 1.1041 + already encoded part of the block. These samples are indexed in the 1.1042 + same time direction as is the target vector and end at the sample 1.1043 + instant prior to the first sample instant represented in the target 1.1044 + vector. The codebook memory has length lMem, which is equal to 1.1045 + CB_MEML=147 for the two/four 40-sample sub-blocks and 85 for the 1.1046 + 23/22-sample sub-block. 1.1047 + 1.1048 + The following figure shows an overview of the encoding procedure. 1.1049 + 1.1050 + +------------+ +---------------+ +-------------+ 1.1051 + -> | 1. Decode | -> | 2. Mem setup | -> | 3. Perc. W. | -> 1.1052 + +------------+ +---------------+ +-------------+ 1.1053 + 1.1054 + +------------+ +-----------------+ 1.1055 + -> | 4. Search | -> | 5. Upd. Target | ------------------> 1.1056 + | +------------+ +------------------ | 1.1057 + ----<-------------<-----------<---------- 1.1058 + stage=0..2 1.1059 + 1.1060 + +----------------+ 1.1061 + -> | 6. Recalc G[0] | ---------------> gains and CB indices 1.1062 + +----------------+ 1.1063 + 1.1064 + Figure 3.4. Flow chart of the codebook search in the iLBC encoder. 1.1065 + 1.1066 + 1.1067 + 1.1068 + 1.1069 +Andersen, et al. Experimental [Page 19] 1.1070 + 1.1071 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.1072 + 1.1073 + 1.1074 + 1. Decode the part of the residual that has been encoded so far, 1.1075 + using the codebook without perceptual weighting. 1.1076 + 1.1077 + 2. Set up the memory by taking data from the decoded residual. This 1.1078 + memory is used to construct codebooks. For blocks preceding the 1.1079 + start state, both the decoded residual and the target are time 1.1080 + reversed (section 3.6.1). 1.1081 + 3. Filter the memory + target with the perceptual weighting filter 1.1082 + (section 3.6.2). 1.1083 + 1.1084 + 4. Search for the best match between the target and the codebook 1.1085 + vector. Compute the optimal gain for this match and quantize that 1.1086 + gain (section 3.6.4). 1.1087 + 1.1088 + 5. Update the perceptually weighted target by subtracting the 1.1089 + contribution from the selected codebook vector from the 1.1090 + perceptually weighted memory (quantized gain times selected 1.1091 + vector). Repeat 4 and 5 for the two additional stages. 1.1092 + 1.1093 + 6. Calculate the energy loss due to encoding of the residual. If 1.1094 + needed, compensate for this loss by an upscaling and 1.1095 + requantization of the gain for the first stage (section 3.7). 1.1096 + 1.1097 + The following sections provide an in-depth description of the 1.1098 + different blocks of Figure 3.4. 1.1099 + 1.1100 +3.6.1. Codebook Memory 1.1101 + 1.1102 + The codebook memory is based on the already encoded sub-blocks, so 1.1103 + the available data for encoding increases for each new sub-block that 1.1104 + has been encoded. Until enough sub-blocks have been encoded to fill 1.1105 + the codebook memory with data, it is padded with zeros. The 1.1106 + following figure shows an example of the order in which the sub- 1.1107 + blocks are encoded for the 30 ms frame size if the start state is 1.1108 + located in the last 58 samples of sub-block 2 and 3. 1.1109 + 1.1110 + +-----------------------------------------------------+ 1.1111 + | 5 | 1 |///|////////| 2 | 3 | 4 | 1.1112 + +-----------------------------------------------------+ 1.1113 + 1.1114 + Figure 3.5. The order from 1 to 5 in which the sub-blocks are 1.1115 + encoded. The slashed area is the start state. 1.1116 + 1.1117 + 1.1118 + 1.1119 + 1.1120 + 1.1121 + 1.1122 + 1.1123 + 1.1124 + 1.1125 +Andersen, et al. Experimental [Page 20] 1.1126 + 1.1127 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.1128 + 1.1129 + 1.1130 + The first target sub-block to be encoded is number 1, and the 1.1131 + corresponding codebook memory is shown in the following figure. As 1.1132 + the target vector comes before the start state in time, the codebook 1.1133 + memory and target vector are time reversed; thus, after the block has 1.1134 + been time reversed the search algorithm can be reused. As only the 1.1135 + start state has been encoded so far, the last samples of the codebook 1.1136 + memory are padded with zeros. 1.1137 + 1.1138 + +------------------------- 1.1139 + |zeros|\\\\\\\\|\\\\| 1 | 1.1140 + +------------------------- 1.1141 + 1.1142 + Figure 3.6. The codebook memory, length lMem=85 samples, and the 1.1143 + target vector 1, length 22 samples. 1.1144 + 1.1145 + The next step is to encode sub-block 2 by using the memory that now 1.1146 + has increased since sub-block 1 has been encoded. The following 1.1147 + figure shows the codebook memory for encoding of sub-block 2. 1.1148 + 1.1149 + +----------------------------------- 1.1150 + | zeros | 1 |///|////////| 2 | 1.1151 + +----------------------------------- 1.1152 + 1.1153 + Figure 3.7. The codebook memory, length lMem=147 samples, and the 1.1154 + target vector 2, length 40 samples. 1.1155 + 1.1156 + The next step is to encode sub-block 3 by using the memory which has 1.1157 + been increased yet again since sub-blocks 1 and 2 have been encoded, 1.1158 + but the sub-block still has to be padded with a few zeros. The 1.1159 + following figure shows the codebook memory for encoding of sub-block 1.1160 + 3. 1.1161 + 1.1162 + +------------------------------------------ 1.1163 + |zeros| 1 |///|////////| 2 | 3 | 1.1164 + +------------------------------------------ 1.1165 + 1.1166 + Figure 3.8. The codebook memory, length lMem=147 samples, and the 1.1167 + target vector 3, length 40 samples. 1.1168 + 1.1169 + The next step is to encode sub-block 4 by using the memory which now 1.1170 + has increased yet again since sub-blocks 1, 2, and 3 have been 1.1171 + encoded. This time, the memory does not have to be padded with 1.1172 + zeros. The following figure shows the codebook memory for encoding 1.1173 + of sub-block 4. 1.1174 + 1.1175 + 1.1176 + 1.1177 + 1.1178 + 1.1179 + 1.1180 + 1.1181 +Andersen, et al. Experimental [Page 21] 1.1182 + 1.1183 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.1184 + 1.1185 + 1.1186 + +------------------------------------------ 1.1187 + |1|///|////////| 2 | 3 | 4 | 1.1188 + +------------------------------------------ 1.1189 + 1.1190 + Figure 3.9. The codebook memory, length lMem=147 samples, and the 1.1191 + target vector 4, length 40 samples. 1.1192 + 1.1193 + The final target sub-block to be encoded is number 5, and the 1.1194 + following figure shows the corresponding codebook memory. As the 1.1195 + target vector comes before the start state in time, the codebook 1.1196 + memory and target vector are time reversed. 1.1197 + 1.1198 + +------------------------------------------- 1.1199 + | 3 | 2 |\\\\\\\\|\\\\| 1 | 5 | 1.1200 + +------------------------------------------- 1.1201 + 1.1202 + Figure 3.10. The codebook memory, length lMem=147 samples, and the 1.1203 + target vector 5, length 40 samples. 1.1204 + 1.1205 + For the case of 20 ms frames, the encoding procedure looks almost 1.1206 + exactly the same. The only difference is that the size of the start 1.1207 + state is 57 samples and that there are only three sub-blocks to be 1.1208 + encoded. The encoding order is the same as above, starting with the 1.1209 + 23-sample target and then encoding the two remaining 40-sample sub- 1.1210 + blocks, first going forward in time and then going backward in time 1.1211 + relative to the start state. 1.1212 + 1.1213 +3.6.2. Perceptual Weighting of Codebook Memory and Target 1.1214 + 1.1215 + To provide a perceptual weighting of the coding error, a 1.1216 + concatenation of the codebook memory and the target to be coded is 1.1217 + all-pole filtered with the perceptual weighting filter specified in 1.1218 + section 3.4. The filter state of the weighting filter is set to 1.1219 + zero. 1.1220 + 1.1221 + in(0..(lMem-1)) = unweighted codebook memory 1.1222 + in(lMem..(lMem+lTarget-1)) = unweighted target signal 1.1223 + 1.1224 + 1.1225 + in -> Wk(z) -> filtered, 1.1226 + where Wk(z) is taken from the sub-block of the target 1.1227 + 1.1228 + weighted codebook memory = filtered(0..(lMem-1)) 1.1229 + weighted target signal = filtered(lMem..(lMem+lTarget-1)) 1.1230 + 1.1231 + The codebook search is done with the weighted codebook memory and the 1.1232 + weighted target, whereas the decoding and the codebook memory update 1.1233 + uses the unweighted codebook memory. 1.1234 + 1.1235 + 1.1236 + 1.1237 +Andersen, et al. Experimental [Page 22] 1.1238 + 1.1239 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.1240 + 1.1241 + 1.1242 +3.6.3. Codebook Creation 1.1243 + 1.1244 + The codebook for the search is created from the perceptually weighted 1.1245 + codebook memory. It consists of two sections, where the first is 1.1246 + referred to as the base codebook and the second as the expanded 1.1247 + codebook, as it is created by linear combinations of the first. Each 1.1248 + of these two sections also has a subsection referred to as the 1.1249 + augmented codebook. The augmented codebook is only created and used 1.1250 + for the coding of the 40-sample sub-blocks and not for the 23/22- 1.1251 + sample sub-block case. The codebook size used for the different 1.1252 + sub-blocks and different stages are summarized in the table below. 1.1253 + 1.1254 + Stage 1.1255 + 1 2 & 3 1.1256 + -------------------------------------------- 1.1257 + 22 128 (64+0)*2 128 (64+0)*2 1.1258 + Sub- 1:st 40 256 (108+20)*2 128 (44+20)*2 1.1259 + Blocks 2:nd 40 256 (108+20)*2 256 (108+20)*2 1.1260 + 3:rd 40 256 (108+20)*2 256 (108+20)*2 1.1261 + 4:th 40 256 (108+20)*2 256 (108+20)*2 1.1262 + 1.1263 + Table 3.1. Codebook sizes for the 30 ms mode. 1.1264 + 1.1265 + Table 3.1 shows the codebook size for the different sub-blocks and 1.1266 + stages for 30 ms frames. Inside the parentheses it shows how the 1.1267 + number of codebook vectors is distributed, within the two sections, 1.1268 + between the base/expanded codebook and the augmented base/expanded 1.1269 + codebook. It should be interpreted in the following way: 1.1270 + (base/expanded cb + augmented base/expanded cb). The total number of 1.1271 + codebook vectors for a specific sub-block and stage is given by the 1.1272 + following formula: 1.1273 + 1.1274 + Tot. cb vectors = base cb + aug. base cb + exp. cb + aug. exp. cb 1.1275 + 1.1276 + The corresponding values to Figure 3.1 for 20 ms frames are only 1.1277 + slightly modified. The short sub-block is 23 instead of 22 samples, 1.1278 + and the 3:rd and 4:th sub-frame are not present. 1.1279 + 1.1280 +3.6.3.1. Creation of a Base Codebook 1.1281 + 1.1282 + The base codebook is given by the perceptually weighted codebook 1.1283 + memory that is mentioned in section 3.5.3. The different codebook 1.1284 + vectors are given by sliding a window of length 23/22 or 40, given by 1.1285 + variable lTarget, over the lMem-long perceptually weighted codebook 1.1286 + memory. The indices are ordered so that the codebook vector 1.1287 + containing sample (lMem-lTarget-n) to (lMem-n-1) of the codebook 1.1288 + 1.1289 + 1.1290 + 1.1291 + 1.1292 + 1.1293 +Andersen, et al. Experimental [Page 23] 1.1294 + 1.1295 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.1296 + 1.1297 + 1.1298 + memory vector has index n, where n=0..lMem-lTarget. Thus the total 1.1299 + number of base codebook vectors is lMem-lTarget+1, and the indices 1.1300 + are ordered from sample delay lTarget (23/22 or 40) to lMem+1 (86 or 1.1301 + 148). 1.1302 + 1.1303 +3.6.3.2. Codebook Expansion 1.1304 + 1.1305 + The base codebook is expanded by a factor of 2, creating an 1.1306 + additional section in the codebook. This new section is obtained by 1.1307 + filtering the base codebook, base_cb, with a FIR filter with filter 1.1308 + length CB_FILTERLEN=8. The construction of the expanded codebook 1.1309 + compensates for the delay of four samples introduced by the FIR 1.1310 + filter. 1.1311 + 1.1312 + cbfiltersTbl[CB_FILTERLEN]={-0.033691, 0.083740, -0.144043, 1.1313 + 0.713379, 0.806152, -0.184326, 1.1314 + 0.108887, -0.034180}; 1.1315 + 1.1316 + ___ 1.1317 + \ 1.1318 + exp_cb(k)= + > cbfiltersTbl(i)*x(k-i+4) 1.1319 + /__ 1.1320 + i=0...(LPC_FILTERORDER-1) 1.1321 + 1.1322 + where x(j) = base_cb(j) for j=0..lMem-1 and 0 otherwise 1.1323 + 1.1324 + The individual codebook vectors of the new filtered codebook, exp_cb, 1.1325 + and their indices are obtained in the same fashion as described above 1.1326 + for the base codebook. 1.1327 + 1.1328 +3.6.3.3. Codebook Augmentation 1.1329 + 1.1330 + For cases where encoding entire sub-blocks, i.e., cbveclen=40, the 1.1331 + base and expanded codebooks are augmented to increase codebook 1.1332 + richness. The codebooks are augmented by vectors produced by 1.1333 + interpolation of segments. The base and expanded codebook, 1.1334 + constructed above, consists of vectors corresponding to sample delays 1.1335 + in the range from cbveclen to lMem. The codebook augmentation 1.1336 + attempts to augment these codebooks with vectors corresponding to 1.1337 + sample delays from 20 to 39. However, not all of these samples are 1.1338 + present in the base codebook and expanded codebook, respectively. 1.1339 + Therefore, the augmentation vectors are constructed as linear 1.1340 + combinations between samples corresponding to sample delays in the 1.1341 + range 20 to 39. The general idea of this procedure is presented in 1.1342 + the following figures and text. The procedure is performed for both 1.1343 + the base codebook and the expanded codebook. 1.1344 + 1.1345 + 1.1346 + 1.1347 + 1.1348 + 1.1349 +Andersen, et al. Experimental [Page 24] 1.1350 + 1.1351 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.1352 + 1.1353 + 1.1354 + - - ------------------------| 1.1355 + codebook memory | 1.1356 + - - ------------------------| 1.1357 + |-5-|---15---|-5-| 1.1358 + pi pp po 1.1359 + 1.1360 + | | Codebook vector 1.1361 + |---15---|-5-|-----20-----| <- corresponding to 1.1362 + i ii iii sample delay 20 1.1363 + 1.1364 + Figure 3.11. Generation of the first augmented codebook. 1.1365 + 1.1366 + Figure 3.11 shows the codebook memory with pointers pi, pp, and po, 1.1367 + where pi points to sample 25, pp to sample 20, and po to sample 5. 1.1368 + Below the codebook memory, the augmented codebook vector 1.1369 + corresponding to sample delay 20 is drawn. Segment i consists of 1.1370 + fifteen samples from pointer pp and forward in time. Segment ii 1.1371 + consists of five interpolated samples from pi and forward and from po 1.1372 + and forward. The samples are linearly interpolated with weights 1.1373 + [0.0, 0.2, 0.4, 0.6, 0.8] for pi and weights [1.0, 0.8, 0.6, 0.4, 1.1374 + 0.2] for po. Segment iii consists of twenty samples from pp and 1.1375 + forward. The augmented codebook vector corresponding to sample delay 1.1376 + 21 is produced by moving pointers pp and pi one sample backward in 1.1377 + time. This gives us the following figure. 1.1378 + 1.1379 + - - ------------------------| 1.1380 + codebook memory | 1.1381 + - - ------------------------| 1.1382 + |-5-|---16---|-5-| 1.1383 + pi pp po 1.1384 + 1.1385 + | | Codebook vector 1.1386 + |---16---|-5-|-----19-----| <- corresponding to 1.1387 + i ii iii sample delay 21 1.1388 + 1.1389 + Figure 3.12. Generation of the second augmented codebook. 1.1390 + 1.1391 + Figure 3.12 shows the codebook memory with pointers pi, pp and po 1.1392 + where pi points to sample 26, pp to sample 21, and po to sample 5. 1.1393 + Below the codebook memory, the augmented codebook vector 1.1394 + corresponding to sample delay 21 is drawn. Segment i now consists of 1.1395 + sixteen samples from pp and forward. Segment ii consists of five 1.1396 + interpolated samples from pi and forward and from po and forward, and 1.1397 + the interpolation weights are the same throughout the procedure. 1.1398 + Segment iii consists of nineteen samples from pp and forward. The 1.1399 + same procedure of moving the two pointers is continued until the last 1.1400 + augmented vector corresponding to sample delay 39 has been created. 1.1401 + This gives a total of twenty new codebook vectors to each of the two 1.1402 + 1.1403 + 1.1404 + 1.1405 +Andersen, et al. Experimental [Page 25] 1.1406 + 1.1407 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.1408 + 1.1409 + 1.1410 + sections. Thus the total number of codebook vectors for each of the 1.1411 + two sections, when including the augmented codebook, becomes lMem- 1.1412 + SUBL+1+SUBL/2. This is provided that augmentation is evoked, i.e., 1.1413 + that lTarget=SUBL. 1.1414 + 1.1415 +3.6.4. Codebook Search 1.1416 + 1.1417 + The codebook search uses the codebooks described in the sections 1.1418 + above to find the best match of the perceptually weighted target, see 1.1419 + section 3.6.2. The search method is a multi-stage gain-shape 1.1420 + matching performed as follows. At each stage the best shape vector 1.1421 + is identified, then the gain is calculated and quantized, and finally 1.1422 + the target is updated in preparation for the next codebook search 1.1423 + stage. The number of stages is CB_NSTAGES=3. 1.1424 + 1.1425 + If the target is the 23/22-sample vector the codebooks are indexed so 1.1426 + that the base codebook is followed by the expanded codebook. If the 1.1427 + target is 40 samples the order is as follows: base codebook, 1.1428 + augmented base codebook, expanded codebook, and augmented expanded 1.1429 + codebook. The size of each codebook section and its corresponding 1.1430 + augmented section is given by Table 3.1 in section 3.6.3. 1.1431 + 1.1432 + For example, when the second 40-sample sub-block is coded, indices 0 1.1433 + - 107 correspond to the base codebook, 108 - 127 correspond to the 1.1434 + augmented base codebook, 128 - 235 correspond to the expanded 1.1435 + codebook, and indices 236 - 255 correspond to the augmented expanded 1.1436 + codebook. The indices are divided in the same fashion for all stages 1.1437 + in the example. Only in the case of coding the first 40-sample sub- 1.1438 + block is there a difference between stages (see Table 3.1). 1.1439 + 1.1440 +3.6.4.1. Codebook Search at Each Stage 1.1441 + 1.1442 + The codebooks are searched to find the best match to the target at 1.1443 + each stage. When the best match is found, the target is updated and 1.1444 + the next-stage search is started. The three chosen codebook vectors 1.1445 + and their corresponding gains constitute the encoded sub-block. The 1.1446 + best match is decided by the following three criteria: 1.1447 + 1.1448 + 1. Compute the measure 1.1449 + 1.1450 + (target*cbvec)^2 / ||cbvec||^2 1.1451 + 1.1452 + for all codebook vectors, cbvec, and choose the codebook vector 1.1453 + maximizing the measure. The expression (target*cbvec) is the dot 1.1454 + product between the target vector to be coded and the codebook vector 1.1455 + for which we compute the measure. The norm, ||x||, is defined as the 1.1456 + square root of (x*x). 1.1457 + 1.1458 + 1.1459 + 1.1460 + 1.1461 +Andersen, et al. Experimental [Page 26] 1.1462 + 1.1463 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.1464 + 1.1465 + 1.1466 + 2. The absolute value of the gain, corresponding to the chosen 1.1467 + codebook vector, cbvec, must be smaller than a fixed limit, 1.1468 + CB_MAXGAIN=1.3: 1.1469 + 1.1470 + |gain| < CB_MAXGAIN 1.1471 + 1.1472 + where the gain is computed in the following way: 1.1473 + 1.1474 + gain = (target*cbvec) / ||cbvec||^2 1.1475 + 1.1476 + 3. For the first stage, the dot product of the chosen codebook vector 1.1477 + and target must be positive: 1.1478 + 1.1479 + target*cbvec > 0 1.1480 + 1.1481 + In practice the above criteria are used in a sequential search 1.1482 + through all codebook vectors. The best match is found by registering 1.1483 + a new max measure and index whenever the previously registered max 1.1484 + measure is surpassed and all other criteria are fulfilled. If none 1.1485 + of the codebook vectors fulfill (2) and (3), the first codebook 1.1486 + vector is selected. 1.1487 + 1.1488 +3.6.4.2. Gain Quantization at Each Stage 1.1489 + 1.1490 + The gain follows as a result of the computation 1.1491 + 1.1492 + gain = (target*cbvec) / ||cbvec||^2 1.1493 + 1.1494 + for the optimal codebook vector found by the procedure in section 1.1495 + 3.6.4.1. 1.1496 + 1.1497 + The three stages quantize the gain, using 5, 4, and 3 bits, 1.1498 + respectively. In the first stage, the gain is limited to positive 1.1499 + values. This gain is quantized by finding the nearest value in the 1.1500 + quantization table gain_sq5Tbl. 1.1501 + 1.1502 + gain_sq5Tbl[32]={0.037476, 0.075012, 0.112488, 0.150024, 0.187500, 1.1503 + 0.224976, 0.262512, 0.299988, 0.337524, 0.375000, 1.1504 + 0.412476, 0.450012, 0.487488, 0.525024, 0.562500, 1.1505 + 0.599976, 0.637512, 0.674988, 0.712524, 0.750000, 1.1506 + 0.787476, 0.825012, 0.862488, 0.900024, 0.937500, 1.1507 + 0.974976, 1.012512, 1.049988, 1.087524, 1.125000, 1.1508 + 1.162476, 1.200012} 1.1509 + 1.1510 + The gains of the subsequent two stages can be either positive or 1.1511 + negative. The gains are quantized by using a quantization table 1.1512 + times a scale factor. The second stage uses the table gain_sq4Tbl, 1.1513 + and the third stage uses gain_sq3Tbl. The scale factor equates 0.1 1.1514 + 1.1515 + 1.1516 + 1.1517 +Andersen, et al. Experimental [Page 27] 1.1518 + 1.1519 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.1520 + 1.1521 + 1.1522 + or the absolute value of the quantized gain representation value 1.1523 + obtained in the previous stage, whichever is larger. Again, the 1.1524 + resulting gain index is the index to the nearest value of the 1.1525 + quantization table times the scale factor. 1.1526 + 1.1527 + gainQ = scaleFact * gain_sqXTbl[index] 1.1528 + 1.1529 + gain_sq4Tbl[16]={-1.049988, -0.900024, -0.750000, -0.599976, 1.1530 + -0.450012, -0.299988, -0.150024, 0.000000, 0.150024, 1.1531 + 0.299988, 0.450012, 0.599976, 0.750000, 0.900024, 1.1532 + 1.049988, 1.200012} 1.1533 + 1.1534 + gain_sq3Tbl[8]={-1.000000, -0.659973, -0.330017,0.000000, 1.1535 + 0.250000, 0.500000, 0.750000, 1.00000} 1.1536 + 1.1537 +3.6.4.3. Preparation of Target for Next Stage 1.1538 + 1.1539 + Before performing the search for the next stage, the perceptually 1.1540 + weighted target vector is updated by subtracting from it the selected 1.1541 + codebook vector (from the perceptually weighted codebook) times the 1.1542 + corresponding quantized gain. 1.1543 + 1.1544 + target[i] = target[i] - gainQ * selected_vec[i]; 1.1545 + 1.1546 + A reference implementation of the codebook encoding is found in 1.1547 + Appendix A.34. 1.1548 + 1.1549 +3.7. Gain Correction Encoding 1.1550 + 1.1551 + The start state is quantized in a relatively model independent manner 1.1552 + using 3 bits per sample. In contrast, the remaining parts of the 1.1553 + block are encoded by using an adaptive codebook. This codebook will 1.1554 + produce high matching accuracy whenever there is a high correlation 1.1555 + between the target and the best codebook vector. For unvoiced speech 1.1556 + segments and background noises, this is not necessarily so, which, 1.1557 + due to the nature of the squared error criterion, results in a coded 1.1558 + signal with less power than the target signal. As the coded start 1.1559 + state has good power matching to the target, the result is a power 1.1560 + fluctuation within the encoded frame. Perceptually, the main problem 1.1561 + with this is that the time envelope of the signal energy becomes 1.1562 + unsteady. To overcome this problem, the gains for the codebooks are 1.1563 + re-scaled after the codebook encoding by searching for a new gain 1.1564 + factor for the first stage codebook that provides better power 1.1565 + matching. 1.1566 + 1.1567 + First, the energy for the target signal, tene, is computed along with 1.1568 + the energy for the coded signal, cene, given by the addition of the 1.1569 + three gain scaled codebook vectors. Because the gains of the second 1.1570 + 1.1571 + 1.1572 + 1.1573 +Andersen, et al. Experimental [Page 28] 1.1574 + 1.1575 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.1576 + 1.1577 + 1.1578 + and third stage scale with the gain of the first stage, when the 1.1579 + first stage gain is changed from gain[0] to gain_sq5Tbl[i] the energy 1.1580 + of the coded signal changes from cene to 1.1581 + 1.1582 + cene*(gain_sq5Tbl[i]*gain_sq5Tbl[i])/(gain[0]*gain[0]) 1.1583 + 1.1584 + where gain[0] is the gain for the first stage found in the original 1.1585 + codebook search. A refined search is performed by testing the gain 1.1586 + indices i=0 to 31, and as long as the new codebook energy as given 1.1587 + above is less than tene, the gain index for stage 1 is increased. A 1.1588 + restriction is applied so that the new gain value for stage 1 cannot 1.1589 + be more than two times higher than the original value found in the 1.1590 + codebook search. Note that by using this method we do not change the 1.1591 + shape of the encoded vector, only the gain or amplitude. 1.1592 + 1.1593 +3.8. Bitstream Definition 1.1594 + 1.1595 + The total number of bits used to describe one frame of 20 ms speech 1.1596 + is 304, which fits in 38 bytes and results in a bit rate of 15.20 1.1597 + kbit/s. For the case of a frame length of 30 ms speech, the total 1.1598 + number of bits used is 400, which fits in 50 bytes and results in a 1.1599 + bit rate of 13.33 kbit/s. In the bitstream definition, the bits are 1.1600 + distributed into three classes according to their bit error or loss 1.1601 + sensitivity. The most sensitive bits (class 1) are placed first in 1.1602 + the bitstream for each frame. The less sensitive bits (class 2) are 1.1603 + placed after the class 1 bits. The least sensitive bits (class 3) 1.1604 + are placed at the end of the bitstream for each frame. 1.1605 + 1.1606 + In the 20/30 ms frame length cases for each class, the following hold 1.1607 + true: The class 1 bits occupy a total of 6/8 bytes (48/64 bits), the 1.1608 + class 2 bits occupy 8/12 bytes (64/96 bits), and the class 3 bits 1.1609 + occupy 24/30 bytes (191/239 bits). This distribution of the bits 1.1610 + enables the use of uneven level protection (ULP) as is exploited in 1.1611 + the payload format definition for iLBC [1]. The detailed bit 1.1612 + allocation is shown in the table below. When a quantization index is 1.1613 + distributed between more classes, the more significant bits belong to 1.1614 + the lowest class. 1.1615 + 1.1616 + 1.1617 + 1.1618 + 1.1619 + 1.1620 + 1.1621 + 1.1622 + 1.1623 + 1.1624 + 1.1625 + 1.1626 + 1.1627 + 1.1628 + 1.1629 +Andersen, et al. Experimental [Page 29] 1.1630 + 1.1631 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.1632 + 1.1633 + 1.1634 + Bitstream structure: 1.1635 + 1.1636 + ------------------------------------------------------------------+ 1.1637 + Parameter | Bits Class <1,2,3> | 1.1638 + | 20 ms frame | 30 ms frame | 1.1639 + ----------------------------------+---------------+---------------+ 1.1640 + Split 1 | 6 <6,0,0> | 6 <6,0,0> | 1.1641 + LSF 1 Split 2 | 7 <7,0,0> | 7 <7,0,0> | 1.1642 + LSF Split 3 | 7 <7,0,0> | 7 <7,0,0> | 1.1643 + ------------------+---------------+---------------+ 1.1644 + Split 1 | NA (Not Appl.)| 6 <6,0,0> | 1.1645 + LSF 2 Split 2 | NA | 7 <7,0,0> | 1.1646 + Split 3 | NA | 7 <7,0,0> | 1.1647 + ------------------+---------------+---------------+ 1.1648 + Sum | 20 <20,0,0> | 40 <40,0,0> | 1.1649 + ----------------------------------+---------------+---------------+ 1.1650 + Block Class | 2 <2,0,0> | 3 <3,0,0> | 1.1651 + ----------------------------------+---------------+---------------+ 1.1652 + Position 22 sample segment | 1 <1,0,0> | 1 <1,0,0> | 1.1653 + ----------------------------------+---------------+---------------+ 1.1654 + Scale Factor State Coder | 6 <6,0,0> | 6 <6,0,0> | 1.1655 + ----------------------------------+---------------+---------------+ 1.1656 + Sample 0 | 3 <0,1,2> | 3 <0,1,2> | 1.1657 + Quantized Sample 1 | 3 <0,1,2> | 3 <0,1,2> | 1.1658 + Residual : | : : | : : | 1.1659 + State : | : : | : : | 1.1660 + Samples : | : : | : : | 1.1661 + Sample 56 | 3 <0,1,2> | 3 <0,1,2> | 1.1662 + Sample 57 | NA | 3 <0,1,2> | 1.1663 + ------------------+---------------+---------------+ 1.1664 + Sum | 171 <0,57,114>| 174 <0,58,116>| 1.1665 + ----------------------------------+---------------+---------------+ 1.1666 + Stage 1 | 7 <6,0,1> | 7 <4,2,1> | 1.1667 + CB for 22/23 Stage 2 | 7 <0,0,7> | 7 <0,0,7> | 1.1668 + sample block Stage 3 | 7 <0,0,7> | 7 <0,0,7> | 1.1669 + ------------------+---------------+---------------+ 1.1670 + Sum | 21 <6,0,15> | 21 <4,2,15> | 1.1671 + ----------------------------------+---------------+---------------+ 1.1672 + Stage 1 | 5 <2,0,3> | 5 <1,1,3> | 1.1673 + Gain for 22/23 Stage 2 | 4 <1,1,2> | 4 <1,1,2> | 1.1674 + sample block Stage 3 | 3 <0,0,3> | 3 <0,0,3> | 1.1675 + ------------------+---------------+---------------+ 1.1676 + Sum | 12 <3,1,8> | 12 <2,2,8> | 1.1677 + ----------------------------------+---------------+---------------+ 1.1678 + Stage 1 | 8 <7,0,1> | 8 <6,1,1> | 1.1679 + sub-block 1 Stage 2 | 7 <0,0,7> | 7 <0,0,7> | 1.1680 + Stage 3 | 7 <0,0,7> | 7 <0,0,7> | 1.1681 + ------------------+---------------+---------------+ 1.1682 + 1.1683 + 1.1684 + 1.1685 +Andersen, et al. Experimental [Page 30] 1.1686 + 1.1687 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.1688 + 1.1689 + 1.1690 + Stage 1 | 8 <0,0,8> | 8 <0,7,1> | 1.1691 + sub-block 2 Stage 2 | 8 <0,0,8> | 8 <0,0,8> | 1.1692 + Indices Stage 3 | 8 <0,0,8> | 8 <0,0,8> | 1.1693 + for CB ------------------+---------------+---------------+ 1.1694 + sub-blocks Stage 1 | NA | 8 <0,7,1> | 1.1695 + sub-block 3 Stage 2 | NA | 8 <0,0,8> | 1.1696 + Stage 3 | NA | 8 <0,0,8> | 1.1697 + ------------------+---------------+---------------+ 1.1698 + Stage 1 | NA | 8 <0,7,1> | 1.1699 + sub-block 4 Stage 2 | NA | 8 <0,0,8> | 1.1700 + Stage 3 | NA | 8 <0,0,8> | 1.1701 + ------------------+---------------+---------------+ 1.1702 + Sum | 46 <7,0,39> | 94 <6,22,66> | 1.1703 + ----------------------------------+---------------+---------------+ 1.1704 + Stage 1 | 5 <1,2,2> | 5 <1,2,2> | 1.1705 + sub-block 1 Stage 2 | 4 <1,1,2> | 4 <1,2,1> | 1.1706 + Stage 3 | 3 <0,0,3> | 3 <0,0,3> | 1.1707 + ------------------+---------------+---------------+ 1.1708 + Stage 1 | 5 <1,1,3> | 5 <0,2,3> | 1.1709 + sub-block 2 Stage 2 | 4 <0,2,2> | 4 <0,2,2> | 1.1710 + Stage 3 | 3 <0,0,3> | 3 <0,0,3> | 1.1711 + Gains for ------------------+---------------+---------------+ 1.1712 + sub-blocks Stage 1 | NA | 5 <0,1,4> | 1.1713 + sub-block 3 Stage 2 | NA | 4 <0,1,3> | 1.1714 + Stage 3 | NA | 3 <0,0,3> | 1.1715 + ------------------+---------------+---------------+ 1.1716 + Stage 1 | NA | 5 <0,1,4> | 1.1717 + sub-block 4 Stage 2 | NA | 4 <0,1,3> | 1.1718 + Stage 3 | NA | 3 <0,0,3> | 1.1719 + ------------------+---------------+---------------+ 1.1720 + Sum | 24 <3,6,15> | 48 <2,12,34> | 1.1721 + ----------------------------------+---------------+---------------+ 1.1722 + Empty frame indicator | 1 <0,0,1> | 1 <0,0,1> | 1.1723 + ------------------------------------------------------------------- 1.1724 + SUM 304 <48,64,192> 400 <64,96,240> 1.1725 + 1.1726 + Table 3.2. The bitstream definition for iLBC for both the 20 ms 1.1727 + frame size mode and the 30 ms frame size mode. 1.1728 + 1.1729 + When packetized into the payload, the bits MUST be sorted as follows: 1.1730 + All the class 1 bits in the order (from top to bottom) as specified 1.1731 + in the table, all the class 2 bits (from top to bottom), and all the 1.1732 + class 3 bits in the same sequential order. The last bit, the empty 1.1733 + frame indicator, SHOULD be set to zero by the encoder. If this bit 1.1734 + is set to 1 the decoder SHOULD treat the data as a lost frame. For 1.1735 + example, this bit can be set to 1 to indicate lost frame for file 1.1736 + storage format, as in [1]. 1.1737 + 1.1738 + 1.1739 + 1.1740 + 1.1741 +Andersen, et al. Experimental [Page 31] 1.1742 + 1.1743 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.1744 + 1.1745 + 1.1746 +4. Decoder Principles 1.1747 + 1.1748 + This section describes the principles of each component of the 1.1749 + decoder algorithm. 1.1750 + 1.1751 + +-------------+ +--------+ +---------------+ 1.1752 + payload -> | 1. Get para | -> | 2. LPC | -> | 3. Sc Dequant | -> 1.1753 + +-------------+ +--------+ +---------------+ 1.1754 + 1.1755 + +-------------+ +------------------+ 1.1756 + -> | 4. Mem setup| -> | 5. Construct res |-------> 1.1757 + | +-------------+ +------------------- | 1.1758 + ---------<-----------<-----------<------------ 1.1759 + Sub-frame 0...2/4 (20 ms/30 ms) 1.1760 + 1.1761 + +----------------+ +----------+ 1.1762 + -> | 6. Enhance res | -> | 7. Synth | ------------> 1.1763 + +----------------+ +----------+ 1.1764 + 1.1765 + +-----------------+ 1.1766 + -> | 8. Post Process | ----------------> decoded speech 1.1767 + +-----------------+ 1.1768 + 1.1769 + Figure 4.1. Flow chart of the iLBC decoder. If a frame was lost, 1.1770 + steps 1 to 5 SHOULD be replaced by a PLC algorithm. 1.1771 + 1.1772 + 1. Extract the parameters from the bitstream. 1.1773 + 1.1774 + 2. Decode the LPC and interpolate (section 4.1). 1.1775 + 1.1776 + 3. Construct the 57/58-sample start state (section 4.2). 1.1777 + 1.1778 + 4. Set up the memory by using data from the decoded residual. This 1.1779 + memory is used for codebook construction. For blocks preceding 1.1780 + the start state, both the decoded residual and the target are time 1.1781 + reversed. Sub-frames are decoded in the same order as they were 1.1782 + encoded. 1.1783 + 1.1784 + 5. Construct the residuals of this sub-frame (gain[0]*cbvec[0] + 1.1785 + gain[1]*cbvec[1] + gain[2]*cbvec[2]). Repeat 4 and 5 until the 1.1786 + residual of all sub-blocks has been constructed. 1.1787 + 1.1788 + 6. Enhance the residual with the post filter (section 4.6). 1.1789 + 1.1790 + 7. Synthesis of the residual (section 4.7). 1.1791 + 1.1792 + 8. Post process with HP filter, if desired (section 4.8). 1.1793 + 1.1794 + 1.1795 + 1.1796 + 1.1797 +Andersen, et al. Experimental [Page 32] 1.1798 + 1.1799 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.1800 + 1.1801 + 1.1802 +4.1. LPC Filter Reconstruction 1.1803 + 1.1804 + The decoding of the LP filter parameters is very straightforward. 1.1805 + For a set of three/six indices, the corresponding LSF vector(s) are 1.1806 + found by simple table lookup. For each of the LSF vectors, the three 1.1807 + split vectors are concatenated to obtain qlsf1 and qlsf2, 1.1808 + respectively (in the 20 ms mode only one LSF vector, qlsf, is 1.1809 + constructed). The next step is the stability check described in 1.1810 + section 3.2.5 followed by the interpolation scheme described in 1.1811 + section 3.2.6 (3.2.7 for 20 ms frames). The only difference is that 1.1812 + only the quantized LSFs are known at the decoder, and hence the 1.1813 + unquantized LSFs are not processed. 1.1814 + 1.1815 + A reference implementation of the LPC filter reconstruction is given 1.1816 + in Appendix A.36. 1.1817 + 1.1818 +4.2. Start State Reconstruction 1.1819 + 1.1820 + The scalar encoded STATE_SHORT_LEN=58 (STATE_SHORT_LEN=57 in the 20 1.1821 + ms mode) state samples are reconstructed by 1) forming a set of 1.1822 + samples (by table lookup) from the index stream idxVec[n], 2) 1.1823 + multiplying the set with 1/scal=(10^qmax)/4.5, 3) time reversing the 1.1824 + 57/58 samples, 4) filtering the time reversed block with the 1.1825 + dispersion (all-pass) filter used in the encoder (as described in 1.1826 + section 3.5.2); this compensates for the phase distortion of the 1.1827 + earlier filter operation, and 5 reversing the 57/58 samples from the 1.1828 + previous step. 1.1829 + 1.1830 + in(0..(STATE_SHORT_LEN-1)) = time reversed samples from table 1.1831 + look-up, 1.1832 + idxVecDec((STATE_SHORT_LEN-1)..0) 1.1833 + 1.1834 + in(STATE_SHORT_LEN..(2*STATE_SHORT_LEN-1)) = 0 1.1835 + 1.1836 + Pk(z) = A~rk(z)/A~k(z), where 1.1837 + ___ 1.1838 + \ 1.1839 + A~rk(z)= z^(-LPC_FILTERORDER) + > a~ki*z^(i-(LPC_FILTERORDER-1)) 1.1840 + /__ 1.1841 + i=0...(LPC_FILTERORDER-1) 1.1842 + 1.1843 + and A~k(z) is taken from the block where the start state begins 1.1844 + 1.1845 + in -> Pk(z) -> filtered 1.1846 + 1.1847 + out(k) = filtered(STATE_SHORT_LEN-1-k) + 1.1848 + filtered(2*STATE_SHORT_LEN-1-k), 1.1849 + k=0..(STATE_SHORT_LEN-1) 1.1850 + 1.1851 + 1.1852 + 1.1853 +Andersen, et al. Experimental [Page 33] 1.1854 + 1.1855 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.1856 + 1.1857 + 1.1858 + The remaining 23/22 samples in the state are reconstructed by the 1.1859 + same adaptive codebook technique described in section 4.3. The 1.1860 + location bit determines whether these are the first or the last 23/22 1.1861 + samples of the 80-sample state vector. If the remaining 23/22 1.1862 + samples are the first samples, then the scalar encoded 1.1863 + STATE_SHORT_LEN state samples are time-reversed before initialization 1.1864 + of the adaptive codebook memory vector. 1.1865 + 1.1866 + A reference implementation of the start state reconstruction is given 1.1867 + in Appendix A.44. 1.1868 + 1.1869 +4.3. Excitation Decoding Loop 1.1870 + 1.1871 + The decoding of the LPC excitation vector proceeds in the same order 1.1872 + in which the residual was encoded at the encoder. That is, after the 1.1873 + decoding of the entire 80-sample state vector, the forward sub-blocks 1.1874 + (corresponding to samples occurring after the state vector samples) 1.1875 + are decoded, and then the backward sub-blocks (corresponding to 1.1876 + samples occurring before the state vector) are decoded, resulting in 1.1877 + a fully decoded block of excitation signal samples. 1.1878 + 1.1879 + In particular, each sub-block is decoded by using the multistage 1.1880 + adaptive codebook decoding module described in section 4.4. This 1.1881 + module relies upon an adaptive codebook memory constructed before 1.1882 + each run of the adaptive codebook decoding. The construction of the 1.1883 + adaptive codebook memory in the decoder is identical to the method 1.1884 + outlined in section 3.6.3, except that it is done on the codebook 1.1885 + memory without perceptual weighting. 1.1886 + 1.1887 + For the initial forward sub-block, the last STATE_LEN=80 samples of 1.1888 + the length CB_LMEM=147 adaptive codebook memory are filled with the 1.1889 + samples of the state vector. For subsequent forward sub-blocks, the 1.1890 + first SUBL=40 samples of the adaptive codebook memory are discarded, 1.1891 + the remaining samples are shifted by SUBL samples toward the 1.1892 + beginning of the vector, and the newly decoded SUBL=40 samples are 1.1893 + placed at the end of the adaptive codebook memory. For backward 1.1894 + sub-blocks, the construction is similar, except that every vector of 1.1895 + samples involved is first time reversed. 1.1896 + 1.1897 + A reference implementation of the excitation decoding loop is found 1.1898 + in Appendix A.5. 1.1899 + 1.1900 + 1.1901 + 1.1902 + 1.1903 + 1.1904 + 1.1905 + 1.1906 + 1.1907 + 1.1908 + 1.1909 +Andersen, et al. Experimental [Page 34] 1.1910 + 1.1911 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.1912 + 1.1913 + 1.1914 +4.4. Multistage Adaptive Codebook Decoding 1.1915 + 1.1916 + The Multistage Adaptive Codebook Decoding module is used at both the 1.1917 + sender (encoder) and the receiver (decoder) ends to produce a 1.1918 + synthetic signal in the residual domain that is eventually used to 1.1919 + produce synthetic speech. The module takes the index values used to 1.1920 + construct vectors that are scaled and summed together to produce a 1.1921 + synthetic signal that is the output of the module. 1.1922 + 1.1923 +4.4.1. Construction of the Decoded Excitation Signal 1.1924 + 1.1925 + The unpacked index values provided at the input to the module are 1.1926 + references to extended codebooks, which are constructed as described 1.1927 + in section 3.6.3, except that they are based on the codebook memory 1.1928 + without the perceptual weighting. The unpacked three indices are 1.1929 + used to look up three codebook vectors. The unpacked three gain 1.1930 + indices are used to decode the corresponding 3 gains. In this 1.1931 + decoding, the successive rescaling, as described in section 3.6.4.2, 1.1932 + is applied. 1.1933 + 1.1934 + A reference implementation of the adaptive codebook decoding is 1.1935 + listed in Appendix A.32. 1.1936 + 1.1937 +4.5. Packet Loss Concealment 1.1938 + 1.1939 + If packet loss occurs, the decoder receives a signal saying that 1.1940 + information regarding a block is lost. For such blocks it is 1.1941 + RECOMMENDED to use a Packet Loss Concealment (PLC) unit to create a 1.1942 + decoded signal that masks the effect of that packet loss. In the 1.1943 + following we will describe an example of a PLC unit that can be used 1.1944 + with the iLBC codec. As the PLC unit is used only at the decoder, 1.1945 + the PLC unit does not affect interoperability between 1.1946 + implementations. Other PLC implementations MAY therefore be used. 1.1947 + 1.1948 + The PLC described operates on the LP filters and the excitation 1.1949 + signals and is based on the following principles: 1.1950 + 1.1951 +4.5.1. Block Received Correctly and Previous Block Also Received 1.1952 + 1.1953 + If the block is received correctly, the PLC only records state 1.1954 + information of the current block that can be used in case the next 1.1955 + block is lost. The LP filter coefficients for each sub-block and the 1.1956 + entire decoded excitation signal are all saved in the decoder state 1.1957 + structure. All of this information will be needed if the following 1.1958 + block is lost. 1.1959 + 1.1960 + 1.1961 + 1.1962 + 1.1963 + 1.1964 + 1.1965 +Andersen, et al. Experimental [Page 35] 1.1966 + 1.1967 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.1968 + 1.1969 + 1.1970 +4.5.2. Block Not Received 1.1971 + 1.1972 + If the block is not received, the block substitution is based on a 1.1973 + pitch-synchronous repetition of the excitation signal, which is 1.1974 + filtered by the last LP filter of the previous block. The previous 1.1975 + block's information is stored in the decoder state structure. 1.1976 + 1.1977 + A correlation analysis is performed on the previous block's 1.1978 + excitation signal in order to detect the amount of pitch periodicity 1.1979 + and a pitch value. The correlation measure is also used to decide on 1.1980 + the voicing level (the degree to which the previous block's 1.1981 + excitation was a voiced or roughly periodic signal). The excitation 1.1982 + in the previous block is used to create an excitation for the block 1.1983 + to be substituted, such that the pitch of the previous block is 1.1984 + maintained. Therefore, the new excitation is constructed in a 1.1985 + pitch-synchronous manner. In order to avoid a buzzy-sounding 1.1986 + substituted block, a random excitation is mixed with the new pitch 1.1987 + periodic excitation, and the relative use of the two components is 1.1988 + computed from the correlation measure (voicing level). 1.1989 + 1.1990 + For the block to be substituted, the newly constructed excitation 1.1991 + signal is then passed through the LP filter to produce the speech 1.1992 + that will be substituted for the lost block. 1.1993 + 1.1994 + For several consecutive lost blocks, the packet loss concealment 1.1995 + continues in a similar manner. The correlation measure of the last 1.1996 + block received is still used along with the same pitch value. The LP 1.1997 + filters of the last block received are also used again. The energy 1.1998 + of the substituted excitation for consecutive lost blocks is 1.1999 + decreased, leading to a dampened excitation, and therefore to 1.2000 + dampened speech. 1.2001 + 1.2002 +4.5.3. Block Received Correctly When Previous Block Not Received 1.2003 + 1.2004 + For the case in which a block is received correctly when the previous 1.2005 + block was not, the correctly received block's directly decoded speech 1.2006 + (based solely on the received block) is not used as the actual 1.2007 + output. The reason for this is that the directly decoded speech does 1.2008 + not necessarily smoothly merge into the synthetic speech generated 1.2009 + for the previous lost block. If the two signals are not smoothly 1.2010 + merged, an audible discontinuity is accidentally produced. 1.2011 + Therefore, a correlation analysis between the two blocks of 1.2012 + excitation signal (the excitation of the previous concealed block and 1.2013 + that of the current received block) is performed to find the best 1.2014 + phase match. Then a simple overlap-add procedure is performed to 1.2015 + merge the previous excitation smoothly into the current block's 1.2016 + excitation. 1.2017 + 1.2018 + 1.2019 + 1.2020 + 1.2021 +Andersen, et al. Experimental [Page 36] 1.2022 + 1.2023 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.2024 + 1.2025 + 1.2026 + The exact implementation of the packet loss concealment does not 1.2027 + influence interoperability of the codec. 1.2028 + 1.2029 + A reference implementation of the packet loss concealment is 1.2030 + suggested in Appendix A.14. Exact compliance with this suggested 1.2031 + algorithm is not needed for a reference implementation to be fully 1.2032 + compatible with the overall codec specification. 1.2033 + 1.2034 +4.6. Enhancement 1.2035 + 1.2036 + The decoder contains an enhancement unit that operates on the 1.2037 + reconstructed excitation signal. The enhancement unit increases the 1.2038 + perceptual quality of the reconstructed signal by reducing the 1.2039 + speech-correlated noise in the voiced speech segments. Compared to 1.2040 + traditional postfilters, the enhancer has an advantage in that it can 1.2041 + only modify the excitation signal slightly. This means that there is 1.2042 + no risk of over enhancement. The enhancer works very similarly for 1.2043 + both the 20 ms frame size mode and the 30 ms frame size mode. 1.2044 + 1.2045 + For the mode with 20 ms frame size, the enhancer uses a memory of six 1.2046 + 80-sample excitation blocks prior in time plus the two new 80-sample 1.2047 + excitation blocks. For each block of 160 new unenhanced excitation 1.2048 + samples, 160 enhanced excitation samples are produced. The enhanced 1.2049 + excitation is 40-sample delayed compared to the unenhanced 1.2050 + excitation, as the enhancer algorithm uses lookahead. 1.2051 + 1.2052 + For the mode with 30 ms frame size, the enhancer uses a memory of 1.2053 + five 80-sample excitation blocks prior in time plus the three new 1.2054 + 80-sample excitation blocks. For each block of 240 new unenhanced 1.2055 + excitation samples, 240 enhanced excitation samples are produced. 1.2056 + The enhanced excitation is 80-sample delayed compared to the 1.2057 + unenhanced excitation, as the enhancer algorithm uses lookahead. 1.2058 + 1.2059 + Outline of Enhancer 1.2060 + 1.2061 + The speech enhancement unit operates on sub-blocks of 80 samples, 1.2062 + which means that there are two/three 80 sample sub-blocks per frame. 1.2063 + Each of these two/three sub-blocks is enhanced separately, but in an 1.2064 + analogous manner. 1.2065 + 1.2066 + 1.2067 + 1.2068 + 1.2069 + 1.2070 + 1.2071 + 1.2072 + 1.2073 + 1.2074 + 1.2075 + 1.2076 + 1.2077 +Andersen, et al. Experimental [Page 37] 1.2078 + 1.2079 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.2080 + 1.2081 + 1.2082 + unenhanced residual 1.2083 + | 1.2084 + | +---------------+ +--------------+ 1.2085 + +-> | 1. Pitch Est | -> | 2. Find PSSQ | --------> 1.2086 + +---------------+ | +--------------+ 1.2087 + +-----<-------<------<--+ 1.2088 + +------------+ enh block 0..1/2 | 1.2089 + -> | 3. Smooth | | 1.2090 + +------------+ | 1.2091 + \ | 1.2092 + /\ | 1.2093 + / \ Already | 1.2094 + / 4. \----------->----------->-----------+ | 1.2095 + \Crit/ Fulfilled | | 1.2096 + \? / v | 1.2097 + \/ | | 1.2098 + \ +-----------------+ +---------+ | | 1.2099 + Not +->| 5. Use Constr. | -> | 6. Mix | -----> 1.2100 + Fulfilled +-----------------+ +---------+ 1.2101 + 1.2102 + ---------------> enhanced residual 1.2103 + 1.2104 + Figure 4.2. Flow chart of the enhancer. 1.2105 + 1.2106 + 1. Pitch estimation of each of the two/three new 80-sample blocks. 1.2107 + 1.2108 + 2. Find the pitch-period-synchronous sequence n (for block k) by a 1.2109 + search around the estimated pitch value. Do this for n=1,2,3, 1.2110 + -1,-2,-3. 1.2111 + 1.2112 + 3. Calculate the smoothed residual generated by the six pitch- 1.2113 + period-synchronous sequences from prior step. 1.2114 + 1.2115 + 4. Check if the smoothed residual satisfies the criterion (section 1.2116 + 4.6.4). 1.2117 + 1.2118 + 5. Use constraint to calculate mixing factor (section 4.6.5). 1.2119 + 1.2120 + 6. Mix smoothed signal with unenhanced residual (pssq(n) n=0). 1.2121 + 1.2122 + The main idea of the enhancer is to find three 80 sample blocks 1.2123 + before and three 80-sample blocks after the analyzed unenhanced sub- 1.2124 + block and to use these to improve the quality of the excitation in 1.2125 + that sub-block. The six blocks are chosen so that they have the 1.2126 + highest possible correlation with the unenhanced sub-block that is 1.2127 + being enhanced. In other words, the six blocks are pitch-period- 1.2128 + synchronous sequences to the unenhanced sub-block. 1.2129 + 1.2130 + 1.2131 + 1.2132 + 1.2133 +Andersen, et al. Experimental [Page 38] 1.2134 + 1.2135 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.2136 + 1.2137 + 1.2138 + A linear combination of the six pitch-period-synchronous sequences is 1.2139 + calculated that approximates the sub-block. If the squared error 1.2140 + between the approximation and the unenhanced sub-block is small 1.2141 + enough, the enhanced residual is set equal to this approximation. 1.2142 + For the cases when the squared error criterion is not fulfilled, a 1.2143 + linear combination of the approximation and the unenhanced residual 1.2144 + forms the enhanced residual. 1.2145 + 1.2146 +4.6.1. Estimating the Pitch 1.2147 + 1.2148 + Pitch estimates are needed to determine the locations of the pitch- 1.2149 + period-synchronous sequences in a complexity-efficient way. For each 1.2150 + of the new two/three sub-blocks, a pitch estimate is calculated by 1.2151 + finding the maximum correlation in the range from lag 20 to lag 120. 1.2152 + These pitch estimates are used to narrow down the search for the best 1.2153 + possible pitch-period-synchronous sequences. 1.2154 + 1.2155 +4.6.2. Determination of the Pitch-Synchronous Sequences 1.2156 + 1.2157 + Upon receiving the pitch estimates from the prior step, the enhancer 1.2158 + analyzes and enhances one 80-sample sub-block at a time. The pitch- 1.2159 + period-synchronous-sequences pssq(n) can be viewed as vectors of 1.2160 + length 80 samples each shifted n*lag samples from the current sub- 1.2161 + block. The six pitch-period-synchronous-sequences, pssq(-3) to 1.2162 + pssq(-1) and pssq(1) to pssq(3), are found one at a time by the steps 1.2163 + below: 1.2164 + 1.2165 + 1) Calculate the estimate of the position of the pssq(n). For 1.2166 + pssq(n) in front of pssq(0) (n > 0), the location of the pssq(n) 1.2167 + is estimated by moving one pitch estimate forward in time from the 1.2168 + exact location of pssq(n-1). Similarly, pssq(n) behind pssq(0) (n 1.2169 + < 0) is estimated by moving one pitch estimate backward in time 1.2170 + from the exact location of pssq(n+1). If the estimated pssq(n) 1.2171 + vector location is totally within the enhancer memory (Figure 1.2172 + 4.3), steps 2, 3, and 4 are performed, otherwise the pssq(n) is 1.2173 + set to zeros. 1.2174 + 1.2175 + 2) Compute the correlation between the unenhanced excitation and 1.2176 + vectors around the estimated location interval of pssq(n). The 1.2177 + correlation is calculated in the interval estimated location +/- 2 1.2178 + samples. This results in five correlation values. 1.2179 + 1.2180 + 3) The five correlation values are upsampled by a factor of 4, by 1.2181 + using four simple upsampling filters (MA filters with coefficients 1.2182 + upsFilter1.. upsFilter4). Within these the maximum value is 1.2183 + found, which specifies the best pitch-period with a resolution of 1.2184 + a quarter of a sample. 1.2185 + 1.2186 + 1.2187 + 1.2188 + 1.2189 +Andersen, et al. Experimental [Page 39] 1.2190 + 1.2191 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.2192 + 1.2193 + 1.2194 + upsFilter1[7]={0.000000 0.000000 0.000000 1.000000 1.2195 + 0.000000 0.000000 0.000000} 1.2196 + upsFilter2[7]={0.015625 -0.076904 0.288330 0.862061 1.2197 + -0.106445 0.018799 -0.015625} 1.2198 + upsFilter3[7]={0.023682 -0.124268 0.601563 0.601563 1.2199 + -0.124268 0.023682 -0.023682} 1.2200 + upsFilter4[7]={0.018799 -0.106445 0.862061 0.288330 1.2201 + -0.076904 0.015625 -0.018799} 1.2202 + 1.2203 + 4) Generate the pssq(n) vector by upsampling of the excitation memory 1.2204 + and extracting the sequence that corresponds to the lag delay that 1.2205 + was calculated in prior step. 1.2206 + 1.2207 + With the steps above, all the pssq(n) can be found in an iterative 1.2208 + manner, first moving backward in time from pssq(0) and then forward 1.2209 + in time from pssq(0). 1.2210 + 1.2211 + 1.2212 + 0 159 319 479 639 1.2213 + +---------------------------------------------------------------+ 1.2214 + | -5 | -4 | -3 | -2 | -1 | 0 | 1 | 2 | 1.2215 + +---------------------------------------------------------------+ 1.2216 + |pssq 0 | 1.2217 + |pssq -1| |pssq 1 | 1.2218 + |pssq -2| |pssq 2 | 1.2219 + |pssq -3| |pssq 3 | 1.2220 + 1.2221 + Figure 4.3. Enhancement for 20 ms frame size. 1.2222 + 1.2223 + Figure 4.3 depicts pitch-period-synchronous sequences in the 1.2224 + enhancement of the first 80 sample block in the 20 ms frame size 1.2225 + mode. The unenhanced signal input is stored in the last two sub- 1.2226 + blocks (1 - 2), and the six other sub-blocks contain unenhanced 1.2227 + residual prior-in-time. We perform the enhancement algorithm on two 1.2228 + blocks of 80 samples, where the first of the two blocks consists of 1.2229 + the last 40 samples of sub-block 0 and the first 40 samples of sub- 1.2230 + block 1. The second 80-sample block consists of the last 40 samples 1.2231 + of sub-block 1 and the first 40 samples of sub-block 2. 1.2232 + 1.2233 + 1.2234 + 1.2235 + 1.2236 + 1.2237 + 1.2238 + 1.2239 + 1.2240 + 1.2241 + 1.2242 + 1.2243 + 1.2244 + 1.2245 +Andersen, et al. Experimental [Page 40] 1.2246 + 1.2247 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.2248 + 1.2249 + 1.2250 + 0 159 319 479 639 1.2251 + +---------------------------------------------------------------+ 1.2252 + | -4 | -3 | -2 | -1 | 0 | 1 | 2 | 3 | 1.2253 + +---------------------------------------------------------------+ 1.2254 + |pssq 0 | 1.2255 + |pssq -1| |pssq 1 | 1.2256 + |pssq -2| |pssq 2 | 1.2257 + |pssq -3| |pssq 3 | 1.2258 + 1.2259 + Figure 4.4. Enhancement for 30 ms frame size. 1.2260 + 1.2261 + Figure 4.4 depicts pitch-period-synchronous sequences in the 1.2262 + enhancement of the first 80-sample block in the 30 ms frame size 1.2263 + mode. The unenhanced signal input is stored in the last three sub- 1.2264 + blocks (1 - 3). The five other sub-blocks contain unenhanced 1.2265 + residual prior-in-time. The enhancement algorithm is performed on 1.2266 + the three 80 sample sub-blocks 0, 1, and 2. 1.2267 + 1.2268 +4.6.3. Calculation of the Smoothed Excitation 1.2269 + 1.2270 + A linear combination of the six pssq(n) (n!=0) form a smoothed 1.2271 + approximation, z, of pssq(0). Most of the weight is put on the 1.2272 + sequences that are close to pssq(0), as these are likely to be most 1.2273 + similar to pssq(0). The smoothed vector is also rescaled so that the 1.2274 + energy of z is the same as the energy of pssq(0). 1.2275 + 1.2276 + ___ 1.2277 + \ 1.2278 + y = > pssq(i) * pssq_weight(i) 1.2279 + /__ 1.2280 + i=-3,-2,-1,1,2,3 1.2281 + 1.2282 + pssq_weight(i) = 0.5*(1-cos(2*pi*(i+4)/(2*3+2))) 1.2283 + 1.2284 + z = C * y, where C = ||pssq(0)||/||y|| 1.2285 + 1.2286 +4.6.4. Enhancer Criterion 1.2287 + 1.2288 + The criterion of the enhancer is that the enhanced excitation is not 1.2289 + allowed to differ much from the unenhanced excitation. This 1.2290 + criterion is checked for each 80-sample sub-block. 1.2291 + 1.2292 + e < (b * ||pssq(0)||^2), where b=0.05 and (Constraint 1) 1.2293 + 1.2294 + e = (pssq(0)-z)*(pssq(0)-z), and "*" means the dot product 1.2295 + 1.2296 + 1.2297 + 1.2298 + 1.2299 + 1.2300 + 1.2301 +Andersen, et al. Experimental [Page 41] 1.2302 + 1.2303 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.2304 + 1.2305 + 1.2306 +4.6.5. Enhancing the excitation 1.2307 + 1.2308 + From the criterion in the previous section, it is clear that the 1.2309 + excitation is not allowed to change much. The purpose of this 1.2310 + constraint is to prevent the creation of an enhanced signal 1.2311 + significantly different from the original signal. This also means 1.2312 + that the constraint limits the numerical size of the errors that the 1.2313 + enhancement procedure can make. That is especially important in 1.2314 + unvoiced segments and background noise segments for which increased 1.2315 + periodicity could lead to lower perceived quality. 1.2316 + 1.2317 + When the constraint in the prior section is not met, the enhanced 1.2318 + residual is instead calculated through a constrained optimization by 1.2319 + using the Lagrange multiplier technique. The new constraint is that 1.2320 + 1.2321 + e = (b * ||pssq(0)||^2) (Constraint 2) 1.2322 + 1.2323 + We distinguish two solution regions for the optimization: 1) the 1.2324 + region where the first constraint is fulfilled and 2) the region 1.2325 + where the first constraint is not fulfilled and the second constraint 1.2326 + must be used. 1.2327 + 1.2328 + In the first case, where the second constraint is not needed, the 1.2329 + optimized re-estimated vector is simply z, the energy-scaled version 1.2330 + of y. 1.2331 + 1.2332 + In the second case, where the second constraint is activated and 1.2333 + becomes an equality constraint, we have 1.2334 + 1.2335 + z= A*y + B*pssq(0) 1.2336 + 1.2337 + where 1.2338 + 1.2339 + A = sqrt((b-b^2/4)*(w00*w00)/ (w11*w00 + w10*w10)) and 1.2340 + 1.2341 + w11 = pssq(0)*pssq(0) 1.2342 + w00 = y*y 1.2343 + w10 = y*pssq(0) (* symbolizes the dot product) 1.2344 + 1.2345 + and 1.2346 + 1.2347 + B = 1 - b/2 - A * w10/w00 1.2348 + 1.2349 + Appendix A.16 contains a listing of a reference implementation for 1.2350 + the enhancement method. 1.2351 + 1.2352 + 1.2353 + 1.2354 + 1.2355 + 1.2356 + 1.2357 +Andersen, et al. Experimental [Page 42] 1.2358 + 1.2359 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.2360 + 1.2361 + 1.2362 +4.7. Synthesis Filtering 1.2363 + 1.2364 + Upon decoding or PLC of the LP excitation block, the decoded speech 1.2365 + block is obtained by running the decoded LP synthesis filter, 1.2366 + 1/A~k(z), over the block. The synthesis filters have to be shifted 1.2367 + to compensate for the delay in the enhancer. For 20 ms frame size 1.2368 + mode, they SHOULD be shifted one 40-sample sub-block, and for 30 ms 1.2369 + frame size mode, they SHOULD be shifted two 40-sample sub-blocks. 1.2370 + The LP coefficients SHOULD be changed at the first sample of every 1.2371 + sub-block while keeping the filter state. For PLC blocks, one 1.2372 + solution is to apply the last LP coefficients of the last decoded 1.2373 + speech block for all sub-blocks. 1.2374 + 1.2375 + The reference implementation for the synthesis filtering can be found 1.2376 + in Appendix A.48. 1.2377 + 1.2378 +4.8. Post Filtering 1.2379 + 1.2380 + If desired, the decoded block can be filtered by a high-pass filter. 1.2381 + This removes the low frequencies of the decoded signal. A reference 1.2382 + implementation of this, with cutoff at 65 Hz, is shown in Appendix 1.2383 + A.30. 1.2384 + 1.2385 +5. Security Considerations 1.2386 + 1.2387 + This algorithm for the coding of speech signals is not subject to any 1.2388 + known security consideration; however, its RTP payload format [1] is 1.2389 + subject to several considerations, which are addressed there. 1.2390 + Confidentiality of the media streams is achieved by encryption; 1.2391 + therefore external mechanisms, such as SRTP [5], MAY be used for that 1.2392 + purpose. 1.2393 + 1.2394 +6. Evaluation of the iLBC Implementations 1.2395 + 1.2396 + It is possible and suggested to evaluate certain iLBC implementation 1.2397 + by utilizing methodology and tools available at 1.2398 + http://www.ilbcfreeware.org/evaluation.html 1.2399 + 1.2400 +7. References 1.2401 + 1.2402 +7.1. Normative References 1.2403 + 1.2404 + [1] Duric, A. and S. Andersen, "Real-time Transport Protocol (RTP) 1.2405 + Payload Format for internet Low Bit Rate Codec (iLBC) Speech", 1.2406 + RFC 3952, December 2004. 1.2407 + 1.2408 + [2] Bradner, S., "Key words for use in RFCs to Indicate Requirement 1.2409 + Levels", BCP 14, RFC 2119, March 1997. 1.2410 + 1.2411 + 1.2412 + 1.2413 +Andersen, et al. Experimental [Page 43] 1.2414 + 1.2415 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.2416 + 1.2417 + 1.2418 + [3] PacketCable(TM) Audio/Video Codecs Specification, Cable 1.2419 + Television Laboratories, Inc. 1.2420 + 1.2421 +7.2. Informative References 1.2422 + 1.2423 + [4] ITU-T Recommendation G.711, available online from the ITU 1.2424 + bookstore at http://www.itu.int. 1.2425 + 1.2426 + [5] Baugher, M., McGrew, D., Naslund, M., Carrara, E., and K. Norman, 1.2427 + "The Secure Real Time Transport Protocol (SRTP)", RFC 3711, March 1.2428 + 2004. 1.2429 + 1.2430 +8. Acknowledgements 1.2431 + 1.2432 + This extensive work, besides listed authors, has the following 1.2433 + authors, who could not have been listed among "official" authors (due 1.2434 + to IESG restrictions in the number of authors who can be listed): 1.2435 + 1.2436 + Manohar N. Murthi (Department of Electrical and Computer 1.2437 + Engineering, University of Miami), Fredrik Galschiodt, Julian 1.2438 + Spittka, and Jan Skoglund (Global IP Sound). 1.2439 + 1.2440 + The authors are deeply indebted to the following people and thank 1.2441 + them sincerely: 1.2442 + 1.2443 + Henry Sinnreich, Patrik Faltstrom, Alan Johnston, and Jean- 1.2444 + Francois Mule for great support of the iLBC initiative and for 1.2445 + valuable feedback and comments. 1.2446 + 1.2447 + Peter Vary, Frank Mertz, and Christoph Erdmann (RWTH Aachen); 1.2448 + Vladimir Cuperman (Niftybox LLC); Thomas Eriksson (Chalmers Univ 1.2449 + of Tech), and Gernot Kubin (TU Graz), for thorough review of the 1.2450 + iLBC document and their valuable feedback and remarks. 1.2451 + 1.2452 + 1.2453 + 1.2454 + 1.2455 + 1.2456 + 1.2457 + 1.2458 + 1.2459 + 1.2460 + 1.2461 + 1.2462 + 1.2463 + 1.2464 + 1.2465 + 1.2466 + 1.2467 + 1.2468 + 1.2469 +Andersen, et al. Experimental [Page 44] 1.2470 + 1.2471 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.2472 + 1.2473 + 1.2474 +APPENDIX A. Reference Implementation 1.2475 + 1.2476 + This appendix contains the complete c-code for a reference 1.2477 + implementation of encoder and decoder for the specified codec. 1.2478 + 1.2479 + The c-code consists of the following files with highest-level 1.2480 + functions: 1.2481 + 1.2482 + iLBC_test.c: main function for evaluation purpose 1.2483 + iLBC_encode.h: encoder header 1.2484 + iLBC_encode.c: encoder function 1.2485 + iLBC_decode.h: decoder header 1.2486 + iLBC_decode.c: decoder function 1.2487 + 1.2488 + The following files contain global defines and constants: 1.2489 + 1.2490 + iLBC_define.h: global defines 1.2491 + constants.h: global constants header 1.2492 + constants.c: global constants memory allocations 1.2493 + 1.2494 + The following files contain subroutines: 1.2495 + 1.2496 + anaFilter.h: lpc analysis filter header 1.2497 + anaFilter.c: lpc analysis filter function 1.2498 + createCB.h: codebook construction header 1.2499 + createCB.c: codebook construction function 1.2500 + doCPLC.h: packet loss concealment header 1.2501 + doCPLC.c: packet loss concealment function 1.2502 + enhancer.h: signal enhancement header 1.2503 + enhancer.c: signal enhancement function 1.2504 + filter.h: general filter header 1.2505 + filter.c: general filter functions 1.2506 + FrameClassify.h: start state classification header 1.2507 + FrameClassify.c: start state classification function 1.2508 + gainquant.h: gain quantization header 1.2509 + gainquant.c: gain quantization function 1.2510 + getCBvec.h: codebook vector construction header 1.2511 + getCBvec.c: codebook vector construction function 1.2512 + helpfun.h: general purpose header 1.2513 + helpfun.c: general purpose functions 1.2514 + hpInput.h: input high pass filter header 1.2515 + hpInput.c: input high pass filter function 1.2516 + hpOutput.h: output high pass filter header 1.2517 + hpOutput.c: output high pass filter function 1.2518 + iCBConstruct.h: excitation decoding header 1.2519 + iCBConstruct.c: excitation decoding function 1.2520 + iCBSearch.h: excitation encoding header 1.2521 + iCBSearch.c: excitation encoding function 1.2522 + 1.2523 + 1.2524 + 1.2525 +Andersen, et al. Experimental [Page 45] 1.2526 + 1.2527 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.2528 + 1.2529 + 1.2530 + LPCdecode.h: lpc decoding header 1.2531 + LPCdecode.c: lpc decoding function 1.2532 + LPCencode.h: lpc encoding header 1.2533 + LPCencode.c: lpc encoding function 1.2534 + lsf.h: line spectral frequencies header 1.2535 + lsf.c: line spectral frequencies functions 1.2536 + packing.h: bitstream packetization header 1.2537 + packing.c: bitstream packetization functions 1.2538 + StateConstructW.h: state decoding header 1.2539 + StateConstructW.c: state decoding functions 1.2540 + StateSearchW.h: state encoding header 1.2541 + StateSearchW.c: state encoding function 1.2542 + syntFilter.h: lpc synthesis filter header 1.2543 + syntFilter.c: lpc synthesis filter function 1.2544 + 1.2545 + The implementation is portable and should work on many different 1.2546 + platforms. However, it is not difficult to optimize the 1.2547 + implementation on particular platforms, an exercise left to the 1.2548 + reader. 1.2549 + 1.2550 +A.1. iLBC_test.c 1.2551 + 1.2552 + /****************************************************************** 1.2553 + 1.2554 + iLBC Speech Coder ANSI-C Source Code 1.2555 + 1.2556 + iLBC_test.c 1.2557 + 1.2558 + Copyright (C) The Internet Society (2004). 1.2559 + All Rights Reserved. 1.2560 + 1.2561 + ******************************************************************/ 1.2562 + 1.2563 + #include <math.h> 1.2564 + #include <stdlib.h> 1.2565 + #include <stdio.h> 1.2566 + #include <string.h> 1.2567 + #include "iLBC_define.h" 1.2568 + #include "iLBC_encode.h" 1.2569 + #include "iLBC_decode.h" 1.2570 + 1.2571 + /* Runtime statistics */ 1.2572 + #include <time.h> 1.2573 + 1.2574 + #define ILBCNOOFWORDS_MAX (NO_OF_BYTES_30MS/2) 1.2575 + 1.2576 + /*----------------------------------------------------------------* 1.2577 + * Encoder interface function 1.2578 + 1.2579 + 1.2580 + 1.2581 +Andersen, et al. Experimental [Page 46] 1.2582 + 1.2583 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.2584 + 1.2585 + 1.2586 + *---------------------------------------------------------------*/ 1.2587 + 1.2588 + short encode( /* (o) Number of bytes encoded */ 1.2589 + iLBC_Enc_Inst_t *iLBCenc_inst, 1.2590 + /* (i/o) Encoder instance */ 1.2591 + short *encoded_data, /* (o) The encoded bytes */ 1.2592 + short *data /* (i) The signal block to encode*/ 1.2593 + ){ 1.2594 + float block[BLOCKL_MAX]; 1.2595 + int k; 1.2596 + 1.2597 + /* convert signal to float */ 1.2598 + 1.2599 + for (k=0; k<iLBCenc_inst->blockl; k++) 1.2600 + block[k] = (float)data[k]; 1.2601 + 1.2602 + /* do the actual encoding */ 1.2603 + 1.2604 + iLBC_encode((unsigned char *)encoded_data, block, iLBCenc_inst); 1.2605 + 1.2606 + 1.2607 + return (iLBCenc_inst->no_of_bytes); 1.2608 + } 1.2609 + 1.2610 + /*----------------------------------------------------------------* 1.2611 + * Decoder interface function 1.2612 + *---------------------------------------------------------------*/ 1.2613 + 1.2614 + short decode( /* (o) Number of decoded samples */ 1.2615 + iLBC_Dec_Inst_t *iLBCdec_inst, /* (i/o) Decoder instance */ 1.2616 + short *decoded_data, /* (o) Decoded signal block*/ 1.2617 + short *encoded_data, /* (i) Encoded bytes */ 1.2618 + short mode /* (i) 0=PL, 1=Normal */ 1.2619 + ){ 1.2620 + int k; 1.2621 + float decblock[BLOCKL_MAX], dtmp; 1.2622 + 1.2623 + /* check if mode is valid */ 1.2624 + 1.2625 + if (mode<0 || mode>1) { 1.2626 + printf("\nERROR - Wrong mode - 0, 1 allowed\n"); exit(3);} 1.2627 + 1.2628 + /* do actual decoding of block */ 1.2629 + 1.2630 + iLBC_decode(decblock, (unsigned char *)encoded_data, 1.2631 + iLBCdec_inst, mode); 1.2632 + 1.2633 + /* convert to short */ 1.2634 + 1.2635 + 1.2636 + 1.2637 +Andersen, et al. Experimental [Page 47] 1.2638 + 1.2639 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.2640 + 1.2641 + 1.2642 + for (k=0; k<iLBCdec_inst->blockl; k++){ 1.2643 + dtmp=decblock[k]; 1.2644 + 1.2645 + if (dtmp<MIN_SAMPLE) 1.2646 + dtmp=MIN_SAMPLE; 1.2647 + else if (dtmp>MAX_SAMPLE) 1.2648 + dtmp=MAX_SAMPLE; 1.2649 + decoded_data[k] = (short) dtmp; 1.2650 + } 1.2651 + 1.2652 + return (iLBCdec_inst->blockl); 1.2653 + } 1.2654 + 1.2655 + /*---------------------------------------------------------------* 1.2656 + * Main program to test iLBC encoding and decoding 1.2657 + * 1.2658 + * Usage: 1.2659 + * exefile_name.exe <infile> <bytefile> <outfile> <channel> 1.2660 + * 1.2661 + * <infile> : Input file, speech for encoder (16-bit pcm file) 1.2662 + * <bytefile> : Bit stream output from the encoder 1.2663 + * <outfile> : Output file, decoded speech (16-bit pcm file) 1.2664 + * <channel> : Bit error file, optional (16-bit) 1.2665 + * 1 - Packet received correctly 1.2666 + * 0 - Packet Lost 1.2667 + * 1.2668 + *--------------------------------------------------------------*/ 1.2669 + 1.2670 + int main(int argc, char* argv[]) 1.2671 + { 1.2672 + 1.2673 + /* Runtime statistics */ 1.2674 + 1.2675 + float starttime; 1.2676 + float runtime; 1.2677 + float outtime; 1.2678 + 1.2679 + FILE *ifileid,*efileid,*ofileid, *cfileid; 1.2680 + short data[BLOCKL_MAX]; 1.2681 + short encoded_data[ILBCNOOFWORDS_MAX], decoded_data[BLOCKL_MAX]; 1.2682 + int len; 1.2683 + short pli, mode; 1.2684 + int blockcount = 0; 1.2685 + int packetlosscount = 0; 1.2686 + 1.2687 + /* Create structs */ 1.2688 + iLBC_Enc_Inst_t Enc_Inst; 1.2689 + iLBC_Dec_Inst_t Dec_Inst; 1.2690 + 1.2691 + 1.2692 + 1.2693 +Andersen, et al. Experimental [Page 48] 1.2694 + 1.2695 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.2696 + 1.2697 + 1.2698 + /* get arguments and open files */ 1.2699 + 1.2700 + if ((argc!=5) && (argc!=6)) { 1.2701 + fprintf(stderr, 1.2702 + "\n*-----------------------------------------------*\n"); 1.2703 + fprintf(stderr, 1.2704 + " %s <20,30> input encoded decoded (channel)\n\n", 1.2705 + argv[0]); 1.2706 + fprintf(stderr, 1.2707 + " mode : Frame size for the encoding/decoding\n"); 1.2708 + fprintf(stderr, 1.2709 + " 20 - 20 ms\n"); 1.2710 + fprintf(stderr, 1.2711 + " 30 - 30 ms\n"); 1.2712 + fprintf(stderr, 1.2713 + " input : Speech for encoder (16-bit pcm file)\n"); 1.2714 + fprintf(stderr, 1.2715 + " encoded : Encoded bit stream\n"); 1.2716 + fprintf(stderr, 1.2717 + " decoded : Decoded speech (16-bit pcm file)\n"); 1.2718 + fprintf(stderr, 1.2719 + " channel : Packet loss pattern, optional (16-bit)\n"); 1.2720 + fprintf(stderr, 1.2721 + " 1 - Packet received correctly\n"); 1.2722 + fprintf(stderr, 1.2723 + " 0 - Packet Lost\n"); 1.2724 + fprintf(stderr, 1.2725 + "*-----------------------------------------------*\n\n"); 1.2726 + exit(1); 1.2727 + } 1.2728 + mode=atoi(argv[1]); 1.2729 + if (mode != 20 && mode != 30) { 1.2730 + fprintf(stderr,"Wrong mode %s, must be 20, or 30\n", 1.2731 + argv[1]); 1.2732 + exit(2); 1.2733 + } 1.2734 + if ( (ifileid=fopen(argv[2],"rb")) == NULL) { 1.2735 + fprintf(stderr,"Cannot open input file %s\n", argv[2]); 1.2736 + exit(2);} 1.2737 + if ( (efileid=fopen(argv[3],"wb")) == NULL) { 1.2738 + fprintf(stderr, "Cannot open encoded file %s\n", 1.2739 + argv[3]); exit(1);} 1.2740 + if ( (ofileid=fopen(argv[4],"wb")) == NULL) { 1.2741 + fprintf(stderr, "Cannot open decoded file %s\n", 1.2742 + argv[4]); exit(1);} 1.2743 + if (argc==6) { 1.2744 + if( (cfileid=fopen(argv[5],"rb")) == NULL) { 1.2745 + fprintf(stderr, "Cannot open channel file %s\n", 1.2746 + 1.2747 + 1.2748 + 1.2749 +Andersen, et al. Experimental [Page 49] 1.2750 + 1.2751 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.2752 + 1.2753 + 1.2754 + argv[5]); 1.2755 + exit(1); 1.2756 + } 1.2757 + } else { 1.2758 + cfileid=NULL; 1.2759 + } 1.2760 + 1.2761 + /* print info */ 1.2762 + 1.2763 + fprintf(stderr, "\n"); 1.2764 + fprintf(stderr, 1.2765 + "*---------------------------------------------------*\n"); 1.2766 + fprintf(stderr, 1.2767 + "* *\n"); 1.2768 + fprintf(stderr, 1.2769 + "* iLBC test program *\n"); 1.2770 + fprintf(stderr, 1.2771 + "* *\n"); 1.2772 + fprintf(stderr, 1.2773 + "* *\n"); 1.2774 + fprintf(stderr, 1.2775 + "*---------------------------------------------------*\n"); 1.2776 + fprintf(stderr,"\nMode : %2d ms\n", mode); 1.2777 + fprintf(stderr,"Input file : %s\n", argv[2]); 1.2778 + fprintf(stderr,"Encoded file : %s\n", argv[3]); 1.2779 + fprintf(stderr,"Output file : %s\n", argv[4]); 1.2780 + if (argc==6) { 1.2781 + fprintf(stderr,"Channel file : %s\n", argv[5]); 1.2782 + } 1.2783 + fprintf(stderr,"\n"); 1.2784 + 1.2785 + /* Initialization */ 1.2786 + 1.2787 + initEncode(&Enc_Inst, mode); 1.2788 + initDecode(&Dec_Inst, mode, 1); 1.2789 + 1.2790 + /* Runtime statistics */ 1.2791 + 1.2792 + starttime=clock()/(float)CLOCKS_PER_SEC; 1.2793 + 1.2794 + /* loop over input blocks */ 1.2795 + 1.2796 + while (fread(data,sizeof(short),Enc_Inst.blockl,ifileid)== 1.2797 + Enc_Inst.blockl) { 1.2798 + 1.2799 + blockcount++; 1.2800 + 1.2801 + /* encoding */ 1.2802 + 1.2803 + 1.2804 + 1.2805 +Andersen, et al. Experimental [Page 50] 1.2806 + 1.2807 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.2808 + 1.2809 + 1.2810 + fprintf(stderr, "--- Encoding block %i --- ",blockcount); 1.2811 + len=encode(&Enc_Inst, encoded_data, data); 1.2812 + fprintf(stderr, "\r"); 1.2813 + 1.2814 + /* write byte file */ 1.2815 + 1.2816 + fwrite(encoded_data, sizeof(unsigned char), len, efileid); 1.2817 + 1.2818 + /* get channel data if provided */ 1.2819 + if (argc==6) { 1.2820 + if (fread(&pli, sizeof(short), 1, cfileid)) { 1.2821 + if ((pli!=0)&&(pli!=1)) { 1.2822 + fprintf(stderr, "Error in channel file\n"); 1.2823 + exit(0); 1.2824 + } 1.2825 + if (pli==0) { 1.2826 + /* Packet loss -> remove info from frame */ 1.2827 + memset(encoded_data, 0, 1.2828 + sizeof(short)*ILBCNOOFWORDS_MAX); 1.2829 + packetlosscount++; 1.2830 + } 1.2831 + } else { 1.2832 + fprintf(stderr, "Error. Channel file too short\n"); 1.2833 + exit(0); 1.2834 + } 1.2835 + } else { 1.2836 + pli=1; 1.2837 + } 1.2838 + 1.2839 + /* decoding */ 1.2840 + 1.2841 + fprintf(stderr, "--- Decoding block %i --- ",blockcount); 1.2842 + 1.2843 + len=decode(&Dec_Inst, decoded_data, encoded_data, pli); 1.2844 + fprintf(stderr, "\r"); 1.2845 + 1.2846 + /* write output file */ 1.2847 + 1.2848 + fwrite(decoded_data,sizeof(short),len,ofileid); 1.2849 + } 1.2850 + 1.2851 + /* Runtime statistics */ 1.2852 + 1.2853 + runtime = (float)(clock()/(float)CLOCKS_PER_SEC-starttime); 1.2854 + outtime = (float)((float)blockcount*(float)mode/1000.0); 1.2855 + printf("\n\nLength of speech file: %.1f s\n", outtime); 1.2856 + printf("Packet loss : %.1f%%\n", 1.2857 + 100.0*(float)packetlosscount/(float)blockcount); 1.2858 + 1.2859 + 1.2860 + 1.2861 +Andersen, et al. Experimental [Page 51] 1.2862 + 1.2863 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.2864 + 1.2865 + 1.2866 + printf("Time to run iLBC :"); 1.2867 + printf(" %.1f s (%.1f %% of realtime)\n\n", runtime, 1.2868 + (100*runtime/outtime)); 1.2869 + 1.2870 + /* close files */ 1.2871 + 1.2872 + fclose(ifileid); fclose(efileid); fclose(ofileid); 1.2873 + if (argc==6) { 1.2874 + fclose(cfileid); 1.2875 + } 1.2876 + return(0); 1.2877 + } 1.2878 + 1.2879 +A.2. iLBC_encode.h 1.2880 + 1.2881 + /****************************************************************** 1.2882 + 1.2883 + iLBC Speech Coder ANSI-C Source Code 1.2884 + 1.2885 + iLBC_encode.h 1.2886 + 1.2887 + Copyright (C) The Internet Society (2004). 1.2888 + All Rights Reserved. 1.2889 + 1.2890 + ******************************************************************/ 1.2891 + 1.2892 + #ifndef __iLBC_ILBCENCODE_H 1.2893 + #define __iLBC_ILBCENCODE_H 1.2894 + 1.2895 + #include "iLBC_define.h" 1.2896 + 1.2897 + short initEncode( /* (o) Number of bytes 1.2898 + encoded */ 1.2899 + iLBC_Enc_Inst_t *iLBCenc_inst, /* (i/o) Encoder instance */ 1.2900 + int mode /* (i) frame size mode */ 1.2901 + ); 1.2902 + 1.2903 + void iLBC_encode( 1.2904 + 1.2905 + unsigned char *bytes, /* (o) encoded data bits iLBC */ 1.2906 + float *block, /* (o) speech vector to 1.2907 + encode */ 1.2908 + iLBC_Enc_Inst_t *iLBCenc_inst /* (i/o) the general encoder 1.2909 + state */ 1.2910 + ); 1.2911 + 1.2912 + #endif 1.2913 + 1.2914 + 1.2915 + 1.2916 + 1.2917 +Andersen, et al. Experimental [Page 52] 1.2918 + 1.2919 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.2920 + 1.2921 + 1.2922 +A.3. iLBC_encode.c 1.2923 + 1.2924 + /****************************************************************** 1.2925 + 1.2926 + iLBC Speech Coder ANSI-C Source Code 1.2927 + 1.2928 + iLBC_encode.c 1.2929 + 1.2930 + Copyright (C) The Internet Society (2004). 1.2931 + All Rights Reserved. 1.2932 + 1.2933 + ******************************************************************/ 1.2934 + 1.2935 + #include <math.h> 1.2936 + #include <stdlib.h> 1.2937 + #include <string.h> 1.2938 + 1.2939 + #include "iLBC_define.h" 1.2940 + #include "LPCencode.h" 1.2941 + #include "FrameClassify.h" 1.2942 + #include "StateSearchW.h" 1.2943 + #include "StateConstructW.h" 1.2944 + #include "helpfun.h" 1.2945 + #include "constants.h" 1.2946 + #include "packing.h" 1.2947 + #include "iCBSearch.h" 1.2948 + #include "iCBConstruct.h" 1.2949 + #include "hpInput.h" 1.2950 + #include "anaFilter.h" 1.2951 + #include "syntFilter.h" 1.2952 + 1.2953 + /*----------------------------------------------------------------* 1.2954 + * Initiation of encoder instance. 1.2955 + *---------------------------------------------------------------*/ 1.2956 + 1.2957 + short initEncode( /* (o) Number of bytes 1.2958 + encoded */ 1.2959 + iLBC_Enc_Inst_t *iLBCenc_inst, /* (i/o) Encoder instance */ 1.2960 + int mode /* (i) frame size mode */ 1.2961 + ){ 1.2962 + iLBCenc_inst->mode = mode; 1.2963 + if (mode==30) { 1.2964 + iLBCenc_inst->blockl = BLOCKL_30MS; 1.2965 + iLBCenc_inst->nsub = NSUB_30MS; 1.2966 + iLBCenc_inst->nasub = NASUB_30MS; 1.2967 + iLBCenc_inst->lpc_n = LPC_N_30MS; 1.2968 + iLBCenc_inst->no_of_bytes = NO_OF_BYTES_30MS; 1.2969 + iLBCenc_inst->no_of_words = NO_OF_WORDS_30MS; 1.2970 + 1.2971 + 1.2972 + 1.2973 +Andersen, et al. Experimental [Page 53] 1.2974 + 1.2975 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.2976 + 1.2977 + 1.2978 + iLBCenc_inst->state_short_len=STATE_SHORT_LEN_30MS; 1.2979 + /* ULP init */ 1.2980 + iLBCenc_inst->ULP_inst=&ULP_30msTbl; 1.2981 + } 1.2982 + else if (mode==20) { 1.2983 + iLBCenc_inst->blockl = BLOCKL_20MS; 1.2984 + iLBCenc_inst->nsub = NSUB_20MS; 1.2985 + iLBCenc_inst->nasub = NASUB_20MS; 1.2986 + iLBCenc_inst->lpc_n = LPC_N_20MS; 1.2987 + iLBCenc_inst->no_of_bytes = NO_OF_BYTES_20MS; 1.2988 + iLBCenc_inst->no_of_words = NO_OF_WORDS_20MS; 1.2989 + iLBCenc_inst->state_short_len=STATE_SHORT_LEN_20MS; 1.2990 + /* ULP init */ 1.2991 + iLBCenc_inst->ULP_inst=&ULP_20msTbl; 1.2992 + } 1.2993 + else { 1.2994 + exit(2); 1.2995 + } 1.2996 + 1.2997 + memset((*iLBCenc_inst).anaMem, 0, 1.2998 + LPC_FILTERORDER*sizeof(float)); 1.2999 + memcpy((*iLBCenc_inst).lsfold, lsfmeanTbl, 1.3000 + LPC_FILTERORDER*sizeof(float)); 1.3001 + memcpy((*iLBCenc_inst).lsfdeqold, lsfmeanTbl, 1.3002 + LPC_FILTERORDER*sizeof(float)); 1.3003 + memset((*iLBCenc_inst).lpc_buffer, 0, 1.3004 + (LPC_LOOKBACK+BLOCKL_MAX)*sizeof(float)); 1.3005 + memset((*iLBCenc_inst).hpimem, 0, 4*sizeof(float)); 1.3006 + 1.3007 + return (iLBCenc_inst->no_of_bytes); 1.3008 + } 1.3009 + 1.3010 + /*----------------------------------------------------------------* 1.3011 + * main encoder function 1.3012 + *---------------------------------------------------------------*/ 1.3013 + 1.3014 + void iLBC_encode( 1.3015 + unsigned char *bytes, /* (o) encoded data bits iLBC */ 1.3016 + float *block, /* (o) speech vector to 1.3017 + encode */ 1.3018 + iLBC_Enc_Inst_t *iLBCenc_inst /* (i/o) the general encoder 1.3019 + state */ 1.3020 + ){ 1.3021 + 1.3022 + float data[BLOCKL_MAX]; 1.3023 + float residual[BLOCKL_MAX], reverseResidual[BLOCKL_MAX]; 1.3024 + 1.3025 + int start, idxForMax, idxVec[STATE_LEN]; 1.3026 + 1.3027 + 1.3028 + 1.3029 +Andersen, et al. Experimental [Page 54] 1.3030 + 1.3031 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.3032 + 1.3033 + 1.3034 + float reverseDecresidual[BLOCKL_MAX], mem[CB_MEML]; 1.3035 + int n, k, meml_gotten, Nfor, Nback, i, pos; 1.3036 + int gain_index[CB_NSTAGES*NASUB_MAX], 1.3037 + extra_gain_index[CB_NSTAGES]; 1.3038 + int cb_index[CB_NSTAGES*NASUB_MAX],extra_cb_index[CB_NSTAGES]; 1.3039 + int lsf_i[LSF_NSPLIT*LPC_N_MAX]; 1.3040 + unsigned char *pbytes; 1.3041 + int diff, start_pos, state_first; 1.3042 + float en1, en2; 1.3043 + int index, ulp, firstpart; 1.3044 + int subcount, subframe; 1.3045 + float weightState[LPC_FILTERORDER]; 1.3046 + float syntdenum[NSUB_MAX*(LPC_FILTERORDER+1)]; 1.3047 + float weightdenum[NSUB_MAX*(LPC_FILTERORDER+1)]; 1.3048 + float decresidual[BLOCKL_MAX]; 1.3049 + 1.3050 + /* high pass filtering of input signal if such is not done 1.3051 + prior to calling this function */ 1.3052 + 1.3053 + hpInput(block, iLBCenc_inst->blockl, 1.3054 + data, (*iLBCenc_inst).hpimem); 1.3055 + 1.3056 + /* otherwise simply copy */ 1.3057 + 1.3058 + /*memcpy(data,block,iLBCenc_inst->blockl*sizeof(float));*/ 1.3059 + 1.3060 + /* LPC of hp filtered input data */ 1.3061 + 1.3062 + LPCencode(syntdenum, weightdenum, lsf_i, data, iLBCenc_inst); 1.3063 + 1.3064 + 1.3065 + /* inverse filter to get residual */ 1.3066 + 1.3067 + for (n=0; n<iLBCenc_inst->nsub; n++) { 1.3068 + anaFilter(&data[n*SUBL], &syntdenum[n*(LPC_FILTERORDER+1)], 1.3069 + SUBL, &residual[n*SUBL], iLBCenc_inst->anaMem); 1.3070 + } 1.3071 + 1.3072 + /* find state location */ 1.3073 + 1.3074 + start = FrameClassify(iLBCenc_inst, residual); 1.3075 + 1.3076 + /* check if state should be in first or last part of the 1.3077 + two subframes */ 1.3078 + 1.3079 + diff = STATE_LEN - iLBCenc_inst->state_short_len; 1.3080 + en1 = 0; 1.3081 + index = (start-1)*SUBL; 1.3082 + 1.3083 + 1.3084 + 1.3085 +Andersen, et al. Experimental [Page 55] 1.3086 + 1.3087 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.3088 + 1.3089 + 1.3090 + for (i = 0; i < iLBCenc_inst->state_short_len; i++) { 1.3091 + en1 += residual[index+i]*residual[index+i]; 1.3092 + } 1.3093 + en2 = 0; 1.3094 + index = (start-1)*SUBL+diff; 1.3095 + for (i = 0; i < iLBCenc_inst->state_short_len; i++) { 1.3096 + en2 += residual[index+i]*residual[index+i]; 1.3097 + } 1.3098 + 1.3099 + 1.3100 + if (en1 > en2) { 1.3101 + state_first = 1; 1.3102 + start_pos = (start-1)*SUBL; 1.3103 + } else { 1.3104 + state_first = 0; 1.3105 + start_pos = (start-1)*SUBL + diff; 1.3106 + } 1.3107 + 1.3108 + /* scalar quantization of state */ 1.3109 + 1.3110 + StateSearchW(iLBCenc_inst, &residual[start_pos], 1.3111 + &syntdenum[(start-1)*(LPC_FILTERORDER+1)], 1.3112 + &weightdenum[(start-1)*(LPC_FILTERORDER+1)], &idxForMax, 1.3113 + idxVec, iLBCenc_inst->state_short_len, state_first); 1.3114 + 1.3115 + StateConstructW(idxForMax, idxVec, 1.3116 + &syntdenum[(start-1)*(LPC_FILTERORDER+1)], 1.3117 + &decresidual[start_pos], iLBCenc_inst->state_short_len); 1.3118 + 1.3119 + /* predictive quantization in state */ 1.3120 + 1.3121 + if (state_first) { /* put adaptive part in the end */ 1.3122 + 1.3123 + /* setup memory */ 1.3124 + 1.3125 + memset(mem, 0, 1.3126 + (CB_MEML-iLBCenc_inst->state_short_len)*sizeof(float)); 1.3127 + memcpy(mem+CB_MEML-iLBCenc_inst->state_short_len, 1.3128 + decresidual+start_pos, 1.3129 + iLBCenc_inst->state_short_len*sizeof(float)); 1.3130 + memset(weightState, 0, LPC_FILTERORDER*sizeof(float)); 1.3131 + 1.3132 + /* encode sub-frames */ 1.3133 + 1.3134 + iCBSearch(iLBCenc_inst, extra_cb_index, extra_gain_index, 1.3135 + &residual[start_pos+iLBCenc_inst->state_short_len], 1.3136 + mem+CB_MEML-stMemLTbl, 1.3137 + stMemLTbl, diff, CB_NSTAGES, 1.3138 + 1.3139 + 1.3140 + 1.3141 +Andersen, et al. Experimental [Page 56] 1.3142 + 1.3143 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.3144 + 1.3145 + 1.3146 + &weightdenum[start*(LPC_FILTERORDER+1)], 1.3147 + weightState, 0); 1.3148 + 1.3149 + /* construct decoded vector */ 1.3150 + 1.3151 + iCBConstruct( 1.3152 + &decresidual[start_pos+iLBCenc_inst->state_short_len], 1.3153 + extra_cb_index, extra_gain_index, 1.3154 + mem+CB_MEML-stMemLTbl, 1.3155 + stMemLTbl, diff, CB_NSTAGES); 1.3156 + 1.3157 + } 1.3158 + else { /* put adaptive part in the beginning */ 1.3159 + 1.3160 + /* create reversed vectors for prediction */ 1.3161 + 1.3162 + for (k=0; k<diff; k++) { 1.3163 + reverseResidual[k] = residual[(start+1)*SUBL-1 1.3164 + -(k+iLBCenc_inst->state_short_len)]; 1.3165 + } 1.3166 + 1.3167 + /* setup memory */ 1.3168 + 1.3169 + meml_gotten = iLBCenc_inst->state_short_len; 1.3170 + for (k=0; k<meml_gotten; k++) { 1.3171 + mem[CB_MEML-1-k] = decresidual[start_pos + k]; 1.3172 + } 1.3173 + memset(mem, 0, (CB_MEML-k)*sizeof(float)); 1.3174 + memset(weightState, 0, LPC_FILTERORDER*sizeof(float)); 1.3175 + 1.3176 + /* encode sub-frames */ 1.3177 + 1.3178 + iCBSearch(iLBCenc_inst, extra_cb_index, extra_gain_index, 1.3179 + reverseResidual, mem+CB_MEML-stMemLTbl, stMemLTbl, 1.3180 + diff, CB_NSTAGES, 1.3181 + &weightdenum[(start-1)*(LPC_FILTERORDER+1)], 1.3182 + weightState, 0); 1.3183 + 1.3184 + /* construct decoded vector */ 1.3185 + 1.3186 + iCBConstruct(reverseDecresidual, extra_cb_index, 1.3187 + extra_gain_index, mem+CB_MEML-stMemLTbl, stMemLTbl, 1.3188 + diff, CB_NSTAGES); 1.3189 + 1.3190 + /* get decoded residual from reversed vector */ 1.3191 + 1.3192 + for (k=0; k<diff; k++) { 1.3193 + decresidual[start_pos-1-k] = reverseDecresidual[k]; 1.3194 + 1.3195 + 1.3196 + 1.3197 +Andersen, et al. Experimental [Page 57] 1.3198 + 1.3199 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.3200 + 1.3201 + 1.3202 + } 1.3203 + } 1.3204 + 1.3205 + /* counter for predicted sub-frames */ 1.3206 + 1.3207 + subcount=0; 1.3208 + 1.3209 + /* forward prediction of sub-frames */ 1.3210 + 1.3211 + Nfor = iLBCenc_inst->nsub-start-1; 1.3212 + 1.3213 + 1.3214 + if ( Nfor > 0 ) { 1.3215 + 1.3216 + /* setup memory */ 1.3217 + 1.3218 + memset(mem, 0, (CB_MEML-STATE_LEN)*sizeof(float)); 1.3219 + memcpy(mem+CB_MEML-STATE_LEN, decresidual+(start-1)*SUBL, 1.3220 + STATE_LEN*sizeof(float)); 1.3221 + memset(weightState, 0, LPC_FILTERORDER*sizeof(float)); 1.3222 + 1.3223 + /* loop over sub-frames to encode */ 1.3224 + 1.3225 + for (subframe=0; subframe<Nfor; subframe++) { 1.3226 + 1.3227 + /* encode sub-frame */ 1.3228 + 1.3229 + iCBSearch(iLBCenc_inst, cb_index+subcount*CB_NSTAGES, 1.3230 + gain_index+subcount*CB_NSTAGES, 1.3231 + &residual[(start+1+subframe)*SUBL], 1.3232 + mem+CB_MEML-memLfTbl[subcount], 1.3233 + memLfTbl[subcount], SUBL, CB_NSTAGES, 1.3234 + &weightdenum[(start+1+subframe)* 1.3235 + (LPC_FILTERORDER+1)], 1.3236 + weightState, subcount+1); 1.3237 + 1.3238 + /* construct decoded vector */ 1.3239 + 1.3240 + iCBConstruct(&decresidual[(start+1+subframe)*SUBL], 1.3241 + cb_index+subcount*CB_NSTAGES, 1.3242 + gain_index+subcount*CB_NSTAGES, 1.3243 + mem+CB_MEML-memLfTbl[subcount], 1.3244 + memLfTbl[subcount], SUBL, CB_NSTAGES); 1.3245 + 1.3246 + /* update memory */ 1.3247 + 1.3248 + memcpy(mem, mem+SUBL, (CB_MEML-SUBL)*sizeof(float)); 1.3249 + memcpy(mem+CB_MEML-SUBL, 1.3250 + 1.3251 + 1.3252 + 1.3253 +Andersen, et al. Experimental [Page 58] 1.3254 + 1.3255 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.3256 + 1.3257 + 1.3258 + &decresidual[(start+1+subframe)*SUBL], 1.3259 + SUBL*sizeof(float)); 1.3260 + memset(weightState, 0, LPC_FILTERORDER*sizeof(float)); 1.3261 + 1.3262 + subcount++; 1.3263 + } 1.3264 + } 1.3265 + 1.3266 + 1.3267 + /* backward prediction of sub-frames */ 1.3268 + 1.3269 + Nback = start-1; 1.3270 + 1.3271 + 1.3272 + if ( Nback > 0 ) { 1.3273 + 1.3274 + /* create reverse order vectors */ 1.3275 + 1.3276 + for (n=0; n<Nback; n++) { 1.3277 + for (k=0; k<SUBL; k++) { 1.3278 + reverseResidual[n*SUBL+k] = 1.3279 + residual[(start-1)*SUBL-1-n*SUBL-k]; 1.3280 + reverseDecresidual[n*SUBL+k] = 1.3281 + decresidual[(start-1)*SUBL-1-n*SUBL-k]; 1.3282 + } 1.3283 + } 1.3284 + 1.3285 + /* setup memory */ 1.3286 + 1.3287 + meml_gotten = SUBL*(iLBCenc_inst->nsub+1-start); 1.3288 + 1.3289 + 1.3290 + if ( meml_gotten > CB_MEML ) { 1.3291 + meml_gotten=CB_MEML; 1.3292 + } 1.3293 + for (k=0; k<meml_gotten; k++) { 1.3294 + mem[CB_MEML-1-k] = decresidual[(start-1)*SUBL + k]; 1.3295 + } 1.3296 + memset(mem, 0, (CB_MEML-k)*sizeof(float)); 1.3297 + memset(weightState, 0, LPC_FILTERORDER*sizeof(float)); 1.3298 + 1.3299 + /* loop over sub-frames to encode */ 1.3300 + 1.3301 + for (subframe=0; subframe<Nback; subframe++) { 1.3302 + 1.3303 + /* encode sub-frame */ 1.3304 + 1.3305 + iCBSearch(iLBCenc_inst, cb_index+subcount*CB_NSTAGES, 1.3306 + 1.3307 + 1.3308 + 1.3309 +Andersen, et al. Experimental [Page 59] 1.3310 + 1.3311 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.3312 + 1.3313 + 1.3314 + gain_index+subcount*CB_NSTAGES, 1.3315 + &reverseResidual[subframe*SUBL], 1.3316 + mem+CB_MEML-memLfTbl[subcount], 1.3317 + memLfTbl[subcount], SUBL, CB_NSTAGES, 1.3318 + &weightdenum[(start-2-subframe)* 1.3319 + (LPC_FILTERORDER+1)], 1.3320 + weightState, subcount+1); 1.3321 + 1.3322 + /* construct decoded vector */ 1.3323 + 1.3324 + iCBConstruct(&reverseDecresidual[subframe*SUBL], 1.3325 + cb_index+subcount*CB_NSTAGES, 1.3326 + gain_index+subcount*CB_NSTAGES, 1.3327 + mem+CB_MEML-memLfTbl[subcount], 1.3328 + memLfTbl[subcount], SUBL, CB_NSTAGES); 1.3329 + 1.3330 + /* update memory */ 1.3331 + 1.3332 + memcpy(mem, mem+SUBL, (CB_MEML-SUBL)*sizeof(float)); 1.3333 + memcpy(mem+CB_MEML-SUBL, 1.3334 + &reverseDecresidual[subframe*SUBL], 1.3335 + SUBL*sizeof(float)); 1.3336 + memset(weightState, 0, LPC_FILTERORDER*sizeof(float)); 1.3337 + 1.3338 + subcount++; 1.3339 + 1.3340 + } 1.3341 + 1.3342 + /* get decoded residual from reversed vector */ 1.3343 + 1.3344 + for (i=0; i<SUBL*Nback; i++) { 1.3345 + decresidual[SUBL*Nback - i - 1] = 1.3346 + reverseDecresidual[i]; 1.3347 + } 1.3348 + } 1.3349 + /* end encoding part */ 1.3350 + 1.3351 + /* adjust index */ 1.3352 + index_conv_enc(cb_index); 1.3353 + 1.3354 + /* pack bytes */ 1.3355 + 1.3356 + pbytes=bytes; 1.3357 + pos=0; 1.3358 + 1.3359 + /* loop over the 3 ULP classes */ 1.3360 + 1.3361 + for (ulp=0; ulp<3; ulp++) { 1.3362 + 1.3363 + 1.3364 + 1.3365 +Andersen, et al. Experimental [Page 60] 1.3366 + 1.3367 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.3368 + 1.3369 + 1.3370 + 1.3371 + /* LSF */ 1.3372 + for (k=0; k<LSF_NSPLIT*iLBCenc_inst->lpc_n; k++) { 1.3373 + packsplit(&lsf_i[k], &firstpart, &lsf_i[k], 1.3374 + iLBCenc_inst->ULP_inst->lsf_bits[k][ulp], 1.3375 + iLBCenc_inst->ULP_inst->lsf_bits[k][ulp]+ 1.3376 + iLBCenc_inst->ULP_inst->lsf_bits[k][ulp+1]+ 1.3377 + iLBCenc_inst->ULP_inst->lsf_bits[k][ulp+2]); 1.3378 + dopack( &pbytes, firstpart, 1.3379 + iLBCenc_inst->ULP_inst->lsf_bits[k][ulp], &pos); 1.3380 + } 1.3381 + 1.3382 + /* Start block info */ 1.3383 + 1.3384 + packsplit(&start, &firstpart, &start, 1.3385 + iLBCenc_inst->ULP_inst->start_bits[ulp], 1.3386 + iLBCenc_inst->ULP_inst->start_bits[ulp]+ 1.3387 + iLBCenc_inst->ULP_inst->start_bits[ulp+1]+ 1.3388 + iLBCenc_inst->ULP_inst->start_bits[ulp+2]); 1.3389 + dopack( &pbytes, firstpart, 1.3390 + iLBCenc_inst->ULP_inst->start_bits[ulp], &pos); 1.3391 + 1.3392 + packsplit(&state_first, &firstpart, &state_first, 1.3393 + iLBCenc_inst->ULP_inst->startfirst_bits[ulp], 1.3394 + iLBCenc_inst->ULP_inst->startfirst_bits[ulp]+ 1.3395 + iLBCenc_inst->ULP_inst->startfirst_bits[ulp+1]+ 1.3396 + iLBCenc_inst->ULP_inst->startfirst_bits[ulp+2]); 1.3397 + dopack( &pbytes, firstpart, 1.3398 + iLBCenc_inst->ULP_inst->startfirst_bits[ulp], &pos); 1.3399 + 1.3400 + packsplit(&idxForMax, &firstpart, &idxForMax, 1.3401 + iLBCenc_inst->ULP_inst->scale_bits[ulp], 1.3402 + iLBCenc_inst->ULP_inst->scale_bits[ulp]+ 1.3403 + iLBCenc_inst->ULP_inst->scale_bits[ulp+1]+ 1.3404 + iLBCenc_inst->ULP_inst->scale_bits[ulp+2]); 1.3405 + dopack( &pbytes, firstpart, 1.3406 + iLBCenc_inst->ULP_inst->scale_bits[ulp], &pos); 1.3407 + 1.3408 + for (k=0; k<iLBCenc_inst->state_short_len; k++) { 1.3409 + packsplit(idxVec+k, &firstpart, idxVec+k, 1.3410 + iLBCenc_inst->ULP_inst->state_bits[ulp], 1.3411 + iLBCenc_inst->ULP_inst->state_bits[ulp]+ 1.3412 + iLBCenc_inst->ULP_inst->state_bits[ulp+1]+ 1.3413 + iLBCenc_inst->ULP_inst->state_bits[ulp+2]); 1.3414 + dopack( &pbytes, firstpart, 1.3415 + iLBCenc_inst->ULP_inst->state_bits[ulp], &pos); 1.3416 + } 1.3417 + 1.3418 + 1.3419 + 1.3420 + 1.3421 +Andersen, et al. Experimental [Page 61] 1.3422 + 1.3423 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.3424 + 1.3425 + 1.3426 + /* 23/22 (20ms/30ms) sample block */ 1.3427 + 1.3428 + for (k=0;k<CB_NSTAGES;k++) { 1.3429 + packsplit(extra_cb_index+k, &firstpart, 1.3430 + extra_cb_index+k, 1.3431 + iLBCenc_inst->ULP_inst->extra_cb_index[k][ulp], 1.3432 + iLBCenc_inst->ULP_inst->extra_cb_index[k][ulp]+ 1.3433 + iLBCenc_inst->ULP_inst->extra_cb_index[k][ulp+1]+ 1.3434 + iLBCenc_inst->ULP_inst->extra_cb_index[k][ulp+2]); 1.3435 + dopack( &pbytes, firstpart, 1.3436 + iLBCenc_inst->ULP_inst->extra_cb_index[k][ulp], 1.3437 + &pos); 1.3438 + } 1.3439 + 1.3440 + for (k=0;k<CB_NSTAGES;k++) { 1.3441 + packsplit(extra_gain_index+k, &firstpart, 1.3442 + extra_gain_index+k, 1.3443 + iLBCenc_inst->ULP_inst->extra_cb_gain[k][ulp], 1.3444 + iLBCenc_inst->ULP_inst->extra_cb_gain[k][ulp]+ 1.3445 + iLBCenc_inst->ULP_inst->extra_cb_gain[k][ulp+1]+ 1.3446 + iLBCenc_inst->ULP_inst->extra_cb_gain[k][ulp+2]); 1.3447 + dopack( &pbytes, firstpart, 1.3448 + iLBCenc_inst->ULP_inst->extra_cb_gain[k][ulp], 1.3449 + &pos); 1.3450 + } 1.3451 + 1.3452 + /* The two/four (20ms/30ms) 40 sample sub-blocks */ 1.3453 + 1.3454 + for (i=0; i<iLBCenc_inst->nasub; i++) { 1.3455 + for (k=0; k<CB_NSTAGES; k++) { 1.3456 + packsplit(cb_index+i*CB_NSTAGES+k, &firstpart, 1.3457 + cb_index+i*CB_NSTAGES+k, 1.3458 + iLBCenc_inst->ULP_inst->cb_index[i][k][ulp], 1.3459 + iLBCenc_inst->ULP_inst->cb_index[i][k][ulp]+ 1.3460 + iLBCenc_inst->ULP_inst->cb_index[i][k][ulp+1]+ 1.3461 + iLBCenc_inst->ULP_inst->cb_index[i][k][ulp+2]); 1.3462 + dopack( &pbytes, firstpart, 1.3463 + iLBCenc_inst->ULP_inst->cb_index[i][k][ulp], 1.3464 + &pos); 1.3465 + } 1.3466 + } 1.3467 + 1.3468 + for (i=0; i<iLBCenc_inst->nasub; i++) { 1.3469 + for (k=0; k<CB_NSTAGES; k++) { 1.3470 + packsplit(gain_index+i*CB_NSTAGES+k, &firstpart, 1.3471 + gain_index+i*CB_NSTAGES+k, 1.3472 + iLBCenc_inst->ULP_inst->cb_gain[i][k][ulp], 1.3473 + iLBCenc_inst->ULP_inst->cb_gain[i][k][ulp]+ 1.3474 + 1.3475 + 1.3476 + 1.3477 +Andersen, et al. Experimental [Page 62] 1.3478 + 1.3479 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.3480 + 1.3481 + 1.3482 + iLBCenc_inst->ULP_inst->cb_gain[i][k][ulp+1]+ 1.3483 + iLBCenc_inst->ULP_inst->cb_gain[i][k][ulp+2]); 1.3484 + dopack( &pbytes, firstpart, 1.3485 + iLBCenc_inst->ULP_inst->cb_gain[i][k][ulp], 1.3486 + &pos); 1.3487 + } 1.3488 + } 1.3489 + } 1.3490 + 1.3491 + /* set the last bit to zero (otherwise the decoder 1.3492 + will treat it as a lost frame) */ 1.3493 + dopack( &pbytes, 0, 1, &pos); 1.3494 + } 1.3495 + 1.3496 +A.4. iLBC_decode.h 1.3497 + 1.3498 + /****************************************************************** 1.3499 + 1.3500 + iLBC Speech Coder ANSI-C Source Code 1.3501 + 1.3502 + iLBC_decode.h 1.3503 + 1.3504 + Copyright (C) The Internet Society (2004). 1.3505 + All Rights Reserved. 1.3506 + 1.3507 + ******************************************************************/ 1.3508 + 1.3509 + #ifndef __iLBC_ILBCDECODE_H 1.3510 + #define __iLBC_ILBCDECODE_H 1.3511 + 1.3512 + #include "iLBC_define.h" 1.3513 + 1.3514 + short initDecode( /* (o) Number of decoded 1.3515 + samples */ 1.3516 + iLBC_Dec_Inst_t *iLBCdec_inst, /* (i/o) Decoder instance */ 1.3517 + int mode, /* (i) frame size mode */ 1.3518 + int use_enhancer /* (i) 1 to use enhancer 1.3519 + 0 to run without 1.3520 + enhancer */ 1.3521 + ); 1.3522 + 1.3523 + void iLBC_decode( 1.3524 + float *decblock, /* (o) decoded signal block */ 1.3525 + unsigned char *bytes, /* (i) encoded signal bits */ 1.3526 + iLBC_Dec_Inst_t *iLBCdec_inst, /* (i/o) the decoder state 1.3527 + structure */ 1.3528 + int mode /* (i) 0: bad packet, PLC, 1.3529 + 1: normal */ 1.3530 + 1.3531 + 1.3532 + 1.3533 +Andersen, et al. Experimental [Page 63] 1.3534 + 1.3535 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.3536 + 1.3537 + 1.3538 + ); 1.3539 + 1.3540 + #endif 1.3541 + 1.3542 +A.5. iLBC_decode.c 1.3543 + 1.3544 + /****************************************************************** 1.3545 + 1.3546 + iLBC Speech Coder ANSI-C Source Code 1.3547 + 1.3548 + iLBC_decode.c 1.3549 + 1.3550 + Copyright (C) The Internet Society (2004). 1.3551 + All Rights Reserved. 1.3552 + 1.3553 + ******************************************************************/ 1.3554 + 1.3555 + #include <math.h> 1.3556 + #include <stdlib.h> 1.3557 + 1.3558 + #include "iLBC_define.h" 1.3559 + #include "StateConstructW.h" 1.3560 + #include "LPCdecode.h" 1.3561 + #include "iCBConstruct.h" 1.3562 + #include "doCPLC.h" 1.3563 + #include "helpfun.h" 1.3564 + #include "constants.h" 1.3565 + #include "packing.h" 1.3566 + #include "string.h" 1.3567 + #include "enhancer.h" 1.3568 + #include "hpOutput.h" 1.3569 + #include "syntFilter.h" 1.3570 + 1.3571 + /*----------------------------------------------------------------* 1.3572 + * Initiation of decoder instance. 1.3573 + *---------------------------------------------------------------*/ 1.3574 + 1.3575 + short initDecode( /* (o) Number of decoded 1.3576 + samples */ 1.3577 + iLBC_Dec_Inst_t *iLBCdec_inst, /* (i/o) Decoder instance */ 1.3578 + int mode, /* (i) frame size mode */ 1.3579 + int use_enhancer /* (i) 1 to use enhancer 1.3580 + 0 to run without 1.3581 + enhancer */ 1.3582 + ){ 1.3583 + int i; 1.3584 + 1.3585 + iLBCdec_inst->mode = mode; 1.3586 + 1.3587 + 1.3588 + 1.3589 +Andersen, et al. Experimental [Page 64] 1.3590 + 1.3591 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.3592 + 1.3593 + 1.3594 + if (mode==30) { 1.3595 + iLBCdec_inst->blockl = BLOCKL_30MS; 1.3596 + iLBCdec_inst->nsub = NSUB_30MS; 1.3597 + iLBCdec_inst->nasub = NASUB_30MS; 1.3598 + iLBCdec_inst->lpc_n = LPC_N_30MS; 1.3599 + iLBCdec_inst->no_of_bytes = NO_OF_BYTES_30MS; 1.3600 + iLBCdec_inst->no_of_words = NO_OF_WORDS_30MS; 1.3601 + iLBCdec_inst->state_short_len=STATE_SHORT_LEN_30MS; 1.3602 + /* ULP init */ 1.3603 + iLBCdec_inst->ULP_inst=&ULP_30msTbl; 1.3604 + } 1.3605 + else if (mode==20) { 1.3606 + iLBCdec_inst->blockl = BLOCKL_20MS; 1.3607 + iLBCdec_inst->nsub = NSUB_20MS; 1.3608 + iLBCdec_inst->nasub = NASUB_20MS; 1.3609 + iLBCdec_inst->lpc_n = LPC_N_20MS; 1.3610 + iLBCdec_inst->no_of_bytes = NO_OF_BYTES_20MS; 1.3611 + iLBCdec_inst->no_of_words = NO_OF_WORDS_20MS; 1.3612 + iLBCdec_inst->state_short_len=STATE_SHORT_LEN_20MS; 1.3613 + /* ULP init */ 1.3614 + iLBCdec_inst->ULP_inst=&ULP_20msTbl; 1.3615 + } 1.3616 + else { 1.3617 + exit(2); 1.3618 + } 1.3619 + 1.3620 + memset(iLBCdec_inst->syntMem, 0, 1.3621 + LPC_FILTERORDER*sizeof(float)); 1.3622 + memcpy((*iLBCdec_inst).lsfdeqold, lsfmeanTbl, 1.3623 + LPC_FILTERORDER*sizeof(float)); 1.3624 + 1.3625 + memset(iLBCdec_inst->old_syntdenum, 0, 1.3626 + ((LPC_FILTERORDER + 1)*NSUB_MAX)*sizeof(float)); 1.3627 + for (i=0; i<NSUB_MAX; i++) 1.3628 + iLBCdec_inst->old_syntdenum[i*(LPC_FILTERORDER+1)]=1.0; 1.3629 + 1.3630 + iLBCdec_inst->last_lag = 20; 1.3631 + 1.3632 + iLBCdec_inst->prevLag = 120; 1.3633 + iLBCdec_inst->per = 0.0; 1.3634 + iLBCdec_inst->consPLICount = 0; 1.3635 + iLBCdec_inst->prevPLI = 0; 1.3636 + iLBCdec_inst->prevLpc[0] = 1.0; 1.3637 + memset(iLBCdec_inst->prevLpc+1,0, 1.3638 + LPC_FILTERORDER*sizeof(float)); 1.3639 + memset(iLBCdec_inst->prevResidual, 0, BLOCKL_MAX*sizeof(float)); 1.3640 + iLBCdec_inst->seed=777; 1.3641 + 1.3642 + 1.3643 + 1.3644 + 1.3645 +Andersen, et al. Experimental [Page 65] 1.3646 + 1.3647 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.3648 + 1.3649 + 1.3650 + memset(iLBCdec_inst->hpomem, 0, 4*sizeof(float)); 1.3651 + 1.3652 + iLBCdec_inst->use_enhancer = use_enhancer; 1.3653 + memset(iLBCdec_inst->enh_buf, 0, ENH_BUFL*sizeof(float)); 1.3654 + for (i=0;i<ENH_NBLOCKS_TOT;i++) 1.3655 + iLBCdec_inst->enh_period[i]=(float)40.0; 1.3656 + 1.3657 + iLBCdec_inst->prev_enh_pl = 0; 1.3658 + 1.3659 + return (iLBCdec_inst->blockl); 1.3660 + } 1.3661 + 1.3662 + /*----------------------------------------------------------------* 1.3663 + * frame residual decoder function (subrutine to iLBC_decode) 1.3664 + *---------------------------------------------------------------*/ 1.3665 + 1.3666 + void Decode( 1.3667 + iLBC_Dec_Inst_t *iLBCdec_inst, /* (i/o) the decoder state 1.3668 + structure */ 1.3669 + float *decresidual, /* (o) decoded residual frame */ 1.3670 + int start, /* (i) location of start 1.3671 + state */ 1.3672 + int idxForMax, /* (i) codebook index for the 1.3673 + maximum value */ 1.3674 + int *idxVec, /* (i) codebook indexes for the 1.3675 + samples in the start 1.3676 + state */ 1.3677 + float *syntdenum, /* (i) the decoded synthesis 1.3678 + filter coefficients */ 1.3679 + int *cb_index, /* (i) the indexes for the 1.3680 + adaptive codebook */ 1.3681 + int *gain_index, /* (i) the indexes for the 1.3682 + corresponding gains */ 1.3683 + int *extra_cb_index, /* (i) the indexes for the 1.3684 + adaptive codebook part 1.3685 + of start state */ 1.3686 + int *extra_gain_index, /* (i) the indexes for the 1.3687 + corresponding gains */ 1.3688 + int state_first /* (i) 1 if non adaptive part 1.3689 + of start state comes 1.3690 + first 0 if that part 1.3691 + comes last */ 1.3692 + ){ 1.3693 + float reverseDecresidual[BLOCKL_MAX], mem[CB_MEML]; 1.3694 + int k, meml_gotten, Nfor, Nback, i; 1.3695 + int diff, start_pos; 1.3696 + int subcount, subframe; 1.3697 + 1.3698 + 1.3699 + 1.3700 + 1.3701 +Andersen, et al. Experimental [Page 66] 1.3702 + 1.3703 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.3704 + 1.3705 + 1.3706 + diff = STATE_LEN - iLBCdec_inst->state_short_len; 1.3707 + 1.3708 + if (state_first == 1) { 1.3709 + start_pos = (start-1)*SUBL; 1.3710 + } else { 1.3711 + start_pos = (start-1)*SUBL + diff; 1.3712 + } 1.3713 + 1.3714 + /* decode scalar part of start state */ 1.3715 + 1.3716 + StateConstructW(idxForMax, idxVec, 1.3717 + &syntdenum[(start-1)*(LPC_FILTERORDER+1)], 1.3718 + &decresidual[start_pos], iLBCdec_inst->state_short_len); 1.3719 + 1.3720 + 1.3721 + if (state_first) { /* put adaptive part in the end */ 1.3722 + 1.3723 + /* setup memory */ 1.3724 + 1.3725 + memset(mem, 0, 1.3726 + (CB_MEML-iLBCdec_inst->state_short_len)*sizeof(float)); 1.3727 + memcpy(mem+CB_MEML-iLBCdec_inst->state_short_len, 1.3728 + decresidual+start_pos, 1.3729 + iLBCdec_inst->state_short_len*sizeof(float)); 1.3730 + 1.3731 + /* construct decoded vector */ 1.3732 + 1.3733 + iCBConstruct( 1.3734 + &decresidual[start_pos+iLBCdec_inst->state_short_len], 1.3735 + extra_cb_index, extra_gain_index, mem+CB_MEML-stMemLTbl, 1.3736 + stMemLTbl, diff, CB_NSTAGES); 1.3737 + 1.3738 + } 1.3739 + else {/* put adaptive part in the beginning */ 1.3740 + 1.3741 + /* create reversed vectors for prediction */ 1.3742 + 1.3743 + for (k=0; k<diff; k++) { 1.3744 + reverseDecresidual[k] = 1.3745 + decresidual[(start+1)*SUBL-1- 1.3746 + (k+iLBCdec_inst->state_short_len)]; 1.3747 + } 1.3748 + 1.3749 + /* setup memory */ 1.3750 + 1.3751 + meml_gotten = iLBCdec_inst->state_short_len; 1.3752 + for (k=0; k<meml_gotten; k++){ 1.3753 + mem[CB_MEML-1-k] = decresidual[start_pos + k]; 1.3754 + 1.3755 + 1.3756 + 1.3757 +Andersen, et al. Experimental [Page 67] 1.3758 + 1.3759 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.3760 + 1.3761 + 1.3762 + } 1.3763 + memset(mem, 0, (CB_MEML-k)*sizeof(float)); 1.3764 + 1.3765 + /* construct decoded vector */ 1.3766 + 1.3767 + iCBConstruct(reverseDecresidual, extra_cb_index, 1.3768 + extra_gain_index, mem+CB_MEML-stMemLTbl, stMemLTbl, 1.3769 + diff, CB_NSTAGES); 1.3770 + 1.3771 + /* get decoded residual from reversed vector */ 1.3772 + 1.3773 + for (k=0; k<diff; k++) { 1.3774 + decresidual[start_pos-1-k] = reverseDecresidual[k]; 1.3775 + } 1.3776 + } 1.3777 + 1.3778 + /* counter for predicted sub-frames */ 1.3779 + 1.3780 + subcount=0; 1.3781 + 1.3782 + /* forward prediction of sub-frames */ 1.3783 + 1.3784 + Nfor = iLBCdec_inst->nsub-start-1; 1.3785 + 1.3786 + if ( Nfor > 0 ){ 1.3787 + 1.3788 + /* setup memory */ 1.3789 + 1.3790 + memset(mem, 0, (CB_MEML-STATE_LEN)*sizeof(float)); 1.3791 + memcpy(mem+CB_MEML-STATE_LEN, decresidual+(start-1)*SUBL, 1.3792 + STATE_LEN*sizeof(float)); 1.3793 + 1.3794 + /* loop over sub-frames to encode */ 1.3795 + 1.3796 + for (subframe=0; subframe<Nfor; subframe++) { 1.3797 + 1.3798 + /* construct decoded vector */ 1.3799 + 1.3800 + iCBConstruct(&decresidual[(start+1+subframe)*SUBL], 1.3801 + cb_index+subcount*CB_NSTAGES, 1.3802 + gain_index+subcount*CB_NSTAGES, 1.3803 + mem+CB_MEML-memLfTbl[subcount], 1.3804 + memLfTbl[subcount], SUBL, CB_NSTAGES); 1.3805 + 1.3806 + /* update memory */ 1.3807 + 1.3808 + memcpy(mem, mem+SUBL, (CB_MEML-SUBL)*sizeof(float)); 1.3809 + memcpy(mem+CB_MEML-SUBL, 1.3810 + 1.3811 + 1.3812 + 1.3813 +Andersen, et al. Experimental [Page 68] 1.3814 + 1.3815 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.3816 + 1.3817 + 1.3818 + &decresidual[(start+1+subframe)*SUBL], 1.3819 + SUBL*sizeof(float)); 1.3820 + 1.3821 + subcount++; 1.3822 + 1.3823 + } 1.3824 + 1.3825 + } 1.3826 + 1.3827 + /* backward prediction of sub-frames */ 1.3828 + 1.3829 + Nback = start-1; 1.3830 + 1.3831 + if ( Nback > 0 ) { 1.3832 + 1.3833 + /* setup memory */ 1.3834 + 1.3835 + meml_gotten = SUBL*(iLBCdec_inst->nsub+1-start); 1.3836 + 1.3837 + if ( meml_gotten > CB_MEML ) { 1.3838 + meml_gotten=CB_MEML; 1.3839 + } 1.3840 + for (k=0; k<meml_gotten; k++) { 1.3841 + mem[CB_MEML-1-k] = decresidual[(start-1)*SUBL + k]; 1.3842 + } 1.3843 + memset(mem, 0, (CB_MEML-k)*sizeof(float)); 1.3844 + 1.3845 + /* loop over subframes to decode */ 1.3846 + 1.3847 + for (subframe=0; subframe<Nback; subframe++) { 1.3848 + 1.3849 + /* construct decoded vector */ 1.3850 + 1.3851 + iCBConstruct(&reverseDecresidual[subframe*SUBL], 1.3852 + cb_index+subcount*CB_NSTAGES, 1.3853 + gain_index+subcount*CB_NSTAGES, 1.3854 + mem+CB_MEML-memLfTbl[subcount], memLfTbl[subcount], 1.3855 + SUBL, CB_NSTAGES); 1.3856 + 1.3857 + /* update memory */ 1.3858 + 1.3859 + memcpy(mem, mem+SUBL, (CB_MEML-SUBL)*sizeof(float)); 1.3860 + memcpy(mem+CB_MEML-SUBL, 1.3861 + &reverseDecresidual[subframe*SUBL], 1.3862 + SUBL*sizeof(float)); 1.3863 + 1.3864 + subcount++; 1.3865 + } 1.3866 + 1.3867 + 1.3868 + 1.3869 +Andersen, et al. Experimental [Page 69] 1.3870 + 1.3871 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.3872 + 1.3873 + 1.3874 + /* get decoded residual from reversed vector */ 1.3875 + 1.3876 + for (i=0; i<SUBL*Nback; i++) 1.3877 + decresidual[SUBL*Nback - i - 1] = 1.3878 + reverseDecresidual[i]; 1.3879 + } 1.3880 + } 1.3881 + 1.3882 + /*----------------------------------------------------------------* 1.3883 + * main decoder function 1.3884 + *---------------------------------------------------------------*/ 1.3885 + 1.3886 + void iLBC_decode( 1.3887 + float *decblock, /* (o) decoded signal block */ 1.3888 + unsigned char *bytes, /* (i) encoded signal bits */ 1.3889 + iLBC_Dec_Inst_t *iLBCdec_inst, /* (i/o) the decoder state 1.3890 + structure */ 1.3891 + int mode /* (i) 0: bad packet, PLC, 1.3892 + 1: normal */ 1.3893 + ){ 1.3894 + float data[BLOCKL_MAX]; 1.3895 + float lsfdeq[LPC_FILTERORDER*LPC_N_MAX]; 1.3896 + float PLCresidual[BLOCKL_MAX], PLClpc[LPC_FILTERORDER + 1]; 1.3897 + float zeros[BLOCKL_MAX], one[LPC_FILTERORDER + 1]; 1.3898 + int k, i, start, idxForMax, pos, lastpart, ulp; 1.3899 + int lag, ilag; 1.3900 + float cc, maxcc; 1.3901 + int idxVec[STATE_LEN]; 1.3902 + int check; 1.3903 + int gain_index[NASUB_MAX*CB_NSTAGES], 1.3904 + extra_gain_index[CB_NSTAGES]; 1.3905 + int cb_index[CB_NSTAGES*NASUB_MAX], extra_cb_index[CB_NSTAGES]; 1.3906 + int lsf_i[LSF_NSPLIT*LPC_N_MAX]; 1.3907 + int state_first; 1.3908 + int last_bit; 1.3909 + unsigned char *pbytes; 1.3910 + float weightdenum[(LPC_FILTERORDER + 1)*NSUB_MAX]; 1.3911 + int order_plus_one; 1.3912 + float syntdenum[NSUB_MAX*(LPC_FILTERORDER+1)]; 1.3913 + float decresidual[BLOCKL_MAX]; 1.3914 + 1.3915 + if (mode>0) { /* the data are good */ 1.3916 + 1.3917 + /* decode data */ 1.3918 + 1.3919 + pbytes=bytes; 1.3920 + pos=0; 1.3921 + 1.3922 + 1.3923 + 1.3924 + 1.3925 +Andersen, et al. Experimental [Page 70] 1.3926 + 1.3927 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.3928 + 1.3929 + 1.3930 + /* Set everything to zero before decoding */ 1.3931 + 1.3932 + for (k=0; k<LSF_NSPLIT*LPC_N_MAX; k++) { 1.3933 + lsf_i[k]=0; 1.3934 + } 1.3935 + start=0; 1.3936 + state_first=0; 1.3937 + idxForMax=0; 1.3938 + for (k=0; k<iLBCdec_inst->state_short_len; k++) { 1.3939 + idxVec[k]=0; 1.3940 + } 1.3941 + for (k=0; k<CB_NSTAGES; k++) { 1.3942 + extra_cb_index[k]=0; 1.3943 + } 1.3944 + for (k=0; k<CB_NSTAGES; k++) { 1.3945 + extra_gain_index[k]=0; 1.3946 + } 1.3947 + for (i=0; i<iLBCdec_inst->nasub; i++) { 1.3948 + for (k=0; k<CB_NSTAGES; k++) { 1.3949 + cb_index[i*CB_NSTAGES+k]=0; 1.3950 + } 1.3951 + } 1.3952 + for (i=0; i<iLBCdec_inst->nasub; i++) { 1.3953 + for (k=0; k<CB_NSTAGES; k++) { 1.3954 + gain_index[i*CB_NSTAGES+k]=0; 1.3955 + } 1.3956 + } 1.3957 + 1.3958 + /* loop over ULP classes */ 1.3959 + 1.3960 + for (ulp=0; ulp<3; ulp++) { 1.3961 + 1.3962 + /* LSF */ 1.3963 + for (k=0; k<LSF_NSPLIT*iLBCdec_inst->lpc_n; k++){ 1.3964 + unpack( &pbytes, &lastpart, 1.3965 + iLBCdec_inst->ULP_inst->lsf_bits[k][ulp], &pos); 1.3966 + packcombine(&lsf_i[k], lastpart, 1.3967 + iLBCdec_inst->ULP_inst->lsf_bits[k][ulp]); 1.3968 + } 1.3969 + 1.3970 + /* Start block info */ 1.3971 + 1.3972 + unpack( &pbytes, &lastpart, 1.3973 + iLBCdec_inst->ULP_inst->start_bits[ulp], &pos); 1.3974 + packcombine(&start, lastpart, 1.3975 + iLBCdec_inst->ULP_inst->start_bits[ulp]); 1.3976 + 1.3977 + unpack( &pbytes, &lastpart, 1.3978 + 1.3979 + 1.3980 + 1.3981 +Andersen, et al. Experimental [Page 71] 1.3982 + 1.3983 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.3984 + 1.3985 + 1.3986 + iLBCdec_inst->ULP_inst->startfirst_bits[ulp], &pos); 1.3987 + packcombine(&state_first, lastpart, 1.3988 + iLBCdec_inst->ULP_inst->startfirst_bits[ulp]); 1.3989 + 1.3990 + unpack( &pbytes, &lastpart, 1.3991 + iLBCdec_inst->ULP_inst->scale_bits[ulp], &pos); 1.3992 + packcombine(&idxForMax, lastpart, 1.3993 + iLBCdec_inst->ULP_inst->scale_bits[ulp]); 1.3994 + 1.3995 + for (k=0; k<iLBCdec_inst->state_short_len; k++) { 1.3996 + unpack( &pbytes, &lastpart, 1.3997 + iLBCdec_inst->ULP_inst->state_bits[ulp], &pos); 1.3998 + packcombine(idxVec+k, lastpart, 1.3999 + iLBCdec_inst->ULP_inst->state_bits[ulp]); 1.4000 + } 1.4001 + 1.4002 + /* 23/22 (20ms/30ms) sample block */ 1.4003 + 1.4004 + for (k=0; k<CB_NSTAGES; k++) { 1.4005 + unpack( &pbytes, &lastpart, 1.4006 + iLBCdec_inst->ULP_inst->extra_cb_index[k][ulp], 1.4007 + &pos); 1.4008 + packcombine(extra_cb_index+k, lastpart, 1.4009 + iLBCdec_inst->ULP_inst->extra_cb_index[k][ulp]); 1.4010 + } 1.4011 + for (k=0; k<CB_NSTAGES; k++) { 1.4012 + unpack( &pbytes, &lastpart, 1.4013 + iLBCdec_inst->ULP_inst->extra_cb_gain[k][ulp], 1.4014 + &pos); 1.4015 + packcombine(extra_gain_index+k, lastpart, 1.4016 + iLBCdec_inst->ULP_inst->extra_cb_gain[k][ulp]); 1.4017 + } 1.4018 + 1.4019 + /* The two/four (20ms/30ms) 40 sample sub-blocks */ 1.4020 + 1.4021 + for (i=0; i<iLBCdec_inst->nasub; i++) { 1.4022 + for (k=0; k<CB_NSTAGES; k++) { 1.4023 + unpack( &pbytes, &lastpart, 1.4024 + iLBCdec_inst->ULP_inst->cb_index[i][k][ulp], 1.4025 + &pos); 1.4026 + packcombine(cb_index+i*CB_NSTAGES+k, lastpart, 1.4027 + iLBCdec_inst->ULP_inst->cb_index[i][k][ulp]); 1.4028 + } 1.4029 + } 1.4030 + 1.4031 + for (i=0; i<iLBCdec_inst->nasub; i++) { 1.4032 + for (k=0; k<CB_NSTAGES; k++) { 1.4033 + unpack( &pbytes, &lastpart, 1.4034 + 1.4035 + 1.4036 + 1.4037 +Andersen, et al. Experimental [Page 72] 1.4038 + 1.4039 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.4040 + 1.4041 + 1.4042 + iLBCdec_inst->ULP_inst->cb_gain[i][k][ulp], 1.4043 + &pos); 1.4044 + packcombine(gain_index+i*CB_NSTAGES+k, lastpart, 1.4045 + iLBCdec_inst->ULP_inst->cb_gain[i][k][ulp]); 1.4046 + } 1.4047 + } 1.4048 + } 1.4049 + /* Extract last bit. If it is 1 this indicates an 1.4050 + empty/lost frame */ 1.4051 + unpack( &pbytes, &last_bit, 1, &pos); 1.4052 + 1.4053 + /* Check for bit errors or empty/lost frames */ 1.4054 + if (start<1) 1.4055 + mode = 0; 1.4056 + if (iLBCdec_inst->mode==20 && start>3) 1.4057 + mode = 0; 1.4058 + if (iLBCdec_inst->mode==30 && start>5) 1.4059 + mode = 0; 1.4060 + if (last_bit==1) 1.4061 + mode = 0; 1.4062 + 1.4063 + if (mode==1) { /* No bit errors was detected, 1.4064 + continue decoding */ 1.4065 + 1.4066 + /* adjust index */ 1.4067 + index_conv_dec(cb_index); 1.4068 + 1.4069 + /* decode the lsf */ 1.4070 + 1.4071 + SimplelsfDEQ(lsfdeq, lsf_i, iLBCdec_inst->lpc_n); 1.4072 + check=LSF_check(lsfdeq, LPC_FILTERORDER, 1.4073 + iLBCdec_inst->lpc_n); 1.4074 + DecoderInterpolateLSF(syntdenum, weightdenum, 1.4075 + lsfdeq, LPC_FILTERORDER, iLBCdec_inst); 1.4076 + 1.4077 + Decode(iLBCdec_inst, decresidual, start, idxForMax, 1.4078 + idxVec, syntdenum, cb_index, gain_index, 1.4079 + extra_cb_index, extra_gain_index, 1.4080 + state_first); 1.4081 + 1.4082 + /* preparing the plc for a future loss! */ 1.4083 + 1.4084 + doThePLC(PLCresidual, PLClpc, 0, decresidual, 1.4085 + syntdenum + 1.4086 + (LPC_FILTERORDER + 1)*(iLBCdec_inst->nsub - 1), 1.4087 + (*iLBCdec_inst).last_lag, iLBCdec_inst); 1.4088 + 1.4089 + 1.4090 + 1.4091 + 1.4092 + 1.4093 +Andersen, et al. Experimental [Page 73] 1.4094 + 1.4095 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.4096 + 1.4097 + 1.4098 + memcpy(decresidual, PLCresidual, 1.4099 + iLBCdec_inst->blockl*sizeof(float)); 1.4100 + } 1.4101 + 1.4102 + } 1.4103 + 1.4104 + if (mode == 0) { 1.4105 + /* the data is bad (either a PLC call 1.4106 + * was made or a severe bit error was detected) 1.4107 + */ 1.4108 + 1.4109 + /* packet loss conceal */ 1.4110 + 1.4111 + memset(zeros, 0, BLOCKL_MAX*sizeof(float)); 1.4112 + 1.4113 + one[0] = 1; 1.4114 + memset(one+1, 0, LPC_FILTERORDER*sizeof(float)); 1.4115 + 1.4116 + start=0; 1.4117 + 1.4118 + doThePLC(PLCresidual, PLClpc, 1, zeros, one, 1.4119 + (*iLBCdec_inst).last_lag, iLBCdec_inst); 1.4120 + memcpy(decresidual, PLCresidual, 1.4121 + iLBCdec_inst->blockl*sizeof(float)); 1.4122 + 1.4123 + order_plus_one = LPC_FILTERORDER + 1; 1.4124 + for (i = 0; i < iLBCdec_inst->nsub; i++) { 1.4125 + memcpy(syntdenum+(i*order_plus_one), PLClpc, 1.4126 + order_plus_one*sizeof(float)); 1.4127 + } 1.4128 + } 1.4129 + 1.4130 + if (iLBCdec_inst->use_enhancer == 1) { 1.4131 + 1.4132 + /* post filtering */ 1.4133 + 1.4134 + iLBCdec_inst->last_lag = 1.4135 + enhancerInterface(data, decresidual, iLBCdec_inst); 1.4136 + 1.4137 + /* synthesis filtering */ 1.4138 + 1.4139 + if (iLBCdec_inst->mode==20) { 1.4140 + /* Enhancer has 40 samples delay */ 1.4141 + i=0; 1.4142 + syntFilter(data + i*SUBL, 1.4143 + iLBCdec_inst->old_syntdenum + 1.4144 + (i+iLBCdec_inst->nsub-1)*(LPC_FILTERORDER+1), 1.4145 + SUBL, iLBCdec_inst->syntMem); 1.4146 + 1.4147 + 1.4148 + 1.4149 +Andersen, et al. Experimental [Page 74] 1.4150 + 1.4151 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.4152 + 1.4153 + 1.4154 + for (i=1; i < iLBCdec_inst->nsub; i++) { 1.4155 + syntFilter(data + i*SUBL, 1.4156 + syntdenum + (i-1)*(LPC_FILTERORDER+1), 1.4157 + SUBL, iLBCdec_inst->syntMem); 1.4158 + } 1.4159 + } else if (iLBCdec_inst->mode==30) { 1.4160 + /* Enhancer has 80 samples delay */ 1.4161 + for (i=0; i < 2; i++) { 1.4162 + syntFilter(data + i*SUBL, 1.4163 + iLBCdec_inst->old_syntdenum + 1.4164 + (i+iLBCdec_inst->nsub-2)*(LPC_FILTERORDER+1), 1.4165 + SUBL, iLBCdec_inst->syntMem); 1.4166 + } 1.4167 + for (i=2; i < iLBCdec_inst->nsub; i++) { 1.4168 + syntFilter(data + i*SUBL, 1.4169 + syntdenum + (i-2)*(LPC_FILTERORDER+1), SUBL, 1.4170 + iLBCdec_inst->syntMem); 1.4171 + } 1.4172 + } 1.4173 + 1.4174 + } else { 1.4175 + 1.4176 + /* Find last lag */ 1.4177 + lag = 20; 1.4178 + maxcc = xCorrCoef(&decresidual[BLOCKL_MAX-ENH_BLOCKL], 1.4179 + &decresidual[BLOCKL_MAX-ENH_BLOCKL-lag], ENH_BLOCKL); 1.4180 + 1.4181 + for (ilag=21; ilag<120; ilag++) { 1.4182 + cc = xCorrCoef(&decresidual[BLOCKL_MAX-ENH_BLOCKL], 1.4183 + &decresidual[BLOCKL_MAX-ENH_BLOCKL-ilag], 1.4184 + ENH_BLOCKL); 1.4185 + 1.4186 + if (cc > maxcc) { 1.4187 + maxcc = cc; 1.4188 + lag = ilag; 1.4189 + } 1.4190 + } 1.4191 + iLBCdec_inst->last_lag = lag; 1.4192 + 1.4193 + /* copy data and run synthesis filter */ 1.4194 + 1.4195 + memcpy(data, decresidual, 1.4196 + iLBCdec_inst->blockl*sizeof(float)); 1.4197 + for (i=0; i < iLBCdec_inst->nsub; i++) { 1.4198 + syntFilter(data + i*SUBL, 1.4199 + syntdenum + i*(LPC_FILTERORDER+1), SUBL, 1.4200 + iLBCdec_inst->syntMem); 1.4201 + } 1.4202 + 1.4203 + 1.4204 + 1.4205 +Andersen, et al. Experimental [Page 75] 1.4206 + 1.4207 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.4208 + 1.4209 + 1.4210 + } 1.4211 + 1.4212 + /* high pass filtering on output if desired, otherwise 1.4213 + copy to out */ 1.4214 + 1.4215 + hpOutput(data, iLBCdec_inst->blockl, 1.4216 + decblock,iLBCdec_inst->hpomem); 1.4217 + 1.4218 + /* memcpy(decblock,data,iLBCdec_inst->blockl*sizeof(float));*/ 1.4219 + 1.4220 + memcpy(iLBCdec_inst->old_syntdenum, syntdenum, 1.4221 + 1.4222 + iLBCdec_inst->nsub*(LPC_FILTERORDER+1)*sizeof(float)); 1.4223 + 1.4224 + iLBCdec_inst->prev_enh_pl=0; 1.4225 + 1.4226 + if (mode==0) { /* PLC was used */ 1.4227 + iLBCdec_inst->prev_enh_pl=1; 1.4228 + } 1.4229 + } 1.4230 + 1.4231 +A.6. iLBC_define.h 1.4232 + 1.4233 + /****************************************************************** 1.4234 + 1.4235 + iLBC Speech Coder ANSI-C Source Code 1.4236 + 1.4237 + iLBC_define.h 1.4238 + 1.4239 + Copyright (C) The Internet Society (2004). 1.4240 + All Rights Reserved. 1.4241 + 1.4242 + ******************************************************************/ 1.4243 + #include <string.h> 1.4244 + 1.4245 + #ifndef __iLBC_ILBCDEFINE_H 1.4246 + #define __iLBC_ILBCDEFINE_H 1.4247 + 1.4248 + /* general codec settings */ 1.4249 + 1.4250 + #define FS (float)8000.0 1.4251 + #define BLOCKL_20MS 160 1.4252 + #define BLOCKL_30MS 240 1.4253 + #define BLOCKL_MAX 240 1.4254 + #define NSUB_20MS 4 1.4255 + #define NSUB_30MS 6 1.4256 + #define NSUB_MAX 6 1.4257 + #define NASUB_20MS 2 1.4258 + 1.4259 + 1.4260 + 1.4261 +Andersen, et al. Experimental [Page 76] 1.4262 + 1.4263 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.4264 + 1.4265 + 1.4266 + #define NASUB_30MS 4 1.4267 + #define NASUB_MAX 4 1.4268 + #define SUBL 40 1.4269 + #define STATE_LEN 80 1.4270 + #define STATE_SHORT_LEN_30MS 58 1.4271 + #define STATE_SHORT_LEN_20MS 57 1.4272 + 1.4273 + /* LPC settings */ 1.4274 + 1.4275 + #define LPC_FILTERORDER 10 1.4276 + #define LPC_CHIRP_SYNTDENUM (float)0.9025 1.4277 + #define LPC_CHIRP_WEIGHTDENUM (float)0.4222 1.4278 + #define LPC_LOOKBACK 60 1.4279 + #define LPC_N_20MS 1 1.4280 + #define LPC_N_30MS 2 1.4281 + #define LPC_N_MAX 2 1.4282 + #define LPC_ASYMDIFF 20 1.4283 + #define LPC_BW (float)60.0 1.4284 + #define LPC_WN (float)1.0001 1.4285 + #define LSF_NSPLIT 3 1.4286 + #define LSF_NUMBER_OF_STEPS 4 1.4287 + #define LPC_HALFORDER (LPC_FILTERORDER/2) 1.4288 + 1.4289 + /* cb settings */ 1.4290 + 1.4291 + #define CB_NSTAGES 3 1.4292 + #define CB_EXPAND 2 1.4293 + #define CB_MEML 147 1.4294 + #define CB_FILTERLEN 2*4 1.4295 + #define CB_HALFFILTERLEN 4 1.4296 + #define CB_RESRANGE 34 1.4297 + #define CB_MAXGAIN (float)1.3 1.4298 + 1.4299 + /* enhancer */ 1.4300 + 1.4301 + #define ENH_BLOCKL 80 /* block length */ 1.4302 + #define ENH_BLOCKL_HALF (ENH_BLOCKL/2) 1.4303 + #define ENH_HL 3 /* 2*ENH_HL+1 is number blocks 1.4304 + in said second sequence */ 1.4305 + #define ENH_SLOP 2 /* max difference estimated and 1.4306 + correct pitch period */ 1.4307 + #define ENH_PLOCSL 20 /* pitch-estimates and pitch- 1.4308 + locations buffer length */ 1.4309 + #define ENH_OVERHANG 2 1.4310 + #define ENH_UPS0 4 /* upsampling rate */ 1.4311 + #define ENH_FL0 3 /* 2*FLO+1 is the length of 1.4312 + each filter */ 1.4313 + #define ENH_VECTL (ENH_BLOCKL+2*ENH_FL0) 1.4314 + 1.4315 + 1.4316 + 1.4317 +Andersen, et al. Experimental [Page 77] 1.4318 + 1.4319 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.4320 + 1.4321 + 1.4322 + #define ENH_CORRDIM (2*ENH_SLOP+1) 1.4323 + #define ENH_NBLOCKS (BLOCKL_MAX/ENH_BLOCKL) 1.4324 + #define ENH_NBLOCKS_EXTRA 5 1.4325 + #define ENH_NBLOCKS_TOT 8 /* ENH_NBLOCKS + 1.4326 + ENH_NBLOCKS_EXTRA */ 1.4327 + #define ENH_BUFL (ENH_NBLOCKS_TOT)*ENH_BLOCKL 1.4328 + #define ENH_ALPHA0 (float)0.05 1.4329 + 1.4330 + /* Down sampling */ 1.4331 + 1.4332 + #define FILTERORDER_DS 7 1.4333 + #define DELAY_DS 3 1.4334 + #define FACTOR_DS 2 1.4335 + 1.4336 + /* bit stream defs */ 1.4337 + 1.4338 + #define NO_OF_BYTES_20MS 38 1.4339 + #define NO_OF_BYTES_30MS 50 1.4340 + #define NO_OF_WORDS_20MS 19 1.4341 + #define NO_OF_WORDS_30MS 25 1.4342 + #define STATE_BITS 3 1.4343 + #define BYTE_LEN 8 1.4344 + #define ULP_CLASSES 3 1.4345 + 1.4346 + /* help parameters */ 1.4347 + 1.4348 + #define FLOAT_MAX (float)1.0e37 1.4349 + #define EPS (float)2.220446049250313e-016 1.4350 + #define PI (float)3.14159265358979323846 1.4351 + #define MIN_SAMPLE -32768 1.4352 + #define MAX_SAMPLE 32767 1.4353 + #define TWO_PI (float)6.283185307 1.4354 + #define PI2 (float)0.159154943 1.4355 + 1.4356 + /* type definition encoder instance */ 1.4357 + typedef struct iLBC_ULP_Inst_t_ { 1.4358 + int lsf_bits[6][ULP_CLASSES+2]; 1.4359 + int start_bits[ULP_CLASSES+2]; 1.4360 + int startfirst_bits[ULP_CLASSES+2]; 1.4361 + int scale_bits[ULP_CLASSES+2]; 1.4362 + int state_bits[ULP_CLASSES+2]; 1.4363 + int extra_cb_index[CB_NSTAGES][ULP_CLASSES+2]; 1.4364 + int extra_cb_gain[CB_NSTAGES][ULP_CLASSES+2]; 1.4365 + int cb_index[NSUB_MAX][CB_NSTAGES][ULP_CLASSES+2]; 1.4366 + int cb_gain[NSUB_MAX][CB_NSTAGES][ULP_CLASSES+2]; 1.4367 + } iLBC_ULP_Inst_t; 1.4368 + 1.4369 + /* type definition encoder instance */ 1.4370 + 1.4371 + 1.4372 + 1.4373 +Andersen, et al. Experimental [Page 78] 1.4374 + 1.4375 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.4376 + 1.4377 + 1.4378 + typedef struct iLBC_Enc_Inst_t_ { 1.4379 + 1.4380 + /* flag for frame size mode */ 1.4381 + int mode; 1.4382 + 1.4383 + /* basic parameters for different frame sizes */ 1.4384 + int blockl; 1.4385 + int nsub; 1.4386 + int nasub; 1.4387 + int no_of_bytes, no_of_words; 1.4388 + int lpc_n; 1.4389 + int state_short_len; 1.4390 + const iLBC_ULP_Inst_t *ULP_inst; 1.4391 + 1.4392 + /* analysis filter state */ 1.4393 + float anaMem[LPC_FILTERORDER]; 1.4394 + 1.4395 + /* old lsf parameters for interpolation */ 1.4396 + float lsfold[LPC_FILTERORDER]; 1.4397 + float lsfdeqold[LPC_FILTERORDER]; 1.4398 + 1.4399 + /* signal buffer for LP analysis */ 1.4400 + float lpc_buffer[LPC_LOOKBACK + BLOCKL_MAX]; 1.4401 + 1.4402 + /* state of input HP filter */ 1.4403 + float hpimem[4]; 1.4404 + 1.4405 + } iLBC_Enc_Inst_t; 1.4406 + 1.4407 + /* type definition decoder instance */ 1.4408 + typedef struct iLBC_Dec_Inst_t_ { 1.4409 + 1.4410 + /* flag for frame size mode */ 1.4411 + int mode; 1.4412 + 1.4413 + /* basic parameters for different frame sizes */ 1.4414 + int blockl; 1.4415 + int nsub; 1.4416 + int nasub; 1.4417 + int no_of_bytes, no_of_words; 1.4418 + int lpc_n; 1.4419 + int state_short_len; 1.4420 + const iLBC_ULP_Inst_t *ULP_inst; 1.4421 + 1.4422 + /* synthesis filter state */ 1.4423 + float syntMem[LPC_FILTERORDER]; 1.4424 + 1.4425 + /* old LSF for interpolation */ 1.4426 + 1.4427 + 1.4428 + 1.4429 +Andersen, et al. Experimental [Page 79] 1.4430 + 1.4431 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.4432 + 1.4433 + 1.4434 + float lsfdeqold[LPC_FILTERORDER]; 1.4435 + 1.4436 + /* pitch lag estimated in enhancer and used in PLC */ 1.4437 + int last_lag; 1.4438 + 1.4439 + /* PLC state information */ 1.4440 + int prevLag, consPLICount, prevPLI, prev_enh_pl; 1.4441 + float prevLpc[LPC_FILTERORDER+1]; 1.4442 + float prevResidual[NSUB_MAX*SUBL]; 1.4443 + float per; 1.4444 + unsigned long seed; 1.4445 + 1.4446 + /* previous synthesis filter parameters */ 1.4447 + float old_syntdenum[(LPC_FILTERORDER + 1)*NSUB_MAX]; 1.4448 + 1.4449 + /* state of output HP filter */ 1.4450 + float hpomem[4]; 1.4451 + 1.4452 + /* enhancer state information */ 1.4453 + int use_enhancer; 1.4454 + float enh_buf[ENH_BUFL]; 1.4455 + float enh_period[ENH_NBLOCKS_TOT]; 1.4456 + 1.4457 + } iLBC_Dec_Inst_t; 1.4458 + 1.4459 + #endif 1.4460 + 1.4461 +A.7. constants.h 1.4462 + 1.4463 + /****************************************************************** 1.4464 + 1.4465 + iLBC Speech Coder ANSI-C Source Code 1.4466 + 1.4467 + constants.h 1.4468 + 1.4469 + Copyright (C) The Internet Society (2004). 1.4470 + All Rights Reserved. 1.4471 + 1.4472 + ******************************************************************/ 1.4473 + 1.4474 + #ifndef __iLBC_CONSTANTS_H 1.4475 + #define __iLBC_CONSTANTS_H 1.4476 + 1.4477 + #include "iLBC_define.h" 1.4478 + 1.4479 + 1.4480 + /* ULP bit allocation */ 1.4481 + 1.4482 + 1.4483 + 1.4484 + 1.4485 +Andersen, et al. Experimental [Page 80] 1.4486 + 1.4487 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.4488 + 1.4489 + 1.4490 + extern const iLBC_ULP_Inst_t ULP_20msTbl; 1.4491 + extern const iLBC_ULP_Inst_t ULP_30msTbl; 1.4492 + 1.4493 + /* high pass filters */ 1.4494 + 1.4495 + extern float hpi_zero_coefsTbl[]; 1.4496 + extern float hpi_pole_coefsTbl[]; 1.4497 + extern float hpo_zero_coefsTbl[]; 1.4498 + extern float hpo_pole_coefsTbl[]; 1.4499 + 1.4500 + /* low pass filters */ 1.4501 + extern float lpFilt_coefsTbl[]; 1.4502 + 1.4503 + /* LPC analysis and quantization */ 1.4504 + 1.4505 + extern float lpc_winTbl[]; 1.4506 + extern float lpc_asymwinTbl[]; 1.4507 + extern float lpc_lagwinTbl[]; 1.4508 + extern float lsfCbTbl[]; 1.4509 + extern float lsfmeanTbl[]; 1.4510 + extern int dim_lsfCbTbl[]; 1.4511 + extern int size_lsfCbTbl[]; 1.4512 + extern float lsf_weightTbl_30ms[]; 1.4513 + extern float lsf_weightTbl_20ms[]; 1.4514 + 1.4515 + /* state quantization tables */ 1.4516 + 1.4517 + extern float state_sq3Tbl[]; 1.4518 + extern float state_frgqTbl[]; 1.4519 + 1.4520 + /* gain quantization tables */ 1.4521 + 1.4522 + extern float gain_sq3Tbl[]; 1.4523 + extern float gain_sq4Tbl[]; 1.4524 + extern float gain_sq5Tbl[]; 1.4525 + 1.4526 + /* adaptive codebook definitions */ 1.4527 + 1.4528 + extern int search_rangeTbl[5][CB_NSTAGES]; 1.4529 + extern int memLfTbl[]; 1.4530 + extern int stMemLTbl; 1.4531 + extern float cbfiltersTbl[CB_FILTERLEN]; 1.4532 + 1.4533 + /* enhancer definitions */ 1.4534 + 1.4535 + extern float polyphaserTbl[]; 1.4536 + extern float enh_plocsTbl[]; 1.4537 + 1.4538 + 1.4539 + 1.4540 + 1.4541 +Andersen, et al. Experimental [Page 81] 1.4542 + 1.4543 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.4544 + 1.4545 + 1.4546 + #endif 1.4547 + 1.4548 +A.8. constants.c 1.4549 + 1.4550 + /****************************************************************** 1.4551 + 1.4552 + iLBC Speech Coder ANSI-C Source Code 1.4553 + 1.4554 + constants.c 1.4555 + 1.4556 + Copyright (C) The Internet Society (2004). 1.4557 + All Rights Reserved. 1.4558 + 1.4559 + ******************************************************************/ 1.4560 + 1.4561 + #include "iLBC_define.h" 1.4562 + 1.4563 + /* ULP bit allocation */ 1.4564 + 1.4565 + /* 20 ms frame */ 1.4566 + 1.4567 + const iLBC_ULP_Inst_t ULP_20msTbl = { 1.4568 + /* LSF */ 1.4569 + { {6,0,0,0,0}, {7,0,0,0,0}, {7,0,0,0,0}, 1.4570 + {0,0,0,0,0}, {0,0,0,0,0}, {0,0,0,0,0}}, 1.4571 + /* Start state location, gain and samples */ 1.4572 + {2,0,0,0,0}, 1.4573 + {1,0,0,0,0}, 1.4574 + {6,0,0,0,0}, 1.4575 + {0,1,2,0,0}, 1.4576 + /* extra CB index and extra CB gain */ 1.4577 + {{6,0,1,0,0}, {0,0,7,0,0}, {0,0,7,0,0}}, 1.4578 + {{2,0,3,0,0}, {1,1,2,0,0}, {0,0,3,0,0}}, 1.4579 + /* CB index and CB gain */ 1.4580 + { {{7,0,1,0,0}, {0,0,7,0,0}, {0,0,7,0,0}}, 1.4581 + {{0,0,8,0,0}, {0,0,8,0,0}, {0,0,8,0,0}}, 1.4582 + {{0,0,0,0,0}, {0,0,0,0,0}, {0,0,0,0,0}}, 1.4583 + {{0,0,0,0,0}, {0,0,0,0,0}, {0,0,0,0,0}}}, 1.4584 + { {{1,2,2,0,0}, {1,1,2,0,0}, {0,0,3,0,0}}, 1.4585 + {{1,1,3,0,0}, {0,2,2,0,0}, {0,0,3,0,0}}, 1.4586 + {{0,0,0,0,0}, {0,0,0,0,0}, {0,0,0,0,0}}, 1.4587 + {{0,0,0,0,0}, {0,0,0,0,0}, {0,0,0,0,0}}} 1.4588 + }; 1.4589 + 1.4590 + /* 30 ms frame */ 1.4591 + 1.4592 + const iLBC_ULP_Inst_t ULP_30msTbl = { 1.4593 + /* LSF */ 1.4594 + 1.4595 + 1.4596 + 1.4597 +Andersen, et al. Experimental [Page 82] 1.4598 + 1.4599 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.4600 + 1.4601 + 1.4602 + { {6,0,0,0,0}, {7,0,0,0,0}, {7,0,0,0,0}, 1.4603 + {6,0,0,0,0}, {7,0,0,0,0}, {7,0,0,0,0}}, 1.4604 + /* Start state location, gain and samples */ 1.4605 + {3,0,0,0,0}, 1.4606 + {1,0,0,0,0}, 1.4607 + {6,0,0,0,0}, 1.4608 + {0,1,2,0,0}, 1.4609 + /* extra CB index and extra CB gain */ 1.4610 + {{4,2,1,0,0}, {0,0,7,0,0}, {0,0,7,0,0}}, 1.4611 + {{1,1,3,0,0}, {1,1,2,0,0}, {0,0,3,0,0}}, 1.4612 + /* CB index and CB gain */ 1.4613 + { {{6,1,1,0,0}, {0,0,7,0,0}, {0,0,7,0,0}}, 1.4614 + {{0,7,1,0,0}, {0,0,8,0,0}, {0,0,8,0,0}}, 1.4615 + {{0,7,1,0,0}, {0,0,8,0,0}, {0,0,8,0,0}}, 1.4616 + {{0,7,1,0,0}, {0,0,8,0,0}, {0,0,8,0,0}}}, 1.4617 + { {{1,2,2,0,0}, {1,2,1,0,0}, {0,0,3,0,0}}, 1.4618 + {{0,2,3,0,0}, {0,2,2,0,0}, {0,0,3,0,0}}, 1.4619 + {{0,1,4,0,0}, {0,1,3,0,0}, {0,0,3,0,0}}, 1.4620 + {{0,1,4,0,0}, {0,1,3,0,0}, {0,0,3,0,0}}} 1.4621 + }; 1.4622 + 1.4623 + /* HP Filters */ 1.4624 + 1.4625 + float hpi_zero_coefsTbl[3] = { 1.4626 + (float)0.92727436, (float)-1.8544941, (float)0.92727436 1.4627 + }; 1.4628 + float hpi_pole_coefsTbl[3] = { 1.4629 + (float)1.0, (float)-1.9059465, (float)0.9114024 1.4630 + }; 1.4631 + float hpo_zero_coefsTbl[3] = { 1.4632 + (float)0.93980581, (float)-1.8795834, (float)0.93980581 1.4633 + }; 1.4634 + float hpo_pole_coefsTbl[3] = { 1.4635 + (float)1.0, (float)-1.9330735, (float)0.93589199 1.4636 + }; 1.4637 + 1.4638 + /* LP Filter */ 1.4639 + 1.4640 + float lpFilt_coefsTbl[FILTERORDER_DS]={ 1.4641 + (float)-0.066650, (float)0.125000, (float)0.316650, 1.4642 + (float)0.414063, (float)0.316650, 1.4643 + (float)0.125000, (float)-0.066650 1.4644 + }; 1.4645 + 1.4646 + /* State quantization tables */ 1.4647 + 1.4648 + float state_sq3Tbl[8] = { 1.4649 + (float)-3.719849, (float)-2.177490, (float)-1.130005, 1.4650 + 1.4651 + 1.4652 + 1.4653 +Andersen, et al. Experimental [Page 83] 1.4654 + 1.4655 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.4656 + 1.4657 + 1.4658 + (float)-0.309692, (float)0.444214, (float)1.329712, 1.4659 + (float)2.436279, (float)3.983887 1.4660 + }; 1.4661 + 1.4662 + float state_frgqTbl[64] = { 1.4663 + (float)1.000085, (float)1.071695, (float)1.140395, 1.4664 + (float)1.206868, (float)1.277188, (float)1.351503, 1.4665 + (float)1.429380, (float)1.500727, (float)1.569049, 1.4666 + (float)1.639599, (float)1.707071, (float)1.781531, 1.4667 + (float)1.840799, (float)1.901550, (float)1.956695, 1.4668 + (float)2.006750, (float)2.055474, (float)2.102787, 1.4669 + (float)2.142819, (float)2.183592, (float)2.217962, 1.4670 + (float)2.257177, (float)2.295739, (float)2.332967, 1.4671 + (float)2.369248, (float)2.402792, (float)2.435080, 1.4672 + (float)2.468598, (float)2.503394, (float)2.539284, 1.4673 + (float)2.572944, (float)2.605036, (float)2.636331, 1.4674 + (float)2.668939, (float)2.698780, (float)2.729101, 1.4675 + (float)2.759786, (float)2.789834, (float)2.818679, 1.4676 + (float)2.848074, (float)2.877470, (float)2.906899, 1.4677 + (float)2.936655, (float)2.967804, (float)3.000115, 1.4678 + (float)3.033367, (float)3.066355, (float)3.104231, 1.4679 + (float)3.141499, (float)3.183012, (float)3.222952, 1.4680 + (float)3.265433, (float)3.308441, (float)3.350823, 1.4681 + (float)3.395275, (float)3.442793, (float)3.490801, 1.4682 + (float)3.542514, (float)3.604064, (float)3.666050, 1.4683 + (float)3.740994, (float)3.830749, (float)3.938770, 1.4684 + (float)4.101764 1.4685 + }; 1.4686 + 1.4687 + /* CB tables */ 1.4688 + 1.4689 + int search_rangeTbl[5][CB_NSTAGES]={{58,58,58}, {108,44,44}, 1.4690 + {108,108,108}, {108,108,108}, {108,108,108}}; 1.4691 + int stMemLTbl=85; 1.4692 + int memLfTbl[NASUB_MAX]={147,147,147,147}; 1.4693 + 1.4694 + /* expansion filter(s) */ 1.4695 + 1.4696 + float cbfiltersTbl[CB_FILTERLEN]={ 1.4697 + (float)-0.034180, (float)0.108887, (float)-0.184326, 1.4698 + (float)0.806152, (float)0.713379, (float)-0.144043, 1.4699 + (float)0.083740, (float)-0.033691 1.4700 + }; 1.4701 + 1.4702 + /* Gain Quantization */ 1.4703 + 1.4704 + float gain_sq3Tbl[8]={ 1.4705 + (float)-1.000000, (float)-0.659973, (float)-0.330017, 1.4706 + 1.4707 + 1.4708 + 1.4709 +Andersen, et al. Experimental [Page 84] 1.4710 + 1.4711 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.4712 + 1.4713 + 1.4714 + (float)0.000000, (float)0.250000, (float)0.500000, 1.4715 + (float)0.750000, (float)1.00000}; 1.4716 + 1.4717 + float gain_sq4Tbl[16]={ 1.4718 + (float)-1.049988, (float)-0.900024, (float)-0.750000, 1.4719 + (float)-0.599976, (float)-0.450012, (float)-0.299988, 1.4720 + (float)-0.150024, (float)0.000000, (float)0.150024, 1.4721 + (float)0.299988, (float)0.450012, (float)0.599976, 1.4722 + (float)0.750000, (float)0.900024, (float)1.049988, 1.4723 + (float)1.200012}; 1.4724 + 1.4725 + float gain_sq5Tbl[32]={ 1.4726 + (float)0.037476, (float)0.075012, (float)0.112488, 1.4727 + (float)0.150024, (float)0.187500, (float)0.224976, 1.4728 + (float)0.262512, (float)0.299988, (float)0.337524, 1.4729 + (float)0.375000, (float)0.412476, (float)0.450012, 1.4730 + (float)0.487488, (float)0.525024, (float)0.562500, 1.4731 + (float)0.599976, (float)0.637512, (float)0.674988, 1.4732 + (float)0.712524, (float)0.750000, (float)0.787476, 1.4733 + (float)0.825012, (float)0.862488, (float)0.900024, 1.4734 + (float)0.937500, (float)0.974976, (float)1.012512, 1.4735 + (float)1.049988, (float)1.087524, (float)1.125000, 1.4736 + (float)1.162476, (float)1.200012}; 1.4737 + 1.4738 + /* Enhancer - Upsamling a factor 4 (ENH_UPS0 = 4) */ 1.4739 + float polyphaserTbl[ENH_UPS0*(2*ENH_FL0+1)]={ 1.4740 + (float)0.000000, (float)0.000000, (float)0.000000, 1.4741 + (float)1.000000, 1.4742 + (float)0.000000, (float)0.000000, (float)0.000000, 1.4743 + (float)0.015625, (float)-0.076904, (float)0.288330, 1.4744 + (float)0.862061, 1.4745 + (float)-0.106445, (float)0.018799, (float)-0.015625, 1.4746 + (float)0.023682, (float)-0.124268, (float)0.601563, 1.4747 + (float)0.601563, 1.4748 + (float)-0.124268, (float)0.023682, (float)-0.023682, 1.4749 + (float)0.018799, (float)-0.106445, (float)0.862061, 1.4750 + (float)0.288330, 1.4751 + (float)-0.076904, (float)0.015625, (float)-0.018799}; 1.4752 + 1.4753 + float enh_plocsTbl[ENH_NBLOCKS_TOT] = {(float)40.0, (float)120.0, 1.4754 + (float)200.0, (float)280.0, (float)360.0, 1.4755 + (float)440.0, (float)520.0, (float)600.0}; 1.4756 + 1.4757 + /* LPC analysis and quantization */ 1.4758 + 1.4759 + int dim_lsfCbTbl[LSF_NSPLIT] = {3, 3, 4}; 1.4760 + int size_lsfCbTbl[LSF_NSPLIT] = {64,128,128}; 1.4761 + 1.4762 + 1.4763 + 1.4764 + 1.4765 +Andersen, et al. Experimental [Page 85] 1.4766 + 1.4767 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.4768 + 1.4769 + 1.4770 + float lsfmeanTbl[LPC_FILTERORDER] = { 1.4771 + (float)0.281738, (float)0.445801, (float)0.663330, 1.4772 + (float)0.962524, (float)1.251831, (float)1.533081, 1.4773 + (float)1.850586, (float)2.137817, (float)2.481445, 1.4774 + (float)2.777344}; 1.4775 + 1.4776 + float lsf_weightTbl_30ms[6] = {(float)(1.0/2.0), (float)1.0, 1.4777 + (float)(2.0/3.0), 1.4778 + (float)(1.0/3.0), (float)0.0, (float)0.0}; 1.4779 + 1.4780 + float lsf_weightTbl_20ms[4] = {(float)(3.0/4.0), (float)(2.0/4.0), 1.4781 + (float)(1.0/4.0), (float)(0.0)}; 1.4782 + 1.4783 + /* Hanning LPC window */ 1.4784 + float lpc_winTbl[BLOCKL_MAX]={ 1.4785 + (float)0.000183, (float)0.000671, (float)0.001526, 1.4786 + (float)0.002716, (float)0.004242, (float)0.006104, 1.4787 + (float)0.008301, (float)0.010834, (float)0.013702, 1.4788 + (float)0.016907, (float)0.020416, (float)0.024261, 1.4789 + (float)0.028442, (float)0.032928, (float)0.037750, 1.4790 + (float)0.042877, (float)0.048309, (float)0.054047, 1.4791 + (float)0.060089, (float)0.066437, (float)0.073090, 1.4792 + (float)0.080017, (float)0.087219, (float)0.094727, 1.4793 + (float)0.102509, (float)0.110535, (float)0.118835, 1.4794 + (float)0.127411, (float)0.136230, (float)0.145294, 1.4795 + (float)0.154602, (float)0.164154, (float)0.173920, 1.4796 + (float)0.183899, (float)0.194122, (float)0.204529, 1.4797 + (float)0.215149, (float)0.225952, (float)0.236938, 1.4798 + (float)0.248108, (float)0.259460, (float)0.270966, 1.4799 + (float)0.282654, (float)0.294464, (float)0.306396, 1.4800 + (float)0.318481, (float)0.330688, (float)0.343018, 1.4801 + (float)0.355438, (float)0.367981, (float)0.380585, 1.4802 + (float)0.393280, (float)0.406067, (float)0.418884, 1.4803 + (float)0.431763, (float)0.444702, (float)0.457672, 1.4804 + (float)0.470673, (float)0.483704, (float)0.496735, 1.4805 + (float)0.509766, (float)0.522797, (float)0.535828, 1.4806 + (float)0.548798, (float)0.561768, (float)0.574677, 1.4807 + (float)0.587524, (float)0.600342, (float)0.613068, 1.4808 + (float)0.625732, (float)0.638306, (float)0.650787, 1.4809 + (float)0.663147, (float)0.675415, (float)0.687561, 1.4810 + (float)0.699585, (float)0.711487, (float)0.723206, 1.4811 + (float)0.734802, (float)0.746216, (float)0.757477, 1.4812 + (float)0.768585, (float)0.779480, (float)0.790192, 1.4813 + (float)0.800720, (float)0.811005, (float)0.821106, 1.4814 + (float)0.830994, (float)0.840668, (float)0.850067, 1.4815 + (float)0.859253, (float)0.868225, (float)0.876892, 1.4816 + (float)0.885345, (float)0.893524, (float)0.901428, 1.4817 + (float)0.909058, (float)0.916412, (float)0.923492, 1.4818 + 1.4819 + 1.4820 + 1.4821 +Andersen, et al. Experimental [Page 86] 1.4822 + 1.4823 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.4824 + 1.4825 + 1.4826 + (float)0.930267, (float)0.936768, (float)0.942963, 1.4827 + (float)0.948853, (float)0.954437, (float)0.959717, 1.4828 + (float)0.964691, (float)0.969360, (float)0.973694, 1.4829 + (float)0.977692, (float)0.981384, (float)0.984741, 1.4830 + (float)0.987762, (float)0.990479, (float)0.992828, 1.4831 + (float)0.994873, (float)0.996552, (float)0.997925, 1.4832 + (float)0.998932, (float)0.999603, (float)0.999969, 1.4833 + (float)0.999969, (float)0.999603, (float)0.998932, 1.4834 + (float)0.997925, (float)0.996552, (float)0.994873, 1.4835 + (float)0.992828, (float)0.990479, (float)0.987762, 1.4836 + (float)0.984741, (float)0.981384, (float)0.977692, 1.4837 + (float)0.973694, (float)0.969360, (float)0.964691, 1.4838 + (float)0.959717, (float)0.954437, (float)0.948853, 1.4839 + (float)0.942963, (float)0.936768, (float)0.930267, 1.4840 + (float)0.923492, (float)0.916412, (float)0.909058, 1.4841 + (float)0.901428, (float)0.893524, (float)0.885345, 1.4842 + (float)0.876892, (float)0.868225, (float)0.859253, 1.4843 + (float)0.850067, (float)0.840668, (float)0.830994, 1.4844 + (float)0.821106, (float)0.811005, (float)0.800720, 1.4845 + (float)0.790192, (float)0.779480, (float)0.768585, 1.4846 + (float)0.757477, (float)0.746216, (float)0.734802, 1.4847 + (float)0.723206, (float)0.711487, (float)0.699585, 1.4848 + (float)0.687561, (float)0.675415, (float)0.663147, 1.4849 + (float)0.650787, (float)0.638306, (float)0.625732, 1.4850 + (float)0.613068, (float)0.600342, (float)0.587524, 1.4851 + (float)0.574677, (float)0.561768, (float)0.548798, 1.4852 + (float)0.535828, (float)0.522797, (float)0.509766, 1.4853 + (float)0.496735, (float)0.483704, (float)0.470673, 1.4854 + (float)0.457672, (float)0.444702, (float)0.431763, 1.4855 + (float)0.418884, (float)0.406067, (float)0.393280, 1.4856 + (float)0.380585, (float)0.367981, (float)0.355438, 1.4857 + (float)0.343018, (float)0.330688, (float)0.318481, 1.4858 + (float)0.306396, (float)0.294464, (float)0.282654, 1.4859 + (float)0.270966, (float)0.259460, (float)0.248108, 1.4860 + (float)0.236938, (float)0.225952, (float)0.215149, 1.4861 + (float)0.204529, (float)0.194122, (float)0.183899, 1.4862 + (float)0.173920, (float)0.164154, (float)0.154602, 1.4863 + (float)0.145294, (float)0.136230, (float)0.127411, 1.4864 + (float)0.118835, (float)0.110535, (float)0.102509, 1.4865 + (float)0.094727, (float)0.087219, (float)0.080017, 1.4866 + (float)0.073090, (float)0.066437, (float)0.060089, 1.4867 + (float)0.054047, (float)0.048309, (float)0.042877, 1.4868 + (float)0.037750, (float)0.032928, (float)0.028442, 1.4869 + (float)0.024261, (float)0.020416, (float)0.016907, 1.4870 + (float)0.013702, (float)0.010834, (float)0.008301, 1.4871 + (float)0.006104, (float)0.004242, (float)0.002716, 1.4872 + (float)0.001526, (float)0.000671, (float)0.000183 1.4873 + }; 1.4874 + 1.4875 + 1.4876 + 1.4877 +Andersen, et al. Experimental [Page 87] 1.4878 + 1.4879 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.4880 + 1.4881 + 1.4882 + /* Asymmetric LPC window */ 1.4883 + float lpc_asymwinTbl[BLOCKL_MAX]={ 1.4884 + (float)0.000061, (float)0.000214, (float)0.000458, 1.4885 + (float)0.000824, (float)0.001282, (float)0.001831, 1.4886 + (float)0.002472, (float)0.003235, (float)0.004120, 1.4887 + (float)0.005066, (float)0.006134, (float)0.007294, 1.4888 + (float)0.008545, (float)0.009918, (float)0.011383, 1.4889 + (float)0.012939, (float)0.014587, (float)0.016357, 1.4890 + (float)0.018219, (float)0.020172, (float)0.022217, 1.4891 + (float)0.024353, (float)0.026611, (float)0.028961, 1.4892 + (float)0.031372, (float)0.033905, (float)0.036530, 1.4893 + (float)0.039276, (float)0.042084, (float)0.044983, 1.4894 + (float)0.047974, (float)0.051086, (float)0.054260, 1.4895 + (float)0.057526, (float)0.060883, (float)0.064331, 1.4896 + (float)0.067871, (float)0.071503, (float)0.075226, 1.4897 + (float)0.079010, (float)0.082916, (float)0.086884, 1.4898 + (float)0.090942, (float)0.095062, (float)0.099304, 1.4899 + (float)0.103607, (float)0.107971, (float)0.112427, 1.4900 + (float)0.116974, (float)0.121582, (float)0.126282, 1.4901 + (float)0.131073, (float)0.135895, (float)0.140839, 1.4902 + (float)0.145813, (float)0.150879, (float)0.156006, 1.4903 + (float)0.161224, (float)0.166504, (float)0.171844, 1.4904 + (float)0.177246, (float)0.182709, (float)0.188263, 1.4905 + (float)0.193848, (float)0.199524, (float)0.205231, 1.4906 + (float)0.211029, (float)0.216858, (float)0.222778, 1.4907 + (float)0.228729, (float)0.234741, (float)0.240814, 1.4908 + (float)0.246918, (float)0.253082, (float)0.259308, 1.4909 + (float)0.265564, (float)0.271881, (float)0.278259, 1.4910 + (float)0.284668, (float)0.291107, (float)0.297607, 1.4911 + (float)0.304138, (float)0.310730, (float)0.317322, 1.4912 + (float)0.323975, (float)0.330658, (float)0.337372, 1.4913 + (float)0.344147, (float)0.350922, (float)0.357727, 1.4914 + (float)0.364594, (float)0.371460, (float)0.378357, 1.4915 + (float)0.385284, (float)0.392212, (float)0.399170, 1.4916 + (float)0.406158, (float)0.413177, (float)0.420197, 1.4917 + (float)0.427246, (float)0.434296, (float)0.441376, 1.4918 + (float)0.448456, (float)0.455536, (float)0.462646, 1.4919 + (float)0.469757, (float)0.476868, (float)0.483978, 1.4920 + (float)0.491089, (float)0.498230, (float)0.505341, 1.4921 + (float)0.512451, (float)0.519592, (float)0.526703, 1.4922 + (float)0.533813, (float)0.540924, (float)0.548004, 1.4923 + (float)0.555084, (float)0.562164, (float)0.569244, 1.4924 + (float)0.576294, (float)0.583313, (float)0.590332, 1.4925 + (float)0.597321, (float)0.604309, (float)0.611267, 1.4926 + (float)0.618195, (float)0.625092, (float)0.631989, 1.4927 + (float)0.638855, (float)0.645660, (float)0.652466, 1.4928 + (float)0.659241, (float)0.665985, (float)0.672668, 1.4929 + (float)0.679352, (float)0.685974, (float)0.692566, 1.4930 + 1.4931 + 1.4932 + 1.4933 +Andersen, et al. Experimental [Page 88] 1.4934 + 1.4935 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.4936 + 1.4937 + 1.4938 + (float)0.699127, (float)0.705658, (float)0.712128, 1.4939 + (float)0.718536, (float)0.724945, (float)0.731262, 1.4940 + (float)0.737549, (float)0.743805, (float)0.750000, 1.4941 + (float)0.756134, (float)0.762238, (float)0.768280, 1.4942 + (float)0.774261, (float)0.780182, (float)0.786072, 1.4943 + (float)0.791870, (float)0.797638, (float)0.803314, 1.4944 + (float)0.808960, (float)0.814514, (float)0.820038, 1.4945 + (float)0.825470, (float)0.830841, (float)0.836151, 1.4946 + (float)0.841400, (float)0.846558, (float)0.851654, 1.4947 + (float)0.856689, (float)0.861633, (float)0.866516, 1.4948 + (float)0.871338, (float)0.876068, (float)0.880737, 1.4949 + (float)0.885315, (float)0.889801, (float)0.894226, 1.4950 + (float)0.898560, (float)0.902832, (float)0.907013, 1.4951 + (float)0.911102, (float)0.915100, (float)0.919037, 1.4952 + (float)0.922882, (float)0.926636, (float)0.930328, 1.4953 + (float)0.933899, (float)0.937408, (float)0.940796, 1.4954 + (float)0.944122, (float)0.947357, (float)0.950470, 1.4955 + (float)0.953522, (float)0.956482, (float)0.959351, 1.4956 + (float)0.962097, (float)0.964783, (float)0.967377, 1.4957 + (float)0.969849, (float)0.972229, (float)0.974518, 1.4958 + (float)0.976715, (float)0.978821, (float)0.980835, 1.4959 + (float)0.982727, (float)0.984528, (float)0.986237, 1.4960 + (float)0.987854, (float)0.989380, (float)0.990784, 1.4961 + (float)0.992096, (float)0.993317, (float)0.994415, 1.4962 + (float)0.995422, (float)0.996338, (float)0.997162, 1.4963 + (float)0.997864, (float)0.998474, (float)0.998962, 1.4964 + (float)0.999390, (float)0.999695, (float)0.999878, 1.4965 + (float)0.999969, (float)0.999969, (float)0.996918, 1.4966 + (float)0.987701, (float)0.972382, (float)0.951050, 1.4967 + (float)0.923889, (float)0.891022, (float)0.852631, 1.4968 + (float)0.809021, (float)0.760406, (float)0.707092, 1.4969 + (float)0.649445, (float)0.587799, (float)0.522491, 1.4970 + (float)0.453979, (float)0.382690, (float)0.309021, 1.4971 + (float)0.233459, (float)0.156433, (float)0.078461 1.4972 + }; 1.4973 + 1.4974 + /* Lag window for LPC */ 1.4975 + float lpc_lagwinTbl[LPC_FILTERORDER + 1]={ 1.4976 + (float)1.000100, (float)0.998890, (float)0.995569, 1.4977 + (float)0.990057, (float)0.982392, 1.4978 + (float)0.972623, (float)0.960816, (float)0.947047, 1.4979 + (float)0.931405, (float)0.913989, (float)0.894909}; 1.4980 + 1.4981 + /* LSF quantization*/ 1.4982 + float lsfCbTbl[64 * 3 + 128 * 3 + 128 * 4] = { 1.4983 + (float)0.155396, (float)0.273193, (float)0.451172, 1.4984 + (float)0.390503, (float)0.648071, (float)1.002075, 1.4985 + (float)0.440186, (float)0.692261, (float)0.955688, 1.4986 + 1.4987 + 1.4988 + 1.4989 +Andersen, et al. Experimental [Page 89] 1.4990 + 1.4991 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.4992 + 1.4993 + 1.4994 + (float)0.343628, (float)0.642334, (float)1.071533, 1.4995 + (float)0.318359, (float)0.491577, (float)0.670532, 1.4996 + (float)0.193115, (float)0.375488, (float)0.725708, 1.4997 + (float)0.364136, (float)0.510376, (float)0.658691, 1.4998 + (float)0.297485, (float)0.527588, (float)0.842529, 1.4999 + (float)0.227173, (float)0.365967, (float)0.563110, 1.5000 + (float)0.244995, (float)0.396729, (float)0.636475, 1.5001 + (float)0.169434, (float)0.300171, (float)0.520264, 1.5002 + (float)0.312866, (float)0.464478, (float)0.643188, 1.5003 + (float)0.248535, (float)0.429932, (float)0.626099, 1.5004 + (float)0.236206, (float)0.491333, (float)0.817139, 1.5005 + (float)0.334961, (float)0.625122, (float)0.895752, 1.5006 + (float)0.343018, (float)0.518555, (float)0.698608, 1.5007 + (float)0.372803, (float)0.659790, (float)0.945435, 1.5008 + (float)0.176880, (float)0.316528, (float)0.581421, 1.5009 + (float)0.416382, (float)0.625977, (float)0.805176, 1.5010 + (float)0.303223, (float)0.568726, (float)0.915039, 1.5011 + (float)0.203613, (float)0.351440, (float)0.588135, 1.5012 + (float)0.221191, (float)0.375000, (float)0.614746, 1.5013 + (float)0.199951, (float)0.323364, (float)0.476074, 1.5014 + (float)0.300781, (float)0.433350, (float)0.566895, 1.5015 + (float)0.226196, (float)0.354004, (float)0.507568, 1.5016 + (float)0.300049, (float)0.508179, (float)0.711670, 1.5017 + (float)0.312012, (float)0.492676, (float)0.763428, 1.5018 + (float)0.329956, (float)0.541016, (float)0.795776, 1.5019 + (float)0.373779, (float)0.604614, (float)0.928833, 1.5020 + (float)0.210571, (float)0.452026, (float)0.755249, 1.5021 + (float)0.271118, (float)0.473267, (float)0.662476, 1.5022 + (float)0.285522, (float)0.436890, (float)0.634399, 1.5023 + (float)0.246704, (float)0.565552, (float)0.859009, 1.5024 + (float)0.270508, (float)0.406250, (float)0.553589, 1.5025 + (float)0.361450, (float)0.578491, (float)0.813843, 1.5026 + (float)0.342651, (float)0.482788, (float)0.622437, 1.5027 + (float)0.340332, (float)0.549438, (float)0.743164, 1.5028 + (float)0.200439, (float)0.336304, (float)0.540894, 1.5029 + (float)0.407837, (float)0.644775, (float)0.895142, 1.5030 + (float)0.294678, (float)0.454834, (float)0.699097, 1.5031 + (float)0.193115, (float)0.344482, (float)0.643188, 1.5032 + (float)0.275757, (float)0.420776, (float)0.598755, 1.5033 + (float)0.380493, (float)0.608643, (float)0.861084, 1.5034 + (float)0.222778, (float)0.426147, (float)0.676514, 1.5035 + (float)0.407471, (float)0.700195, (float)1.053101, 1.5036 + (float)0.218384, (float)0.377197, (float)0.669922, 1.5037 + (float)0.313232, (float)0.454102, (float)0.600952, 1.5038 + (float)0.347412, (float)0.571533, (float)0.874146, 1.5039 + (float)0.238037, (float)0.405396, (float)0.729492, 1.5040 + (float)0.223877, (float)0.412964, (float)0.822021, 1.5041 + (float)0.395264, (float)0.582153, (float)0.743896, 1.5042 + 1.5043 + 1.5044 + 1.5045 +Andersen, et al. Experimental [Page 90] 1.5046 + 1.5047 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.5048 + 1.5049 + 1.5050 + (float)0.247925, (float)0.485596, (float)0.720581, 1.5051 + (float)0.229126, (float)0.496582, (float)0.907715, 1.5052 + (float)0.260132, (float)0.566895, (float)1.012695, 1.5053 + (float)0.337402, (float)0.611572, (float)0.978149, 1.5054 + (float)0.267822, (float)0.447632, (float)0.769287, 1.5055 + (float)0.250610, (float)0.381714, (float)0.530029, 1.5056 + (float)0.430054, (float)0.805054, (float)1.221924, 1.5057 + (float)0.382568, (float)0.544067, (float)0.701660, 1.5058 + (float)0.383545, (float)0.710327, (float)1.149170, 1.5059 + (float)0.271362, (float)0.529053, (float)0.775513, 1.5060 + (float)0.246826, (float)0.393555, (float)0.588623, 1.5061 + (float)0.266846, (float)0.422119, (float)0.676758, 1.5062 + (float)0.311523, (float)0.580688, (float)0.838623, 1.5063 + (float)1.331177, (float)1.576782, (float)1.779541, 1.5064 + (float)1.160034, (float)1.401978, (float)1.768188, 1.5065 + (float)1.161865, (float)1.525146, (float)1.715332, 1.5066 + (float)0.759521, (float)0.913940, (float)1.119873, 1.5067 + (float)0.947144, (float)1.121338, (float)1.282471, 1.5068 + (float)1.015015, (float)1.557007, (float)1.804932, 1.5069 + (float)1.172974, (float)1.402100, (float)1.692627, 1.5070 + (float)1.087524, (float)1.474243, (float)1.665405, 1.5071 + (float)0.899536, (float)1.105225, (float)1.406250, 1.5072 + (float)1.148438, (float)1.484741, (float)1.796265, 1.5073 + (float)0.785645, (float)1.209839, (float)1.567749, 1.5074 + (float)0.867798, (float)1.166504, (float)1.450684, 1.5075 + (float)0.922485, (float)1.229858, (float)1.420898, 1.5076 + (float)0.791260, (float)1.123291, (float)1.409546, 1.5077 + (float)0.788940, (float)0.966064, (float)1.340332, 1.5078 + (float)1.051147, (float)1.272827, (float)1.556641, 1.5079 + (float)0.866821, (float)1.181152, (float)1.538818, 1.5080 + (float)0.906738, (float)1.373535, (float)1.607910, 1.5081 + (float)1.244751, (float)1.581421, (float)1.933838, 1.5082 + (float)0.913940, (float)1.337280, (float)1.539673, 1.5083 + (float)0.680542, (float)0.959229, (float)1.662720, 1.5084 + (float)0.887207, (float)1.430542, (float)1.800781, 1.5085 + (float)0.912598, (float)1.433594, (float)1.683960, 1.5086 + (float)0.860474, (float)1.060303, (float)1.455322, 1.5087 + (float)1.005127, (float)1.381104, (float)1.706909, 1.5088 + (float)0.800781, (float)1.363892, (float)1.829102, 1.5089 + (float)0.781860, (float)1.124390, (float)1.505981, 1.5090 + (float)1.003662, (float)1.471436, (float)1.684692, 1.5091 + (float)0.981323, (float)1.309570, (float)1.618042, 1.5092 + (float)1.228760, (float)1.554321, (float)1.756470, 1.5093 + (float)0.734375, (float)0.895752, (float)1.225586, 1.5094 + (float)0.841797, (float)1.055664, (float)1.249268, 1.5095 + (float)0.920166, (float)1.119385, (float)1.486206, 1.5096 + (float)0.894409, (float)1.539063, (float)1.828979, 1.5097 + (float)1.283691, (float)1.543335, (float)1.858276, 1.5098 + 1.5099 + 1.5100 + 1.5101 +Andersen, et al. Experimental [Page 91] 1.5102 + 1.5103 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.5104 + 1.5105 + 1.5106 + (float)0.676025, (float)0.933105, (float)1.490845, 1.5107 + (float)0.821289, (float)1.491821, (float)1.739868, 1.5108 + (float)0.923218, (float)1.144653, (float)1.580566, 1.5109 + (float)1.057251, (float)1.345581, (float)1.635864, 1.5110 + (float)0.888672, (float)1.074951, (float)1.353149, 1.5111 + (float)0.942749, (float)1.195435, (float)1.505493, 1.5112 + (float)1.492310, (float)1.788086, (float)2.039673, 1.5113 + (float)1.070313, (float)1.634399, (float)1.860962, 1.5114 + (float)1.253296, (float)1.488892, (float)1.686035, 1.5115 + (float)0.647095, (float)0.864014, (float)1.401855, 1.5116 + (float)0.866699, (float)1.254883, (float)1.453369, 1.5117 + (float)1.063965, (float)1.532593, (float)1.731323, 1.5118 + (float)1.167847, (float)1.521484, (float)1.884033, 1.5119 + (float)0.956055, (float)1.502075, (float)1.745605, 1.5120 + (float)0.928711, (float)1.288574, (float)1.479614, 1.5121 + (float)1.088013, (float)1.380737, (float)1.570801, 1.5122 + (float)0.905029, (float)1.186768, (float)1.371948, 1.5123 + (float)1.057861, (float)1.421021, (float)1.617432, 1.5124 + (float)1.108276, (float)1.312500, (float)1.501465, 1.5125 + (float)0.979492, (float)1.416992, (float)1.624268, 1.5126 + (float)1.276001, (float)1.661011, (float)2.007935, 1.5127 + (float)0.993042, (float)1.168579, (float)1.331665, 1.5128 + (float)0.778198, (float)0.944946, (float)1.235962, 1.5129 + (float)1.223755, (float)1.491333, (float)1.815674, 1.5130 + (float)0.852661, (float)1.350464, (float)1.722290, 1.5131 + (float)1.134766, (float)1.593140, (float)1.787354, 1.5132 + (float)1.051392, (float)1.339722, (float)1.531006, 1.5133 + (float)0.803589, (float)1.271240, (float)1.652100, 1.5134 + (float)0.755737, (float)1.143555, (float)1.639404, 1.5135 + (float)0.700928, (float)0.837280, (float)1.130371, 1.5136 + (float)0.942749, (float)1.197876, (float)1.669800, 1.5137 + (float)0.993286, (float)1.378296, (float)1.566528, 1.5138 + (float)0.801025, (float)1.095337, (float)1.298950, 1.5139 + (float)0.739990, (float)1.032959, (float)1.383667, 1.5140 + (float)0.845703, (float)1.072266, (float)1.543823, 1.5141 + (float)0.915649, (float)1.072266, (float)1.224487, 1.5142 + (float)1.021973, (float)1.226196, (float)1.481323, 1.5143 + (float)0.999878, (float)1.204102, (float)1.555908, 1.5144 + (float)0.722290, (float)0.913940, (float)1.340210, 1.5145 + (float)0.673340, (float)0.835938, (float)1.259521, 1.5146 + (float)0.832397, (float)1.208374, (float)1.394165, 1.5147 + (float)0.962158, (float)1.576172, (float)1.912842, 1.5148 + (float)1.166748, (float)1.370850, (float)1.556763, 1.5149 + (float)0.946289, (float)1.138550, (float)1.400391, 1.5150 + (float)1.035034, (float)1.218262, (float)1.386475, 1.5151 + (float)1.393799, (float)1.717773, (float)2.000244, 1.5152 + (float)0.972656, (float)1.260986, (float)1.760620, 1.5153 + (float)1.028198, (float)1.288452, (float)1.484619, 1.5154 + 1.5155 + 1.5156 + 1.5157 +Andersen, et al. Experimental [Page 92] 1.5158 + 1.5159 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.5160 + 1.5161 + 1.5162 + (float)0.773560, (float)1.258057, (float)1.756714, 1.5163 + (float)1.080322, (float)1.328003, (float)1.742676, 1.5164 + (float)0.823975, (float)1.450806, (float)1.917725, 1.5165 + (float)0.859009, (float)1.016602, (float)1.191895, 1.5166 + (float)0.843994, (float)1.131104, (float)1.645020, 1.5167 + (float)1.189697, (float)1.702759, (float)1.894409, 1.5168 + (float)1.346680, (float)1.763184, (float)2.066040, 1.5169 + (float)0.980469, (float)1.253784, (float)1.441650, 1.5170 + (float)1.338135, (float)1.641968, (float)1.932739, 1.5171 + (float)1.223267, (float)1.424194, (float)1.626465, 1.5172 + (float)0.765747, (float)1.004150, (float)1.579102, 1.5173 + (float)1.042847, (float)1.269165, (float)1.647461, 1.5174 + (float)0.968750, (float)1.257568, (float)1.555786, 1.5175 + (float)0.826294, (float)0.993408, (float)1.275146, 1.5176 + (float)0.742310, (float)0.950439, (float)1.430542, 1.5177 + (float)1.054321, (float)1.439819, (float)1.828003, 1.5178 + (float)1.072998, (float)1.261719, (float)1.441895, 1.5179 + (float)0.859375, (float)1.036377, (float)1.314819, 1.5180 + (float)0.895752, (float)1.267212, (float)1.605591, 1.5181 + (float)0.805420, (float)0.962891, (float)1.142334, 1.5182 + (float)0.795654, (float)1.005493, (float)1.468506, 1.5183 + (float)1.105347, (float)1.313843, (float)1.584839, 1.5184 + (float)0.792236, (float)1.221802, (float)1.465698, 1.5185 + (float)1.170532, (float)1.467651, (float)1.664063, 1.5186 + (float)0.838257, (float)1.153198, (float)1.342163, 1.5187 + (float)0.968018, (float)1.198242, (float)1.391235, 1.5188 + (float)1.250122, (float)1.623535, (float)1.823608, 1.5189 + (float)0.711670, (float)1.058350, (float)1.512085, 1.5190 + (float)1.204834, (float)1.454468, (float)1.739136, 1.5191 + (float)1.137451, (float)1.421753, (float)1.620117, 1.5192 + (float)0.820435, (float)1.322754, (float)1.578247, 1.5193 + (float)0.798706, (float)1.005005, (float)1.213867, 1.5194 + (float)0.980713, (float)1.324951, (float)1.512939, 1.5195 + (float)1.112305, (float)1.438843, (float)1.735596, 1.5196 + (float)1.135498, (float)1.356689, (float)1.635742, 1.5197 + (float)1.101318, (float)1.387451, (float)1.686523, 1.5198 + (float)0.849854, (float)1.276978, (float)1.523438, 1.5199 + (float)1.377930, (float)1.627563, (float)1.858154, 1.5200 + (float)0.884888, (float)1.095459, (float)1.287476, 1.5201 + (float)1.289795, (float)1.505859, (float)1.756592, 1.5202 + (float)0.817505, (float)1.384155, (float)1.650513, 1.5203 + (float)1.446655, (float)1.702148, (float)1.931885, 1.5204 + (float)0.835815, (float)1.023071, (float)1.385376, 1.5205 + (float)0.916626, (float)1.139038, (float)1.335327, 1.5206 + (float)0.980103, (float)1.174072, (float)1.453735, 1.5207 + (float)1.705688, (float)2.153809, (float)2.398315, (float)2.743408, 1.5208 + (float)1.797119, (float)2.016846, (float)2.445679, (float)2.701904, 1.5209 + (float)1.990356, (float)2.219116, (float)2.576416, (float)2.813477, 1.5210 + 1.5211 + 1.5212 + 1.5213 +Andersen, et al. Experimental [Page 93] 1.5214 + 1.5215 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.5216 + 1.5217 + 1.5218 + (float)1.849365, (float)2.190918, (float)2.611572, (float)2.835083, 1.5219 + (float)1.657959, (float)1.854370, (float)2.159058, (float)2.726196, 1.5220 + (float)1.437744, (float)1.897705, (float)2.253174, (float)2.655396, 1.5221 + (float)2.028687, (float)2.247314, (float)2.542358, (float)2.875854, 1.5222 + (float)1.736938, (float)1.922119, (float)2.185913, (float)2.743408, 1.5223 + (float)1.521606, (float)1.870972, (float)2.526855, (float)2.786987, 1.5224 + (float)1.841431, (float)2.050659, (float)2.463623, (float)2.857666, 1.5225 + (float)1.590088, (float)2.067261, (float)2.427979, (float)2.794434, 1.5226 + (float)1.746826, (float)2.057373, (float)2.320190, (float)2.800781, 1.5227 + (float)1.734619, (float)1.940552, (float)2.306030, (float)2.826416, 1.5228 + (float)1.786255, (float)2.204468, (float)2.457520, (float)2.795288, 1.5229 + (float)1.861084, (float)2.170532, (float)2.414551, (float)2.763672, 1.5230 + (float)2.001465, (float)2.307617, (float)2.552734, (float)2.811890, 1.5231 + (float)1.784424, (float)2.124146, (float)2.381592, (float)2.645508, 1.5232 + (float)1.888794, (float)2.135864, (float)2.418579, (float)2.861206, 1.5233 + (float)2.301147, (float)2.531250, (float)2.724976, (float)2.913086, 1.5234 + (float)1.837769, (float)2.051270, (float)2.261963, (float)2.553223, 1.5235 + (float)2.012939, (float)2.221191, (float)2.440186, (float)2.678101, 1.5236 + (float)1.429565, (float)1.858276, (float)2.582275, (float)2.845703, 1.5237 + (float)1.622803, (float)1.897705, (float)2.367310, (float)2.621094, 1.5238 + (float)1.581543, (float)1.960449, (float)2.515869, (float)2.736450, 1.5239 + (float)1.419434, (float)1.933960, (float)2.394653, (float)2.746704, 1.5240 + (float)1.721924, (float)2.059570, (float)2.421753, (float)2.769653, 1.5241 + (float)1.911011, (float)2.220703, (float)2.461060, (float)2.740723, 1.5242 + (float)1.581177, (float)1.860840, (float)2.516968, (float)2.874634, 1.5243 + (float)1.870361, (float)2.098755, (float)2.432373, (float)2.656494, 1.5244 + (float)2.059692, (float)2.279785, (float)2.495605, (float)2.729370, 1.5245 + (float)1.815674, (float)2.181519, (float)2.451538, (float)2.680542, 1.5246 + (float)1.407959, (float)1.768311, (float)2.343018, (float)2.668091, 1.5247 + (float)2.168701, (float)2.394653, (float)2.604736, (float)2.829346, 1.5248 + (float)1.636230, (float)1.865723, (float)2.329102, (float)2.824219, 1.5249 + (float)1.878906, (float)2.139526, (float)2.376709, (float)2.679810, 1.5250 + (float)1.765381, (float)1.971802, (float)2.195435, (float)2.586914, 1.5251 + (float)2.164795, (float)2.410889, (float)2.673706, (float)2.903198, 1.5252 + (float)2.071899, (float)2.331055, (float)2.645874, (float)2.907104, 1.5253 + (float)2.026001, (float)2.311523, (float)2.594849, (float)2.863892, 1.5254 + (float)1.948975, (float)2.180786, (float)2.514893, (float)2.797852, 1.5255 + (float)1.881836, (float)2.130859, (float)2.478149, (float)2.804199, 1.5256 + (float)2.238159, (float)2.452759, (float)2.652832, (float)2.868286, 1.5257 + (float)1.897949, (float)2.101685, (float)2.524292, (float)2.880127, 1.5258 + (float)1.856445, (float)2.074585, (float)2.541016, (float)2.791748, 1.5259 + (float)1.695557, (float)2.199097, (float)2.506226, (float)2.742676, 1.5260 + (float)1.612671, (float)1.877075, (float)2.435425, (float)2.732910, 1.5261 + (float)1.568848, (float)1.786499, (float)2.194580, (float)2.768555, 1.5262 + (float)1.953369, (float)2.164551, (float)2.486938, (float)2.874023, 1.5263 + (float)1.388306, (float)1.725342, (float)2.384521, (float)2.771851, 1.5264 + (float)2.115356, (float)2.337769, (float)2.592896, (float)2.864014, 1.5265 + (float)1.905762, (float)2.111328, (float)2.363525, (float)2.789307, 1.5266 + 1.5267 + 1.5268 + 1.5269 +Andersen, et al. Experimental [Page 94] 1.5270 + 1.5271 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.5272 + 1.5273 + 1.5274 + (float)1.882568, (float)2.332031, (float)2.598267, (float)2.827637, 1.5275 + (float)1.683594, (float)2.088745, (float)2.361938, (float)2.608643, 1.5276 + (float)1.874023, (float)2.182129, (float)2.536133, (float)2.766968, 1.5277 + (float)1.861938, (float)2.070435, (float)2.309692, (float)2.700562, 1.5278 + (float)1.722168, (float)2.107422, (float)2.477295, (float)2.837646, 1.5279 + (float)1.926880, (float)2.184692, (float)2.442627, (float)2.663818, 1.5280 + (float)2.123901, (float)2.337280, (float)2.553101, (float)2.777466, 1.5281 + (float)1.588135, (float)1.911499, (float)2.212769, (float)2.543945, 1.5282 + (float)2.053955, (float)2.370850, (float)2.712158, (float)2.939941, 1.5283 + (float)2.210449, (float)2.519653, (float)2.770386, (float)2.958618, 1.5284 + (float)2.199463, (float)2.474731, (float)2.718262, (float)2.919922, 1.5285 + (float)1.960083, (float)2.175415, (float)2.608032, (float)2.888794, 1.5286 + (float)1.953735, (float)2.185181, (float)2.428223, (float)2.809570, 1.5287 + (float)1.615234, (float)2.036499, (float)2.576538, (float)2.834595, 1.5288 + (float)1.621094, (float)2.028198, (float)2.431030, (float)2.664673, 1.5289 + (float)1.824951, (float)2.267456, (float)2.514526, (float)2.747925, 1.5290 + (float)1.994263, (float)2.229126, (float)2.475220, (float)2.833984, 1.5291 + (float)1.746338, (float)2.011353, (float)2.588257, (float)2.826904, 1.5292 + (float)1.562866, (float)2.135986, (float)2.471680, (float)2.687256, 1.5293 + (float)1.748901, (float)2.083496, (float)2.460938, (float)2.686279, 1.5294 + (float)1.758057, (float)2.131470, (float)2.636597, (float)2.891602, 1.5295 + (float)2.071289, (float)2.299072, (float)2.550781, (float)2.814331, 1.5296 + (float)1.839600, (float)2.094360, (float)2.496460, (float)2.723999, 1.5297 + (float)1.882202, (float)2.088257, (float)2.636841, (float)2.923096, 1.5298 + (float)1.957886, (float)2.153198, (float)2.384399, (float)2.615234, 1.5299 + (float)1.992920, (float)2.351196, (float)2.654419, (float)2.889771, 1.5300 + (float)2.012817, (float)2.262451, (float)2.643799, (float)2.903076, 1.5301 + (float)2.025635, (float)2.254761, (float)2.508423, (float)2.784058, 1.5302 + (float)2.316040, (float)2.589355, (float)2.794189, (float)2.963623, 1.5303 + (float)1.741211, (float)2.279541, (float)2.578491, (float)2.816284, 1.5304 + (float)1.845337, (float)2.055786, (float)2.348511, (float)2.822021, 1.5305 + (float)1.679932, (float)1.926514, (float)2.499756, (float)2.835693, 1.5306 + (float)1.722534, (float)1.946899, (float)2.448486, (float)2.728760, 1.5307 + (float)1.829834, (float)2.043213, (float)2.580444, (float)2.867676, 1.5308 + (float)1.676636, (float)2.071655, (float)2.322510, (float)2.704834, 1.5309 + (float)1.791504, (float)2.113525, (float)2.469727, (float)2.784058, 1.5310 + (float)1.977051, (float)2.215088, (float)2.497437, (float)2.726929, 1.5311 + (float)1.800171, (float)2.106689, (float)2.357788, (float)2.738892, 1.5312 + (float)1.827759, (float)2.170166, (float)2.525879, (float)2.852417, 1.5313 + (float)1.918335, (float)2.132813, (float)2.488403, (float)2.728149, 1.5314 + (float)1.916748, (float)2.225098, (float)2.542603, (float)2.857666, 1.5315 + (float)1.761230, (float)1.976074, (float)2.507446, (float)2.884521, 1.5316 + (float)2.053711, (float)2.367432, (float)2.608032, (float)2.837646, 1.5317 + (float)1.595337, (float)2.000977, (float)2.307129, (float)2.578247, 1.5318 + (float)1.470581, (float)2.031250, (float)2.375854, (float)2.647583, 1.5319 + (float)1.801392, (float)2.128052, (float)2.399780, (float)2.822876, 1.5320 + (float)1.853638, (float)2.066650, (float)2.429199, (float)2.751465, 1.5321 + (float)1.956299, (float)2.163696, (float)2.394775, (float)2.734253, 1.5322 + 1.5323 + 1.5324 + 1.5325 +Andersen, et al. Experimental [Page 95] 1.5326 + 1.5327 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.5328 + 1.5329 + 1.5330 + (float)1.963623, (float)2.275757, (float)2.585327, (float)2.865234, 1.5331 + (float)1.887451, (float)2.105469, (float)2.331787, (float)2.587402, 1.5332 + (float)2.120117, (float)2.443359, (float)2.733887, (float)2.941406, 1.5333 + (float)1.506348, (float)1.766968, (float)2.400513, (float)2.851807, 1.5334 + (float)1.664551, (float)1.981079, (float)2.375732, (float)2.774414, 1.5335 + (float)1.720703, (float)1.978882, (float)2.391479, (float)2.640991, 1.5336 + (float)1.483398, (float)1.814819, (float)2.434448, (float)2.722290, 1.5337 + (float)1.769043, (float)2.136597, (float)2.563721, (float)2.774414, 1.5338 + (float)1.810791, (float)2.049316, (float)2.373901, (float)2.613647, 1.5339 + (float)1.788330, (float)2.005981, (float)2.359131, (float)2.723145, 1.5340 + (float)1.785156, (float)1.993164, (float)2.399780, (float)2.832520, 1.5341 + (float)1.695313, (float)2.022949, (float)2.522583, (float)2.745117, 1.5342 + (float)1.584106, (float)1.965576, (float)2.299927, (float)2.715576, 1.5343 + (float)1.894897, (float)2.249878, (float)2.655884, (float)2.897705, 1.5344 + (float)1.720581, (float)1.995728, (float)2.299438, (float)2.557007, 1.5345 + (float)1.619385, (float)2.173950, (float)2.574219, (float)2.787964, 1.5346 + (float)1.883179, (float)2.220459, (float)2.474365, (float)2.825073, 1.5347 + (float)1.447632, (float)2.045044, (float)2.555542, (float)2.744873, 1.5348 + (float)1.502686, (float)2.156616, (float)2.653320, (float)2.846558, 1.5349 + (float)1.711548, (float)1.944092, (float)2.282959, (float)2.685791, 1.5350 + (float)1.499756, (float)1.867554, (float)2.341064, (float)2.578857, 1.5351 + (float)1.916870, (float)2.135132, (float)2.568237, (float)2.826050, 1.5352 + (float)1.498047, (float)1.711182, (float)2.223267, (float)2.755127, 1.5353 + (float)1.808716, (float)1.997559, (float)2.256470, (float)2.758545, 1.5354 + (float)2.088501, (float)2.402710, (float)2.667358, (float)2.890259, 1.5355 + (float)1.545044, (float)1.819214, (float)2.324097, (float)2.692993, 1.5356 + (float)1.796021, (float)2.012573, (float)2.505737, (float)2.784912, 1.5357 + (float)1.786499, (float)2.041748, (float)2.290405, (float)2.650757, 1.5358 + (float)1.938232, (float)2.264404, (float)2.529053, (float)2.796143 1.5359 + }; 1.5360 + 1.5361 +A.9. anaFilter.h 1.5362 + 1.5363 + /****************************************************************** 1.5364 + 1.5365 + iLBC Speech Coder ANSI-C Source Code 1.5366 + 1.5367 + anaFilter.h 1.5368 + 1.5369 + Copyright (C) The Internet Society (2004). 1.5370 + All Rights Reserved. 1.5371 + 1.5372 + ******************************************************************/ 1.5373 + 1.5374 + #ifndef __iLBC_ANAFILTER_H 1.5375 + #define __iLBC_ANAFILTER_H 1.5376 + 1.5377 + void anaFilter( 1.5378 + 1.5379 + 1.5380 + 1.5381 +Andersen, et al. Experimental [Page 96] 1.5382 + 1.5383 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.5384 + 1.5385 + 1.5386 + float *In, /* (i) Signal to be filtered */ 1.5387 + float *a, /* (i) LP parameters */ 1.5388 + int len,/* (i) Length of signal */ 1.5389 + float *Out, /* (o) Filtered signal */ 1.5390 + float *mem /* (i/o) Filter state */ 1.5391 + ); 1.5392 + 1.5393 + #endif 1.5394 + 1.5395 +A.10. anaFilter.c 1.5396 + 1.5397 + /****************************************************************** 1.5398 + 1.5399 + iLBC Speech Coder ANSI-C Source Code 1.5400 + 1.5401 + anaFilter.c 1.5402 + 1.5403 + Copyright (C) The Internet Society (2004). 1.5404 + All Rights Reserved. 1.5405 + 1.5406 + ******************************************************************/ 1.5407 + 1.5408 + #include <string.h> 1.5409 + #include "iLBC_define.h" 1.5410 + 1.5411 + /*----------------------------------------------------------------* 1.5412 + * LP analysis filter. 1.5413 + *---------------------------------------------------------------*/ 1.5414 + 1.5415 + void anaFilter( 1.5416 + float *In, /* (i) Signal to be filtered */ 1.5417 + float *a, /* (i) LP parameters */ 1.5418 + int len,/* (i) Length of signal */ 1.5419 + float *Out, /* (o) Filtered signal */ 1.5420 + float *mem /* (i/o) Filter state */ 1.5421 + ){ 1.5422 + int i, j; 1.5423 + float *po, *pi, *pm, *pa; 1.5424 + 1.5425 + po = Out; 1.5426 + 1.5427 + /* Filter first part using memory from past */ 1.5428 + 1.5429 + for (i=0; i<LPC_FILTERORDER; i++) { 1.5430 + pi = &In[i]; 1.5431 + pm = &mem[LPC_FILTERORDER-1]; 1.5432 + pa = a; 1.5433 + *po=0.0; 1.5434 + 1.5435 + 1.5436 + 1.5437 +Andersen, et al. Experimental [Page 97] 1.5438 + 1.5439 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.5440 + 1.5441 + 1.5442 + for (j=0; j<=i; j++) { 1.5443 + *po+=(*pa++)*(*pi--); 1.5444 + } 1.5445 + for (j=i+1; j<LPC_FILTERORDER+1; j++) { 1.5446 + 1.5447 + *po+=(*pa++)*(*pm--); 1.5448 + } 1.5449 + po++; 1.5450 + } 1.5451 + 1.5452 + /* Filter last part where the state is entirely 1.5453 + in the input vector */ 1.5454 + 1.5455 + for (i=LPC_FILTERORDER; i<len; i++) { 1.5456 + pi = &In[i]; 1.5457 + pa = a; 1.5458 + *po=0.0; 1.5459 + for (j=0; j<LPC_FILTERORDER+1; j++) { 1.5460 + *po+=(*pa++)*(*pi--); 1.5461 + } 1.5462 + po++; 1.5463 + } 1.5464 + 1.5465 + /* Update state vector */ 1.5466 + 1.5467 + memcpy(mem, &In[len-LPC_FILTERORDER], 1.5468 + LPC_FILTERORDER*sizeof(float)); 1.5469 + } 1.5470 + 1.5471 +A.11. createCB.h 1.5472 + 1.5473 + /****************************************************************** 1.5474 + 1.5475 + iLBC Speech Coder ANSI-C Source Code 1.5476 + 1.5477 + createCB.h 1.5478 + 1.5479 + Copyright (C) The Internet Society (2004). 1.5480 + All Rights Reserved. 1.5481 + 1.5482 + ******************************************************************/ 1.5483 + 1.5484 + #ifndef __iLBC_CREATECB_H 1.5485 + #define __iLBC_CREATECB_H 1.5486 + 1.5487 + void filteredCBvecs( 1.5488 + float *cbvectors, /* (o) Codebook vector for the 1.5489 + higher section */ 1.5490 + 1.5491 + 1.5492 + 1.5493 +Andersen, et al. Experimental [Page 98] 1.5494 + 1.5495 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.5496 + 1.5497 + 1.5498 + float *mem, /* (i) Buffer to create codebook 1.5499 + vectors from */ 1.5500 + int lMem /* (i) Length of buffer */ 1.5501 + ); 1.5502 + 1.5503 + void searchAugmentedCB( 1.5504 + int low, /* (i) Start index for the search */ 1.5505 + int high, /* (i) End index for the search */ 1.5506 + int stage, /* (i) Current stage */ 1.5507 + int startIndex, /* (i) CB index for the first 1.5508 + augmented vector */ 1.5509 + float *target, /* (i) Target vector for encoding */ 1.5510 + float *buffer, /* (i) Pointer to the end of the 1.5511 + buffer for augmented codebook 1.5512 + construction */ 1.5513 + float *max_measure, /* (i/o) Currently maximum measure */ 1.5514 + int *best_index,/* (o) Currently the best index */ 1.5515 + float *gain, /* (o) Currently the best gain */ 1.5516 + float *energy, /* (o) Energy of augmented 1.5517 + codebook vectors */ 1.5518 + float *invenergy/* (o) Inv energy of aug codebook 1.5519 + vectors */ 1.5520 + ); 1.5521 + 1.5522 + void createAugmentedVec( 1.5523 + int index, /* (i) Index for the aug vector 1.5524 + to be created */ 1.5525 + float *buffer, /* (i) Pointer to the end of the 1.5526 + buffer for augmented codebook 1.5527 + construction */ 1.5528 + float *cbVec /* (o) The construced codebook vector */ 1.5529 + ); 1.5530 + 1.5531 + #endif 1.5532 + 1.5533 +A.12. createCB.c 1.5534 + 1.5535 + 1.5536 + /****************************************************************** 1.5537 + 1.5538 + iLBC Speech Coder ANSI-C Source Code 1.5539 + 1.5540 + createCB.c 1.5541 + 1.5542 + Copyright (C) The Internet Society (2004). 1.5543 + All Rights Reserved. 1.5544 + 1.5545 + ******************************************************************/ 1.5546 + 1.5547 + 1.5548 + 1.5549 +Andersen, et al. Experimental [Page 99] 1.5550 + 1.5551 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.5552 + 1.5553 + 1.5554 + #include "iLBC_define.h" 1.5555 + #include "constants.h" 1.5556 + #include <string.h> 1.5557 + #include <math.h> 1.5558 + 1.5559 + /*----------------------------------------------------------------* 1.5560 + * Construct an additional codebook vector by filtering the 1.5561 + * initial codebook buffer. This vector is then used to expand 1.5562 + * the codebook with an additional section. 1.5563 + *---------------------------------------------------------------*/ 1.5564 + 1.5565 + void filteredCBvecs( 1.5566 + float *cbvectors, /* (o) Codebook vectors for the 1.5567 + higher section */ 1.5568 + float *mem, /* (i) Buffer to create codebook 1.5569 + vector from */ 1.5570 + int lMem /* (i) Length of buffer */ 1.5571 + ){ 1.5572 + int j, k; 1.5573 + float *pp, *pp1; 1.5574 + float tempbuff2[CB_MEML+CB_FILTERLEN]; 1.5575 + float *pos; 1.5576 + 1.5577 + memset(tempbuff2, 0, (CB_HALFFILTERLEN-1)*sizeof(float)); 1.5578 + memcpy(&tempbuff2[CB_HALFFILTERLEN-1], mem, lMem*sizeof(float)); 1.5579 + memset(&tempbuff2[lMem+CB_HALFFILTERLEN-1], 0, 1.5580 + (CB_HALFFILTERLEN+1)*sizeof(float)); 1.5581 + 1.5582 + /* Create codebook vector for higher section by filtering */ 1.5583 + 1.5584 + /* do filtering */ 1.5585 + pos=cbvectors; 1.5586 + memset(pos, 0, lMem*sizeof(float)); 1.5587 + for (k=0; k<lMem; k++) { 1.5588 + pp=&tempbuff2[k]; 1.5589 + pp1=&cbfiltersTbl[CB_FILTERLEN-1]; 1.5590 + for (j=0;j<CB_FILTERLEN;j++) { 1.5591 + (*pos)+=(*pp++)*(*pp1--); 1.5592 + } 1.5593 + pos++; 1.5594 + } 1.5595 + } 1.5596 + 1.5597 + /*----------------------------------------------------------------* 1.5598 + * Search the augmented part of the codebook to find the best 1.5599 + * measure. 1.5600 + *----------------------------------------------------------------*/ 1.5601 + 1.5602 + 1.5603 + 1.5604 + 1.5605 +Andersen, et al. Experimental [Page 100] 1.5606 + 1.5607 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.5608 + 1.5609 + 1.5610 + void searchAugmentedCB( 1.5611 + int low, /* (i) Start index for the search */ 1.5612 + int high, /* (i) End index for the search */ 1.5613 + int stage, /* (i) Current stage */ 1.5614 + int startIndex, /* (i) Codebook index for the first 1.5615 + aug vector */ 1.5616 + float *target, /* (i) Target vector for encoding */ 1.5617 + float *buffer, /* (i) Pointer to the end of the buffer for 1.5618 + augmented codebook construction */ 1.5619 + float *max_measure, /* (i/o) Currently maximum measure */ 1.5620 + int *best_index,/* (o) Currently the best index */ 1.5621 + float *gain, /* (o) Currently the best gain */ 1.5622 + float *energy, /* (o) Energy of augmented codebook 1.5623 + vectors */ 1.5624 + float *invenergy/* (o) Inv energy of augmented codebook 1.5625 + vectors */ 1.5626 + ) { 1.5627 + int icount, ilow, j, tmpIndex; 1.5628 + float *pp, *ppo, *ppi, *ppe, crossDot, alfa; 1.5629 + float weighted, measure, nrjRecursive; 1.5630 + float ftmp; 1.5631 + 1.5632 + /* Compute the energy for the first (low-5) 1.5633 + noninterpolated samples */ 1.5634 + nrjRecursive = (float) 0.0; 1.5635 + pp = buffer - low + 1; 1.5636 + for (j=0; j<(low-5); j++) { 1.5637 + nrjRecursive += ( (*pp)*(*pp) ); 1.5638 + pp++; 1.5639 + } 1.5640 + ppe = buffer - low; 1.5641 + 1.5642 + 1.5643 + for (icount=low; icount<=high; icount++) { 1.5644 + 1.5645 + /* Index of the codebook vector used for retrieving 1.5646 + energy values */ 1.5647 + tmpIndex = startIndex+icount-20; 1.5648 + 1.5649 + ilow = icount-4; 1.5650 + 1.5651 + /* Update the energy recursively to save complexity */ 1.5652 + nrjRecursive = nrjRecursive + (*ppe)*(*ppe); 1.5653 + ppe--; 1.5654 + energy[tmpIndex] = nrjRecursive; 1.5655 + 1.5656 + /* Compute cross dot product for the first (low-5) 1.5657 + samples */ 1.5658 + 1.5659 + 1.5660 + 1.5661 +Andersen, et al. Experimental [Page 101] 1.5662 + 1.5663 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.5664 + 1.5665 + 1.5666 + crossDot = (float) 0.0; 1.5667 + pp = buffer-icount; 1.5668 + for (j=0; j<ilow; j++) { 1.5669 + crossDot += target[j]*(*pp++); 1.5670 + } 1.5671 + 1.5672 + /* interpolation */ 1.5673 + alfa = (float) 0.2; 1.5674 + ppo = buffer-4; 1.5675 + ppi = buffer-icount-4; 1.5676 + for (j=ilow; j<icount; j++) { 1.5677 + weighted = ((float)1.0-alfa)*(*ppo)+alfa*(*ppi); 1.5678 + ppo++; 1.5679 + ppi++; 1.5680 + energy[tmpIndex] += weighted*weighted; 1.5681 + crossDot += target[j]*weighted; 1.5682 + alfa += (float)0.2; 1.5683 + } 1.5684 + 1.5685 + /* Compute energy and cross dot product for the 1.5686 + remaining samples */ 1.5687 + pp = buffer - icount; 1.5688 + for (j=icount; j<SUBL; j++) { 1.5689 + energy[tmpIndex] += (*pp)*(*pp); 1.5690 + crossDot += target[j]*(*pp++); 1.5691 + } 1.5692 + 1.5693 + if (energy[tmpIndex]>0.0) { 1.5694 + invenergy[tmpIndex]=(float)1.0/(energy[tmpIndex]+EPS); 1.5695 + } else { 1.5696 + invenergy[tmpIndex] = (float) 0.0; 1.5697 + } 1.5698 + 1.5699 + if (stage==0) { 1.5700 + measure = (float)-10000000.0; 1.5701 + 1.5702 + if (crossDot > 0.0) { 1.5703 + measure = crossDot*crossDot*invenergy[tmpIndex]; 1.5704 + } 1.5705 + } 1.5706 + else { 1.5707 + measure = crossDot*crossDot*invenergy[tmpIndex]; 1.5708 + } 1.5709 + 1.5710 + /* check if measure is better */ 1.5711 + ftmp = crossDot*invenergy[tmpIndex]; 1.5712 + 1.5713 + if ((measure>*max_measure) && (fabs(ftmp)<CB_MAXGAIN)) { 1.5714 + 1.5715 + 1.5716 + 1.5717 +Andersen, et al. Experimental [Page 102] 1.5718 + 1.5719 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.5720 + 1.5721 + 1.5722 + *best_index = tmpIndex; 1.5723 + *max_measure = measure; 1.5724 + *gain = ftmp; 1.5725 + } 1.5726 + } 1.5727 + } 1.5728 + 1.5729 + 1.5730 + /*----------------------------------------------------------------* 1.5731 + * Recreate a specific codebook vector from the augmented part. 1.5732 + * 1.5733 + *----------------------------------------------------------------*/ 1.5734 + 1.5735 + void createAugmentedVec( 1.5736 + int index, /* (i) Index for the augmented vector 1.5737 + to be created */ 1.5738 + float *buffer, /* (i) Pointer to the end of the buffer for 1.5739 + augmented codebook construction */ 1.5740 + float *cbVec/* (o) The construced codebook vector */ 1.5741 + ) { 1.5742 + int ilow, j; 1.5743 + float *pp, *ppo, *ppi, alfa, alfa1, weighted; 1.5744 + 1.5745 + ilow = index-5; 1.5746 + 1.5747 + /* copy the first noninterpolated part */ 1.5748 + 1.5749 + pp = buffer-index; 1.5750 + memcpy(cbVec,pp,sizeof(float)*index); 1.5751 + 1.5752 + /* interpolation */ 1.5753 + 1.5754 + alfa1 = (float)0.2; 1.5755 + alfa = 0.0; 1.5756 + ppo = buffer-5; 1.5757 + ppi = buffer-index-5; 1.5758 + for (j=ilow; j<index; j++) { 1.5759 + weighted = ((float)1.0-alfa)*(*ppo)+alfa*(*ppi); 1.5760 + ppo++; 1.5761 + ppi++; 1.5762 + cbVec[j] = weighted; 1.5763 + alfa += alfa1; 1.5764 + } 1.5765 + 1.5766 + /* copy the second noninterpolated part */ 1.5767 + 1.5768 + pp = buffer - index; 1.5769 + memcpy(cbVec+index,pp,sizeof(float)*(SUBL-index)); 1.5770 + 1.5771 + 1.5772 + 1.5773 +Andersen, et al. Experimental [Page 103] 1.5774 + 1.5775 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.5776 + 1.5777 + 1.5778 + } 1.5779 + 1.5780 +A.13. doCPLC.h 1.5781 + 1.5782 + /****************************************************************** 1.5783 + 1.5784 + iLBC Speech Coder ANSI-C Source Code 1.5785 + 1.5786 + doCPLC.h 1.5787 + 1.5788 + Copyright (C) The Internet Society (2004). 1.5789 + All Rights Reserved. 1.5790 + 1.5791 + ******************************************************************/ 1.5792 + 1.5793 + #ifndef __iLBC_DOLPC_H 1.5794 + #define __iLBC_DOLPC_H 1.5795 + 1.5796 + void doThePLC( 1.5797 + float *PLCresidual, /* (o) concealed residual */ 1.5798 + float *PLClpc, /* (o) concealed LP parameters */ 1.5799 + int PLI, /* (i) packet loss indicator 1.5800 + 0 - no PL, 1 = PL */ 1.5801 + float *decresidual, /* (i) decoded residual */ 1.5802 + float *lpc, /* (i) decoded LPC (only used for no PL) */ 1.5803 + int inlag, /* (i) pitch lag */ 1.5804 + iLBC_Dec_Inst_t *iLBCdec_inst 1.5805 + /* (i/o) decoder instance */ 1.5806 + ); 1.5807 + 1.5808 + #endif 1.5809 + 1.5810 +A.14. doCPLC.c 1.5811 + 1.5812 + /****************************************************************** 1.5813 + 1.5814 + iLBC Speech Coder ANSI-C Source Code 1.5815 + 1.5816 + doCPLC.c 1.5817 + 1.5818 + Copyright (C) The Internet Society (2004). 1.5819 + All Rights Reserved. 1.5820 + 1.5821 + ******************************************************************/ 1.5822 + 1.5823 + #include <math.h> 1.5824 + #include <string.h> 1.5825 + #include <stdio.h> 1.5826 + 1.5827 + 1.5828 + 1.5829 +Andersen, et al. Experimental [Page 104] 1.5830 + 1.5831 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.5832 + 1.5833 + 1.5834 + #include "iLBC_define.h" 1.5835 + 1.5836 + /*----------------------------------------------------------------* 1.5837 + * Compute cross correlation and pitch gain for pitch prediction 1.5838 + * of last subframe at given lag. 1.5839 + *---------------------------------------------------------------*/ 1.5840 + 1.5841 + void compCorr( 1.5842 + float *cc, /* (o) cross correlation coefficient */ 1.5843 + float *gc, /* (o) gain */ 1.5844 + float *pm, 1.5845 + float *buffer, /* (i) signal buffer */ 1.5846 + int lag, /* (i) pitch lag */ 1.5847 + int bLen, /* (i) length of buffer */ 1.5848 + int sRange /* (i) correlation search length */ 1.5849 + ){ 1.5850 + int i; 1.5851 + float ftmp1, ftmp2, ftmp3; 1.5852 + 1.5853 + /* Guard against getting outside buffer */ 1.5854 + if ((bLen-sRange-lag)<0) { 1.5855 + sRange=bLen-lag; 1.5856 + } 1.5857 + 1.5858 + ftmp1 = 0.0; 1.5859 + ftmp2 = 0.0; 1.5860 + ftmp3 = 0.0; 1.5861 + for (i=0; i<sRange; i++) { 1.5862 + ftmp1 += buffer[bLen-sRange+i] * 1.5863 + buffer[bLen-sRange+i-lag]; 1.5864 + ftmp2 += buffer[bLen-sRange+i-lag] * 1.5865 + buffer[bLen-sRange+i-lag]; 1.5866 + ftmp3 += buffer[bLen-sRange+i] * 1.5867 + buffer[bLen-sRange+i]; 1.5868 + } 1.5869 + 1.5870 + if (ftmp2 > 0.0) { 1.5871 + *cc = ftmp1*ftmp1/ftmp2; 1.5872 + *gc = (float)fabs(ftmp1/ftmp2); 1.5873 + *pm=(float)fabs(ftmp1)/ 1.5874 + ((float)sqrt(ftmp2)*(float)sqrt(ftmp3)); 1.5875 + } 1.5876 + else { 1.5877 + *cc = 0.0; 1.5878 + *gc = 0.0; 1.5879 + *pm=0.0; 1.5880 + } 1.5881 + } 1.5882 + 1.5883 + 1.5884 + 1.5885 +Andersen, et al. Experimental [Page 105] 1.5886 + 1.5887 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.5888 + 1.5889 + 1.5890 + /*----------------------------------------------------------------* 1.5891 + * Packet loss concealment routine. Conceals a residual signal 1.5892 + * and LP parameters. If no packet loss, update state. 1.5893 + *---------------------------------------------------------------*/ 1.5894 + 1.5895 + void doThePLC( 1.5896 + float *PLCresidual, /* (o) concealed residual */ 1.5897 + float *PLClpc, /* (o) concealed LP parameters */ 1.5898 + int PLI, /* (i) packet loss indicator 1.5899 + 0 - no PL, 1 = PL */ 1.5900 + float *decresidual, /* (i) decoded residual */ 1.5901 + float *lpc, /* (i) decoded LPC (only used for no PL) */ 1.5902 + int inlag, /* (i) pitch lag */ 1.5903 + iLBC_Dec_Inst_t *iLBCdec_inst 1.5904 + /* (i/o) decoder instance */ 1.5905 + ){ 1.5906 + int lag=20, randlag; 1.5907 + float gain, maxcc; 1.5908 + float use_gain; 1.5909 + float gain_comp, maxcc_comp, per, max_per; 1.5910 + int i, pick, use_lag; 1.5911 + float ftmp, randvec[BLOCKL_MAX], pitchfact, energy; 1.5912 + 1.5913 + /* Packet Loss */ 1.5914 + 1.5915 + if (PLI == 1) { 1.5916 + 1.5917 + iLBCdec_inst->consPLICount += 1; 1.5918 + 1.5919 + /* if previous frame not lost, 1.5920 + determine pitch pred. gain */ 1.5921 + 1.5922 + if (iLBCdec_inst->prevPLI != 1) { 1.5923 + 1.5924 + /* Search around the previous lag to find the 1.5925 + best pitch period */ 1.5926 + 1.5927 + lag=inlag-3; 1.5928 + compCorr(&maxcc, &gain, &max_per, 1.5929 + iLBCdec_inst->prevResidual, 1.5930 + lag, iLBCdec_inst->blockl, 60); 1.5931 + for (i=inlag-2;i<=inlag+3;i++) { 1.5932 + compCorr(&maxcc_comp, &gain_comp, &per, 1.5933 + iLBCdec_inst->prevResidual, 1.5934 + i, iLBCdec_inst->blockl, 60); 1.5935 + 1.5936 + if (maxcc_comp>maxcc) { 1.5937 + maxcc=maxcc_comp; 1.5938 + 1.5939 + 1.5940 + 1.5941 +Andersen, et al. Experimental [Page 106] 1.5942 + 1.5943 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.5944 + 1.5945 + 1.5946 + gain=gain_comp; 1.5947 + lag=i; 1.5948 + max_per=per; 1.5949 + } 1.5950 + } 1.5951 + 1.5952 + } 1.5953 + 1.5954 + /* previous frame lost, use recorded lag and periodicity */ 1.5955 + 1.5956 + else { 1.5957 + lag=iLBCdec_inst->prevLag; 1.5958 + max_per=iLBCdec_inst->per; 1.5959 + } 1.5960 + 1.5961 + /* downscaling */ 1.5962 + 1.5963 + use_gain=1.0; 1.5964 + if (iLBCdec_inst->consPLICount*iLBCdec_inst->blockl>320) 1.5965 + use_gain=(float)0.9; 1.5966 + else if (iLBCdec_inst->consPLICount* 1.5967 + iLBCdec_inst->blockl>2*320) 1.5968 + use_gain=(float)0.7; 1.5969 + else if (iLBCdec_inst->consPLICount* 1.5970 + iLBCdec_inst->blockl>3*320) 1.5971 + use_gain=(float)0.5; 1.5972 + else if (iLBCdec_inst->consPLICount* 1.5973 + iLBCdec_inst->blockl>4*320) 1.5974 + use_gain=(float)0.0; 1.5975 + 1.5976 + /* mix noise and pitch repeatition */ 1.5977 + ftmp=(float)sqrt(max_per); 1.5978 + if (ftmp>(float)0.7) 1.5979 + pitchfact=(float)1.0; 1.5980 + else if (ftmp>(float)0.4) 1.5981 + pitchfact=(ftmp-(float)0.4)/((float)0.7-(float)0.4); 1.5982 + else 1.5983 + pitchfact=0.0; 1.5984 + 1.5985 + 1.5986 + /* avoid repetition of same pitch cycle */ 1.5987 + use_lag=lag; 1.5988 + if (lag<80) { 1.5989 + use_lag=2*lag; 1.5990 + } 1.5991 + 1.5992 + /* compute concealed residual */ 1.5993 + 1.5994 + 1.5995 + 1.5996 + 1.5997 +Andersen, et al. Experimental [Page 107] 1.5998 + 1.5999 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.6000 + 1.6001 + 1.6002 + energy = 0.0; 1.6003 + for (i=0; i<iLBCdec_inst->blockl; i++) { 1.6004 + 1.6005 + /* noise component */ 1.6006 + 1.6007 + iLBCdec_inst->seed=(iLBCdec_inst->seed*69069L+1) & 1.6008 + (0x80000000L-1); 1.6009 + randlag = 50 + ((signed long) iLBCdec_inst->seed)%70; 1.6010 + pick = i - randlag; 1.6011 + 1.6012 + if (pick < 0) { 1.6013 + randvec[i] = 1.6014 + iLBCdec_inst->prevResidual[ 1.6015 + iLBCdec_inst->blockl+pick]; 1.6016 + } else { 1.6017 + randvec[i] = randvec[pick]; 1.6018 + } 1.6019 + 1.6020 + /* pitch repeatition component */ 1.6021 + pick = i - use_lag; 1.6022 + 1.6023 + if (pick < 0) { 1.6024 + PLCresidual[i] = 1.6025 + iLBCdec_inst->prevResidual[ 1.6026 + iLBCdec_inst->blockl+pick]; 1.6027 + } else { 1.6028 + PLCresidual[i] = PLCresidual[pick]; 1.6029 + } 1.6030 + 1.6031 + /* mix random and periodicity component */ 1.6032 + 1.6033 + if (i<80) 1.6034 + PLCresidual[i] = use_gain*(pitchfact * 1.6035 + PLCresidual[i] + 1.6036 + ((float)1.0 - pitchfact) * randvec[i]); 1.6037 + else if (i<160) 1.6038 + PLCresidual[i] = (float)0.95*use_gain*(pitchfact * 1.6039 + PLCresidual[i] + 1.6040 + ((float)1.0 - pitchfact) * randvec[i]); 1.6041 + else 1.6042 + PLCresidual[i] = (float)0.9*use_gain*(pitchfact * 1.6043 + PLCresidual[i] + 1.6044 + ((float)1.0 - pitchfact) * randvec[i]); 1.6045 + 1.6046 + energy += PLCresidual[i] * PLCresidual[i]; 1.6047 + } 1.6048 + 1.6049 + /* less than 30 dB, use only noise */ 1.6050 + 1.6051 + 1.6052 + 1.6053 +Andersen, et al. Experimental [Page 108] 1.6054 + 1.6055 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.6056 + 1.6057 + 1.6058 + 1.6059 + if (sqrt(energy/(float)iLBCdec_inst->blockl) < 30.0) { 1.6060 + gain=0.0; 1.6061 + for (i=0; i<iLBCdec_inst->blockl; i++) { 1.6062 + PLCresidual[i] = randvec[i]; 1.6063 + } 1.6064 + } 1.6065 + 1.6066 + /* use old LPC */ 1.6067 + 1.6068 + memcpy(PLClpc,iLBCdec_inst->prevLpc, 1.6069 + (LPC_FILTERORDER+1)*sizeof(float)); 1.6070 + 1.6071 + } 1.6072 + 1.6073 + /* no packet loss, copy input */ 1.6074 + 1.6075 + else { 1.6076 + memcpy(PLCresidual, decresidual, 1.6077 + iLBCdec_inst->blockl*sizeof(float)); 1.6078 + memcpy(PLClpc, lpc, (LPC_FILTERORDER+1)*sizeof(float)); 1.6079 + iLBCdec_inst->consPLICount = 0; 1.6080 + } 1.6081 + 1.6082 + /* update state */ 1.6083 + 1.6084 + if (PLI) { 1.6085 + iLBCdec_inst->prevLag = lag; 1.6086 + iLBCdec_inst->per=max_per; 1.6087 + } 1.6088 + 1.6089 + iLBCdec_inst->prevPLI = PLI; 1.6090 + memcpy(iLBCdec_inst->prevLpc, PLClpc, 1.6091 + (LPC_FILTERORDER+1)*sizeof(float)); 1.6092 + memcpy(iLBCdec_inst->prevResidual, PLCresidual, 1.6093 + iLBCdec_inst->blockl*sizeof(float)); 1.6094 + } 1.6095 + 1.6096 +A.15. enhancer.h 1.6097 + 1.6098 + /****************************************************************** 1.6099 + 1.6100 + iLBC Speech Coder ANSI-C Source Code 1.6101 + 1.6102 + enhancer.h 1.6103 + 1.6104 + Copyright (C) The Internet Society (2004). 1.6105 + All Rights Reserved. 1.6106 + 1.6107 + 1.6108 + 1.6109 +Andersen, et al. Experimental [Page 109] 1.6110 + 1.6111 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.6112 + 1.6113 + 1.6114 + ******************************************************************/ 1.6115 + 1.6116 + #ifndef __ENHANCER_H 1.6117 + #define __ENHANCER_H 1.6118 + 1.6119 + #include "iLBC_define.h" 1.6120 + 1.6121 + float xCorrCoef( 1.6122 + float *target, /* (i) first array */ 1.6123 + float *regressor, /* (i) second array */ 1.6124 + int subl /* (i) dimension arrays */ 1.6125 + ); 1.6126 + 1.6127 + int enhancerInterface( 1.6128 + float *out, /* (o) the enhanced recidual signal */ 1.6129 + float *in, /* (i) the recidual signal to enhance */ 1.6130 + iLBC_Dec_Inst_t *iLBCdec_inst 1.6131 + /* (i/o) the decoder state structure */ 1.6132 + ); 1.6133 + 1.6134 + #endif 1.6135 + 1.6136 +A.16. enhancer.c 1.6137 + 1.6138 + /****************************************************************** 1.6139 + 1.6140 + iLBC Speech Coder ANSI-C Source Code 1.6141 + 1.6142 + enhancer.c 1.6143 + 1.6144 + Copyright (C) The Internet Society (2004). 1.6145 + All Rights Reserved. 1.6146 + 1.6147 + ******************************************************************/ 1.6148 + 1.6149 + #include <math.h> 1.6150 + #include <string.h> 1.6151 + #include "iLBC_define.h" 1.6152 + #include "constants.h" 1.6153 + #include "filter.h" 1.6154 + 1.6155 + /*----------------------------------------------------------------* 1.6156 + * Find index in array such that the array element with said 1.6157 + * index is the element of said array closest to "value" 1.6158 + * according to the squared-error criterion 1.6159 + *---------------------------------------------------------------*/ 1.6160 + 1.6161 + void NearestNeighbor( 1.6162 + 1.6163 + 1.6164 + 1.6165 +Andersen, et al. Experimental [Page 110] 1.6166 + 1.6167 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.6168 + 1.6169 + 1.6170 + int *index, /* (o) index of array element closest 1.6171 + to value */ 1.6172 + float *array, /* (i) data array */ 1.6173 + float value,/* (i) value */ 1.6174 + int arlength/* (i) dimension of data array */ 1.6175 + ){ 1.6176 + int i; 1.6177 + float bestcrit,crit; 1.6178 + 1.6179 + crit=array[0]-value; 1.6180 + bestcrit=crit*crit; 1.6181 + *index=0; 1.6182 + for (i=1; i<arlength; i++) { 1.6183 + crit=array[i]-value; 1.6184 + crit=crit*crit; 1.6185 + 1.6186 + if (crit<bestcrit) { 1.6187 + bestcrit=crit; 1.6188 + *index=i; 1.6189 + } 1.6190 + } 1.6191 + } 1.6192 + 1.6193 + /*----------------------------------------------------------------* 1.6194 + * compute cross correlation between sequences 1.6195 + *---------------------------------------------------------------*/ 1.6196 + 1.6197 + void mycorr1( 1.6198 + float* corr, /* (o) correlation of seq1 and seq2 */ 1.6199 + float* seq1, /* (i) first sequence */ 1.6200 + int dim1, /* (i) dimension first seq1 */ 1.6201 + const float *seq2, /* (i) second sequence */ 1.6202 + int dim2 /* (i) dimension seq2 */ 1.6203 + ){ 1.6204 + int i,j; 1.6205 + 1.6206 + for (i=0; i<=dim1-dim2; i++) { 1.6207 + corr[i]=0.0; 1.6208 + for (j=0; j<dim2; j++) { 1.6209 + corr[i] += seq1[i+j] * seq2[j]; 1.6210 + } 1.6211 + } 1.6212 + } 1.6213 + 1.6214 + /*----------------------------------------------------------------* 1.6215 + * upsample finite array assuming zeros outside bounds 1.6216 + *---------------------------------------------------------------*/ 1.6217 + 1.6218 + 1.6219 + 1.6220 + 1.6221 +Andersen, et al. Experimental [Page 111] 1.6222 + 1.6223 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.6224 + 1.6225 + 1.6226 + void enh_upsample( 1.6227 + float* useq1, /* (o) upsampled output sequence */ 1.6228 + float* seq1,/* (i) unupsampled sequence */ 1.6229 + int dim1, /* (i) dimension seq1 */ 1.6230 + int hfl /* (i) polyphase filter length=2*hfl+1 */ 1.6231 + ){ 1.6232 + float *pu,*ps; 1.6233 + int i,j,k,q,filterlength,hfl2; 1.6234 + const float *polyp[ENH_UPS0]; /* pointers to 1.6235 + polyphase columns */ 1.6236 + const float *pp; 1.6237 + 1.6238 + /* define pointers for filter */ 1.6239 + 1.6240 + filterlength=2*hfl+1; 1.6241 + 1.6242 + if ( filterlength > dim1 ) { 1.6243 + hfl2=(int) (dim1/2); 1.6244 + for (j=0; j<ENH_UPS0; j++) { 1.6245 + polyp[j]=polyphaserTbl+j*filterlength+hfl-hfl2; 1.6246 + } 1.6247 + hfl=hfl2; 1.6248 + filterlength=2*hfl+1; 1.6249 + } 1.6250 + else { 1.6251 + for (j=0; j<ENH_UPS0; j++) { 1.6252 + polyp[j]=polyphaserTbl+j*filterlength; 1.6253 + } 1.6254 + } 1.6255 + 1.6256 + /* filtering: filter overhangs left side of sequence */ 1.6257 + 1.6258 + pu=useq1; 1.6259 + for (i=hfl; i<filterlength; i++) { 1.6260 + for (j=0; j<ENH_UPS0; j++) { 1.6261 + *pu=0.0; 1.6262 + pp = polyp[j]; 1.6263 + ps = seq1+i; 1.6264 + for (k=0; k<=i; k++) { 1.6265 + *pu += *ps-- * *pp++; 1.6266 + } 1.6267 + pu++; 1.6268 + } 1.6269 + } 1.6270 + 1.6271 + /* filtering: simple convolution=inner products */ 1.6272 + 1.6273 + for (i=filterlength; i<dim1; i++) { 1.6274 + 1.6275 + 1.6276 + 1.6277 +Andersen, et al. Experimental [Page 112] 1.6278 + 1.6279 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.6280 + 1.6281 + 1.6282 + for (j=0;j<ENH_UPS0; j++){ 1.6283 + *pu=0.0; 1.6284 + pp = polyp[j]; 1.6285 + ps = seq1+i; 1.6286 + for (k=0; k<filterlength; k++) { 1.6287 + *pu += *ps-- * *pp++; 1.6288 + } 1.6289 + pu++; 1.6290 + } 1.6291 + } 1.6292 + 1.6293 + /* filtering: filter overhangs right side of sequence */ 1.6294 + 1.6295 + for (q=1; q<=hfl; q++) { 1.6296 + for (j=0; j<ENH_UPS0; j++) { 1.6297 + *pu=0.0; 1.6298 + pp = polyp[j]+q; 1.6299 + ps = seq1+dim1-1; 1.6300 + for (k=0; k<filterlength-q; k++) { 1.6301 + *pu += *ps-- * *pp++; 1.6302 + } 1.6303 + pu++; 1.6304 + } 1.6305 + } 1.6306 + } 1.6307 + 1.6308 + 1.6309 + /*----------------------------------------------------------------* 1.6310 + * find segment starting near idata+estSegPos that has highest 1.6311 + * correlation with idata+centerStartPos through 1.6312 + * idata+centerStartPos+ENH_BLOCKL-1 segment is found at a 1.6313 + * resolution of ENH_UPSO times the original of the original 1.6314 + * sampling rate 1.6315 + *---------------------------------------------------------------*/ 1.6316 + 1.6317 + void refiner( 1.6318 + float *seg, /* (o) segment array */ 1.6319 + float *updStartPos, /* (o) updated start point */ 1.6320 + float* idata, /* (i) original data buffer */ 1.6321 + int idatal, /* (i) dimension of idata */ 1.6322 + int centerStartPos, /* (i) beginning center segment */ 1.6323 + float estSegPos,/* (i) estimated beginning other segment */ 1.6324 + float period /* (i) estimated pitch period */ 1.6325 + ){ 1.6326 + int estSegPosRounded,searchSegStartPos,searchSegEndPos,corrdim; 1.6327 + int tloc,tloc2,i,st,en,fraction; 1.6328 + float vect[ENH_VECTL],corrVec[ENH_CORRDIM],maxv; 1.6329 + float corrVecUps[ENH_CORRDIM*ENH_UPS0]; 1.6330 + 1.6331 + 1.6332 + 1.6333 +Andersen, et al. Experimental [Page 113] 1.6334 + 1.6335 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.6336 + 1.6337 + 1.6338 + /* defining array bounds */ 1.6339 + 1.6340 + estSegPosRounded=(int)(estSegPos - 0.5); 1.6341 + 1.6342 + searchSegStartPos=estSegPosRounded-ENH_SLOP; 1.6343 + 1.6344 + if (searchSegStartPos<0) { 1.6345 + searchSegStartPos=0; 1.6346 + } 1.6347 + searchSegEndPos=estSegPosRounded+ENH_SLOP; 1.6348 + 1.6349 + if (searchSegEndPos+ENH_BLOCKL >= idatal) { 1.6350 + searchSegEndPos=idatal-ENH_BLOCKL-1; 1.6351 + } 1.6352 + corrdim=searchSegEndPos-searchSegStartPos+1; 1.6353 + 1.6354 + /* compute upsampled correlation (corr33) and find 1.6355 + location of max */ 1.6356 + 1.6357 + mycorr1(corrVec,idata+searchSegStartPos, 1.6358 + corrdim+ENH_BLOCKL-1,idata+centerStartPos,ENH_BLOCKL); 1.6359 + enh_upsample(corrVecUps,corrVec,corrdim,ENH_FL0); 1.6360 + tloc=0; maxv=corrVecUps[0]; 1.6361 + for (i=1; i<ENH_UPS0*corrdim; i++) { 1.6362 + 1.6363 + if (corrVecUps[i]>maxv) { 1.6364 + tloc=i; 1.6365 + maxv=corrVecUps[i]; 1.6366 + } 1.6367 + } 1.6368 + 1.6369 + /* make vector can be upsampled without ever running outside 1.6370 + bounds */ 1.6371 + 1.6372 + *updStartPos= (float)searchSegStartPos + 1.6373 + (float)tloc/(float)ENH_UPS0+(float)1.0; 1.6374 + tloc2=(int)(tloc/ENH_UPS0); 1.6375 + 1.6376 + if (tloc>tloc2*ENH_UPS0) { 1.6377 + tloc2++; 1.6378 + } 1.6379 + st=searchSegStartPos+tloc2-ENH_FL0; 1.6380 + 1.6381 + if (st<0) { 1.6382 + memset(vect,0,-st*sizeof(float)); 1.6383 + memcpy(&vect[-st],idata, (ENH_VECTL+st)*sizeof(float)); 1.6384 + } 1.6385 + else { 1.6386 + 1.6387 + 1.6388 + 1.6389 +Andersen, et al. Experimental [Page 114] 1.6390 + 1.6391 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.6392 + 1.6393 + 1.6394 + en=st+ENH_VECTL; 1.6395 + 1.6396 + if (en>idatal) { 1.6397 + memcpy(vect, &idata[st], 1.6398 + (ENH_VECTL-(en-idatal))*sizeof(float)); 1.6399 + memset(&vect[ENH_VECTL-(en-idatal)], 0, 1.6400 + (en-idatal)*sizeof(float)); 1.6401 + } 1.6402 + else { 1.6403 + memcpy(vect, &idata[st], ENH_VECTL*sizeof(float)); 1.6404 + } 1.6405 + } 1.6406 + fraction=tloc2*ENH_UPS0-tloc; 1.6407 + 1.6408 + /* compute the segment (this is actually a convolution) */ 1.6409 + 1.6410 + mycorr1(seg,vect,ENH_VECTL,polyphaserTbl+(2*ENH_FL0+1)*fraction, 1.6411 + 2*ENH_FL0+1); 1.6412 + } 1.6413 + 1.6414 + /*----------------------------------------------------------------* 1.6415 + * find the smoothed output data 1.6416 + *---------------------------------------------------------------*/ 1.6417 + 1.6418 + void smath( 1.6419 + float *odata, /* (o) smoothed output */ 1.6420 + float *sseq,/* (i) said second sequence of waveforms */ 1.6421 + int hl, /* (i) 2*hl+1 is sseq dimension */ 1.6422 + float alpha0/* (i) max smoothing energy fraction */ 1.6423 + ){ 1.6424 + int i,k; 1.6425 + float w00,w10,w11,A,B,C,*psseq,err,errs; 1.6426 + float surround[BLOCKL_MAX]; /* shape contributed by other than 1.6427 + current */ 1.6428 + float wt[2*ENH_HL+1]; /* waveform weighting to get 1.6429 + surround shape */ 1.6430 + float denom; 1.6431 + 1.6432 + /* create shape of contribution from all waveforms except the 1.6433 + current one */ 1.6434 + 1.6435 + for (i=1; i<=2*hl+1; i++) { 1.6436 + wt[i-1] = (float)0.5*(1 - (float)cos(2*PI*i/(2*hl+2))); 1.6437 + } 1.6438 + wt[hl]=0.0; /* for clarity, not used */ 1.6439 + for (i=0; i<ENH_BLOCKL; i++) { 1.6440 + surround[i]=sseq[i]*wt[0]; 1.6441 + } 1.6442 + 1.6443 + 1.6444 + 1.6445 +Andersen, et al. Experimental [Page 115] 1.6446 + 1.6447 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.6448 + 1.6449 + 1.6450 + for (k=1; k<hl; k++) { 1.6451 + psseq=sseq+k*ENH_BLOCKL; 1.6452 + for(i=0;i<ENH_BLOCKL; i++) { 1.6453 + surround[i]+=psseq[i]*wt[k]; 1.6454 + } 1.6455 + } 1.6456 + for (k=hl+1; k<=2*hl; k++) { 1.6457 + psseq=sseq+k*ENH_BLOCKL; 1.6458 + for(i=0;i<ENH_BLOCKL; i++) { 1.6459 + surround[i]+=psseq[i]*wt[k]; 1.6460 + } 1.6461 + } 1.6462 + 1.6463 + /* compute some inner products */ 1.6464 + 1.6465 + w00 = w10 = w11 = 0.0; 1.6466 + psseq=sseq+hl*ENH_BLOCKL; /* current block */ 1.6467 + for (i=0; i<ENH_BLOCKL;i++) { 1.6468 + w00+=psseq[i]*psseq[i]; 1.6469 + w11+=surround[i]*surround[i]; 1.6470 + w10+=surround[i]*psseq[i]; 1.6471 + } 1.6472 + 1.6473 + if (fabs(w11) < 1.0) { 1.6474 + w11=1.0; 1.6475 + } 1.6476 + C = (float)sqrt( w00/w11); 1.6477 + 1.6478 + /* first try enhancement without power-constraint */ 1.6479 + 1.6480 + errs=0.0; 1.6481 + psseq=sseq+hl*ENH_BLOCKL; 1.6482 + for (i=0; i<ENH_BLOCKL; i++) { 1.6483 + odata[i]=C*surround[i]; 1.6484 + err=psseq[i]-odata[i]; 1.6485 + errs+=err*err; 1.6486 + } 1.6487 + 1.6488 + /* if constraint violated by first try, add constraint */ 1.6489 + 1.6490 + if (errs > alpha0 * w00) { 1.6491 + if ( w00 < 1) { 1.6492 + w00=1; 1.6493 + } 1.6494 + denom = (w11*w00-w10*w10)/(w00*w00); 1.6495 + 1.6496 + if (denom > 0.0001) { /* eliminates numerical problems 1.6497 + for if smooth */ 1.6498 + 1.6499 + 1.6500 + 1.6501 +Andersen, et al. Experimental [Page 116] 1.6502 + 1.6503 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.6504 + 1.6505 + 1.6506 + A = (float)sqrt( (alpha0- alpha0*alpha0/4)/denom); 1.6507 + B = -alpha0/2 - A * w10/w00; 1.6508 + B = B+1; 1.6509 + } 1.6510 + else { /* essentially no difference between cycles; 1.6511 + smoothing not needed */ 1.6512 + A= 0.0; 1.6513 + B= 1.0; 1.6514 + } 1.6515 + 1.6516 + /* create smoothed sequence */ 1.6517 + 1.6518 + psseq=sseq+hl*ENH_BLOCKL; 1.6519 + for (i=0; i<ENH_BLOCKL; i++) { 1.6520 + odata[i]=A*surround[i]+B*psseq[i]; 1.6521 + } 1.6522 + } 1.6523 + } 1.6524 + 1.6525 + /*----------------------------------------------------------------* 1.6526 + * get the pitch-synchronous sample sequence 1.6527 + *---------------------------------------------------------------*/ 1.6528 + 1.6529 + void getsseq( 1.6530 + float *sseq, /* (o) the pitch-synchronous sequence */ 1.6531 + float *idata, /* (i) original data */ 1.6532 + int idatal, /* (i) dimension of data */ 1.6533 + int centerStartPos, /* (i) where current block starts */ 1.6534 + float *period, /* (i) rough-pitch-period array */ 1.6535 + float *plocs, /* (i) where periods of period array 1.6536 + are taken */ 1.6537 + int periodl, /* (i) dimension period array */ 1.6538 + int hl /* (i) 2*hl+1 is the number of sequences */ 1.6539 + ){ 1.6540 + int i,centerEndPos,q; 1.6541 + float blockStartPos[2*ENH_HL+1]; 1.6542 + int lagBlock[2*ENH_HL+1]; 1.6543 + float plocs2[ENH_PLOCSL]; 1.6544 + float *psseq; 1.6545 + 1.6546 + centerEndPos=centerStartPos+ENH_BLOCKL-1; 1.6547 + 1.6548 + /* present */ 1.6549 + 1.6550 + NearestNeighbor(lagBlock+hl,plocs, 1.6551 + (float)0.5*(centerStartPos+centerEndPos),periodl); 1.6552 + 1.6553 + blockStartPos[hl]=(float)centerStartPos; 1.6554 + 1.6555 + 1.6556 + 1.6557 +Andersen, et al. Experimental [Page 117] 1.6558 + 1.6559 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.6560 + 1.6561 + 1.6562 + psseq=sseq+ENH_BLOCKL*hl; 1.6563 + memcpy(psseq, idata+centerStartPos, ENH_BLOCKL*sizeof(float)); 1.6564 + 1.6565 + /* past */ 1.6566 + 1.6567 + for (q=hl-1; q>=0; q--) { 1.6568 + blockStartPos[q]=blockStartPos[q+1]-period[lagBlock[q+1]]; 1.6569 + NearestNeighbor(lagBlock+q,plocs, 1.6570 + blockStartPos[q]+ 1.6571 + ENH_BLOCKL_HALF-period[lagBlock[q+1]], periodl); 1.6572 + 1.6573 + 1.6574 + if (blockStartPos[q]-ENH_OVERHANG>=0) { 1.6575 + refiner(sseq+q*ENH_BLOCKL, blockStartPos+q, idata, 1.6576 + idatal, centerStartPos, blockStartPos[q], 1.6577 + period[lagBlock[q+1]]); 1.6578 + } else { 1.6579 + psseq=sseq+q*ENH_BLOCKL; 1.6580 + memset(psseq, 0, ENH_BLOCKL*sizeof(float)); 1.6581 + } 1.6582 + } 1.6583 + 1.6584 + /* future */ 1.6585 + 1.6586 + for (i=0; i<periodl; i++) { 1.6587 + plocs2[i]=plocs[i]-period[i]; 1.6588 + } 1.6589 + for (q=hl+1; q<=2*hl; q++) { 1.6590 + NearestNeighbor(lagBlock+q,plocs2, 1.6591 + blockStartPos[q-1]+ENH_BLOCKL_HALF,periodl); 1.6592 + 1.6593 + blockStartPos[q]=blockStartPos[q-1]+period[lagBlock[q]]; 1.6594 + if (blockStartPos[q]+ENH_BLOCKL+ENH_OVERHANG<idatal) { 1.6595 + refiner(sseq+ENH_BLOCKL*q, blockStartPos+q, idata, 1.6596 + idatal, centerStartPos, blockStartPos[q], 1.6597 + period[lagBlock[q]]); 1.6598 + } 1.6599 + else { 1.6600 + psseq=sseq+q*ENH_BLOCKL; 1.6601 + memset(psseq, 0, ENH_BLOCKL*sizeof(float)); 1.6602 + } 1.6603 + } 1.6604 + } 1.6605 + 1.6606 + /*----------------------------------------------------------------* 1.6607 + * perform enhancement on idata+centerStartPos through 1.6608 + * idata+centerStartPos+ENH_BLOCKL-1 1.6609 + *---------------------------------------------------------------*/ 1.6610 + 1.6611 + 1.6612 + 1.6613 +Andersen, et al. Experimental [Page 118] 1.6614 + 1.6615 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.6616 + 1.6617 + 1.6618 + void enhancer( 1.6619 + float *odata, /* (o) smoothed block, dimension blockl */ 1.6620 + float *idata, /* (i) data buffer used for enhancing */ 1.6621 + int idatal, /* (i) dimension idata */ 1.6622 + int centerStartPos, /* (i) first sample current block 1.6623 + within idata */ 1.6624 + float alpha0, /* (i) max correction-energy-fraction 1.6625 + (in [0,1]) */ 1.6626 + float *period, /* (i) pitch period array */ 1.6627 + float *plocs, /* (i) locations where period array 1.6628 + values valid */ 1.6629 + int periodl /* (i) dimension of period and plocs */ 1.6630 + ){ 1.6631 + float sseq[(2*ENH_HL+1)*ENH_BLOCKL]; 1.6632 + 1.6633 + /* get said second sequence of segments */ 1.6634 + 1.6635 + getsseq(sseq,idata,idatal,centerStartPos,period, 1.6636 + plocs,periodl,ENH_HL); 1.6637 + 1.6638 + /* compute the smoothed output from said second sequence */ 1.6639 + 1.6640 + smath(odata,sseq,ENH_HL,alpha0); 1.6641 + 1.6642 + } 1.6643 + 1.6644 + /*----------------------------------------------------------------* 1.6645 + * cross correlation 1.6646 + *---------------------------------------------------------------*/ 1.6647 + 1.6648 + float xCorrCoef( 1.6649 + float *target, /* (i) first array */ 1.6650 + float *regressor, /* (i) second array */ 1.6651 + int subl /* (i) dimension arrays */ 1.6652 + ){ 1.6653 + int i; 1.6654 + float ftmp1, ftmp2; 1.6655 + 1.6656 + ftmp1 = 0.0; 1.6657 + ftmp2 = 0.0; 1.6658 + for (i=0; i<subl; i++) { 1.6659 + ftmp1 += target[i]*regressor[i]; 1.6660 + ftmp2 += regressor[i]*regressor[i]; 1.6661 + } 1.6662 + 1.6663 + if (ftmp1 > 0.0) { 1.6664 + return (float)(ftmp1*ftmp1/ftmp2); 1.6665 + } 1.6666 + 1.6667 + 1.6668 + 1.6669 +Andersen, et al. Experimental [Page 119] 1.6670 + 1.6671 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.6672 + 1.6673 + 1.6674 + else { 1.6675 + return (float)0.0; 1.6676 + } 1.6677 + } 1.6678 + 1.6679 + /*----------------------------------------------------------------* 1.6680 + * interface for enhancer 1.6681 + *---------------------------------------------------------------*/ 1.6682 + 1.6683 + int enhancerInterface( 1.6684 + float *out, /* (o) enhanced signal */ 1.6685 + float *in, /* (i) unenhanced signal */ 1.6686 + iLBC_Dec_Inst_t *iLBCdec_inst /* (i) buffers etc */ 1.6687 + ){ 1.6688 + float *enh_buf, *enh_period; 1.6689 + int iblock, isample; 1.6690 + int lag=0, ilag, i, ioffset; 1.6691 + float cc, maxcc; 1.6692 + float ftmp1, ftmp2; 1.6693 + float *inPtr, *enh_bufPtr1, *enh_bufPtr2; 1.6694 + float plc_pred[ENH_BLOCKL]; 1.6695 + 1.6696 + float lpState[6], downsampled[(ENH_NBLOCKS*ENH_BLOCKL+120)/2]; 1.6697 + int inLen=ENH_NBLOCKS*ENH_BLOCKL+120; 1.6698 + int start, plc_blockl, inlag; 1.6699 + 1.6700 + enh_buf=iLBCdec_inst->enh_buf; 1.6701 + enh_period=iLBCdec_inst->enh_period; 1.6702 + 1.6703 + memmove(enh_buf, &enh_buf[iLBCdec_inst->blockl], 1.6704 + (ENH_BUFL-iLBCdec_inst->blockl)*sizeof(float)); 1.6705 + 1.6706 + memcpy(&enh_buf[ENH_BUFL-iLBCdec_inst->blockl], in, 1.6707 + iLBCdec_inst->blockl*sizeof(float)); 1.6708 + 1.6709 + if (iLBCdec_inst->mode==30) 1.6710 + plc_blockl=ENH_BLOCKL; 1.6711 + else 1.6712 + plc_blockl=40; 1.6713 + 1.6714 + /* when 20 ms frame, move processing one block */ 1.6715 + ioffset=0; 1.6716 + if (iLBCdec_inst->mode==20) ioffset=1; 1.6717 + 1.6718 + i=3-ioffset; 1.6719 + memmove(enh_period, &enh_period[i], 1.6720 + (ENH_NBLOCKS_TOT-i)*sizeof(float)); 1.6721 + 1.6722 + 1.6723 + 1.6724 + 1.6725 +Andersen, et al. Experimental [Page 120] 1.6726 + 1.6727 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.6728 + 1.6729 + 1.6730 + /* Set state information to the 6 samples right before 1.6731 + the samples to be downsampled. */ 1.6732 + 1.6733 + memcpy(lpState, 1.6734 + enh_buf+(ENH_NBLOCKS_EXTRA+ioffset)*ENH_BLOCKL-126, 1.6735 + 6*sizeof(float)); 1.6736 + 1.6737 + /* Down sample a factor 2 to save computations */ 1.6738 + 1.6739 + DownSample(enh_buf+(ENH_NBLOCKS_EXTRA+ioffset)*ENH_BLOCKL-120, 1.6740 + lpFilt_coefsTbl, inLen-ioffset*ENH_BLOCKL, 1.6741 + lpState, downsampled); 1.6742 + 1.6743 + /* Estimate the pitch in the down sampled domain. */ 1.6744 + for (iblock = 0; iblock<ENH_NBLOCKS-ioffset; iblock++) { 1.6745 + 1.6746 + lag = 10; 1.6747 + maxcc = xCorrCoef(downsampled+60+iblock* 1.6748 + ENH_BLOCKL_HALF, downsampled+60+iblock* 1.6749 + ENH_BLOCKL_HALF-lag, ENH_BLOCKL_HALF); 1.6750 + for (ilag=11; ilag<60; ilag++) { 1.6751 + cc = xCorrCoef(downsampled+60+iblock* 1.6752 + ENH_BLOCKL_HALF, downsampled+60+iblock* 1.6753 + ENH_BLOCKL_HALF-ilag, ENH_BLOCKL_HALF); 1.6754 + 1.6755 + if (cc > maxcc) { 1.6756 + maxcc = cc; 1.6757 + lag = ilag; 1.6758 + } 1.6759 + } 1.6760 + 1.6761 + /* Store the estimated lag in the non-downsampled domain */ 1.6762 + enh_period[iblock+ENH_NBLOCKS_EXTRA+ioffset] = (float)lag*2; 1.6763 + 1.6764 + 1.6765 + } 1.6766 + 1.6767 + 1.6768 + /* PLC was performed on the previous packet */ 1.6769 + if (iLBCdec_inst->prev_enh_pl==1) { 1.6770 + 1.6771 + inlag=(int)enh_period[ENH_NBLOCKS_EXTRA+ioffset]; 1.6772 + 1.6773 + lag = inlag-1; 1.6774 + maxcc = xCorrCoef(in, in+lag, plc_blockl); 1.6775 + for (ilag=inlag; ilag<=inlag+1; ilag++) { 1.6776 + cc = xCorrCoef(in, in+ilag, plc_blockl); 1.6777 + 1.6778 + 1.6779 + 1.6780 + 1.6781 +Andersen, et al. Experimental [Page 121] 1.6782 + 1.6783 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.6784 + 1.6785 + 1.6786 + if (cc > maxcc) { 1.6787 + maxcc = cc; 1.6788 + lag = ilag; 1.6789 + } 1.6790 + } 1.6791 + 1.6792 + enh_period[ENH_NBLOCKS_EXTRA+ioffset-1]=(float)lag; 1.6793 + 1.6794 + /* compute new concealed residual for the old lookahead, 1.6795 + mix the forward PLC with a backward PLC from 1.6796 + the new frame */ 1.6797 + 1.6798 + inPtr=&in[lag-1]; 1.6799 + 1.6800 + enh_bufPtr1=&plc_pred[plc_blockl-1]; 1.6801 + 1.6802 + if (lag>plc_blockl) { 1.6803 + start=plc_blockl; 1.6804 + } else { 1.6805 + start=lag; 1.6806 + } 1.6807 + 1.6808 + for (isample = start; isample>0; isample--) { 1.6809 + *enh_bufPtr1-- = *inPtr--; 1.6810 + } 1.6811 + 1.6812 + enh_bufPtr2=&enh_buf[ENH_BUFL-1-iLBCdec_inst->blockl]; 1.6813 + for (isample = (plc_blockl-1-lag); isample>=0; isample--) { 1.6814 + *enh_bufPtr1-- = *enh_bufPtr2--; 1.6815 + } 1.6816 + 1.6817 + /* limit energy change */ 1.6818 + ftmp2=0.0; 1.6819 + ftmp1=0.0; 1.6820 + for (i=0;i<plc_blockl;i++) { 1.6821 + ftmp2+=enh_buf[ENH_BUFL-1-iLBCdec_inst->blockl-i]* 1.6822 + enh_buf[ENH_BUFL-1-iLBCdec_inst->blockl-i]; 1.6823 + ftmp1+=plc_pred[i]*plc_pred[i]; 1.6824 + } 1.6825 + ftmp1=(float)sqrt(ftmp1/(float)plc_blockl); 1.6826 + ftmp2=(float)sqrt(ftmp2/(float)plc_blockl); 1.6827 + if (ftmp1>(float)2.0*ftmp2 && ftmp1>0.0) { 1.6828 + for (i=0;i<plc_blockl-10;i++) { 1.6829 + plc_pred[i]*=(float)2.0*ftmp2/ftmp1; 1.6830 + } 1.6831 + for (i=plc_blockl-10;i<plc_blockl;i++) { 1.6832 + plc_pred[i]*=(float)(i-plc_blockl+10)* 1.6833 + ((float)1.0-(float)2.0*ftmp2/ftmp1)/(float)(10)+ 1.6834 + 1.6835 + 1.6836 + 1.6837 +Andersen, et al. Experimental [Page 122] 1.6838 + 1.6839 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.6840 + 1.6841 + 1.6842 + (float)2.0*ftmp2/ftmp1; 1.6843 + } 1.6844 + } 1.6845 + 1.6846 + enh_bufPtr1=&enh_buf[ENH_BUFL-1-iLBCdec_inst->blockl]; 1.6847 + for (i=0; i<plc_blockl; i++) { 1.6848 + ftmp1 = (float) (i+1) / (float) (plc_blockl+1); 1.6849 + *enh_bufPtr1 *= ftmp1; 1.6850 + *enh_bufPtr1 += ((float)1.0-ftmp1)* 1.6851 + plc_pred[plc_blockl-1-i]; 1.6852 + enh_bufPtr1--; 1.6853 + } 1.6854 + } 1.6855 + 1.6856 + if (iLBCdec_inst->mode==20) { 1.6857 + /* Enhancer with 40 samples delay */ 1.6858 + for (iblock = 0; iblock<2; iblock++) { 1.6859 + enhancer(out+iblock*ENH_BLOCKL, enh_buf, 1.6860 + ENH_BUFL, (5+iblock)*ENH_BLOCKL+40, 1.6861 + ENH_ALPHA0, enh_period, enh_plocsTbl, 1.6862 + ENH_NBLOCKS_TOT); 1.6863 + } 1.6864 + } else if (iLBCdec_inst->mode==30) { 1.6865 + /* Enhancer with 80 samples delay */ 1.6866 + for (iblock = 0; iblock<3; iblock++) { 1.6867 + enhancer(out+iblock*ENH_BLOCKL, enh_buf, 1.6868 + ENH_BUFL, (4+iblock)*ENH_BLOCKL, 1.6869 + ENH_ALPHA0, enh_period, enh_plocsTbl, 1.6870 + ENH_NBLOCKS_TOT); 1.6871 + } 1.6872 + } 1.6873 + 1.6874 + return (lag*2); 1.6875 + } 1.6876 + 1.6877 +A.17. filter.h 1.6878 + 1.6879 + /****************************************************************** 1.6880 + 1.6881 + iLBC Speech Coder ANSI-C Source Code 1.6882 + 1.6883 + filter.h 1.6884 + 1.6885 + Copyright (C) The Internet Society (2004). 1.6886 + All Rights Reserved. 1.6887 + 1.6888 + ******************************************************************/ 1.6889 + 1.6890 + 1.6891 + 1.6892 + 1.6893 +Andersen, et al. Experimental [Page 123] 1.6894 + 1.6895 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.6896 + 1.6897 + 1.6898 + #ifndef __iLBC_FILTER_H 1.6899 + #define __iLBC_FILTER_H 1.6900 + 1.6901 + void AllPoleFilter( 1.6902 + float *InOut, /* (i/o) on entrance InOut[-orderCoef] to 1.6903 + InOut[-1] contain the state of the 1.6904 + filter (delayed samples). InOut[0] to 1.6905 + InOut[lengthInOut-1] contain the filter 1.6906 + input, on en exit InOut[-orderCoef] to 1.6907 + InOut[-1] is unchanged and InOut[0] to 1.6908 + InOut[lengthInOut-1] contain filtered 1.6909 + samples */ 1.6910 + float *Coef,/* (i) filter coefficients, Coef[0] is assumed 1.6911 + to be 1.0 */ 1.6912 + int lengthInOut,/* (i) number of input/output samples */ 1.6913 + int orderCoef /* (i) number of filter coefficients */ 1.6914 + ); 1.6915 + 1.6916 + void AllZeroFilter( 1.6917 + float *In, /* (i) In[0] to In[lengthInOut-1] contain 1.6918 + filter input samples */ 1.6919 + float *Coef,/* (i) filter coefficients (Coef[0] is assumed 1.6920 + to be 1.0) */ 1.6921 + int lengthInOut,/* (i) number of input/output samples */ 1.6922 + int orderCoef, /* (i) number of filter coefficients */ 1.6923 + float *Out /* (i/o) on entrance Out[-orderCoef] to Out[-1] 1.6924 + contain the filter state, on exit Out[0] 1.6925 + to Out[lengthInOut-1] contain filtered 1.6926 + samples */ 1.6927 + ); 1.6928 + 1.6929 + void ZeroPoleFilter( 1.6930 + float *In, /* (i) In[0] to In[lengthInOut-1] contain filter 1.6931 + input samples In[-orderCoef] to In[-1] 1.6932 + contain state of all-zero section */ 1.6933 + float *ZeroCoef,/* (i) filter coefficients for all-zero 1.6934 + section (ZeroCoef[0] is assumed to 1.6935 + be 1.0) */ 1.6936 + float *PoleCoef,/* (i) filter coefficients for all-pole section 1.6937 + (ZeroCoef[0] is assumed to be 1.0) */ 1.6938 + int lengthInOut,/* (i) number of input/output samples */ 1.6939 + int orderCoef, /* (i) number of filter coefficients */ 1.6940 + float *Out /* (i/o) on entrance Out[-orderCoef] to Out[-1] 1.6941 + contain state of all-pole section. On 1.6942 + exit Out[0] to Out[lengthInOut-1] 1.6943 + contain filtered samples */ 1.6944 + ); 1.6945 + 1.6946 + 1.6947 + 1.6948 + 1.6949 +Andersen, et al. Experimental [Page 124] 1.6950 + 1.6951 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.6952 + 1.6953 + 1.6954 + void DownSample ( 1.6955 + float *In, /* (i) input samples */ 1.6956 + float *Coef, /* (i) filter coefficients */ 1.6957 + int lengthIn, /* (i) number of input samples */ 1.6958 + float *state, /* (i) filter state */ 1.6959 + float *Out /* (o) downsampled output */ 1.6960 + ); 1.6961 + 1.6962 + #endif 1.6963 + 1.6964 +A.18. filter.c 1.6965 + 1.6966 + /****************************************************************** 1.6967 + 1.6968 + iLBC Speech Coder ANSI-C Source Code 1.6969 + 1.6970 + filter.c 1.6971 + 1.6972 + Copyright (C) The Internet Society (2004). 1.6973 + All Rights Reserved. 1.6974 + 1.6975 + ******************************************************************/ 1.6976 + 1.6977 + #include "iLBC_define.h" 1.6978 + 1.6979 + /*----------------------------------------------------------------* 1.6980 + * all-pole filter 1.6981 + *---------------------------------------------------------------*/ 1.6982 + 1.6983 + void AllPoleFilter( 1.6984 + float *InOut, /* (i/o) on entrance InOut[-orderCoef] to 1.6985 + InOut[-1] contain the state of the 1.6986 + filter (delayed samples). InOut[0] to 1.6987 + InOut[lengthInOut-1] contain the filter 1.6988 + input, on en exit InOut[-orderCoef] to 1.6989 + InOut[-1] is unchanged and InOut[0] to 1.6990 + InOut[lengthInOut-1] contain filtered 1.6991 + samples */ 1.6992 + float *Coef,/* (i) filter coefficients, Coef[0] is assumed 1.6993 + to be 1.0 */ 1.6994 + int lengthInOut,/* (i) number of input/output samples */ 1.6995 + int orderCoef /* (i) number of filter coefficients */ 1.6996 + ){ 1.6997 + int n,k; 1.6998 + 1.6999 + for(n=0;n<lengthInOut;n++){ 1.7000 + for(k=1;k<=orderCoef;k++){ 1.7001 + *InOut -= Coef[k]*InOut[-k]; 1.7002 + 1.7003 + 1.7004 + 1.7005 +Andersen, et al. Experimental [Page 125] 1.7006 + 1.7007 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.7008 + 1.7009 + 1.7010 + } 1.7011 + InOut++; 1.7012 + } 1.7013 + } 1.7014 + 1.7015 + /*----------------------------------------------------------------* 1.7016 + * all-zero filter 1.7017 + *---------------------------------------------------------------*/ 1.7018 + 1.7019 + void AllZeroFilter( 1.7020 + float *In, /* (i) In[0] to In[lengthInOut-1] contain 1.7021 + filter input samples */ 1.7022 + float *Coef,/* (i) filter coefficients (Coef[0] is assumed 1.7023 + to be 1.0) */ 1.7024 + int lengthInOut,/* (i) number of input/output samples */ 1.7025 + int orderCoef, /* (i) number of filter coefficients */ 1.7026 + float *Out /* (i/o) on entrance Out[-orderCoef] to Out[-1] 1.7027 + contain the filter state, on exit Out[0] 1.7028 + to Out[lengthInOut-1] contain filtered 1.7029 + samples */ 1.7030 + ){ 1.7031 + int n,k; 1.7032 + 1.7033 + for(n=0;n<lengthInOut;n++){ 1.7034 + *Out = Coef[0]*In[0]; 1.7035 + for(k=1;k<=orderCoef;k++){ 1.7036 + *Out += Coef[k]*In[-k]; 1.7037 + } 1.7038 + Out++; 1.7039 + In++; 1.7040 + } 1.7041 + } 1.7042 + 1.7043 + /*----------------------------------------------------------------* 1.7044 + * pole-zero filter 1.7045 + *---------------------------------------------------------------*/ 1.7046 + 1.7047 + void ZeroPoleFilter( 1.7048 + float *In, /* (i) In[0] to In[lengthInOut-1] contain 1.7049 + filter input samples In[-orderCoef] to 1.7050 + In[-1] contain state of all-zero 1.7051 + section */ 1.7052 + float *ZeroCoef,/* (i) filter coefficients for all-zero 1.7053 + section (ZeroCoef[0] is assumed to 1.7054 + be 1.0) */ 1.7055 + float *PoleCoef,/* (i) filter coefficients for all-pole section 1.7056 + (ZeroCoef[0] is assumed to be 1.0) */ 1.7057 + int lengthInOut,/* (i) number of input/output samples */ 1.7058 + 1.7059 + 1.7060 + 1.7061 +Andersen, et al. Experimental [Page 126] 1.7062 + 1.7063 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.7064 + 1.7065 + 1.7066 + int orderCoef, /* (i) number of filter coefficients */ 1.7067 + float *Out /* (i/o) on entrance Out[-orderCoef] to Out[-1] 1.7068 + contain state of all-pole section. On 1.7069 + exit Out[0] to Out[lengthInOut-1] 1.7070 + contain filtered samples */ 1.7071 + ){ 1.7072 + AllZeroFilter(In,ZeroCoef,lengthInOut,orderCoef,Out); 1.7073 + AllPoleFilter(Out,PoleCoef,lengthInOut,orderCoef); 1.7074 + } 1.7075 + 1.7076 + /*----------------------------------------------------------------* 1.7077 + * downsample (LP filter and decimation) 1.7078 + *---------------------------------------------------------------*/ 1.7079 + 1.7080 + void DownSample ( 1.7081 + float *In, /* (i) input samples */ 1.7082 + float *Coef, /* (i) filter coefficients */ 1.7083 + int lengthIn, /* (i) number of input samples */ 1.7084 + float *state, /* (i) filter state */ 1.7085 + float *Out /* (o) downsampled output */ 1.7086 + ){ 1.7087 + float o; 1.7088 + float *Out_ptr = Out; 1.7089 + float *Coef_ptr, *In_ptr; 1.7090 + float *state_ptr; 1.7091 + int i, j, stop; 1.7092 + 1.7093 + /* LP filter and decimate at the same time */ 1.7094 + 1.7095 + for (i = DELAY_DS; i < lengthIn; i+=FACTOR_DS) 1.7096 + { 1.7097 + Coef_ptr = &Coef[0]; 1.7098 + In_ptr = &In[i]; 1.7099 + state_ptr = &state[FILTERORDER_DS-2]; 1.7100 + 1.7101 + o = (float)0.0; 1.7102 + 1.7103 + stop = (i < FILTERORDER_DS) ? i + 1 : FILTERORDER_DS; 1.7104 + 1.7105 + for (j = 0; j < stop; j++) 1.7106 + { 1.7107 + o += *Coef_ptr++ * (*In_ptr--); 1.7108 + } 1.7109 + for (j = i + 1; j < FILTERORDER_DS; j++) 1.7110 + { 1.7111 + o += *Coef_ptr++ * (*state_ptr--); 1.7112 + } 1.7113 + 1.7114 + 1.7115 + 1.7116 + 1.7117 +Andersen, et al. Experimental [Page 127] 1.7118 + 1.7119 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.7120 + 1.7121 + 1.7122 + *Out_ptr++ = o; 1.7123 + } 1.7124 + 1.7125 + /* Get the last part (use zeros as input for the future) */ 1.7126 + 1.7127 + for (i=(lengthIn+FACTOR_DS); i<(lengthIn+DELAY_DS); 1.7128 + i+=FACTOR_DS) { 1.7129 + 1.7130 + o=(float)0.0; 1.7131 + 1.7132 + if (i<lengthIn) { 1.7133 + Coef_ptr = &Coef[0]; 1.7134 + In_ptr = &In[i]; 1.7135 + for (j=0; j<FILTERORDER_DS; j++) { 1.7136 + o += *Coef_ptr++ * (*Out_ptr--); 1.7137 + } 1.7138 + } else { 1.7139 + Coef_ptr = &Coef[i-lengthIn]; 1.7140 + In_ptr = &In[lengthIn-1]; 1.7141 + for (j=0; j<FILTERORDER_DS-(i-lengthIn); j++) { 1.7142 + o += *Coef_ptr++ * (*In_ptr--); 1.7143 + } 1.7144 + } 1.7145 + *Out_ptr++ = o; 1.7146 + } 1.7147 + } 1.7148 + 1.7149 +A.19. FrameClassify.h 1.7150 + 1.7151 + /****************************************************************** 1.7152 + 1.7153 + iLBC Speech Coder ANSI-C Source Code 1.7154 + 1.7155 + FrameClassify.h 1.7156 + 1.7157 + Copyright (C) The Internet Society (2004). 1.7158 + All Rights Reserved. 1.7159 + 1.7160 + ******************************************************************/ 1.7161 + 1.7162 + #ifndef __iLBC_FRAMECLASSIFY_H 1.7163 + #define __iLBC_FRAMECLASSIFY_H 1.7164 + 1.7165 + int FrameClassify( /* index to the max-energy sub-frame */ 1.7166 + iLBC_Enc_Inst_t *iLBCenc_inst, 1.7167 + /* (i/o) the encoder state structure */ 1.7168 + float *residual /* (i) lpc residual signal */ 1.7169 + ); 1.7170 + 1.7171 + 1.7172 + 1.7173 +Andersen, et al. Experimental [Page 128] 1.7174 + 1.7175 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.7176 + 1.7177 + 1.7178 + #endif 1.7179 + 1.7180 +A.20. FrameClassify.c 1.7181 + 1.7182 + /****************************************************************** 1.7183 + 1.7184 + iLBC Speech Coder ANSI-C Source Code 1.7185 + 1.7186 + FrameClassify.c 1.7187 + 1.7188 + Copyright (C) The Internet Society (2004). 1.7189 + All Rights Reserved. 1.7190 + 1.7191 + ******************************************************************/ 1.7192 + 1.7193 + #include "iLBC_define.h" 1.7194 + 1.7195 + /*---------------------------------------------------------------* 1.7196 + * Classification of subframes to localize start state 1.7197 + *--------------------------------------------------------------*/ 1.7198 + 1.7199 + int FrameClassify( /* index to the max-energy sub-frame */ 1.7200 + iLBC_Enc_Inst_t *iLBCenc_inst, 1.7201 + /* (i/o) the encoder state structure */ 1.7202 + float *residual /* (i) lpc residual signal */ 1.7203 + ) { 1.7204 + float max_ssqEn, fssqEn[NSUB_MAX], bssqEn[NSUB_MAX], *pp; 1.7205 + int n, l, max_ssqEn_n; 1.7206 + const float ssqEn_win[NSUB_MAX-1]={(float)0.8,(float)0.9, 1.7207 + (float)1.0,(float)0.9,(float)0.8}; 1.7208 + const float sampEn_win[5]={(float)1.0/(float)6.0, 1.7209 + (float)2.0/(float)6.0, (float)3.0/(float)6.0, 1.7210 + (float)4.0/(float)6.0, (float)5.0/(float)6.0}; 1.7211 + 1.7212 + /* init the front and back energies to zero */ 1.7213 + 1.7214 + memset(fssqEn, 0, NSUB_MAX*sizeof(float)); 1.7215 + memset(bssqEn, 0, NSUB_MAX*sizeof(float)); 1.7216 + 1.7217 + /* Calculate front of first seqence */ 1.7218 + 1.7219 + n=0; 1.7220 + pp=residual; 1.7221 + for (l=0; l<5; l++) { 1.7222 + fssqEn[n] += sampEn_win[l] * (*pp) * (*pp); 1.7223 + pp++; 1.7224 + } 1.7225 + for (l=5; l<SUBL; l++) { 1.7226 + 1.7227 + 1.7228 + 1.7229 +Andersen, et al. Experimental [Page 129] 1.7230 + 1.7231 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.7232 + 1.7233 + 1.7234 + fssqEn[n] += (*pp) * (*pp); 1.7235 + pp++; 1.7236 + } 1.7237 + 1.7238 + /* Calculate front and back of all middle sequences */ 1.7239 + 1.7240 + for (n=1; n<iLBCenc_inst->nsub-1; n++) { 1.7241 + pp=residual+n*SUBL; 1.7242 + for (l=0; l<5; l++) { 1.7243 + fssqEn[n] += sampEn_win[l] * (*pp) * (*pp); 1.7244 + bssqEn[n] += (*pp) * (*pp); 1.7245 + pp++; 1.7246 + } 1.7247 + for (l=5; l<SUBL-5; l++) { 1.7248 + fssqEn[n] += (*pp) * (*pp); 1.7249 + bssqEn[n] += (*pp) * (*pp); 1.7250 + pp++; 1.7251 + } 1.7252 + for (l=SUBL-5; l<SUBL; l++) { 1.7253 + fssqEn[n] += (*pp) * (*pp); 1.7254 + bssqEn[n] += sampEn_win[SUBL-l-1] * (*pp) * (*pp); 1.7255 + pp++; 1.7256 + } 1.7257 + } 1.7258 + 1.7259 + /* Calculate back of last seqence */ 1.7260 + 1.7261 + n=iLBCenc_inst->nsub-1; 1.7262 + pp=residual+n*SUBL; 1.7263 + for (l=0; l<SUBL-5; l++) { 1.7264 + bssqEn[n] += (*pp) * (*pp); 1.7265 + pp++; 1.7266 + } 1.7267 + for (l=SUBL-5; l<SUBL; l++) { 1.7268 + bssqEn[n] += sampEn_win[SUBL-l-1] * (*pp) * (*pp); 1.7269 + pp++; 1.7270 + } 1.7271 + 1.7272 + /* find the index to the weighted 80 sample with 1.7273 + most energy */ 1.7274 + 1.7275 + if (iLBCenc_inst->mode==20) l=1; 1.7276 + else l=0; 1.7277 + 1.7278 + max_ssqEn=(fssqEn[0]+bssqEn[1])*ssqEn_win[l]; 1.7279 + max_ssqEn_n=1; 1.7280 + for (n=2; n<iLBCenc_inst->nsub; n++) { 1.7281 + 1.7282 + 1.7283 + 1.7284 + 1.7285 +Andersen, et al. Experimental [Page 130] 1.7286 + 1.7287 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.7288 + 1.7289 + 1.7290 + l++; 1.7291 + if ((fssqEn[n-1]+bssqEn[n])*ssqEn_win[l] > max_ssqEn) { 1.7292 + max_ssqEn=(fssqEn[n-1]+bssqEn[n]) * 1.7293 + ssqEn_win[l]; 1.7294 + max_ssqEn_n=n; 1.7295 + } 1.7296 + } 1.7297 + 1.7298 + return max_ssqEn_n; 1.7299 + } 1.7300 + 1.7301 +A.21. gainquant.h 1.7302 + 1.7303 + /****************************************************************** 1.7304 + 1.7305 + iLBC Speech Coder ANSI-C Source Code 1.7306 + 1.7307 + gainquant.h 1.7308 + 1.7309 + Copyright (C) The Internet Society (2004). 1.7310 + All Rights Reserved. 1.7311 + 1.7312 + ******************************************************************/ 1.7313 + 1.7314 + #ifndef __iLBC_GAINQUANT_H 1.7315 + #define __iLBC_GAINQUANT_H 1.7316 + 1.7317 + float gainquant(/* (o) quantized gain value */ 1.7318 + float in, /* (i) gain value */ 1.7319 + float maxIn,/* (i) maximum of gain value */ 1.7320 + int cblen, /* (i) number of quantization indices */ 1.7321 + int *index /* (o) quantization index */ 1.7322 + ); 1.7323 + 1.7324 + float gaindequant( /* (o) quantized gain value */ 1.7325 + int index, /* (i) quantization index */ 1.7326 + float maxIn,/* (i) maximum of unquantized gain */ 1.7327 + int cblen /* (i) number of quantization indices */ 1.7328 + ); 1.7329 + 1.7330 + #endif 1.7331 + 1.7332 +A.22. gainquant.c 1.7333 + 1.7334 + /****************************************************************** 1.7335 + 1.7336 + iLBC Speech Coder ANSI-C Source Code 1.7337 + 1.7338 + 1.7339 + 1.7340 + 1.7341 +Andersen, et al. Experimental [Page 131] 1.7342 + 1.7343 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.7344 + 1.7345 + 1.7346 + gainquant.c 1.7347 + 1.7348 + Copyright (C) The Internet Society (2004). 1.7349 + All Rights Reserved. 1.7350 + 1.7351 + ******************************************************************/ 1.7352 + 1.7353 + #include <string.h> 1.7354 + #include <math.h> 1.7355 + #include "constants.h" 1.7356 + #include "filter.h" 1.7357 + 1.7358 + /*----------------------------------------------------------------* 1.7359 + * quantizer for the gain in the gain-shape coding of residual 1.7360 + *---------------------------------------------------------------*/ 1.7361 + 1.7362 + float gainquant(/* (o) quantized gain value */ 1.7363 + float in, /* (i) gain value */ 1.7364 + float maxIn,/* (i) maximum of gain value */ 1.7365 + int cblen, /* (i) number of quantization indices */ 1.7366 + int *index /* (o) quantization index */ 1.7367 + ){ 1.7368 + int i, tindex; 1.7369 + float minmeasure,measure, *cb, scale; 1.7370 + 1.7371 + /* ensure a lower bound on the scaling factor */ 1.7372 + 1.7373 + scale=maxIn; 1.7374 + 1.7375 + if (scale<0.1) { 1.7376 + scale=(float)0.1; 1.7377 + } 1.7378 + 1.7379 + /* select the quantization table */ 1.7380 + 1.7381 + if (cblen == 8) { 1.7382 + cb = gain_sq3Tbl; 1.7383 + } else if (cblen == 16) { 1.7384 + cb = gain_sq4Tbl; 1.7385 + } else { 1.7386 + cb = gain_sq5Tbl; 1.7387 + } 1.7388 + 1.7389 + /* select the best index in the quantization table */ 1.7390 + 1.7391 + minmeasure=10000000.0; 1.7392 + tindex=0; 1.7393 + for (i=0; i<cblen; i++) { 1.7394 + 1.7395 + 1.7396 + 1.7397 +Andersen, et al. Experimental [Page 132] 1.7398 + 1.7399 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.7400 + 1.7401 + 1.7402 + measure=(in-scale*cb[i])*(in-scale*cb[i]); 1.7403 + 1.7404 + if (measure<minmeasure) { 1.7405 + tindex=i; 1.7406 + minmeasure=measure; 1.7407 + } 1.7408 + } 1.7409 + *index=tindex; 1.7410 + 1.7411 + /* return the quantized value */ 1.7412 + 1.7413 + return scale*cb[tindex]; 1.7414 + } 1.7415 + 1.7416 + /*----------------------------------------------------------------* 1.7417 + * decoder for quantized gains in the gain-shape coding of 1.7418 + * residual 1.7419 + *---------------------------------------------------------------*/ 1.7420 + 1.7421 + float gaindequant( /* (o) quantized gain value */ 1.7422 + int index, /* (i) quantization index */ 1.7423 + float maxIn,/* (i) maximum of unquantized gain */ 1.7424 + int cblen /* (i) number of quantization indices */ 1.7425 + ){ 1.7426 + float scale; 1.7427 + 1.7428 + /* obtain correct scale factor */ 1.7429 + 1.7430 + scale=(float)fabs(maxIn); 1.7431 + 1.7432 + if (scale<0.1) { 1.7433 + scale=(float)0.1; 1.7434 + } 1.7435 + 1.7436 + /* select the quantization table and return the decoded value */ 1.7437 + 1.7438 + if (cblen==8) { 1.7439 + return scale*gain_sq3Tbl[index]; 1.7440 + } else if (cblen==16) { 1.7441 + return scale*gain_sq4Tbl[index]; 1.7442 + } 1.7443 + else if (cblen==32) { 1.7444 + return scale*gain_sq5Tbl[index]; 1.7445 + } 1.7446 + 1.7447 + return 0.0; 1.7448 + } 1.7449 + 1.7450 + 1.7451 + 1.7452 + 1.7453 +Andersen, et al. Experimental [Page 133] 1.7454 + 1.7455 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.7456 + 1.7457 + 1.7458 +A.23. getCBvec.h 1.7459 + 1.7460 + /****************************************************************** 1.7461 + 1.7462 + iLBC Speech Coder ANSI-C Source Code 1.7463 + 1.7464 + getCBvec.h 1.7465 + 1.7466 + Copyright (C) The Internet Society (2004). 1.7467 + All Rights Reserved. 1.7468 + 1.7469 + ******************************************************************/ 1.7470 + 1.7471 + #ifndef __iLBC_GETCBVEC_H 1.7472 + #define __iLBC_GETCBVEC_H 1.7473 + 1.7474 + void getCBvec( 1.7475 + float *cbvec, /* (o) Constructed codebook vector */ 1.7476 + float *mem, /* (i) Codebook buffer */ 1.7477 + int index, /* (i) Codebook index */ 1.7478 + int lMem, /* (i) Length of codebook buffer */ 1.7479 + int cbveclen/* (i) Codebook vector length */ 1.7480 + ); 1.7481 + 1.7482 + #endif 1.7483 + 1.7484 +A.24. getCBvec.c 1.7485 + 1.7486 + /****************************************************************** 1.7487 + 1.7488 + iLBC Speech Coder ANSI-C Source Code 1.7489 + 1.7490 + getCBvec.c 1.7491 + 1.7492 + Copyright (C) The Internet Society (2004). 1.7493 + All Rights Reserved. 1.7494 + 1.7495 + ******************************************************************/ 1.7496 + 1.7497 + #include "iLBC_define.h" 1.7498 + #include "constants.h" 1.7499 + #include <string.h> 1.7500 + 1.7501 + /*----------------------------------------------------------------* 1.7502 + * Construct codebook vector for given index. 1.7503 + *---------------------------------------------------------------*/ 1.7504 + 1.7505 + void getCBvec( 1.7506 + 1.7507 + 1.7508 + 1.7509 +Andersen, et al. Experimental [Page 134] 1.7510 + 1.7511 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.7512 + 1.7513 + 1.7514 + float *cbvec, /* (o) Constructed codebook vector */ 1.7515 + float *mem, /* (i) Codebook buffer */ 1.7516 + int index, /* (i) Codebook index */ 1.7517 + int lMem, /* (i) Length of codebook buffer */ 1.7518 + int cbveclen/* (i) Codebook vector length */ 1.7519 + ){ 1.7520 + int j, k, n, memInd, sFilt; 1.7521 + float tmpbuf[CB_MEML]; 1.7522 + int base_size; 1.7523 + int ilow, ihigh; 1.7524 + float alfa, alfa1; 1.7525 + 1.7526 + /* Determine size of codebook sections */ 1.7527 + 1.7528 + base_size=lMem-cbveclen+1; 1.7529 + 1.7530 + if (cbveclen==SUBL) { 1.7531 + base_size+=cbveclen/2; 1.7532 + } 1.7533 + 1.7534 + /* No filter -> First codebook section */ 1.7535 + 1.7536 + if (index<lMem-cbveclen+1) { 1.7537 + 1.7538 + /* first non-interpolated vectors */ 1.7539 + 1.7540 + k=index+cbveclen; 1.7541 + /* get vector */ 1.7542 + memcpy(cbvec, mem+lMem-k, cbveclen*sizeof(float)); 1.7543 + 1.7544 + } else if (index < base_size) { 1.7545 + 1.7546 + k=2*(index-(lMem-cbveclen+1))+cbveclen; 1.7547 + 1.7548 + ihigh=k/2; 1.7549 + ilow=ihigh-5; 1.7550 + 1.7551 + /* Copy first noninterpolated part */ 1.7552 + 1.7553 + memcpy(cbvec, mem+lMem-k/2, ilow*sizeof(float)); 1.7554 + 1.7555 + /* interpolation */ 1.7556 + 1.7557 + alfa1=(float)0.2; 1.7558 + alfa=0.0; 1.7559 + for (j=ilow; j<ihigh; j++) { 1.7560 + cbvec[j]=((float)1.0-alfa)*mem[lMem-k/2+j]+ 1.7561 + alfa*mem[lMem-k+j]; 1.7562 + 1.7563 + 1.7564 + 1.7565 +Andersen, et al. Experimental [Page 135] 1.7566 + 1.7567 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.7568 + 1.7569 + 1.7570 + alfa+=alfa1; 1.7571 + } 1.7572 + 1.7573 + /* Copy second noninterpolated part */ 1.7574 + 1.7575 + memcpy(cbvec+ihigh, mem+lMem-k+ihigh, 1.7576 + (cbveclen-ihigh)*sizeof(float)); 1.7577 + 1.7578 + } 1.7579 + 1.7580 + /* Higher codebook section based on filtering */ 1.7581 + 1.7582 + else { 1.7583 + 1.7584 + /* first non-interpolated vectors */ 1.7585 + 1.7586 + if (index-base_size<lMem-cbveclen+1) { 1.7587 + float tempbuff2[CB_MEML+CB_FILTERLEN+1]; 1.7588 + float *pos; 1.7589 + float *pp, *pp1; 1.7590 + 1.7591 + memset(tempbuff2, 0, 1.7592 + CB_HALFFILTERLEN*sizeof(float)); 1.7593 + memcpy(&tempbuff2[CB_HALFFILTERLEN], mem, 1.7594 + lMem*sizeof(float)); 1.7595 + memset(&tempbuff2[lMem+CB_HALFFILTERLEN], 0, 1.7596 + (CB_HALFFILTERLEN+1)*sizeof(float)); 1.7597 + 1.7598 + k=index-base_size+cbveclen; 1.7599 + sFilt=lMem-k; 1.7600 + memInd=sFilt+1-CB_HALFFILTERLEN; 1.7601 + 1.7602 + /* do filtering */ 1.7603 + pos=cbvec; 1.7604 + memset(pos, 0, cbveclen*sizeof(float)); 1.7605 + for (n=0; n<cbveclen; n++) { 1.7606 + pp=&tempbuff2[memInd+n+CB_HALFFILTERLEN]; 1.7607 + pp1=&cbfiltersTbl[CB_FILTERLEN-1]; 1.7608 + for (j=0; j<CB_FILTERLEN; j++) { 1.7609 + (*pos)+=(*pp++)*(*pp1--); 1.7610 + } 1.7611 + pos++; 1.7612 + } 1.7613 + } 1.7614 + 1.7615 + /* interpolated vectors */ 1.7616 + 1.7617 + else { 1.7618 + 1.7619 + 1.7620 + 1.7621 +Andersen, et al. Experimental [Page 136] 1.7622 + 1.7623 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.7624 + 1.7625 + 1.7626 + float tempbuff2[CB_MEML+CB_FILTERLEN+1]; 1.7627 + 1.7628 + float *pos; 1.7629 + float *pp, *pp1; 1.7630 + int i; 1.7631 + 1.7632 + memset(tempbuff2, 0, 1.7633 + CB_HALFFILTERLEN*sizeof(float)); 1.7634 + memcpy(&tempbuff2[CB_HALFFILTERLEN], mem, 1.7635 + lMem*sizeof(float)); 1.7636 + memset(&tempbuff2[lMem+CB_HALFFILTERLEN], 0, 1.7637 + (CB_HALFFILTERLEN+1)*sizeof(float)); 1.7638 + 1.7639 + k=2*(index-base_size- 1.7640 + (lMem-cbveclen+1))+cbveclen; 1.7641 + sFilt=lMem-k; 1.7642 + memInd=sFilt+1-CB_HALFFILTERLEN; 1.7643 + 1.7644 + /* do filtering */ 1.7645 + pos=&tmpbuf[sFilt]; 1.7646 + memset(pos, 0, k*sizeof(float)); 1.7647 + for (i=0; i<k; i++) { 1.7648 + pp=&tempbuff2[memInd+i+CB_HALFFILTERLEN]; 1.7649 + pp1=&cbfiltersTbl[CB_FILTERLEN-1]; 1.7650 + for (j=0; j<CB_FILTERLEN; j++) { 1.7651 + (*pos)+=(*pp++)*(*pp1--); 1.7652 + } 1.7653 + pos++; 1.7654 + } 1.7655 + 1.7656 + ihigh=k/2; 1.7657 + ilow=ihigh-5; 1.7658 + 1.7659 + /* Copy first noninterpolated part */ 1.7660 + 1.7661 + memcpy(cbvec, tmpbuf+lMem-k/2, 1.7662 + ilow*sizeof(float)); 1.7663 + 1.7664 + /* interpolation */ 1.7665 + 1.7666 + alfa1=(float)0.2; 1.7667 + alfa=0.0; 1.7668 + for (j=ilow; j<ihigh; j++) { 1.7669 + cbvec[j]=((float)1.0-alfa)* 1.7670 + tmpbuf[lMem-k/2+j]+alfa*tmpbuf[lMem-k+j]; 1.7671 + alfa+=alfa1; 1.7672 + } 1.7673 + 1.7674 + 1.7675 + 1.7676 + 1.7677 +Andersen, et al. Experimental [Page 137] 1.7678 + 1.7679 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.7680 + 1.7681 + 1.7682 + /* Copy second noninterpolated part */ 1.7683 + 1.7684 + memcpy(cbvec+ihigh, tmpbuf+lMem-k+ihigh, 1.7685 + (cbveclen-ihigh)*sizeof(float)); 1.7686 + } 1.7687 + } 1.7688 + } 1.7689 + 1.7690 +A.25. helpfun.h 1.7691 + 1.7692 + /****************************************************************** 1.7693 + 1.7694 + iLBC Speech Coder ANSI-C Source Code 1.7695 + 1.7696 + helpfun.h 1.7697 + 1.7698 + Copyright (C) The Internet Society (2004). 1.7699 + All Rights Reserved. 1.7700 + 1.7701 + ******************************************************************/ 1.7702 + 1.7703 + #ifndef __iLBC_HELPFUN_H 1.7704 + #define __iLBC_HELPFUN_H 1.7705 + 1.7706 + void autocorr( 1.7707 + float *r, /* (o) autocorrelation vector */ 1.7708 + const float *x, /* (i) data vector */ 1.7709 + int N, /* (i) length of data vector */ 1.7710 + int order /* largest lag for calculated 1.7711 + autocorrelations */ 1.7712 + ); 1.7713 + 1.7714 + void window( 1.7715 + float *z, /* (o) the windowed data */ 1.7716 + const float *x, /* (i) the original data vector */ 1.7717 + const float *y, /* (i) the window */ 1.7718 + int N /* (i) length of all vectors */ 1.7719 + ); 1.7720 + 1.7721 + void levdurb( 1.7722 + float *a, /* (o) lpc coefficient vector starting 1.7723 + with 1.0 */ 1.7724 + float *k, /* (o) reflection coefficients */ 1.7725 + float *r, /* (i) autocorrelation vector */ 1.7726 + int order /* (i) order of lpc filter */ 1.7727 + ); 1.7728 + 1.7729 + void interpolate( 1.7730 + 1.7731 + 1.7732 + 1.7733 +Andersen, et al. Experimental [Page 138] 1.7734 + 1.7735 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.7736 + 1.7737 + 1.7738 + float *out, /* (o) the interpolated vector */ 1.7739 + float *in1, /* (i) the first vector for the 1.7740 + interpolation */ 1.7741 + float *in2, /* (i) the second vector for the 1.7742 + interpolation */ 1.7743 + float coef, /* (i) interpolation weights */ 1.7744 + int length /* (i) length of all vectors */ 1.7745 + ); 1.7746 + 1.7747 + void bwexpand( 1.7748 + float *out, /* (o) the bandwidth expanded lpc 1.7749 + coefficients */ 1.7750 + float *in, /* (i) the lpc coefficients before bandwidth 1.7751 + expansion */ 1.7752 + float coef, /* (i) the bandwidth expansion factor */ 1.7753 + int length /* (i) the length of lpc coefficient vectors */ 1.7754 + ); 1.7755 + 1.7756 + void vq( 1.7757 + float *Xq, /* (o) the quantized vector */ 1.7758 + int *index, /* (o) the quantization index */ 1.7759 + const float *CB,/* (i) the vector quantization codebook */ 1.7760 + float *X, /* (i) the vector to quantize */ 1.7761 + int n_cb, /* (i) the number of vectors in the codebook */ 1.7762 + int dim /* (i) the dimension of all vectors */ 1.7763 + ); 1.7764 + 1.7765 + void SplitVQ( 1.7766 + float *qX, /* (o) the quantized vector */ 1.7767 + int *index, /* (o) a vector of indexes for all vector 1.7768 + codebooks in the split */ 1.7769 + float *X, /* (i) the vector to quantize */ 1.7770 + const float *CB,/* (i) the quantizer codebook */ 1.7771 + int nsplit, /* the number of vector splits */ 1.7772 + const int *dim, /* the dimension of X and qX */ 1.7773 + const int *cbsize /* the number of vectors in the codebook */ 1.7774 + ); 1.7775 + 1.7776 + 1.7777 + void sort_sq( 1.7778 + float *xq, /* (o) the quantized value */ 1.7779 + int *index, /* (o) the quantization index */ 1.7780 + float x, /* (i) the value to quantize */ 1.7781 + const float *cb,/* (i) the quantization codebook */ 1.7782 + int cb_size /* (i) the size of the quantization codebook */ 1.7783 + ); 1.7784 + 1.7785 + int LSF_check( /* (o) 1 for stable lsf vectors and 0 for 1.7786 + 1.7787 + 1.7788 + 1.7789 +Andersen, et al. Experimental [Page 139] 1.7790 + 1.7791 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.7792 + 1.7793 + 1.7794 + nonstable ones */ 1.7795 + float *lsf, /* (i) a table of lsf vectors */ 1.7796 + int dim, /* (i) the dimension of each lsf vector */ 1.7797 + int NoAn /* (i) the number of lsf vectors in the 1.7798 + table */ 1.7799 + ); 1.7800 + 1.7801 + #endif 1.7802 + 1.7803 +A.26. helpfun.c 1.7804 + 1.7805 + /****************************************************************** 1.7806 + 1.7807 + iLBC Speech Coder ANSI-C Source Code 1.7808 + 1.7809 + helpfun.c 1.7810 + 1.7811 + Copyright (C) The Internet Society (2004). 1.7812 + All Rights Reserved. 1.7813 + 1.7814 + ******************************************************************/ 1.7815 + 1.7816 + #include <math.h> 1.7817 + 1.7818 + #include "iLBC_define.h" 1.7819 + #include "constants.h" 1.7820 + 1.7821 + /*----------------------------------------------------------------* 1.7822 + * calculation of auto correlation 1.7823 + *---------------------------------------------------------------*/ 1.7824 + 1.7825 + void autocorr( 1.7826 + float *r, /* (o) autocorrelation vector */ 1.7827 + const float *x, /* (i) data vector */ 1.7828 + int N, /* (i) length of data vector */ 1.7829 + int order /* largest lag for calculated 1.7830 + autocorrelations */ 1.7831 + ){ 1.7832 + int lag, n; 1.7833 + float sum; 1.7834 + 1.7835 + for (lag = 0; lag <= order; lag++) { 1.7836 + sum = 0; 1.7837 + for (n = 0; n < N - lag; n++) { 1.7838 + sum += x[n] * x[n+lag]; 1.7839 + } 1.7840 + r[lag] = sum; 1.7841 + } 1.7842 + 1.7843 + 1.7844 + 1.7845 +Andersen, et al. Experimental [Page 140] 1.7846 + 1.7847 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.7848 + 1.7849 + 1.7850 + } 1.7851 + 1.7852 + /*----------------------------------------------------------------* 1.7853 + * window multiplication 1.7854 + *---------------------------------------------------------------*/ 1.7855 + 1.7856 + void window( 1.7857 + float *z, /* (o) the windowed data */ 1.7858 + const float *x, /* (i) the original data vector */ 1.7859 + const float *y, /* (i) the window */ 1.7860 + int N /* (i) length of all vectors */ 1.7861 + ){ 1.7862 + int i; 1.7863 + 1.7864 + for (i = 0; i < N; i++) { 1.7865 + z[i] = x[i] * y[i]; 1.7866 + } 1.7867 + } 1.7868 + 1.7869 + /*----------------------------------------------------------------* 1.7870 + * levinson-durbin solution for lpc coefficients 1.7871 + *---------------------------------------------------------------*/ 1.7872 + 1.7873 + void levdurb( 1.7874 + float *a, /* (o) lpc coefficient vector starting 1.7875 + with 1.0 */ 1.7876 + float *k, /* (o) reflection coefficients */ 1.7877 + float *r, /* (i) autocorrelation vector */ 1.7878 + int order /* (i) order of lpc filter */ 1.7879 + ){ 1.7880 + float sum, alpha; 1.7881 + int m, m_h, i; 1.7882 + 1.7883 + a[0] = 1.0; 1.7884 + 1.7885 + if (r[0] < EPS) { /* if r[0] <= 0, set LPC coeff. to zero */ 1.7886 + for (i = 0; i < order; i++) { 1.7887 + k[i] = 0; 1.7888 + a[i+1] = 0; 1.7889 + } 1.7890 + } else { 1.7891 + a[1] = k[0] = -r[1]/r[0]; 1.7892 + alpha = r[0] + r[1] * k[0]; 1.7893 + for (m = 1; m < order; m++){ 1.7894 + sum = r[m + 1]; 1.7895 + for (i = 0; i < m; i++){ 1.7896 + sum += a[i+1] * r[m - i]; 1.7897 + } 1.7898 + 1.7899 + 1.7900 + 1.7901 +Andersen, et al. Experimental [Page 141] 1.7902 + 1.7903 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.7904 + 1.7905 + 1.7906 + k[m] = -sum / alpha; 1.7907 + alpha += k[m] * sum; 1.7908 + m_h = (m + 1) >> 1; 1.7909 + for (i = 0; i < m_h; i++){ 1.7910 + sum = a[i+1] + k[m] * a[m - i]; 1.7911 + a[m - i] += k[m] * a[i+1]; 1.7912 + a[i+1] = sum; 1.7913 + } 1.7914 + a[m+1] = k[m]; 1.7915 + } 1.7916 + } 1.7917 + } 1.7918 + 1.7919 + /*----------------------------------------------------------------* 1.7920 + * interpolation between vectors 1.7921 + *---------------------------------------------------------------*/ 1.7922 + 1.7923 + void interpolate( 1.7924 + float *out, /* (o) the interpolated vector */ 1.7925 + float *in1, /* (i) the first vector for the 1.7926 + interpolation */ 1.7927 + float *in2, /* (i) the second vector for the 1.7928 + interpolation */ 1.7929 + float coef, /* (i) interpolation weights */ 1.7930 + int length /* (i) length of all vectors */ 1.7931 + ){ 1.7932 + int i; 1.7933 + float invcoef; 1.7934 + 1.7935 + invcoef = (float)1.0 - coef; 1.7936 + for (i = 0; i < length; i++) { 1.7937 + out[i] = coef * in1[i] + invcoef * in2[i]; 1.7938 + } 1.7939 + } 1.7940 + 1.7941 + /*----------------------------------------------------------------* 1.7942 + * lpc bandwidth expansion 1.7943 + *---------------------------------------------------------------*/ 1.7944 + 1.7945 + void bwexpand( 1.7946 + float *out, /* (o) the bandwidth expanded lpc 1.7947 + coefficients */ 1.7948 + float *in, /* (i) the lpc coefficients before bandwidth 1.7949 + expansion */ 1.7950 + float coef, /* (i) the bandwidth expansion factor */ 1.7951 + int length /* (i) the length of lpc coefficient vectors */ 1.7952 + ){ 1.7953 + int i; 1.7954 + 1.7955 + 1.7956 + 1.7957 +Andersen, et al. Experimental [Page 142] 1.7958 + 1.7959 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.7960 + 1.7961 + 1.7962 + float chirp; 1.7963 + 1.7964 + chirp = coef; 1.7965 + 1.7966 + out[0] = in[0]; 1.7967 + for (i = 1; i < length; i++) { 1.7968 + out[i] = chirp * in[i]; 1.7969 + chirp *= coef; 1.7970 + } 1.7971 + } 1.7972 + 1.7973 + /*----------------------------------------------------------------* 1.7974 + * vector quantization 1.7975 + *---------------------------------------------------------------*/ 1.7976 + 1.7977 + void vq( 1.7978 + float *Xq, /* (o) the quantized vector */ 1.7979 + int *index, /* (o) the quantization index */ 1.7980 + const float *CB,/* (i) the vector quantization codebook */ 1.7981 + float *X, /* (i) the vector to quantize */ 1.7982 + int n_cb, /* (i) the number of vectors in the codebook */ 1.7983 + int dim /* (i) the dimension of all vectors */ 1.7984 + ){ 1.7985 + int i, j; 1.7986 + int pos, minindex; 1.7987 + float dist, tmp, mindist; 1.7988 + 1.7989 + pos = 0; 1.7990 + mindist = FLOAT_MAX; 1.7991 + minindex = 0; 1.7992 + for (j = 0; j < n_cb; j++) { 1.7993 + dist = X[0] - CB[pos]; 1.7994 + dist *= dist; 1.7995 + for (i = 1; i < dim; i++) { 1.7996 + tmp = X[i] - CB[pos + i]; 1.7997 + dist += tmp*tmp; 1.7998 + } 1.7999 + 1.8000 + if (dist < mindist) { 1.8001 + mindist = dist; 1.8002 + minindex = j; 1.8003 + } 1.8004 + pos += dim; 1.8005 + } 1.8006 + for (i = 0; i < dim; i++) { 1.8007 + Xq[i] = CB[minindex*dim + i]; 1.8008 + } 1.8009 + *index = minindex; 1.8010 + 1.8011 + 1.8012 + 1.8013 +Andersen, et al. Experimental [Page 143] 1.8014 + 1.8015 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.8016 + 1.8017 + 1.8018 + } 1.8019 + 1.8020 + /*----------------------------------------------------------------* 1.8021 + * split vector quantization 1.8022 + *---------------------------------------------------------------*/ 1.8023 + 1.8024 + void SplitVQ( 1.8025 + float *qX, /* (o) the quantized vector */ 1.8026 + int *index, /* (o) a vector of indexes for all vector 1.8027 + codebooks in the split */ 1.8028 + float *X, /* (i) the vector to quantize */ 1.8029 + const float *CB,/* (i) the quantizer codebook */ 1.8030 + int nsplit, /* the number of vector splits */ 1.8031 + const int *dim, /* the dimension of X and qX */ 1.8032 + const int *cbsize /* the number of vectors in the codebook */ 1.8033 + ){ 1.8034 + int cb_pos, X_pos, i; 1.8035 + 1.8036 + cb_pos = 0; 1.8037 + X_pos= 0; 1.8038 + for (i = 0; i < nsplit; i++) { 1.8039 + vq(qX + X_pos, index + i, CB + cb_pos, X + X_pos, 1.8040 + cbsize[i], dim[i]); 1.8041 + X_pos += dim[i]; 1.8042 + cb_pos += dim[i] * cbsize[i]; 1.8043 + } 1.8044 + } 1.8045 + 1.8046 + /*----------------------------------------------------------------* 1.8047 + * scalar quantization 1.8048 + *---------------------------------------------------------------*/ 1.8049 + 1.8050 + void sort_sq( 1.8051 + float *xq, /* (o) the quantized value */ 1.8052 + int *index, /* (o) the quantization index */ 1.8053 + float x, /* (i) the value to quantize */ 1.8054 + const float *cb,/* (i) the quantization codebook */ 1.8055 + int cb_size /* (i) the size of the quantization codebook */ 1.8056 + ){ 1.8057 + int i; 1.8058 + 1.8059 + if (x <= cb[0]) { 1.8060 + *index = 0; 1.8061 + *xq = cb[0]; 1.8062 + } else { 1.8063 + i = 0; 1.8064 + while ((x > cb[i]) && i < cb_size - 1) { 1.8065 + i++; 1.8066 + 1.8067 + 1.8068 + 1.8069 +Andersen, et al. Experimental [Page 144] 1.8070 + 1.8071 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.8072 + 1.8073 + 1.8074 + } 1.8075 + 1.8076 + if (x > ((cb[i] + cb[i - 1])/2)) { 1.8077 + *index = i; 1.8078 + *xq = cb[i]; 1.8079 + } else { 1.8080 + *index = i - 1; 1.8081 + *xq = cb[i - 1]; 1.8082 + } 1.8083 + } 1.8084 + } 1.8085 + 1.8086 + /*----------------------------------------------------------------* 1.8087 + * check for stability of lsf coefficients 1.8088 + *---------------------------------------------------------------*/ 1.8089 + 1.8090 + int LSF_check( /* (o) 1 for stable lsf vectors and 0 for 1.8091 + nonstable ones */ 1.8092 + float *lsf, /* (i) a table of lsf vectors */ 1.8093 + int dim, /* (i) the dimension of each lsf vector */ 1.8094 + int NoAn /* (i) the number of lsf vectors in the 1.8095 + table */ 1.8096 + ){ 1.8097 + int k,n,m, Nit=2, change=0,pos; 1.8098 + float tmp; 1.8099 + static float eps=(float)0.039; /* 50 Hz */ 1.8100 + static float eps2=(float)0.0195; 1.8101 + static float maxlsf=(float)3.14; /* 4000 Hz */ 1.8102 + static float minlsf=(float)0.01; /* 0 Hz */ 1.8103 + 1.8104 + /* LSF separation check*/ 1.8105 + 1.8106 + for (n=0; n<Nit; n++) { /* Run through a couple of times */ 1.8107 + for (m=0; m<NoAn; m++) { /* Number of analyses per frame */ 1.8108 + for (k=0; k<(dim-1); k++) { 1.8109 + pos=m*dim+k; 1.8110 + 1.8111 + if ((lsf[pos+1]-lsf[pos])<eps) { 1.8112 + 1.8113 + if (lsf[pos+1]<lsf[pos]) { 1.8114 + tmp=lsf[pos+1]; 1.8115 + lsf[pos+1]= lsf[pos]+eps2; 1.8116 + lsf[pos]= lsf[pos+1]-eps2; 1.8117 + } else { 1.8118 + lsf[pos]-=eps2; 1.8119 + lsf[pos+1]+=eps2; 1.8120 + } 1.8121 + change=1; 1.8122 + 1.8123 + 1.8124 + 1.8125 +Andersen, et al. Experimental [Page 145] 1.8126 + 1.8127 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.8128 + 1.8129 + 1.8130 + } 1.8131 + 1.8132 + if (lsf[pos]<minlsf) { 1.8133 + lsf[pos]=minlsf; 1.8134 + change=1; 1.8135 + } 1.8136 + 1.8137 + if (lsf[pos]>maxlsf) { 1.8138 + lsf[pos]=maxlsf; 1.8139 + change=1; 1.8140 + } 1.8141 + } 1.8142 + } 1.8143 + } 1.8144 + 1.8145 + return change; 1.8146 + } 1.8147 + 1.8148 +A.27. hpInput.h 1.8149 + 1.8150 + /****************************************************************** 1.8151 + 1.8152 + iLBC Speech Coder ANSI-C Source Code 1.8153 + 1.8154 + hpInput.h 1.8155 + 1.8156 + Copyright (C) The Internet Society (2004). 1.8157 + All Rights Reserved. 1.8158 + 1.8159 + ******************************************************************/ 1.8160 + 1.8161 + #ifndef __iLBC_HPINPUT_H 1.8162 + #define __iLBC_HPINPUT_H 1.8163 + 1.8164 + void hpInput( 1.8165 + float *In, /* (i) vector to filter */ 1.8166 + int len, /* (i) length of vector to filter */ 1.8167 + float *Out, /* (o) the resulting filtered vector */ 1.8168 + float *mem /* (i/o) the filter state */ 1.8169 + ); 1.8170 + 1.8171 + #endif 1.8172 + 1.8173 +A.28. hpInput.c 1.8174 + 1.8175 + /****************************************************************** 1.8176 + 1.8177 + iLBC Speech Coder ANSI-C Source Code 1.8178 + 1.8179 + 1.8180 + 1.8181 +Andersen, et al. Experimental [Page 146] 1.8182 + 1.8183 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.8184 + 1.8185 + 1.8186 + hpInput.c 1.8187 + 1.8188 + Copyright (C) The Internet Society (2004). 1.8189 + All Rights Reserved. 1.8190 + 1.8191 + ******************************************************************/ 1.8192 + 1.8193 + #include "constants.h" 1.8194 + 1.8195 + /*----------------------------------------------------------------* 1.8196 + * Input high-pass filter 1.8197 + *---------------------------------------------------------------*/ 1.8198 + 1.8199 + void hpInput( 1.8200 + float *In, /* (i) vector to filter */ 1.8201 + int len, /* (i) length of vector to filter */ 1.8202 + float *Out, /* (o) the resulting filtered vector */ 1.8203 + float *mem /* (i/o) the filter state */ 1.8204 + ){ 1.8205 + int i; 1.8206 + float *pi, *po; 1.8207 + 1.8208 + /* all-zero section*/ 1.8209 + 1.8210 + pi = &In[0]; 1.8211 + po = &Out[0]; 1.8212 + for (i=0; i<len; i++) { 1.8213 + *po = hpi_zero_coefsTbl[0] * (*pi); 1.8214 + *po += hpi_zero_coefsTbl[1] * mem[0]; 1.8215 + *po += hpi_zero_coefsTbl[2] * mem[1]; 1.8216 + 1.8217 + mem[1] = mem[0]; 1.8218 + mem[0] = *pi; 1.8219 + po++; 1.8220 + pi++; 1.8221 + 1.8222 + } 1.8223 + 1.8224 + /* all-pole section*/ 1.8225 + 1.8226 + po = &Out[0]; 1.8227 + for (i=0; i<len; i++) { 1.8228 + *po -= hpi_pole_coefsTbl[1] * mem[2]; 1.8229 + *po -= hpi_pole_coefsTbl[2] * mem[3]; 1.8230 + 1.8231 + mem[3] = mem[2]; 1.8232 + mem[2] = *po; 1.8233 + po++; 1.8234 + 1.8235 + 1.8236 + 1.8237 +Andersen, et al. Experimental [Page 147] 1.8238 + 1.8239 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.8240 + 1.8241 + 1.8242 + } 1.8243 + } 1.8244 + 1.8245 +A.29. hpOutput.h 1.8246 + 1.8247 + /****************************************************************** 1.8248 + 1.8249 + iLBC Speech Coder ANSI-C Source Code 1.8250 + 1.8251 + hpOutput.h 1.8252 + 1.8253 + Copyright (C) The Internet Society (2004). 1.8254 + All Rights Reserved. 1.8255 + 1.8256 + ******************************************************************/ 1.8257 + 1.8258 + #ifndef __iLBC_HPOUTPUT_H 1.8259 + #define __iLBC_HPOUTPUT_H 1.8260 + 1.8261 + void hpOutput( 1.8262 + float *In, /* (i) vector to filter */ 1.8263 + int len,/* (i) length of vector to filter */ 1.8264 + float *Out, /* (o) the resulting filtered vector */ 1.8265 + float *mem /* (i/o) the filter state */ 1.8266 + ); 1.8267 + 1.8268 + #endif 1.8269 + 1.8270 +A.30. hpOutput.c 1.8271 + 1.8272 + /****************************************************************** 1.8273 + 1.8274 + iLBC Speech Coder ANSI-C Source Code 1.8275 + 1.8276 + hpOutput.c 1.8277 + 1.8278 + Copyright (C) The Internet Society (2004). 1.8279 + All Rights Reserved. 1.8280 + 1.8281 + ******************************************************************/ 1.8282 + 1.8283 + #include "constants.h" 1.8284 + 1.8285 + /*----------------------------------------------------------------* 1.8286 + * Output high-pass filter 1.8287 + *---------------------------------------------------------------*/ 1.8288 + 1.8289 + void hpOutput( 1.8290 + 1.8291 + 1.8292 + 1.8293 +Andersen, et al. Experimental [Page 148] 1.8294 + 1.8295 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.8296 + 1.8297 + 1.8298 + float *In, /* (i) vector to filter */ 1.8299 + int len,/* (i) length of vector to filter */ 1.8300 + float *Out, /* (o) the resulting filtered vector */ 1.8301 + float *mem /* (i/o) the filter state */ 1.8302 + ){ 1.8303 + int i; 1.8304 + float *pi, *po; 1.8305 + 1.8306 + /* all-zero section*/ 1.8307 + 1.8308 + pi = &In[0]; 1.8309 + po = &Out[0]; 1.8310 + for (i=0; i<len; i++) { 1.8311 + *po = hpo_zero_coefsTbl[0] * (*pi); 1.8312 + *po += hpo_zero_coefsTbl[1] * mem[0]; 1.8313 + *po += hpo_zero_coefsTbl[2] * mem[1]; 1.8314 + 1.8315 + mem[1] = mem[0]; 1.8316 + mem[0] = *pi; 1.8317 + po++; 1.8318 + pi++; 1.8319 + 1.8320 + } 1.8321 + 1.8322 + /* all-pole section*/ 1.8323 + 1.8324 + po = &Out[0]; 1.8325 + for (i=0; i<len; i++) { 1.8326 + *po -= hpo_pole_coefsTbl[1] * mem[2]; 1.8327 + *po -= hpo_pole_coefsTbl[2] * mem[3]; 1.8328 + 1.8329 + mem[3] = mem[2]; 1.8330 + mem[2] = *po; 1.8331 + po++; 1.8332 + } 1.8333 + } 1.8334 + 1.8335 +A.31. iCBConstruct.h 1.8336 + 1.8337 + /****************************************************************** 1.8338 + 1.8339 + iLBC Speech Coder ANSI-C Source Code 1.8340 + 1.8341 + iCBConstruct.h 1.8342 + 1.8343 + Copyright (C) The Internet Society (2004). 1.8344 + All Rights Reserved. 1.8345 + 1.8346 + 1.8347 + 1.8348 + 1.8349 +Andersen, et al. Experimental [Page 149] 1.8350 + 1.8351 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.8352 + 1.8353 + 1.8354 + ******************************************************************/ 1.8355 + 1.8356 + #ifndef __iLBC_ICBCONSTRUCT_H 1.8357 + #define __iLBC_ICBCONSTRUCT_H 1.8358 + 1.8359 + void index_conv_enc( 1.8360 + int *index /* (i/o) Codebook indexes */ 1.8361 + ); 1.8362 + 1.8363 + void index_conv_dec( 1.8364 + int *index /* (i/o) Codebook indexes */ 1.8365 + ); 1.8366 + 1.8367 + void iCBConstruct( 1.8368 + float *decvector, /* (o) Decoded vector */ 1.8369 + int *index, /* (i) Codebook indices */ 1.8370 + int *gain_index,/* (i) Gain quantization indices */ 1.8371 + float *mem, /* (i) Buffer for codevector construction */ 1.8372 + int lMem, /* (i) Length of buffer */ 1.8373 + int veclen, /* (i) Length of vector */ 1.8374 + int nStages /* (i) Number of codebook stages */ 1.8375 + ); 1.8376 + 1.8377 + #endif 1.8378 + 1.8379 +A.32. iCBConstruct.c 1.8380 + 1.8381 + /****************************************************************** 1.8382 + 1.8383 + iLBC Speech Coder ANSI-C Source Code 1.8384 + 1.8385 + iCBConstruct.c 1.8386 + 1.8387 + Copyright (C) The Internet Society (2004). 1.8388 + All Rights Reserved. 1.8389 + 1.8390 + ******************************************************************/ 1.8391 + 1.8392 + #include <math.h> 1.8393 + 1.8394 + #include "iLBC_define.h" 1.8395 + #include "gainquant.h" 1.8396 + #include "getCBvec.h" 1.8397 + 1.8398 + /*----------------------------------------------------------------* 1.8399 + * Convert the codebook indexes to make the search easier 1.8400 + *---------------------------------------------------------------*/ 1.8401 + 1.8402 + 1.8403 + 1.8404 + 1.8405 +Andersen, et al. Experimental [Page 150] 1.8406 + 1.8407 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.8408 + 1.8409 + 1.8410 + void index_conv_enc( 1.8411 + int *index /* (i/o) Codebook indexes */ 1.8412 + ){ 1.8413 + int k; 1.8414 + 1.8415 + for (k=1; k<CB_NSTAGES; k++) { 1.8416 + 1.8417 + if ((index[k]>=108)&&(index[k]<172)) { 1.8418 + index[k]-=64; 1.8419 + } else if (index[k]>=236) { 1.8420 + index[k]-=128; 1.8421 + } else { 1.8422 + /* ERROR */ 1.8423 + } 1.8424 + } 1.8425 + } 1.8426 + 1.8427 + void index_conv_dec( 1.8428 + int *index /* (i/o) Codebook indexes */ 1.8429 + ){ 1.8430 + int k; 1.8431 + 1.8432 + for (k=1; k<CB_NSTAGES; k++) { 1.8433 + 1.8434 + if ((index[k]>=44)&&(index[k]<108)) { 1.8435 + index[k]+=64; 1.8436 + } else if ((index[k]>=108)&&(index[k]<128)) { 1.8437 + index[k]+=128; 1.8438 + } else { 1.8439 + /* ERROR */ 1.8440 + } 1.8441 + } 1.8442 + } 1.8443 + 1.8444 + /*----------------------------------------------------------------* 1.8445 + * Construct decoded vector from codebook and gains. 1.8446 + *---------------------------------------------------------------*/ 1.8447 + 1.8448 + void iCBConstruct( 1.8449 + float *decvector, /* (o) Decoded vector */ 1.8450 + int *index, /* (i) Codebook indices */ 1.8451 + int *gain_index,/* (i) Gain quantization indices */ 1.8452 + float *mem, /* (i) Buffer for codevector construction */ 1.8453 + int lMem, /* (i) Length of buffer */ 1.8454 + int veclen, /* (i) Length of vector */ 1.8455 + int nStages /* (i) Number of codebook stages */ 1.8456 + ){ 1.8457 + int j,k; 1.8458 + 1.8459 + 1.8460 + 1.8461 +Andersen, et al. Experimental [Page 151] 1.8462 + 1.8463 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.8464 + 1.8465 + 1.8466 + float gain[CB_NSTAGES]; 1.8467 + float cbvec[SUBL]; 1.8468 + 1.8469 + /* gain de-quantization */ 1.8470 + 1.8471 + gain[0] = gaindequant(gain_index[0], 1.0, 32); 1.8472 + if (nStages > 1) { 1.8473 + gain[1] = gaindequant(gain_index[1], 1.8474 + (float)fabs(gain[0]), 16); 1.8475 + } 1.8476 + if (nStages > 2) { 1.8477 + gain[2] = gaindequant(gain_index[2], 1.8478 + (float)fabs(gain[1]), 8); 1.8479 + } 1.8480 + 1.8481 + /* codebook vector construction and construction of 1.8482 + total vector */ 1.8483 + 1.8484 + getCBvec(cbvec, mem, index[0], lMem, veclen); 1.8485 + for (j=0;j<veclen;j++){ 1.8486 + decvector[j] = gain[0]*cbvec[j]; 1.8487 + } 1.8488 + if (nStages > 1) { 1.8489 + for (k=1; k<nStages; k++) { 1.8490 + getCBvec(cbvec, mem, index[k], lMem, veclen); 1.8491 + for (j=0;j<veclen;j++) { 1.8492 + decvector[j] += gain[k]*cbvec[j]; 1.8493 + } 1.8494 + } 1.8495 + } 1.8496 + } 1.8497 + 1.8498 +A.33. iCBSearch.h 1.8499 + 1.8500 + /****************************************************************** 1.8501 + 1.8502 + iLBC Speech Coder ANSI-C Source Code 1.8503 + 1.8504 + iCBSearch.h 1.8505 + 1.8506 + Copyright (C) The Internet Society (2004). 1.8507 + All Rights Reserved. 1.8508 + 1.8509 + ******************************************************************/ 1.8510 + 1.8511 + #ifndef __iLBC_ICBSEARCH_H 1.8512 + #define __iLBC_ICBSEARCH_H 1.8513 + 1.8514 + 1.8515 + 1.8516 + 1.8517 +Andersen, et al. Experimental [Page 152] 1.8518 + 1.8519 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.8520 + 1.8521 + 1.8522 + void iCBSearch( 1.8523 + iLBC_Enc_Inst_t *iLBCenc_inst, 1.8524 + /* (i) the encoder state structure */ 1.8525 + int *index, /* (o) Codebook indices */ 1.8526 + int *gain_index,/* (o) Gain quantization indices */ 1.8527 + float *intarget,/* (i) Target vector for encoding */ 1.8528 + float *mem, /* (i) Buffer for codebook construction */ 1.8529 + int lMem, /* (i) Length of buffer */ 1.8530 + int lTarget, /* (i) Length of vector */ 1.8531 + int nStages, /* (i) Number of codebook stages */ 1.8532 + float *weightDenum, /* (i) weighting filter coefficients */ 1.8533 + float *weightState, /* (i) weighting filter state */ 1.8534 + int block /* (i) the sub-block number */ 1.8535 + ); 1.8536 + 1.8537 + #endif 1.8538 + 1.8539 +A.34. iCBSearch.c 1.8540 + 1.8541 + /****************************************************************** 1.8542 + 1.8543 + iLBC Speech Coder ANSI-C Source Code 1.8544 + 1.8545 + iCBSearch.c 1.8546 + 1.8547 + Copyright (C) The Internet Society (2004). 1.8548 + All Rights Reserved. 1.8549 + 1.8550 + ******************************************************************/ 1.8551 + 1.8552 + #include <math.h> 1.8553 + #include <string.h> 1.8554 + 1.8555 + #include "iLBC_define.h" 1.8556 + #include "gainquant.h" 1.8557 + #include "createCB.h" 1.8558 + #include "filter.h" 1.8559 + #include "constants.h" 1.8560 + 1.8561 + /*----------------------------------------------------------------* 1.8562 + * Search routine for codebook encoding and gain quantization. 1.8563 + *---------------------------------------------------------------*/ 1.8564 + 1.8565 + void iCBSearch( 1.8566 + iLBC_Enc_Inst_t *iLBCenc_inst, 1.8567 + /* (i) the encoder state structure */ 1.8568 + int *index, /* (o) Codebook indices */ 1.8569 + int *gain_index,/* (o) Gain quantization indices */ 1.8570 + 1.8571 + 1.8572 + 1.8573 +Andersen, et al. Experimental [Page 153] 1.8574 + 1.8575 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.8576 + 1.8577 + 1.8578 + float *intarget,/* (i) Target vector for encoding */ 1.8579 + float *mem, /* (i) Buffer for codebook construction */ 1.8580 + int lMem, /* (i) Length of buffer */ 1.8581 + int lTarget, /* (i) Length of vector */ 1.8582 + int nStages, /* (i) Number of codebook stages */ 1.8583 + float *weightDenum, /* (i) weighting filter coefficients */ 1.8584 + float *weightState, /* (i) weighting filter state */ 1.8585 + int block /* (i) the sub-block number */ 1.8586 + ){ 1.8587 + int i, j, icount, stage, best_index, range, counter; 1.8588 + float max_measure, gain, measure, crossDot, ftmp; 1.8589 + float gains[CB_NSTAGES]; 1.8590 + float target[SUBL]; 1.8591 + int base_index, sInd, eInd, base_size; 1.8592 + int sIndAug=0, eIndAug=0; 1.8593 + float buf[CB_MEML+SUBL+2*LPC_FILTERORDER]; 1.8594 + float invenergy[CB_EXPAND*128], energy[CB_EXPAND*128]; 1.8595 + float *pp, *ppi=0, *ppo=0, *ppe=0; 1.8596 + float cbvectors[CB_MEML]; 1.8597 + float tene, cene, cvec[SUBL]; 1.8598 + float aug_vec[SUBL]; 1.8599 + 1.8600 + memset(cvec,0,SUBL*sizeof(float)); 1.8601 + 1.8602 + /* Determine size of codebook sections */ 1.8603 + 1.8604 + base_size=lMem-lTarget+1; 1.8605 + 1.8606 + if (lTarget==SUBL) { 1.8607 + base_size=lMem-lTarget+1+lTarget/2; 1.8608 + } 1.8609 + 1.8610 + /* setup buffer for weighting */ 1.8611 + 1.8612 + memcpy(buf,weightState,sizeof(float)*LPC_FILTERORDER); 1.8613 + memcpy(buf+LPC_FILTERORDER,mem,lMem*sizeof(float)); 1.8614 + memcpy(buf+LPC_FILTERORDER+lMem,intarget,lTarget*sizeof(float)); 1.8615 + 1.8616 + /* weighting */ 1.8617 + 1.8618 + AllPoleFilter(buf+LPC_FILTERORDER, weightDenum, 1.8619 + lMem+lTarget, LPC_FILTERORDER); 1.8620 + 1.8621 + /* Construct the codebook and target needed */ 1.8622 + 1.8623 + memcpy(target, buf+LPC_FILTERORDER+lMem, lTarget*sizeof(float)); 1.8624 + 1.8625 + tene=0.0; 1.8626 + 1.8627 + 1.8628 + 1.8629 +Andersen, et al. Experimental [Page 154] 1.8630 + 1.8631 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.8632 + 1.8633 + 1.8634 + for (i=0; i<lTarget; i++) { 1.8635 + tene+=target[i]*target[i]; 1.8636 + } 1.8637 + 1.8638 + /* Prepare search over one more codebook section. This section 1.8639 + is created by filtering the original buffer with a filter. */ 1.8640 + 1.8641 + filteredCBvecs(cbvectors, buf+LPC_FILTERORDER, lMem); 1.8642 + 1.8643 + /* The Main Loop over stages */ 1.8644 + 1.8645 + for (stage=0; stage<nStages; stage++) { 1.8646 + 1.8647 + range = search_rangeTbl[block][stage]; 1.8648 + 1.8649 + /* initialize search measure */ 1.8650 + 1.8651 + max_measure = (float)-10000000.0; 1.8652 + gain = (float)0.0; 1.8653 + best_index = 0; 1.8654 + 1.8655 + /* Compute cross dot product between the target 1.8656 + and the CB memory */ 1.8657 + 1.8658 + crossDot=0.0; 1.8659 + pp=buf+LPC_FILTERORDER+lMem-lTarget; 1.8660 + for (j=0; j<lTarget; j++) { 1.8661 + crossDot += target[j]*(*pp++); 1.8662 + } 1.8663 + 1.8664 + if (stage==0) { 1.8665 + 1.8666 + /* Calculate energy in the first block of 1.8667 + 'lTarget' samples. */ 1.8668 + ppe = energy; 1.8669 + ppi = buf+LPC_FILTERORDER+lMem-lTarget-1; 1.8670 + ppo = buf+LPC_FILTERORDER+lMem-1; 1.8671 + 1.8672 + *ppe=0.0; 1.8673 + pp=buf+LPC_FILTERORDER+lMem-lTarget; 1.8674 + for (j=0; j<lTarget; j++) { 1.8675 + *ppe+=(*pp)*(*pp++); 1.8676 + } 1.8677 + 1.8678 + if (*ppe>0.0) { 1.8679 + invenergy[0] = (float) 1.0 / (*ppe + EPS); 1.8680 + } else { 1.8681 + invenergy[0] = (float) 0.0; 1.8682 + 1.8683 + 1.8684 + 1.8685 +Andersen, et al. Experimental [Page 155] 1.8686 + 1.8687 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.8688 + 1.8689 + 1.8690 + } 1.8691 + ppe++; 1.8692 + 1.8693 + measure=(float)-10000000.0; 1.8694 + 1.8695 + if (crossDot > 0.0) { 1.8696 + measure = crossDot*crossDot*invenergy[0]; 1.8697 + } 1.8698 + } 1.8699 + else { 1.8700 + measure = crossDot*crossDot*invenergy[0]; 1.8701 + } 1.8702 + 1.8703 + /* check if measure is better */ 1.8704 + ftmp = crossDot*invenergy[0]; 1.8705 + 1.8706 + if ((measure>max_measure) && (fabs(ftmp)<CB_MAXGAIN)) { 1.8707 + best_index = 0; 1.8708 + max_measure = measure; 1.8709 + gain = ftmp; 1.8710 + } 1.8711 + 1.8712 + /* loop over the main first codebook section, 1.8713 + full search */ 1.8714 + 1.8715 + for (icount=1; icount<range; icount++) { 1.8716 + 1.8717 + /* calculate measure */ 1.8718 + 1.8719 + crossDot=0.0; 1.8720 + pp = buf+LPC_FILTERORDER+lMem-lTarget-icount; 1.8721 + 1.8722 + for (j=0; j<lTarget; j++) { 1.8723 + crossDot += target[j]*(*pp++); 1.8724 + } 1.8725 + 1.8726 + if (stage==0) { 1.8727 + *ppe++ = energy[icount-1] + (*ppi)*(*ppi) - 1.8728 + (*ppo)*(*ppo); 1.8729 + ppo--; 1.8730 + ppi--; 1.8731 + 1.8732 + if (energy[icount]>0.0) { 1.8733 + invenergy[icount] = 1.8734 + (float)1.0/(energy[icount]+EPS); 1.8735 + } else { 1.8736 + invenergy[icount] = (float) 0.0; 1.8737 + } 1.8738 + 1.8739 + 1.8740 + 1.8741 +Andersen, et al. Experimental [Page 156] 1.8742 + 1.8743 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.8744 + 1.8745 + 1.8746 + measure=(float)-10000000.0; 1.8747 + 1.8748 + if (crossDot > 0.0) { 1.8749 + measure = crossDot*crossDot*invenergy[icount]; 1.8750 + } 1.8751 + } 1.8752 + else { 1.8753 + measure = crossDot*crossDot*invenergy[icount]; 1.8754 + } 1.8755 + 1.8756 + /* check if measure is better */ 1.8757 + ftmp = crossDot*invenergy[icount]; 1.8758 + 1.8759 + if ((measure>max_measure) && (fabs(ftmp)<CB_MAXGAIN)) { 1.8760 + best_index = icount; 1.8761 + max_measure = measure; 1.8762 + gain = ftmp; 1.8763 + } 1.8764 + } 1.8765 + 1.8766 + /* Loop over augmented part in the first codebook 1.8767 + * section, full search. 1.8768 + * The vectors are interpolated. 1.8769 + */ 1.8770 + 1.8771 + if (lTarget==SUBL) { 1.8772 + 1.8773 + /* Search for best possible cb vector and 1.8774 + compute the CB-vectors' energy. */ 1.8775 + searchAugmentedCB(20, 39, stage, base_size-lTarget/2, 1.8776 + target, buf+LPC_FILTERORDER+lMem, 1.8777 + &max_measure, &best_index, &gain, energy, 1.8778 + invenergy); 1.8779 + } 1.8780 + 1.8781 + /* set search range for following codebook sections */ 1.8782 + 1.8783 + base_index=best_index; 1.8784 + 1.8785 + /* unrestricted search */ 1.8786 + 1.8787 + if (CB_RESRANGE == -1) { 1.8788 + sInd=0; 1.8789 + eInd=range-1; 1.8790 + sIndAug=20; 1.8791 + eIndAug=39; 1.8792 + } 1.8793 + 1.8794 + 1.8795 + 1.8796 + 1.8797 +Andersen, et al. Experimental [Page 157] 1.8798 + 1.8799 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.8800 + 1.8801 + 1.8802 + /* restricted search around best index from first 1.8803 + codebook section */ 1.8804 + 1.8805 + else { 1.8806 + /* Initialize search indices */ 1.8807 + sIndAug=0; 1.8808 + eIndAug=0; 1.8809 + sInd=base_index-CB_RESRANGE/2; 1.8810 + eInd=sInd+CB_RESRANGE; 1.8811 + 1.8812 + if (lTarget==SUBL) { 1.8813 + 1.8814 + if (sInd<0) { 1.8815 + 1.8816 + sIndAug = 40 + sInd; 1.8817 + eIndAug = 39; 1.8818 + sInd=0; 1.8819 + 1.8820 + } else if ( base_index < (base_size-20) ) { 1.8821 + 1.8822 + if (eInd > range) { 1.8823 + sInd -= (eInd-range); 1.8824 + eInd = range; 1.8825 + } 1.8826 + } else { /* base_index >= (base_size-20) */ 1.8827 + 1.8828 + if (sInd < (base_size-20)) { 1.8829 + sIndAug = 20; 1.8830 + sInd = 0; 1.8831 + eInd = 0; 1.8832 + eIndAug = 19 + CB_RESRANGE; 1.8833 + 1.8834 + if(eIndAug > 39) { 1.8835 + eInd = eIndAug-39; 1.8836 + eIndAug = 39; 1.8837 + } 1.8838 + } else { 1.8839 + sIndAug = 20 + sInd - (base_size-20); 1.8840 + eIndAug = 39; 1.8841 + sInd = 0; 1.8842 + eInd = CB_RESRANGE - (eIndAug-sIndAug+1); 1.8843 + } 1.8844 + } 1.8845 + 1.8846 + } else { /* lTarget = 22 or 23 */ 1.8847 + 1.8848 + if (sInd < 0) { 1.8849 + eInd -= sInd; 1.8850 + 1.8851 + 1.8852 + 1.8853 +Andersen, et al. Experimental [Page 158] 1.8854 + 1.8855 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.8856 + 1.8857 + 1.8858 + sInd = 0; 1.8859 + } 1.8860 + 1.8861 + if(eInd > range) { 1.8862 + sInd -= (eInd - range); 1.8863 + eInd = range; 1.8864 + } 1.8865 + } 1.8866 + } 1.8867 + 1.8868 + /* search of higher codebook section */ 1.8869 + 1.8870 + /* index search range */ 1.8871 + counter = sInd; 1.8872 + sInd += base_size; 1.8873 + eInd += base_size; 1.8874 + 1.8875 + 1.8876 + if (stage==0) { 1.8877 + ppe = energy+base_size; 1.8878 + *ppe=0.0; 1.8879 + 1.8880 + pp=cbvectors+lMem-lTarget; 1.8881 + for (j=0; j<lTarget; j++) { 1.8882 + *ppe+=(*pp)*(*pp++); 1.8883 + } 1.8884 + 1.8885 + ppi = cbvectors + lMem - 1 - lTarget; 1.8886 + ppo = cbvectors + lMem - 1; 1.8887 + 1.8888 + for (j=0; j<(range-1); j++) { 1.8889 + *(ppe+1) = *ppe + (*ppi)*(*ppi) - (*ppo)*(*ppo); 1.8890 + ppo--; 1.8891 + ppi--; 1.8892 + ppe++; 1.8893 + } 1.8894 + } 1.8895 + 1.8896 + /* loop over search range */ 1.8897 + 1.8898 + for (icount=sInd; icount<eInd; icount++) { 1.8899 + 1.8900 + /* calculate measure */ 1.8901 + 1.8902 + crossDot=0.0; 1.8903 + pp=cbvectors + lMem - (counter++) - lTarget; 1.8904 + 1.8905 + for (j=0;j<lTarget;j++) { 1.8906 + 1.8907 + 1.8908 + 1.8909 +Andersen, et al. Experimental [Page 159] 1.8910 + 1.8911 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.8912 + 1.8913 + 1.8914 + crossDot += target[j]*(*pp++); 1.8915 + } 1.8916 + 1.8917 + if (energy[icount]>0.0) { 1.8918 + invenergy[icount] =(float)1.0/(energy[icount]+EPS); 1.8919 + } else { 1.8920 + invenergy[icount] =(float)0.0; 1.8921 + } 1.8922 + 1.8923 + if (stage==0) { 1.8924 + 1.8925 + measure=(float)-10000000.0; 1.8926 + 1.8927 + if (crossDot > 0.0) { 1.8928 + measure = crossDot*crossDot* 1.8929 + invenergy[icount]; 1.8930 + } 1.8931 + } 1.8932 + else { 1.8933 + measure = crossDot*crossDot*invenergy[icount]; 1.8934 + } 1.8935 + 1.8936 + /* check if measure is better */ 1.8937 + ftmp = crossDot*invenergy[icount]; 1.8938 + 1.8939 + if ((measure>max_measure) && (fabs(ftmp)<CB_MAXGAIN)) { 1.8940 + best_index = icount; 1.8941 + max_measure = measure; 1.8942 + gain = ftmp; 1.8943 + } 1.8944 + } 1.8945 + 1.8946 + /* Search the augmented CB inside the limited range. */ 1.8947 + 1.8948 + if ((lTarget==SUBL)&&(sIndAug!=0)) { 1.8949 + searchAugmentedCB(sIndAug, eIndAug, stage, 1.8950 + 2*base_size-20, target, cbvectors+lMem, 1.8951 + &max_measure, &best_index, &gain, energy, 1.8952 + invenergy); 1.8953 + } 1.8954 + 1.8955 + /* record best index */ 1.8956 + 1.8957 + index[stage] = best_index; 1.8958 + 1.8959 + /* gain quantization */ 1.8960 + 1.8961 + if (stage==0){ 1.8962 + 1.8963 + 1.8964 + 1.8965 +Andersen, et al. Experimental [Page 160] 1.8966 + 1.8967 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.8968 + 1.8969 + 1.8970 + 1.8971 + if (gain<0.0){ 1.8972 + gain = 0.0; 1.8973 + } 1.8974 + 1.8975 + if (gain>CB_MAXGAIN) { 1.8976 + gain = (float)CB_MAXGAIN; 1.8977 + } 1.8978 + gain = gainquant(gain, 1.0, 32, &gain_index[stage]); 1.8979 + } 1.8980 + else { 1.8981 + if (stage==1) { 1.8982 + gain = gainquant(gain, (float)fabs(gains[stage-1]), 1.8983 + 16, &gain_index[stage]); 1.8984 + } else { 1.8985 + gain = gainquant(gain, (float)fabs(gains[stage-1]), 1.8986 + 8, &gain_index[stage]); 1.8987 + } 1.8988 + } 1.8989 + 1.8990 + /* Extract the best (according to measure) 1.8991 + codebook vector */ 1.8992 + 1.8993 + if (lTarget==(STATE_LEN-iLBCenc_inst->state_short_len)) { 1.8994 + 1.8995 + if (index[stage]<base_size) { 1.8996 + pp=buf+LPC_FILTERORDER+lMem-lTarget-index[stage]; 1.8997 + } else { 1.8998 + pp=cbvectors+lMem-lTarget- 1.8999 + index[stage]+base_size; 1.9000 + } 1.9001 + } else { 1.9002 + 1.9003 + if (index[stage]<base_size) { 1.9004 + if (index[stage]<(base_size-20)) { 1.9005 + pp=buf+LPC_FILTERORDER+lMem- 1.9006 + lTarget-index[stage]; 1.9007 + } else { 1.9008 + createAugmentedVec(index[stage]-base_size+40, 1.9009 + buf+LPC_FILTERORDER+lMem,aug_vec); 1.9010 + pp=aug_vec; 1.9011 + } 1.9012 + } else { 1.9013 + int filterno, position; 1.9014 + 1.9015 + filterno=index[stage]/base_size; 1.9016 + position=index[stage]-filterno*base_size; 1.9017 + 1.9018 + 1.9019 + 1.9020 + 1.9021 +Andersen, et al. Experimental [Page 161] 1.9022 + 1.9023 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.9024 + 1.9025 + 1.9026 + 1.9027 + if (position<(base_size-20)) { 1.9028 + pp=cbvectors+filterno*lMem-lTarget- 1.9029 + index[stage]+filterno*base_size; 1.9030 + } else { 1.9031 + createAugmentedVec( 1.9032 + index[stage]-(filterno+1)*base_size+40, 1.9033 + cbvectors+filterno*lMem,aug_vec); 1.9034 + pp=aug_vec; 1.9035 + } 1.9036 + } 1.9037 + } 1.9038 + 1.9039 + /* Subtract the best codebook vector, according 1.9040 + to measure, from the target vector */ 1.9041 + 1.9042 + for (j=0;j<lTarget;j++) { 1.9043 + cvec[j] += gain*(*pp); 1.9044 + target[j] -= gain*(*pp++); 1.9045 + } 1.9046 + 1.9047 + /* record quantized gain */ 1.9048 + 1.9049 + gains[stage]=gain; 1.9050 + 1.9051 + }/* end of Main Loop. for (stage=0;... */ 1.9052 + 1.9053 + /* Gain adjustment for energy matching */ 1.9054 + cene=0.0; 1.9055 + for (i=0; i<lTarget; i++) { 1.9056 + cene+=cvec[i]*cvec[i]; 1.9057 + } 1.9058 + j=gain_index[0]; 1.9059 + 1.9060 + for (i=gain_index[0]; i<32; i++) { 1.9061 + ftmp=cene*gain_sq5Tbl[i]*gain_sq5Tbl[i]; 1.9062 + 1.9063 + if ((ftmp<(tene*gains[0]*gains[0])) && 1.9064 + (gain_sq5Tbl[j]<(2.0*gains[0]))) { 1.9065 + j=i; 1.9066 + } 1.9067 + } 1.9068 + gain_index[0]=j; 1.9069 + } 1.9070 + 1.9071 + 1.9072 + 1.9073 + 1.9074 + 1.9075 + 1.9076 + 1.9077 +Andersen, et al. Experimental [Page 162] 1.9078 + 1.9079 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.9080 + 1.9081 + 1.9082 +A.35. LPCdecode.h 1.9083 + 1.9084 + /****************************************************************** 1.9085 + 1.9086 + iLBC Speech Coder ANSI-C Source Code 1.9087 + 1.9088 + LPC_decode.h 1.9089 + 1.9090 + Copyright (C) The Internet Society (2004). 1.9091 + All Rights Reserved. 1.9092 + 1.9093 + ******************************************************************/ 1.9094 + 1.9095 + #ifndef __iLBC_LPC_DECODE_H 1.9096 + #define __iLBC_LPC_DECODE_H 1.9097 + 1.9098 + void LSFinterpolate2a_dec( 1.9099 + float *a, /* (o) lpc coefficients for a sub-frame */ 1.9100 + float *lsf1, /* (i) first lsf coefficient vector */ 1.9101 + float *lsf2, /* (i) second lsf coefficient vector */ 1.9102 + float coef, /* (i) interpolation weight */ 1.9103 + int length /* (i) length of lsf vectors */ 1.9104 + ); 1.9105 + 1.9106 + void SimplelsfDEQ( 1.9107 + float *lsfdeq, /* (o) dequantized lsf coefficients */ 1.9108 + int *index, /* (i) quantization index */ 1.9109 + int lpc_n /* (i) number of LPCs */ 1.9110 + ); 1.9111 + 1.9112 + void DecoderInterpolateLSF( 1.9113 + float *syntdenum, /* (o) synthesis filter coefficients */ 1.9114 + float *weightdenum, /* (o) weighting denumerator 1.9115 + coefficients */ 1.9116 + float *lsfdeq, /* (i) dequantized lsf coefficients */ 1.9117 + int length, /* (i) length of lsf coefficient vector */ 1.9118 + iLBC_Dec_Inst_t *iLBCdec_inst 1.9119 + /* (i) the decoder state structure */ 1.9120 + ); 1.9121 + 1.9122 + #endif 1.9123 + 1.9124 + 1.9125 + 1.9126 + 1.9127 + 1.9128 + 1.9129 + 1.9130 + 1.9131 + 1.9132 + 1.9133 +Andersen, et al. Experimental [Page 163] 1.9134 + 1.9135 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.9136 + 1.9137 + 1.9138 +A.36. LPCdecode.c 1.9139 + 1.9140 + /****************************************************************** 1.9141 + 1.9142 + iLBC Speech Coder ANSI-C Source Code 1.9143 + 1.9144 + LPC_decode.c 1.9145 + 1.9146 + Copyright (C) The Internet Society (2004). 1.9147 + All Rights Reserved. 1.9148 + 1.9149 + ******************************************************************/ 1.9150 + 1.9151 + #include <math.h> 1.9152 + #include <string.h> 1.9153 + 1.9154 + #include "helpfun.h" 1.9155 + #include "lsf.h" 1.9156 + #include "iLBC_define.h" 1.9157 + #include "constants.h" 1.9158 + 1.9159 + /*---------------------------------------------------------------* 1.9160 + * interpolation of lsf coefficients for the decoder 1.9161 + *--------------------------------------------------------------*/ 1.9162 + 1.9163 + void LSFinterpolate2a_dec( 1.9164 + float *a, /* (o) lpc coefficients for a sub-frame */ 1.9165 + float *lsf1, /* (i) first lsf coefficient vector */ 1.9166 + float *lsf2, /* (i) second lsf coefficient vector */ 1.9167 + float coef, /* (i) interpolation weight */ 1.9168 + int length /* (i) length of lsf vectors */ 1.9169 + ){ 1.9170 + float lsftmp[LPC_FILTERORDER]; 1.9171 + 1.9172 + interpolate(lsftmp, lsf1, lsf2, coef, length); 1.9173 + lsf2a(a, lsftmp); 1.9174 + } 1.9175 + 1.9176 + /*---------------------------------------------------------------* 1.9177 + * obtain dequantized lsf coefficients from quantization index 1.9178 + *--------------------------------------------------------------*/ 1.9179 + 1.9180 + void SimplelsfDEQ( 1.9181 + float *lsfdeq, /* (o) dequantized lsf coefficients */ 1.9182 + int *index, /* (i) quantization index */ 1.9183 + int lpc_n /* (i) number of LPCs */ 1.9184 + ){ 1.9185 + int i, j, pos, cb_pos; 1.9186 + 1.9187 + 1.9188 + 1.9189 +Andersen, et al. Experimental [Page 164] 1.9190 + 1.9191 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.9192 + 1.9193 + 1.9194 + /* decode first LSF */ 1.9195 + 1.9196 + pos = 0; 1.9197 + cb_pos = 0; 1.9198 + for (i = 0; i < LSF_NSPLIT; i++) { 1.9199 + for (j = 0; j < dim_lsfCbTbl[i]; j++) { 1.9200 + lsfdeq[pos + j] = lsfCbTbl[cb_pos + 1.9201 + (long)(index[i])*dim_lsfCbTbl[i] + j]; 1.9202 + } 1.9203 + pos += dim_lsfCbTbl[i]; 1.9204 + cb_pos += size_lsfCbTbl[i]*dim_lsfCbTbl[i]; 1.9205 + } 1.9206 + 1.9207 + if (lpc_n>1) { 1.9208 + 1.9209 + /* decode last LSF */ 1.9210 + 1.9211 + pos = 0; 1.9212 + cb_pos = 0; 1.9213 + for (i = 0; i < LSF_NSPLIT; i++) { 1.9214 + for (j = 0; j < dim_lsfCbTbl[i]; j++) { 1.9215 + lsfdeq[LPC_FILTERORDER + pos + j] = 1.9216 + lsfCbTbl[cb_pos + 1.9217 + (long)(index[LSF_NSPLIT + i])* 1.9218 + dim_lsfCbTbl[i] + j]; 1.9219 + } 1.9220 + pos += dim_lsfCbTbl[i]; 1.9221 + cb_pos += size_lsfCbTbl[i]*dim_lsfCbTbl[i]; 1.9222 + } 1.9223 + } 1.9224 + } 1.9225 + 1.9226 + /*----------------------------------------------------------------* 1.9227 + * obtain synthesis and weighting filters form lsf coefficients 1.9228 + *---------------------------------------------------------------*/ 1.9229 + 1.9230 + void DecoderInterpolateLSF( 1.9231 + float *syntdenum, /* (o) synthesis filter coefficients */ 1.9232 + float *weightdenum, /* (o) weighting denumerator 1.9233 + coefficients */ 1.9234 + float *lsfdeq, /* (i) dequantized lsf coefficients */ 1.9235 + int length, /* (i) length of lsf coefficient vector */ 1.9236 + iLBC_Dec_Inst_t *iLBCdec_inst 1.9237 + /* (i) the decoder state structure */ 1.9238 + ){ 1.9239 + int i, pos, lp_length; 1.9240 + float lp[LPC_FILTERORDER + 1], *lsfdeq2; 1.9241 + 1.9242 + 1.9243 + 1.9244 + 1.9245 +Andersen, et al. Experimental [Page 165] 1.9246 + 1.9247 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.9248 + 1.9249 + 1.9250 + lsfdeq2 = lsfdeq + length; 1.9251 + lp_length = length + 1; 1.9252 + 1.9253 + if (iLBCdec_inst->mode==30) { 1.9254 + /* sub-frame 1: Interpolation between old and first */ 1.9255 + 1.9256 + LSFinterpolate2a_dec(lp, iLBCdec_inst->lsfdeqold, lsfdeq, 1.9257 + lsf_weightTbl_30ms[0], length); 1.9258 + memcpy(syntdenum,lp,lp_length*sizeof(float)); 1.9259 + bwexpand(weightdenum, lp, LPC_CHIRP_WEIGHTDENUM, 1.9260 + lp_length); 1.9261 + 1.9262 + /* sub-frames 2 to 6: interpolation between first 1.9263 + and last LSF */ 1.9264 + 1.9265 + pos = lp_length; 1.9266 + for (i = 1; i < 6; i++) { 1.9267 + LSFinterpolate2a_dec(lp, lsfdeq, lsfdeq2, 1.9268 + lsf_weightTbl_30ms[i], length); 1.9269 + memcpy(syntdenum + pos,lp,lp_length*sizeof(float)); 1.9270 + bwexpand(weightdenum + pos, lp, 1.9271 + LPC_CHIRP_WEIGHTDENUM, lp_length); 1.9272 + pos += lp_length; 1.9273 + } 1.9274 + } 1.9275 + else { 1.9276 + pos = 0; 1.9277 + for (i = 0; i < iLBCdec_inst->nsub; i++) { 1.9278 + LSFinterpolate2a_dec(lp, iLBCdec_inst->lsfdeqold, 1.9279 + lsfdeq, lsf_weightTbl_20ms[i], length); 1.9280 + memcpy(syntdenum+pos,lp,lp_length*sizeof(float)); 1.9281 + bwexpand(weightdenum+pos, lp, LPC_CHIRP_WEIGHTDENUM, 1.9282 + lp_length); 1.9283 + pos += lp_length; 1.9284 + } 1.9285 + } 1.9286 + 1.9287 + /* update memory */ 1.9288 + 1.9289 + if (iLBCdec_inst->mode==30) 1.9290 + memcpy(iLBCdec_inst->lsfdeqold, lsfdeq2, 1.9291 + length*sizeof(float)); 1.9292 + else 1.9293 + memcpy(iLBCdec_inst->lsfdeqold, lsfdeq, 1.9294 + length*sizeof(float)); 1.9295 + 1.9296 + } 1.9297 + 1.9298 + 1.9299 + 1.9300 + 1.9301 +Andersen, et al. Experimental [Page 166] 1.9302 + 1.9303 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.9304 + 1.9305 + 1.9306 +A.37. LPCencode.h 1.9307 + 1.9308 + /****************************************************************** 1.9309 + 1.9310 + iLBC Speech Coder ANSI-C Source Code 1.9311 + 1.9312 + LPCencode.h 1.9313 + 1.9314 + Copyright (C) The Internet Society (2004). 1.9315 + All Rights Reserved. 1.9316 + 1.9317 + ******************************************************************/ 1.9318 + 1.9319 + #ifndef __iLBC_LPCENCOD_H 1.9320 + #define __iLBC_LPCENCOD_H 1.9321 + 1.9322 + void LPCencode( 1.9323 + float *syntdenum, /* (i/o) synthesis filter coefficients 1.9324 + before/after encoding */ 1.9325 + float *weightdenum, /* (i/o) weighting denumerator coefficients 1.9326 + before/after encoding */ 1.9327 + int *lsf_index, /* (o) lsf quantization index */ 1.9328 + float *data, /* (i) lsf coefficients to quantize */ 1.9329 + iLBC_Enc_Inst_t *iLBCenc_inst 1.9330 + /* (i/o) the encoder state structure */ 1.9331 + ); 1.9332 + 1.9333 + #endif 1.9334 + 1.9335 +A.38. LPCencode.c 1.9336 + 1.9337 + /****************************************************************** 1.9338 + 1.9339 + iLBC Speech Coder ANSI-C Source Code 1.9340 + 1.9341 + LPCencode.c 1.9342 + 1.9343 + Copyright (C) The Internet Society (2004). 1.9344 + All Rights Reserved. 1.9345 + 1.9346 + ******************************************************************/ 1.9347 + 1.9348 + #include <string.h> 1.9349 + 1.9350 + #include "iLBC_define.h" 1.9351 + #include "helpfun.h" 1.9352 + #include "lsf.h" 1.9353 + #include "constants.h" 1.9354 + 1.9355 + 1.9356 + 1.9357 +Andersen, et al. Experimental [Page 167] 1.9358 + 1.9359 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.9360 + 1.9361 + 1.9362 + /*----------------------------------------------------------------* 1.9363 + * lpc analysis (subrutine to LPCencode) 1.9364 + *---------------------------------------------------------------*/ 1.9365 + 1.9366 + void SimpleAnalysis( 1.9367 + float *lsf, /* (o) lsf coefficients */ 1.9368 + float *data, /* (i) new data vector */ 1.9369 + iLBC_Enc_Inst_t *iLBCenc_inst 1.9370 + /* (i/o) the encoder state structure */ 1.9371 + ){ 1.9372 + int k, is; 1.9373 + float temp[BLOCKL_MAX], lp[LPC_FILTERORDER + 1]; 1.9374 + float lp2[LPC_FILTERORDER + 1]; 1.9375 + float r[LPC_FILTERORDER + 1]; 1.9376 + 1.9377 + is=LPC_LOOKBACK+BLOCKL_MAX-iLBCenc_inst->blockl; 1.9378 + memcpy(iLBCenc_inst->lpc_buffer+is,data, 1.9379 + iLBCenc_inst->blockl*sizeof(float)); 1.9380 + 1.9381 + /* No lookahead, last window is asymmetric */ 1.9382 + 1.9383 + for (k = 0; k < iLBCenc_inst->lpc_n; k++) { 1.9384 + 1.9385 + is = LPC_LOOKBACK; 1.9386 + 1.9387 + if (k < (iLBCenc_inst->lpc_n - 1)) { 1.9388 + window(temp, lpc_winTbl, 1.9389 + iLBCenc_inst->lpc_buffer, BLOCKL_MAX); 1.9390 + } else { 1.9391 + window(temp, lpc_asymwinTbl, 1.9392 + iLBCenc_inst->lpc_buffer + is, BLOCKL_MAX); 1.9393 + } 1.9394 + 1.9395 + autocorr(r, temp, BLOCKL_MAX, LPC_FILTERORDER); 1.9396 + window(r, r, lpc_lagwinTbl, LPC_FILTERORDER + 1); 1.9397 + 1.9398 + levdurb(lp, temp, r, LPC_FILTERORDER); 1.9399 + bwexpand(lp2, lp, LPC_CHIRP_SYNTDENUM, LPC_FILTERORDER+1); 1.9400 + 1.9401 + a2lsf(lsf + k*LPC_FILTERORDER, lp2); 1.9402 + } 1.9403 + is=LPC_LOOKBACK+BLOCKL_MAX-iLBCenc_inst->blockl; 1.9404 + memmove(iLBCenc_inst->lpc_buffer, 1.9405 + iLBCenc_inst->lpc_buffer+LPC_LOOKBACK+BLOCKL_MAX-is, 1.9406 + is*sizeof(float)); 1.9407 + } 1.9408 + 1.9409 + /*----------------------------------------------------------------* 1.9410 + 1.9411 + 1.9412 + 1.9413 +Andersen, et al. Experimental [Page 168] 1.9414 + 1.9415 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.9416 + 1.9417 + 1.9418 + * lsf interpolator and conversion from lsf to a coefficients 1.9419 + * (subrutine to SimpleInterpolateLSF) 1.9420 + *---------------------------------------------------------------*/ 1.9421 + 1.9422 + void LSFinterpolate2a_enc( 1.9423 + float *a, /* (o) lpc coefficients */ 1.9424 + float *lsf1,/* (i) first set of lsf coefficients */ 1.9425 + float *lsf2,/* (i) second set of lsf coefficients */ 1.9426 + float coef, /* (i) weighting coefficient to use between 1.9427 + lsf1 and lsf2 */ 1.9428 + long length /* (i) length of coefficient vectors */ 1.9429 + ){ 1.9430 + float lsftmp[LPC_FILTERORDER]; 1.9431 + 1.9432 + interpolate(lsftmp, lsf1, lsf2, coef, length); 1.9433 + lsf2a(a, lsftmp); 1.9434 + } 1.9435 + 1.9436 + /*----------------------------------------------------------------* 1.9437 + * lsf interpolator (subrutine to LPCencode) 1.9438 + *---------------------------------------------------------------*/ 1.9439 + 1.9440 + void SimpleInterpolateLSF( 1.9441 + float *syntdenum, /* (o) the synthesis filter denominator 1.9442 + resulting from the quantized 1.9443 + interpolated lsf */ 1.9444 + float *weightdenum, /* (o) the weighting filter denominator 1.9445 + resulting from the unquantized 1.9446 + interpolated lsf */ 1.9447 + float *lsf, /* (i) the unquantized lsf coefficients */ 1.9448 + float *lsfdeq, /* (i) the dequantized lsf coefficients */ 1.9449 + float *lsfold, /* (i) the unquantized lsf coefficients of 1.9450 + the previous signal frame */ 1.9451 + float *lsfdeqold, /* (i) the dequantized lsf coefficients of 1.9452 + the previous signal frame */ 1.9453 + int length, /* (i) should equate LPC_FILTERORDER */ 1.9454 + iLBC_Enc_Inst_t *iLBCenc_inst 1.9455 + /* (i/o) the encoder state structure */ 1.9456 + ){ 1.9457 + int i, pos, lp_length; 1.9458 + float lp[LPC_FILTERORDER + 1], *lsf2, *lsfdeq2; 1.9459 + 1.9460 + lsf2 = lsf + length; 1.9461 + lsfdeq2 = lsfdeq + length; 1.9462 + lp_length = length + 1; 1.9463 + 1.9464 + if (iLBCenc_inst->mode==30) { 1.9465 + /* sub-frame 1: Interpolation between old and first 1.9466 + 1.9467 + 1.9468 + 1.9469 +Andersen, et al. Experimental [Page 169] 1.9470 + 1.9471 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.9472 + 1.9473 + 1.9474 + set of lsf coefficients */ 1.9475 + 1.9476 + LSFinterpolate2a_enc(lp, lsfdeqold, lsfdeq, 1.9477 + lsf_weightTbl_30ms[0], length); 1.9478 + memcpy(syntdenum,lp,lp_length*sizeof(float)); 1.9479 + LSFinterpolate2a_enc(lp, lsfold, lsf, 1.9480 + lsf_weightTbl_30ms[0], length); 1.9481 + bwexpand(weightdenum, lp, LPC_CHIRP_WEIGHTDENUM, lp_length); 1.9482 + 1.9483 + /* sub-frame 2 to 6: Interpolation between first 1.9484 + and second set of lsf coefficients */ 1.9485 + 1.9486 + pos = lp_length; 1.9487 + for (i = 1; i < iLBCenc_inst->nsub; i++) { 1.9488 + LSFinterpolate2a_enc(lp, lsfdeq, lsfdeq2, 1.9489 + lsf_weightTbl_30ms[i], length); 1.9490 + memcpy(syntdenum + pos,lp,lp_length*sizeof(float)); 1.9491 + 1.9492 + LSFinterpolate2a_enc(lp, lsf, lsf2, 1.9493 + lsf_weightTbl_30ms[i], length); 1.9494 + bwexpand(weightdenum + pos, lp, 1.9495 + LPC_CHIRP_WEIGHTDENUM, lp_length); 1.9496 + pos += lp_length; 1.9497 + } 1.9498 + } 1.9499 + else { 1.9500 + pos = 0; 1.9501 + for (i = 0; i < iLBCenc_inst->nsub; i++) { 1.9502 + LSFinterpolate2a_enc(lp, lsfdeqold, lsfdeq, 1.9503 + lsf_weightTbl_20ms[i], length); 1.9504 + memcpy(syntdenum+pos,lp,lp_length*sizeof(float)); 1.9505 + LSFinterpolate2a_enc(lp, lsfold, lsf, 1.9506 + lsf_weightTbl_20ms[i], length); 1.9507 + bwexpand(weightdenum+pos, lp, 1.9508 + LPC_CHIRP_WEIGHTDENUM, lp_length); 1.9509 + pos += lp_length; 1.9510 + } 1.9511 + } 1.9512 + 1.9513 + /* update memory */ 1.9514 + 1.9515 + if (iLBCenc_inst->mode==30) { 1.9516 + memcpy(lsfold, lsf2, length*sizeof(float)); 1.9517 + memcpy(lsfdeqold, lsfdeq2, length*sizeof(float)); 1.9518 + } 1.9519 + else { 1.9520 + memcpy(lsfold, lsf, length*sizeof(float)); 1.9521 + memcpy(lsfdeqold, lsfdeq, length*sizeof(float)); 1.9522 + 1.9523 + 1.9524 + 1.9525 +Andersen, et al. Experimental [Page 170] 1.9526 + 1.9527 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.9528 + 1.9529 + 1.9530 + } 1.9531 + } 1.9532 + 1.9533 + /*----------------------------------------------------------------* 1.9534 + * lsf quantizer (subrutine to LPCencode) 1.9535 + *---------------------------------------------------------------*/ 1.9536 + 1.9537 + void SimplelsfQ( 1.9538 + float *lsfdeq, /* (o) dequantized lsf coefficients 1.9539 + (dimension FILTERORDER) */ 1.9540 + int *index, /* (o) quantization index */ 1.9541 + float *lsf, /* (i) the lsf coefficient vector to be 1.9542 + quantized (dimension FILTERORDER ) */ 1.9543 + int lpc_n /* (i) number of lsf sets to quantize */ 1.9544 + ){ 1.9545 + /* Quantize first LSF with memoryless split VQ */ 1.9546 + SplitVQ(lsfdeq, index, lsf, lsfCbTbl, LSF_NSPLIT, 1.9547 + dim_lsfCbTbl, size_lsfCbTbl); 1.9548 + 1.9549 + if (lpc_n==2) { 1.9550 + /* Quantize second LSF with memoryless split VQ */ 1.9551 + SplitVQ(lsfdeq + LPC_FILTERORDER, index + LSF_NSPLIT, 1.9552 + lsf + LPC_FILTERORDER, lsfCbTbl, LSF_NSPLIT, 1.9553 + dim_lsfCbTbl, size_lsfCbTbl); 1.9554 + } 1.9555 + } 1.9556 + 1.9557 + /*----------------------------------------------------------------* 1.9558 + * lpc encoder 1.9559 + *---------------------------------------------------------------*/ 1.9560 + 1.9561 + void LPCencode( 1.9562 + float *syntdenum, /* (i/o) synthesis filter coefficients 1.9563 + before/after encoding */ 1.9564 + float *weightdenum, /* (i/o) weighting denumerator 1.9565 + coefficients before/after 1.9566 + encoding */ 1.9567 + int *lsf_index, /* (o) lsf quantization index */ 1.9568 + float *data, /* (i) lsf coefficients to quantize */ 1.9569 + iLBC_Enc_Inst_t *iLBCenc_inst 1.9570 + /* (i/o) the encoder state structure */ 1.9571 + ){ 1.9572 + float lsf[LPC_FILTERORDER * LPC_N_MAX]; 1.9573 + float lsfdeq[LPC_FILTERORDER * LPC_N_MAX]; 1.9574 + int change=0; 1.9575 + 1.9576 + SimpleAnalysis(lsf, data, iLBCenc_inst); 1.9577 + SimplelsfQ(lsfdeq, lsf_index, lsf, iLBCenc_inst->lpc_n); 1.9578 + 1.9579 + 1.9580 + 1.9581 +Andersen, et al. Experimental [Page 171] 1.9582 + 1.9583 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.9584 + 1.9585 + 1.9586 + change=LSF_check(lsfdeq, LPC_FILTERORDER, iLBCenc_inst->lpc_n); 1.9587 + SimpleInterpolateLSF(syntdenum, weightdenum, 1.9588 + lsf, lsfdeq, iLBCenc_inst->lsfold, 1.9589 + iLBCenc_inst->lsfdeqold, LPC_FILTERORDER, iLBCenc_inst); 1.9590 + } 1.9591 + 1.9592 +A.39. lsf.h 1.9593 + 1.9594 + /****************************************************************** 1.9595 + 1.9596 + iLBC Speech Coder ANSI-C Source Code 1.9597 + 1.9598 + lsf.h 1.9599 + 1.9600 + Copyright (C) The Internet Society (2004). 1.9601 + All Rights Reserved. 1.9602 + 1.9603 + ******************************************************************/ 1.9604 + 1.9605 + #ifndef __iLBC_LSF_H 1.9606 + #define __iLBC_LSF_H 1.9607 + 1.9608 + void a2lsf( 1.9609 + float *freq,/* (o) lsf coefficients */ 1.9610 + float *a /* (i) lpc coefficients */ 1.9611 + ); 1.9612 + 1.9613 + void lsf2a( 1.9614 + float *a_coef, /* (o) lpc coefficients */ 1.9615 + float *freq /* (i) lsf coefficients */ 1.9616 + ); 1.9617 + 1.9618 + #endif 1.9619 + 1.9620 +A.40. lsf.c 1.9621 + 1.9622 + /****************************************************************** 1.9623 + 1.9624 + iLBC Speech Coder ANSI-C Source Code 1.9625 + 1.9626 + lsf.c 1.9627 + 1.9628 + Copyright (C) The Internet Society (2004). 1.9629 + All Rights Reserved. 1.9630 + 1.9631 + ******************************************************************/ 1.9632 + 1.9633 + #include <string.h> 1.9634 + 1.9635 + 1.9636 + 1.9637 +Andersen, et al. Experimental [Page 172] 1.9638 + 1.9639 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.9640 + 1.9641 + 1.9642 + #include <math.h> 1.9643 + 1.9644 + #include "iLBC_define.h" 1.9645 + 1.9646 + /*----------------------------------------------------------------* 1.9647 + * conversion from lpc coefficients to lsf coefficients 1.9648 + *---------------------------------------------------------------*/ 1.9649 + 1.9650 + void a2lsf( 1.9651 + float *freq,/* (o) lsf coefficients */ 1.9652 + float *a /* (i) lpc coefficients */ 1.9653 + ){ 1.9654 + float steps[LSF_NUMBER_OF_STEPS] = 1.9655 + {(float)0.00635, (float)0.003175, (float)0.0015875, 1.9656 + (float)0.00079375}; 1.9657 + float step; 1.9658 + int step_idx; 1.9659 + int lsp_index; 1.9660 + float p[LPC_HALFORDER]; 1.9661 + float q[LPC_HALFORDER]; 1.9662 + float p_pre[LPC_HALFORDER]; 1.9663 + float q_pre[LPC_HALFORDER]; 1.9664 + float old_p, old_q, *old; 1.9665 + float *pq_coef; 1.9666 + float omega, old_omega; 1.9667 + int i; 1.9668 + float hlp, hlp1, hlp2, hlp3, hlp4, hlp5; 1.9669 + 1.9670 + for (i=0; i<LPC_HALFORDER; i++) { 1.9671 + p[i] = (float)-1.0 * (a[i + 1] + a[LPC_FILTERORDER - i]); 1.9672 + q[i] = a[LPC_FILTERORDER - i] - a[i + 1]; 1.9673 + } 1.9674 + 1.9675 + p_pre[0] = (float)-1.0 - p[0]; 1.9676 + p_pre[1] = - p_pre[0] - p[1]; 1.9677 + p_pre[2] = - p_pre[1] - p[2]; 1.9678 + p_pre[3] = - p_pre[2] - p[3]; 1.9679 + p_pre[4] = - p_pre[3] - p[4]; 1.9680 + p_pre[4] = p_pre[4] / 2; 1.9681 + 1.9682 + q_pre[0] = (float)1.0 - q[0]; 1.9683 + q_pre[1] = q_pre[0] - q[1]; 1.9684 + q_pre[2] = q_pre[1] - q[2]; 1.9685 + q_pre[3] = q_pre[2] - q[3]; 1.9686 + q_pre[4] = q_pre[3] - q[4]; 1.9687 + q_pre[4] = q_pre[4] / 2; 1.9688 + 1.9689 + omega = 0.0; 1.9690 + 1.9691 + 1.9692 + 1.9693 +Andersen, et al. Experimental [Page 173] 1.9694 + 1.9695 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.9696 + 1.9697 + 1.9698 + old_omega = 0.0; 1.9699 + 1.9700 + old_p = FLOAT_MAX; 1.9701 + old_q = FLOAT_MAX; 1.9702 + 1.9703 + /* Here we loop through lsp_index to find all the 1.9704 + LPC_FILTERORDER roots for omega. */ 1.9705 + 1.9706 + for (lsp_index = 0; lsp_index<LPC_FILTERORDER; lsp_index++) { 1.9707 + 1.9708 + /* Depending on lsp_index being even or odd, we 1.9709 + alternatively solve the roots for the two LSP equations. */ 1.9710 + 1.9711 + 1.9712 + if ((lsp_index & 0x1) == 0) { 1.9713 + pq_coef = p_pre; 1.9714 + old = &old_p; 1.9715 + } else { 1.9716 + pq_coef = q_pre; 1.9717 + old = &old_q; 1.9718 + } 1.9719 + 1.9720 + /* Start with low resolution grid */ 1.9721 + 1.9722 + for (step_idx = 0, step = steps[step_idx]; 1.9723 + step_idx < LSF_NUMBER_OF_STEPS;){ 1.9724 + 1.9725 + /* cos(10piw) + pq(0)cos(8piw) + pq(1)cos(6piw) + 1.9726 + pq(2)cos(4piw) + pq(3)cod(2piw) + pq(4) */ 1.9727 + 1.9728 + hlp = (float)cos(omega * TWO_PI); 1.9729 + hlp1 = (float)2.0 * hlp + pq_coef[0]; 1.9730 + hlp2 = (float)2.0 * hlp * hlp1 - (float)1.0 + 1.9731 + pq_coef[1]; 1.9732 + hlp3 = (float)2.0 * hlp * hlp2 - hlp1 + pq_coef[2]; 1.9733 + hlp4 = (float)2.0 * hlp * hlp3 - hlp2 + pq_coef[3]; 1.9734 + hlp5 = hlp * hlp4 - hlp3 + pq_coef[4]; 1.9735 + 1.9736 + 1.9737 + if (((hlp5 * (*old)) <= 0.0) || (omega >= 0.5)){ 1.9738 + 1.9739 + if (step_idx == (LSF_NUMBER_OF_STEPS - 1)){ 1.9740 + 1.9741 + if (fabs(hlp5) >= fabs(*old)) { 1.9742 + freq[lsp_index] = omega - step; 1.9743 + } else { 1.9744 + freq[lsp_index] = omega; 1.9745 + } 1.9746 + 1.9747 + 1.9748 + 1.9749 +Andersen, et al. Experimental [Page 174] 1.9750 + 1.9751 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.9752 + 1.9753 + 1.9754 + 1.9755 + 1.9756 + if ((*old) >= 0.0){ 1.9757 + *old = (float)-1.0 * FLOAT_MAX; 1.9758 + } else { 1.9759 + *old = FLOAT_MAX; 1.9760 + } 1.9761 + 1.9762 + omega = old_omega; 1.9763 + step_idx = 0; 1.9764 + 1.9765 + step_idx = LSF_NUMBER_OF_STEPS; 1.9766 + } else { 1.9767 + 1.9768 + if (step_idx == 0) { 1.9769 + old_omega = omega; 1.9770 + } 1.9771 + 1.9772 + step_idx++; 1.9773 + omega -= steps[step_idx]; 1.9774 + 1.9775 + /* Go back one grid step */ 1.9776 + 1.9777 + step = steps[step_idx]; 1.9778 + } 1.9779 + } else { 1.9780 + 1.9781 + /* increment omega until they are of different sign, 1.9782 + and we know there is at least one root between omega 1.9783 + and old_omega */ 1.9784 + *old = hlp5; 1.9785 + omega += step; 1.9786 + } 1.9787 + } 1.9788 + } 1.9789 + 1.9790 + for (i = 0; i<LPC_FILTERORDER; i++) { 1.9791 + freq[i] = freq[i] * TWO_PI; 1.9792 + } 1.9793 + } 1.9794 + 1.9795 + /*----------------------------------------------------------------* 1.9796 + * conversion from lsf coefficients to lpc coefficients 1.9797 + *---------------------------------------------------------------*/ 1.9798 + 1.9799 + void lsf2a( 1.9800 + float *a_coef, /* (o) lpc coefficients */ 1.9801 + float *freq /* (i) lsf coefficients */ 1.9802 + 1.9803 + 1.9804 + 1.9805 +Andersen, et al. Experimental [Page 175] 1.9806 + 1.9807 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.9808 + 1.9809 + 1.9810 + ){ 1.9811 + int i, j; 1.9812 + float hlp; 1.9813 + float p[LPC_HALFORDER], q[LPC_HALFORDER]; 1.9814 + float a[LPC_HALFORDER + 1], a1[LPC_HALFORDER], 1.9815 + a2[LPC_HALFORDER]; 1.9816 + float b[LPC_HALFORDER + 1], b1[LPC_HALFORDER], 1.9817 + b2[LPC_HALFORDER]; 1.9818 + 1.9819 + for (i=0; i<LPC_FILTERORDER; i++) { 1.9820 + freq[i] = freq[i] * PI2; 1.9821 + } 1.9822 + 1.9823 + /* Check input for ill-conditioned cases. This part is not 1.9824 + found in the TIA standard. It involves the following 2 IF 1.9825 + blocks. If "freq" is judged ill-conditioned, then we first 1.9826 + modify freq[0] and freq[LPC_HALFORDER-1] (normally 1.9827 + LPC_HALFORDER = 10 for LPC applications), then we adjust 1.9828 + the other "freq" values slightly */ 1.9829 + 1.9830 + 1.9831 + if ((freq[0] <= 0.0) || (freq[LPC_FILTERORDER - 1] >= 0.5)){ 1.9832 + 1.9833 + 1.9834 + if (freq[0] <= 0.0) { 1.9835 + freq[0] = (float)0.022; 1.9836 + } 1.9837 + 1.9838 + 1.9839 + if (freq[LPC_FILTERORDER - 1] >= 0.5) { 1.9840 + freq[LPC_FILTERORDER - 1] = (float)0.499; 1.9841 + } 1.9842 + 1.9843 + hlp = (freq[LPC_FILTERORDER - 1] - freq[0]) / 1.9844 + (float) (LPC_FILTERORDER - 1); 1.9845 + 1.9846 + for (i=1; i<LPC_FILTERORDER; i++) { 1.9847 + freq[i] = freq[i - 1] + hlp; 1.9848 + } 1.9849 + } 1.9850 + 1.9851 + memset(a1, 0, LPC_HALFORDER*sizeof(float)); 1.9852 + memset(a2, 0, LPC_HALFORDER*sizeof(float)); 1.9853 + memset(b1, 0, LPC_HALFORDER*sizeof(float)); 1.9854 + memset(b2, 0, LPC_HALFORDER*sizeof(float)); 1.9855 + memset(a, 0, (LPC_HALFORDER+1)*sizeof(float)); 1.9856 + memset(b, 0, (LPC_HALFORDER+1)*sizeof(float)); 1.9857 + 1.9858 + 1.9859 + 1.9860 + 1.9861 +Andersen, et al. Experimental [Page 176] 1.9862 + 1.9863 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.9864 + 1.9865 + 1.9866 + /* p[i] and q[i] compute cos(2*pi*omega_{2j}) and 1.9867 + cos(2*pi*omega_{2j-1} in eqs. 4.2.2.2-1 and 4.2.2.2-2. 1.9868 + Note that for this code p[i] specifies the coefficients 1.9869 + used in .Q_A(z) while q[i] specifies the coefficients used 1.9870 + in .P_A(z) */ 1.9871 + 1.9872 + for (i=0; i<LPC_HALFORDER; i++) { 1.9873 + p[i] = (float)cos(TWO_PI * freq[2 * i]); 1.9874 + q[i] = (float)cos(TWO_PI * freq[2 * i + 1]); 1.9875 + } 1.9876 + 1.9877 + a[0] = 0.25; 1.9878 + b[0] = 0.25; 1.9879 + 1.9880 + for (i= 0; i<LPC_HALFORDER; i++) { 1.9881 + a[i + 1] = a[i] - 2 * p[i] * a1[i] + a2[i]; 1.9882 + b[i + 1] = b[i] - 2 * q[i] * b1[i] + b2[i]; 1.9883 + a2[i] = a1[i]; 1.9884 + a1[i] = a[i]; 1.9885 + b2[i] = b1[i]; 1.9886 + b1[i] = b[i]; 1.9887 + } 1.9888 + 1.9889 + for (j=0; j<LPC_FILTERORDER; j++) { 1.9890 + 1.9891 + if (j == 0) { 1.9892 + a[0] = 0.25; 1.9893 + b[0] = -0.25; 1.9894 + } else { 1.9895 + a[0] = b[0] = 0.0; 1.9896 + } 1.9897 + 1.9898 + for (i=0; i<LPC_HALFORDER; i++) { 1.9899 + a[i + 1] = a[i] - 2 * p[i] * a1[i] + a2[i]; 1.9900 + b[i + 1] = b[i] - 2 * q[i] * b1[i] + b2[i]; 1.9901 + a2[i] = a1[i]; 1.9902 + a1[i] = a[i]; 1.9903 + b2[i] = b1[i]; 1.9904 + b1[i] = b[i]; 1.9905 + } 1.9906 + 1.9907 + a_coef[j + 1] = 2 * (a[LPC_HALFORDER] + b[LPC_HALFORDER]); 1.9908 + } 1.9909 + 1.9910 + a_coef[0] = 1.0; 1.9911 + } 1.9912 + 1.9913 + 1.9914 + 1.9915 + 1.9916 + 1.9917 +Andersen, et al. Experimental [Page 177] 1.9918 + 1.9919 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.9920 + 1.9921 + 1.9922 +A.41. packing.h 1.9923 + 1.9924 + /****************************************************************** 1.9925 + 1.9926 + iLBC Speech Coder ANSI-C Source Code 1.9927 + 1.9928 + packing.h 1.9929 + 1.9930 + Copyright (C) The Internet Society (2004). 1.9931 + All Rights Reserved. 1.9932 + 1.9933 + ******************************************************************/ 1.9934 + 1.9935 + #ifndef __PACKING_H 1.9936 + #define __PACKING_H 1.9937 + 1.9938 + void packsplit( 1.9939 + int *index, /* (i) the value to split */ 1.9940 + int *firstpart, /* (o) the value specified by most 1.9941 + significant bits */ 1.9942 + int *rest, /* (o) the value specified by least 1.9943 + significant bits */ 1.9944 + int bitno_firstpart, /* (i) number of bits in most 1.9945 + significant part */ 1.9946 + int bitno_total /* (i) number of bits in full range 1.9947 + of value */ 1.9948 + ); 1.9949 + 1.9950 + void packcombine( 1.9951 + int *index, /* (i/o) the msb value in the 1.9952 + combined value out */ 1.9953 + int rest, /* (i) the lsb value */ 1.9954 + int bitno_rest /* (i) the number of bits in the 1.9955 + lsb part */ 1.9956 + ); 1.9957 + 1.9958 + void dopack( 1.9959 + unsigned char **bitstream, /* (i/o) on entrance pointer to 1.9960 + place in bitstream to pack 1.9961 + new data, on exit pointer 1.9962 + to place in bitstream to 1.9963 + pack future data */ 1.9964 + int index, /* (i) the value to pack */ 1.9965 + int bitno, /* (i) the number of bits that the 1.9966 + value will fit within */ 1.9967 + int *pos /* (i/o) write position in the 1.9968 + current byte */ 1.9969 + ); 1.9970 + 1.9971 + 1.9972 + 1.9973 +Andersen, et al. Experimental [Page 178] 1.9974 + 1.9975 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.9976 + 1.9977 + 1.9978 + void unpack( 1.9979 + unsigned char **bitstream, /* (i/o) on entrance pointer to 1.9980 + place in bitstream to 1.9981 + unpack new data from, on 1.9982 + exit pointer to place in 1.9983 + bitstream to unpack future 1.9984 + data from */ 1.9985 + int *index, /* (o) resulting value */ 1.9986 + int bitno, /* (i) number of bits used to 1.9987 + represent the value */ 1.9988 + int *pos /* (i/o) read position in the 1.9989 + current byte */ 1.9990 + ); 1.9991 + 1.9992 + #endif 1.9993 + 1.9994 +A.42. packing.c 1.9995 + 1.9996 + /****************************************************************** 1.9997 + 1.9998 + iLBC Speech Coder ANSI-C Source Code 1.9999 + 1.10000 + packing.c 1.10001 + 1.10002 + Copyright (C) The Internet Society (2004). 1.10003 + All Rights Reserved. 1.10004 + 1.10005 + ******************************************************************/ 1.10006 + 1.10007 + #include <math.h> 1.10008 + #include <stdlib.h> 1.10009 + 1.10010 + #include "iLBC_define.h" 1.10011 + #include "constants.h" 1.10012 + #include "helpfun.h" 1.10013 + #include "string.h" 1.10014 + 1.10015 + /*----------------------------------------------------------------* 1.10016 + * splitting an integer into first most significant bits and 1.10017 + * remaining least significant bits 1.10018 + *---------------------------------------------------------------*/ 1.10019 + 1.10020 + void packsplit( 1.10021 + int *index, /* (i) the value to split */ 1.10022 + int *firstpart, /* (o) the value specified by most 1.10023 + significant bits */ 1.10024 + int *rest, /* (o) the value specified by least 1.10025 + significant bits */ 1.10026 + 1.10027 + 1.10028 + 1.10029 +Andersen, et al. Experimental [Page 179] 1.10030 + 1.10031 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.10032 + 1.10033 + 1.10034 + int bitno_firstpart, /* (i) number of bits in most 1.10035 + significant part */ 1.10036 + int bitno_total /* (i) number of bits in full range 1.10037 + of value */ 1.10038 + ){ 1.10039 + int bitno_rest = bitno_total-bitno_firstpart; 1.10040 + 1.10041 + *firstpart = *index>>(bitno_rest); 1.10042 + *rest = *index-(*firstpart<<(bitno_rest)); 1.10043 + } 1.10044 + 1.10045 + /*----------------------------------------------------------------* 1.10046 + * combining a value corresponding to msb's with a value 1.10047 + * corresponding to lsb's 1.10048 + *---------------------------------------------------------------*/ 1.10049 + 1.10050 + void packcombine( 1.10051 + int *index, /* (i/o) the msb value in the 1.10052 + combined value out */ 1.10053 + int rest, /* (i) the lsb value */ 1.10054 + int bitno_rest /* (i) the number of bits in the 1.10055 + lsb part */ 1.10056 + ){ 1.10057 + *index = *index<<bitno_rest; 1.10058 + *index += rest; 1.10059 + } 1.10060 + 1.10061 + /*----------------------------------------------------------------* 1.10062 + * packing of bits into bitstream, i.e., vector of bytes 1.10063 + *---------------------------------------------------------------*/ 1.10064 + 1.10065 + void dopack( 1.10066 + unsigned char **bitstream, /* (i/o) on entrance pointer to 1.10067 + place in bitstream to pack 1.10068 + new data, on exit pointer 1.10069 + to place in bitstream to 1.10070 + pack future data */ 1.10071 + int index, /* (i) the value to pack */ 1.10072 + int bitno, /* (i) the number of bits that the 1.10073 + value will fit within */ 1.10074 + int *pos /* (i/o) write position in the 1.10075 + current byte */ 1.10076 + ){ 1.10077 + int posLeft; 1.10078 + 1.10079 + /* Clear the bits before starting in a new byte */ 1.10080 + 1.10081 + if ((*pos)==0) { 1.10082 + 1.10083 + 1.10084 + 1.10085 +Andersen, et al. Experimental [Page 180] 1.10086 + 1.10087 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.10088 + 1.10089 + 1.10090 + **bitstream=0; 1.10091 + } 1.10092 + 1.10093 + while (bitno>0) { 1.10094 + 1.10095 + /* Jump to the next byte if end of this byte is reached*/ 1.10096 + 1.10097 + if (*pos==8) { 1.10098 + *pos=0; 1.10099 + (*bitstream)++; 1.10100 + **bitstream=0; 1.10101 + } 1.10102 + 1.10103 + posLeft=8-(*pos); 1.10104 + 1.10105 + /* Insert index into the bitstream */ 1.10106 + 1.10107 + if (bitno <= posLeft) { 1.10108 + **bitstream |= (unsigned char)(index<<(posLeft-bitno)); 1.10109 + *pos+=bitno; 1.10110 + bitno=0; 1.10111 + } else { 1.10112 + **bitstream |= (unsigned char)(index>>(bitno-posLeft)); 1.10113 + 1.10114 + *pos=8; 1.10115 + index-=((index>>(bitno-posLeft))<<(bitno-posLeft)); 1.10116 + 1.10117 + bitno-=posLeft; 1.10118 + } 1.10119 + } 1.10120 + } 1.10121 + 1.10122 + /*----------------------------------------------------------------* 1.10123 + * unpacking of bits from bitstream, i.e., vector of bytes 1.10124 + *---------------------------------------------------------------*/ 1.10125 + 1.10126 + void unpack( 1.10127 + unsigned char **bitstream, /* (i/o) on entrance pointer to 1.10128 + place in bitstream to 1.10129 + unpack new data from, on 1.10130 + exit pointer to place in 1.10131 + bitstream to unpack future 1.10132 + data from */ 1.10133 + int *index, /* (o) resulting value */ 1.10134 + int bitno, /* (i) number of bits used to 1.10135 + represent the value */ 1.10136 + int *pos /* (i/o) read position in the 1.10137 + current byte */ 1.10138 + 1.10139 + 1.10140 + 1.10141 +Andersen, et al. Experimental [Page 181] 1.10142 + 1.10143 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.10144 + 1.10145 + 1.10146 + ){ 1.10147 + int BitsLeft; 1.10148 + 1.10149 + *index=0; 1.10150 + 1.10151 + while (bitno>0) { 1.10152 + 1.10153 + /* move forward in bitstream when the end of the 1.10154 + byte is reached */ 1.10155 + 1.10156 + if (*pos==8) { 1.10157 + *pos=0; 1.10158 + (*bitstream)++; 1.10159 + } 1.10160 + 1.10161 + BitsLeft=8-(*pos); 1.10162 + 1.10163 + /* Extract bits to index */ 1.10164 + 1.10165 + if (BitsLeft>=bitno) { 1.10166 + *index+=((((**bitstream)<<(*pos)) & 0xFF)>>(8-bitno)); 1.10167 + 1.10168 + *pos+=bitno; 1.10169 + bitno=0; 1.10170 + } else { 1.10171 + 1.10172 + if ((8-bitno)>0) { 1.10173 + *index+=((((**bitstream)<<(*pos)) & 0xFF)>> 1.10174 + (8-bitno)); 1.10175 + *pos=8; 1.10176 + } else { 1.10177 + *index+=(((int)(((**bitstream)<<(*pos)) & 0xFF))<< 1.10178 + (bitno-8)); 1.10179 + *pos=8; 1.10180 + } 1.10181 + bitno-=BitsLeft; 1.10182 + } 1.10183 + } 1.10184 + } 1.10185 + 1.10186 +A.43. StateConstructW.h 1.10187 + 1.10188 + /****************************************************************** 1.10189 + 1.10190 + iLBC Speech Coder ANSI-C Source Code 1.10191 + 1.10192 + StateConstructW.h 1.10193 + 1.10194 + 1.10195 + 1.10196 + 1.10197 +Andersen, et al. Experimental [Page 182] 1.10198 + 1.10199 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.10200 + 1.10201 + 1.10202 + Copyright (C) The Internet Society (2004). 1.10203 + All Rights Reserved. 1.10204 + 1.10205 + ******************************************************************/ 1.10206 + 1.10207 + #ifndef __iLBC_STATECONSTRUCTW_H 1.10208 + #define __iLBC_STATECONSTRUCTW_H 1.10209 + 1.10210 + void StateConstructW( 1.10211 + int idxForMax, /* (i) 6-bit index for the quantization of 1.10212 + max amplitude */ 1.10213 + int *idxVec, /* (i) vector of quantization indexes */ 1.10214 + float *syntDenum, /* (i) synthesis filter denumerator */ 1.10215 + float *out, /* (o) the decoded state vector */ 1.10216 + int len /* (i) length of a state vector */ 1.10217 + ); 1.10218 + 1.10219 + #endif 1.10220 + 1.10221 +A.44. StateConstructW.c 1.10222 + 1.10223 + /****************************************************************** 1.10224 + 1.10225 + iLBC Speech Coder ANSI-C Source Code 1.10226 + 1.10227 + StateConstructW.c 1.10228 + 1.10229 + Copyright (C) The Internet Society (2004). 1.10230 + All Rights Reserved. 1.10231 + 1.10232 + ******************************************************************/ 1.10233 + 1.10234 + #include <math.h> 1.10235 + #include <string.h> 1.10236 + 1.10237 + #include "iLBC_define.h" 1.10238 + #include "constants.h" 1.10239 + #include "filter.h" 1.10240 + 1.10241 + /*----------------------------------------------------------------* 1.10242 + * decoding of the start state 1.10243 + *---------------------------------------------------------------*/ 1.10244 + 1.10245 + void StateConstructW( 1.10246 + int idxForMax, /* (i) 6-bit index for the quantization of 1.10247 + max amplitude */ 1.10248 + int *idxVec, /* (i) vector of quantization indexes */ 1.10249 + float *syntDenum, /* (i) synthesis filter denumerator */ 1.10250 + 1.10251 + 1.10252 + 1.10253 +Andersen, et al. Experimental [Page 183] 1.10254 + 1.10255 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.10256 + 1.10257 + 1.10258 + float *out, /* (o) the decoded state vector */ 1.10259 + int len /* (i) length of a state vector */ 1.10260 + ){ 1.10261 + float maxVal, tmpbuf[LPC_FILTERORDER+2*STATE_LEN], *tmp, 1.10262 + numerator[LPC_FILTERORDER+1]; 1.10263 + float foutbuf[LPC_FILTERORDER+2*STATE_LEN], *fout; 1.10264 + int k,tmpi; 1.10265 + 1.10266 + /* decoding of the maximum value */ 1.10267 + 1.10268 + maxVal = state_frgqTbl[idxForMax]; 1.10269 + maxVal = (float)pow(10,maxVal)/(float)4.5; 1.10270 + 1.10271 + /* initialization of buffers and coefficients */ 1.10272 + 1.10273 + memset(tmpbuf, 0, LPC_FILTERORDER*sizeof(float)); 1.10274 + memset(foutbuf, 0, LPC_FILTERORDER*sizeof(float)); 1.10275 + for (k=0; k<LPC_FILTERORDER; k++) { 1.10276 + numerator[k]=syntDenum[LPC_FILTERORDER-k]; 1.10277 + } 1.10278 + numerator[LPC_FILTERORDER]=syntDenum[0]; 1.10279 + tmp = &tmpbuf[LPC_FILTERORDER]; 1.10280 + fout = &foutbuf[LPC_FILTERORDER]; 1.10281 + 1.10282 + /* decoding of the sample values */ 1.10283 + 1.10284 + for (k=0; k<len; k++) { 1.10285 + tmpi = len-1-k; 1.10286 + /* maxVal = 1/scal */ 1.10287 + tmp[k] = maxVal*state_sq3Tbl[idxVec[tmpi]]; 1.10288 + } 1.10289 + 1.10290 + /* circular convolution with all-pass filter */ 1.10291 + 1.10292 + memset(tmp+len, 0, len*sizeof(float)); 1.10293 + ZeroPoleFilter(tmp, numerator, syntDenum, 2*len, 1.10294 + LPC_FILTERORDER, fout); 1.10295 + for (k=0;k<len;k++) { 1.10296 + out[k] = fout[len-1-k]+fout[2*len-1-k]; 1.10297 + } 1.10298 + } 1.10299 + 1.10300 + 1.10301 + 1.10302 + 1.10303 + 1.10304 + 1.10305 + 1.10306 + 1.10307 + 1.10308 + 1.10309 +Andersen, et al. Experimental [Page 184] 1.10310 + 1.10311 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.10312 + 1.10313 + 1.10314 +A.45. StateSearchW.h 1.10315 + 1.10316 + /****************************************************************** 1.10317 + 1.10318 + iLBC Speech Coder ANSI-C Source Code 1.10319 + 1.10320 + StateSearchW.h 1.10321 + 1.10322 + Copyright (C) The Internet Society (2004). 1.10323 + All Rights Reserved. 1.10324 + 1.10325 + ******************************************************************/ 1.10326 + 1.10327 + #ifndef __iLBC_STATESEARCHW_H 1.10328 + #define __iLBC_STATESEARCHW_H 1.10329 + 1.10330 + void AbsQuantW( 1.10331 + iLBC_Enc_Inst_t *iLBCenc_inst, 1.10332 + /* (i) Encoder instance */ 1.10333 + float *in, /* (i) vector to encode */ 1.10334 + float *syntDenum, /* (i) denominator of synthesis filter */ 1.10335 + float *weightDenum, /* (i) denominator of weighting filter */ 1.10336 + int *out, /* (o) vector of quantizer indexes */ 1.10337 + int len, /* (i) length of vector to encode and 1.10338 + vector of quantizer indexes */ 1.10339 + int state_first /* (i) position of start state in the 1.10340 + 80 vec */ 1.10341 + ); 1.10342 + 1.10343 + void StateSearchW( 1.10344 + iLBC_Enc_Inst_t *iLBCenc_inst, 1.10345 + /* (i) Encoder instance */ 1.10346 + float *residual,/* (i) target residual vector */ 1.10347 + float *syntDenum, /* (i) lpc synthesis filter */ 1.10348 + float *weightDenum, /* (i) weighting filter denuminator */ 1.10349 + int *idxForMax, /* (o) quantizer index for maximum 1.10350 + amplitude */ 1.10351 + int *idxVec, /* (o) vector of quantization indexes */ 1.10352 + int len, /* (i) length of all vectors */ 1.10353 + int state_first /* (i) position of start state in the 1.10354 + 80 vec */ 1.10355 + ); 1.10356 + 1.10357 + 1.10358 + #endif 1.10359 + 1.10360 + 1.10361 + 1.10362 + 1.10363 + 1.10364 + 1.10365 +Andersen, et al. Experimental [Page 185] 1.10366 + 1.10367 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.10368 + 1.10369 + 1.10370 +A.46. StateSearchW.c 1.10371 + 1.10372 + /****************************************************************** 1.10373 + 1.10374 + iLBC Speech Coder ANSI-C Source Code 1.10375 + 1.10376 + StateSearchW.c 1.10377 + 1.10378 + Copyright (C) The Internet Society (2004). 1.10379 + All Rights Reserved. 1.10380 + 1.10381 + ******************************************************************/ 1.10382 + 1.10383 + #include <math.h> 1.10384 + #include <string.h> 1.10385 + 1.10386 + #include "iLBC_define.h" 1.10387 + #include "constants.h" 1.10388 + #include "filter.h" 1.10389 + #include "helpfun.h" 1.10390 + 1.10391 + /*----------------------------------------------------------------* 1.10392 + * predictive noise shaping encoding of scaled start state 1.10393 + * (subrutine for StateSearchW) 1.10394 + *---------------------------------------------------------------*/ 1.10395 + 1.10396 + void AbsQuantW( 1.10397 + iLBC_Enc_Inst_t *iLBCenc_inst, 1.10398 + /* (i) Encoder instance */ 1.10399 + float *in, /* (i) vector to encode */ 1.10400 + float *syntDenum, /* (i) denominator of synthesis filter */ 1.10401 + float *weightDenum, /* (i) denominator of weighting filter */ 1.10402 + int *out, /* (o) vector of quantizer indexes */ 1.10403 + int len, /* (i) length of vector to encode and 1.10404 + vector of quantizer indexes */ 1.10405 + int state_first /* (i) position of start state in the 1.10406 + 80 vec */ 1.10407 + ){ 1.10408 + float *syntOut; 1.10409 + float syntOutBuf[LPC_FILTERORDER+STATE_SHORT_LEN_30MS]; 1.10410 + float toQ, xq; 1.10411 + int n; 1.10412 + int index; 1.10413 + 1.10414 + /* initialization of buffer for filtering */ 1.10415 + 1.10416 + memset(syntOutBuf, 0, LPC_FILTERORDER*sizeof(float)); 1.10417 + 1.10418 + 1.10419 + 1.10420 + 1.10421 +Andersen, et al. Experimental [Page 186] 1.10422 + 1.10423 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.10424 + 1.10425 + 1.10426 + /* initialization of pointer for filtering */ 1.10427 + 1.10428 + syntOut = &syntOutBuf[LPC_FILTERORDER]; 1.10429 + 1.10430 + /* synthesis and weighting filters on input */ 1.10431 + 1.10432 + if (state_first) { 1.10433 + AllPoleFilter (in, weightDenum, SUBL, LPC_FILTERORDER); 1.10434 + } else { 1.10435 + AllPoleFilter (in, weightDenum, 1.10436 + iLBCenc_inst->state_short_len-SUBL, 1.10437 + LPC_FILTERORDER); 1.10438 + } 1.10439 + 1.10440 + /* encoding loop */ 1.10441 + 1.10442 + for (n=0; n<len; n++) { 1.10443 + 1.10444 + /* time update of filter coefficients */ 1.10445 + 1.10446 + if ((state_first)&&(n==SUBL)){ 1.10447 + syntDenum += (LPC_FILTERORDER+1); 1.10448 + weightDenum += (LPC_FILTERORDER+1); 1.10449 + 1.10450 + /* synthesis and weighting filters on input */ 1.10451 + AllPoleFilter (&in[n], weightDenum, len-n, 1.10452 + LPC_FILTERORDER); 1.10453 + 1.10454 + } else if ((state_first==0)&& 1.10455 + (n==(iLBCenc_inst->state_short_len-SUBL))) { 1.10456 + syntDenum += (LPC_FILTERORDER+1); 1.10457 + weightDenum += (LPC_FILTERORDER+1); 1.10458 + 1.10459 + /* synthesis and weighting filters on input */ 1.10460 + AllPoleFilter (&in[n], weightDenum, len-n, 1.10461 + LPC_FILTERORDER); 1.10462 + 1.10463 + } 1.10464 + 1.10465 + /* prediction of synthesized and weighted input */ 1.10466 + 1.10467 + syntOut[n] = 0.0; 1.10468 + AllPoleFilter (&syntOut[n], weightDenum, 1, 1.10469 + LPC_FILTERORDER); 1.10470 + 1.10471 + /* quantization */ 1.10472 + 1.10473 + toQ = in[n]-syntOut[n]; 1.10474 + 1.10475 + 1.10476 + 1.10477 +Andersen, et al. Experimental [Page 187] 1.10478 + 1.10479 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.10480 + 1.10481 + 1.10482 + sort_sq(&xq, &index, toQ, state_sq3Tbl, 8); 1.10483 + out[n]=index; 1.10484 + syntOut[n] = state_sq3Tbl[out[n]]; 1.10485 + 1.10486 + /* update of the prediction filter */ 1.10487 + 1.10488 + AllPoleFilter(&syntOut[n], weightDenum, 1, 1.10489 + LPC_FILTERORDER); 1.10490 + } 1.10491 + } 1.10492 + 1.10493 + /*----------------------------------------------------------------* 1.10494 + * encoding of start state 1.10495 + *---------------------------------------------------------------*/ 1.10496 + 1.10497 + void StateSearchW( 1.10498 + iLBC_Enc_Inst_t *iLBCenc_inst, 1.10499 + /* (i) Encoder instance */ 1.10500 + float *residual,/* (i) target residual vector */ 1.10501 + float *syntDenum, /* (i) lpc synthesis filter */ 1.10502 + float *weightDenum, /* (i) weighting filter denuminator */ 1.10503 + int *idxForMax, /* (o) quantizer index for maximum 1.10504 + amplitude */ 1.10505 + int *idxVec, /* (o) vector of quantization indexes */ 1.10506 + int len, /* (i) length of all vectors */ 1.10507 + int state_first /* (i) position of start state in the 1.10508 + 80 vec */ 1.10509 + ){ 1.10510 + float dtmp, maxVal; 1.10511 + float tmpbuf[LPC_FILTERORDER+2*STATE_SHORT_LEN_30MS]; 1.10512 + float *tmp, numerator[1+LPC_FILTERORDER]; 1.10513 + float foutbuf[LPC_FILTERORDER+2*STATE_SHORT_LEN_30MS], *fout; 1.10514 + int k; 1.10515 + float qmax, scal; 1.10516 + 1.10517 + /* initialization of buffers and filter coefficients */ 1.10518 + 1.10519 + memset(tmpbuf, 0, LPC_FILTERORDER*sizeof(float)); 1.10520 + memset(foutbuf, 0, LPC_FILTERORDER*sizeof(float)); 1.10521 + for (k=0; k<LPC_FILTERORDER; k++) { 1.10522 + numerator[k]=syntDenum[LPC_FILTERORDER-k]; 1.10523 + } 1.10524 + numerator[LPC_FILTERORDER]=syntDenum[0]; 1.10525 + tmp = &tmpbuf[LPC_FILTERORDER]; 1.10526 + fout = &foutbuf[LPC_FILTERORDER]; 1.10527 + 1.10528 + /* circular convolution with the all-pass filter */ 1.10529 + 1.10530 + 1.10531 + 1.10532 + 1.10533 +Andersen, et al. Experimental [Page 188] 1.10534 + 1.10535 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.10536 + 1.10537 + 1.10538 + memcpy(tmp, residual, len*sizeof(float)); 1.10539 + memset(tmp+len, 0, len*sizeof(float)); 1.10540 + ZeroPoleFilter(tmp, numerator, syntDenum, 2*len, 1.10541 + LPC_FILTERORDER, fout); 1.10542 + for (k=0; k<len; k++) { 1.10543 + fout[k] += fout[k+len]; 1.10544 + } 1.10545 + 1.10546 + /* identification of the maximum amplitude value */ 1.10547 + 1.10548 + maxVal = fout[0]; 1.10549 + for (k=1; k<len; k++) { 1.10550 + 1.10551 + if (fout[k]*fout[k] > maxVal*maxVal){ 1.10552 + maxVal = fout[k]; 1.10553 + } 1.10554 + } 1.10555 + maxVal=(float)fabs(maxVal); 1.10556 + 1.10557 + /* encoding of the maximum amplitude value */ 1.10558 + 1.10559 + if (maxVal < 10.0) { 1.10560 + maxVal = 10.0; 1.10561 + } 1.10562 + maxVal = (float)log10(maxVal); 1.10563 + sort_sq(&dtmp, idxForMax, maxVal, state_frgqTbl, 64); 1.10564 + 1.10565 + /* decoding of the maximum amplitude representation value, 1.10566 + and corresponding scaling of start state */ 1.10567 + 1.10568 + maxVal=state_frgqTbl[*idxForMax]; 1.10569 + qmax = (float)pow(10,maxVal); 1.10570 + scal = (float)(4.5)/qmax; 1.10571 + for (k=0; k<len; k++){ 1.10572 + fout[k] *= scal; 1.10573 + } 1.10574 + 1.10575 + /* predictive noise shaping encoding of scaled start state */ 1.10576 + 1.10577 + AbsQuantW(iLBCenc_inst, fout,syntDenum, 1.10578 + weightDenum,idxVec, len, state_first); 1.10579 + } 1.10580 + 1.10581 + 1.10582 + 1.10583 + 1.10584 + 1.10585 + 1.10586 + 1.10587 + 1.10588 + 1.10589 +Andersen, et al. Experimental [Page 189] 1.10590 + 1.10591 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.10592 + 1.10593 + 1.10594 +A.47. syntFilter.h 1.10595 + 1.10596 + /****************************************************************** 1.10597 + 1.10598 + iLBC Speech Coder ANSI-C Source Code 1.10599 + 1.10600 + syntFilter.h 1.10601 + 1.10602 + Copyright (C) The Internet Society (2004). 1.10603 + All Rights Reserved. 1.10604 + 1.10605 + ******************************************************************/ 1.10606 + 1.10607 + #ifndef __iLBC_SYNTFILTER_H 1.10608 + #define __iLBC_SYNTFILTER_H 1.10609 + 1.10610 + void syntFilter( 1.10611 + float *Out, /* (i/o) Signal to be filtered */ 1.10612 + float *a, /* (i) LP parameters */ 1.10613 + int len, /* (i) Length of signal */ 1.10614 + float *mem /* (i/o) Filter state */ 1.10615 + ); 1.10616 + 1.10617 + #endif 1.10618 + 1.10619 +A.48. syntFilter.c 1.10620 + 1.10621 + /****************************************************************** 1.10622 + 1.10623 + iLBC Speech Coder ANSI-C Source Code 1.10624 + 1.10625 + syntFilter.c 1.10626 + 1.10627 + Copyright (C) The Internet Society (2004). 1.10628 + All Rights Reserved. 1.10629 + 1.10630 + ******************************************************************/ 1.10631 + 1.10632 + #include "iLBC_define.h" 1.10633 + 1.10634 + /*----------------------------------------------------------------* 1.10635 + * LP synthesis filter. 1.10636 + *---------------------------------------------------------------*/ 1.10637 + 1.10638 + void syntFilter( 1.10639 + float *Out, /* (i/o) Signal to be filtered */ 1.10640 + float *a, /* (i) LP parameters */ 1.10641 + int len, /* (i) Length of signal */ 1.10642 + 1.10643 + 1.10644 + 1.10645 +Andersen, et al. Experimental [Page 190] 1.10646 + 1.10647 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.10648 + 1.10649 + 1.10650 + float *mem /* (i/o) Filter state */ 1.10651 + ){ 1.10652 + int i, j; 1.10653 + float *po, *pi, *pa, *pm; 1.10654 + 1.10655 + po=Out; 1.10656 + 1.10657 + /* Filter first part using memory from past */ 1.10658 + 1.10659 + for (i=0; i<LPC_FILTERORDER; i++) { 1.10660 + pi=&Out[i-1]; 1.10661 + pa=&a[1]; 1.10662 + pm=&mem[LPC_FILTERORDER-1]; 1.10663 + for (j=1; j<=i; j++) { 1.10664 + *po-=(*pa++)*(*pi--); 1.10665 + } 1.10666 + for (j=i+1; j<LPC_FILTERORDER+1; j++) { 1.10667 + *po-=(*pa++)*(*pm--); 1.10668 + } 1.10669 + po++; 1.10670 + } 1.10671 + 1.10672 + /* Filter last part where the state is entirely in 1.10673 + the output vector */ 1.10674 + 1.10675 + for (i=LPC_FILTERORDER; i<len; i++) { 1.10676 + pi=&Out[i-1]; 1.10677 + pa=&a[1]; 1.10678 + for (j=1; j<LPC_FILTERORDER+1; j++) { 1.10679 + *po-=(*pa++)*(*pi--); 1.10680 + } 1.10681 + po++; 1.10682 + } 1.10683 + 1.10684 + /* Update state vector */ 1.10685 + 1.10686 + memcpy(mem, &Out[len-LPC_FILTERORDER], 1.10687 + LPC_FILTERORDER*sizeof(float)); 1.10688 + } 1.10689 + 1.10690 + 1.10691 + 1.10692 + 1.10693 + 1.10694 + 1.10695 + 1.10696 + 1.10697 + 1.10698 + 1.10699 + 1.10700 + 1.10701 +Andersen, et al. Experimental [Page 191] 1.10702 + 1.10703 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.10704 + 1.10705 + 1.10706 +Authors' Addresses 1.10707 + 1.10708 + Soren Vang Andersen 1.10709 + Department of Communication Technology 1.10710 + Aalborg University 1.10711 + Fredrik Bajers Vej 7A 1.10712 + 9200 Aalborg 1.10713 + Denmark 1.10714 + 1.10715 + Phone: ++45 9 6358627 1.10716 + EMail: sva@kom.auc.dk 1.10717 + 1.10718 + 1.10719 + Alan Duric 1.10720 + Telio AS 1.10721 + Stoperigt. 2 1.10722 + Oslo, N-0250 1.10723 + Norway 1.10724 + 1.10725 + Phone: +47 21673555 1.10726 + EMail: alan.duric@telio.no 1.10727 + 1.10728 + 1.10729 + Henrik Astrom 1.10730 + Global IP Sound AB 1.10731 + Olandsgatan 42 1.10732 + Stockholm, S-11663 1.10733 + Sweden 1.10734 + 1.10735 + Phone: +46 8 54553040 1.10736 + EMail: henrik.astrom@globalipsound.com 1.10737 + 1.10738 + 1.10739 + Roar Hagen 1.10740 + Global IP Sound AB 1.10741 + Olandsgatan 42 1.10742 + Stockholm, S-11663 1.10743 + Sweden 1.10744 + 1.10745 + Phone: +46 8 54553040 1.10746 + EMail: roar.hagen@globalipsound.com 1.10747 + 1.10748 + 1.10749 + 1.10750 + 1.10751 + 1.10752 + 1.10753 + 1.10754 + 1.10755 + 1.10756 + 1.10757 +Andersen, et al. Experimental [Page 192] 1.10758 + 1.10759 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.10760 + 1.10761 + 1.10762 + W. Bastiaan Kleijn 1.10763 + Global IP Sound AB 1.10764 + Olandsgatan 42 1.10765 + Stockholm, S-11663 1.10766 + Sweden 1.10767 + 1.10768 + Phone: +46 8 54553040 1.10769 + EMail: bastiaan.kleijn@globalipsound.com 1.10770 + 1.10771 + 1.10772 + Jan Linden 1.10773 + Global IP Sound Inc. 1.10774 + 900 Kearny Street, suite 500 1.10775 + San Francisco, CA-94133 1.10776 + USA 1.10777 + 1.10778 + Phone: +1 415 397 2555 1.10779 + EMail: jan.linden@globalipsound.com 1.10780 + 1.10781 + 1.10782 + 1.10783 + 1.10784 + 1.10785 + 1.10786 + 1.10787 + 1.10788 + 1.10789 + 1.10790 + 1.10791 + 1.10792 + 1.10793 + 1.10794 + 1.10795 + 1.10796 + 1.10797 + 1.10798 + 1.10799 + 1.10800 + 1.10801 + 1.10802 + 1.10803 + 1.10804 + 1.10805 + 1.10806 + 1.10807 + 1.10808 + 1.10809 + 1.10810 + 1.10811 + 1.10812 + 1.10813 +Andersen, et al. Experimental [Page 193] 1.10814 + 1.10815 +RFC 3951 Internet Low Bit Rate Codec December 2004 1.10816 + 1.10817 + 1.10818 +Full Copyright Statement 1.10819 + 1.10820 + Copyright (C) The Internet Society (2004). 1.10821 + 1.10822 + This document is subject to the rights, licenses and restrictions 1.10823 + contained in BCP 78, and except as set forth therein, the authors 1.10824 + retain all their rights. 1.10825 + 1.10826 + This document and the information contained herein are provided on an 1.10827 + "AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS 1.10828 + OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY AND THE INTERNET 1.10829 + ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, 1.10830 + INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE 1.10831 + INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED 1.10832 + WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. 1.10833 + 1.10834 +Intellectual Property 1.10835 + 1.10836 + The IETF takes no position regarding the validity or scope of any 1.10837 + Intellectual Property Rights or other rights that might be claimed to 1.10838 + pertain to the implementation or use of the technology described in 1.10839 + this document or the extent to which any license under such rights 1.10840 + might or might not be available; nor does it represent that it has 1.10841 + made any independent effort to identify any such rights. Information 1.10842 + on the IETF's procedures with respect to rights in IETF Documents can 1.10843 + be found in BCP 78 and BCP 79. 1.10844 + 1.10845 + Copies of IPR disclosures made to the IETF Secretariat and any 1.10846 + assurances of licenses to be made available, or the result of an 1.10847 + attempt made to obtain a general license or permission for the use of 1.10848 + such proprietary rights by implementers or users of this 1.10849 + specification can be obtained from the IETF on-line IPR repository at 1.10850 + http://www.ietf.org/ipr. 1.10851 + 1.10852 + The IETF invites any interested party to bring to its attention any 1.10853 + copyrights, patents or patent applications, or other proprietary 1.10854 + rights that may cover technology that may be required to implement 1.10855 + this standard. Please address the information to the IETF at ietf- 1.10856 + ipr@ietf.org. 1.10857 + 1.10858 + 1.10859 +Acknowledgement 1.10860 + 1.10861 + Funding for the RFC Editor function is currently provided by the 1.10862 + Internet Society. 1.10863 + 1.10864 + 1.10865 + 1.10866 + 1.10867 + 1.10868 + 1.10869 +Andersen, et al. Experimental [Page 194] 1.10870 +