Mercurial > hg > audiostuff
comparison intercom/g726/g726.c @ 2:13be24d74cd2
import intercom-0.4.1
| author | Peter Meerwald <pmeerw@cosy.sbg.ac.at> |
|---|---|
| date | Fri, 25 Jun 2010 09:57:52 +0200 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 1:9cadc470e3da | 2:13be24d74cd2 |
|---|---|
| 1 /* v2.0 24.Jan.2000 | |
| 2 ============================================================================= | |
| 3 | |
| 4 U U GGG SSSS TTTTT | |
| 5 U U G S T | |
| 6 U U G GG SSSS T | |
| 7 U U G G S T | |
| 8 UUU GG SSS T | |
| 9 | |
| 10 ======================================== | |
| 11 ITU-T - USER'S GROUP ON SOFTWARE TOOLS | |
| 12 ======================================== | |
| 13 | |
| 14 | |
| 15 ============================================================= | |
| 16 COPYRIGHT NOTE: This source code, and all of its derivations, | |
| 17 is subject to the "ITU-T General Public License". Please have | |
| 18 it read in the distribution disk, or in the ITU-T | |
| 19 Recommendation G.191 on "SOFTWARE TOOLS FOR SPEECH AND AUDIO | |
| 20 CODING STANDARDS". | |
| 21 ============================================================= | |
| 22 | |
| 23 | |
| 24 MODULE: G726.C ADPCM AT 40, 32, 24, AND 16 KBIT/S MODULE | |
| 25 | |
| 26 ORIGINAL BY: | |
| 27 Jose' Sindi Yamamoto (Fortran version of the G.721) | |
| 28 <tdsindi@venus.cpqd.ansp.br> | |
| 29 Simao Ferraz de Campos Neto (C translation, adaptation&testing of the G.721) | |
| 30 <simao@venus.cpqd.ansp.br> | |
| 31 Fernando Tofolli Queiroz (Extension of the G.721 to the other rates=>G.726) | |
| 32 <tofolli@venus.cpqd.ansp.br> | |
| 33 Simao Ferraz de Campos Neto (Adaptation and testing of the G.726) | |
| 34 <simao@venus.cpqd.ansp.br> | |
| 35 | |
| 36 HISTORY: | |
| 37 28.Feb.1994 v1.0c Version 1.0 in C, by translating Fortran to C (f2c) | |
| 38 24.Jan.2000 v2.0 Corrected bug G726_compress() that caused incorrect | |
| 39 processing of test vector ri40fa. Corrected code | |
| 40 provided by Jayesh Patel <jayesh@dspse.com>. | |
| 41 Verified by <simao.campos@labs.comsat.com> | |
| 42 | |
| 43 FUNCTIONS: | |
| 44 Public: | |
| 45 G726_encode ..... G726 encoder function; | |
| 46 | |
| 47 G726_decode ..... G726 decoder function; | |
| 48 | |
| 49 Private: | |
| 50 G726_accum ...... addition of predictor outputs to form the partial | |
| 51 signal estimate (from the sixth order predictor) and | |
| 52 the signal estimate. | |
| 53 | |
| 54 G726_adda ....... addition of scale factor to logarithmic version of | |
| 55 quantized difference signal. | |
| 56 | |
| 57 G726_addb ....... addition of quantized difference signal and signal | |
| 58 estimate to form reconstructed signal. | |
| 59 | |
| 60 G726_addc....... obtain sign of addition of quantized difference signal | |
| 61 and partial signal estimate. | |
| 62 | |
| 63 G726_antilog .... convert quantized difference signal from the | |
| 64 logarithmic to the linear domain. | |
| 65 | |
| 66 G726_compress ... convert from uniform pcm to either a-law or u-law pcm. | |
| 67 | |
| 68 G726_delaya ..... memory block. | |
| 69 | |
| 70 G726_delayb ..... memory block. | |
| 71 | |
| 72 G726_delayc ..... memory block. | |
| 73 | |
| 74 G726_delayd ..... memory block. | |
| 75 | |
| 76 G726_expand ..... convert either a-law (law=1) or u-law (law=0) to | |
| 77 uniform pcm. | |
| 78 | |
| 79 G726_filta ...... update of short term average of f(i). | |
| 80 | |
| 81 G726_filtb ...... update of long term average of f(i). | |
| 82 | |
| 83 G726_filtc ...... low pass filter of speed control parameter. | |
| 84 | |
| 85 G726_filtd ...... update of fast quantizer scale factor. | |
| 86 | |
| 87 G726_filte ...... update of slow quantizer scale factor. | |
| 88 | |
| 89 G726_floata ..... convert 15-bit signed magnitude to floating point. | |
| 90 | |
| 91 G726_floatb ..... convert 16-bit two's complement to floating point. | |
| 92 | |
| 93 G726_fmult ...... multiply predictor coefficients with corresponding | |
| 94 quantized difference signal or reconstructed signal. | |
| 95 Multiplication is done in floating point format. | |
| 96 | |
| 97 G726_functf ..... map quantizer output into the f(i) function. | |
| 98 | |
| 99 G726_functw ..... map quantizer output into logarithmic version of scale | |
| 100 factor multiplier. | |
| 101 | |
| 102 G726_lima ....... limit speed control parameter. | |
| 103 | |
| 104 G726_limb ....... limit quantizer scale factor. | |
| 105 | |
| 106 G726_limc ....... limits on a2 coefficient of second order predictor. | |
| 107 | |
| 108 G726_limd ....... limits on a1 coefficient of second order predictor. | |
| 109 | |
| 110 G726_log ........ convert difference signal from linear to the | |
| 111 logarithmic domain. | |
| 112 | |
| 113 G726_mix ........ form linear combination of fast and slow quantizer | |
| 114 scale factors. | |
| 115 | |
| 116 G726_quan ....... quantize difference signal in logarithmic domain. | |
| 117 | |
| 118 G726_reconst .... reconstruction of quantized difference signal in the | |
| 119 logarithmic domain. | |
| 120 | |
| 121 G726_subta ...... compute difference signal by subtracting signal | |
| 122 estimate from input signal (or quantized reconstructed | |
| 123 signal in decoder). | |
| 124 | |
| 125 G726_subtb ...... scale logarithmic version of difference signal by | |
| 126 subtracting scale factor. | |
| 127 | |
| 128 G726_subtc ...... compute magnitude of the difference of short and | |
| 129 long-term function of quantizer output sequence and | |
| 130 then perform threshold comparison for quantizing speed | |
| 131 control parameter. | |
| 132 | |
| 133 G726_sync ....... re-encode output pcm sample in decoder for synchronous | |
| 134 tandem coding. | |
| 135 | |
| 136 G726_tone ....... partial band signal detection. | |
| 137 | |
| 138 G726_trans ...... transition detector. | |
| 139 | |
| 140 G726_triga ...... speed control trigger block. | |
| 141 | |
| 142 G726_trigb ...... predictor trigger block. | |
| 143 | |
| 144 G726_upa1 ....... update a1 coefficient of second order predictor. | |
| 145 | |
| 146 G726_upa2 ....... update a2 coefficient of second order predictor. | |
| 147 | |
| 148 G726_upb ........ update for coefficients of sixth order predictor. | |
| 149 | |
| 150 G726_xor ........ one bit "exclusive or" of sign of difference signal | |
| 151 and sign of delayed difference signal. | |
| 152 | |
| 153 ============================================================================= | |
| 154 */ | |
| 155 | |
| 156 /* | |
| 157 * .................. INCLUDES .................. | |
| 158 */ | |
| 159 #include "g726.h" | |
| 160 | |
| 161 | |
| 162 /* | |
| 163 * .................. FUNCTIONS .................. | |
| 164 */ | |
| 165 | |
| 166 /* | |
| 167 ---------------------------------------------------------------------------- | |
| 168 | |
| 169 void G726_encode (short *inp_buf, short *out_buf, long smpno, | |
| 170 ~~~~~~~~~~~~~~~~ char *law, short rate, short r, G726_state *state); | |
| 171 | |
| 172 Description: | |
| 173 ~~~~~~~~~~~~ | |
| 174 | |
| 175 Simulation of the ITU-T G.726 ADPCM encoder. Takes the A or mu | |
| 176 law input array of shorts `inp_buf' (16 bit, right- justified, | |
| 177 without sign extension) of length `smpno', and saves the | |
| 178 encoded samples in the array of shorts `out_buf', with the | |
| 179 same number of samples and right-justified. | |
| 180 | |
| 181 The state variables are saved in the structure `state', and the | |
| 182 reset can be stablished by making r equal to 1. The law is A if | |
| 183 `law'=='1', and mu law if `law'=='0'. | |
| 184 | |
| 185 | |
| 186 Return value: | |
| 187 ~~~~~~~~~~~~~ | |
| 188 None. | |
| 189 | |
| 190 Prototype: in file g726.h | |
| 191 ~~~~~~~~~~ | |
| 192 | |
| 193 History: | |
| 194 ~~~~~~~~ | |
| 195 31.Jan.91 v1.0f Version 1.0 in Fortran | |
| 196 <tdsindi@venus.cpqd.ansp.br> | |
| 197 05.Feb.92 v1.0c Version 1.0 in C, by translating Fortran to C (f2c) | |
| 198 <tdsimao@venus.cpqd.ansp.br> | |
| 199 | |
| 200 ---------------------------------------------------------------------------- | |
| 201 */ | |
| 202 void G726_encode(inp_buf, out_buf, smpno, law, rate, r, state) | |
| 203 unsigned char *inp_buf; | |
| 204 short *out_buf; | |
| 205 long smpno; | |
| 206 char *law; | |
| 207 short r; | |
| 208 short rate; | |
| 209 G726_state *state; | |
| 210 { | |
| 211 short s; | |
| 212 short d, i; | |
| 213 short y; | |
| 214 short sigpk; | |
| 215 short sr, tr; | |
| 216 short yu; | |
| 217 short al, fi, dl, ap, dq, ds, se, ax, td, sl, wi; | |
| 218 short u1, u2, u3, u4, u5, u6; | |
| 219 short a1, a2, b1, b2, b3, b4, b5, b6; | |
| 220 short dqln; | |
| 221 short a1p, a2p, a1t, a2t, b1p, b2p, b3p, b4p, b5p, b6p, dq6, pk2, | |
| 222 sr2, wa1, wa2, wb1, wb2, wb3, wb4, wb5, wb6; | |
| 223 short dml, dln, app, dql, dms; | |
| 224 short dqs, tdp; | |
| 225 short sez; | |
| 226 short yut; | |
| 227 long yl; | |
| 228 | |
| 229 long j; | |
| 230 | |
| 231 /* Invert even bits if A law */ | |
| 232 if (*law == '1') { | |
| 233 for (j = 0; j < smpno; j++) | |
| 234 inp_buf[j] ^= 85; | |
| 235 } | |
| 236 | |
| 237 /* Process all desired samples in inp_buf to out_buf; The comments about | |
| 238 * general blocks are given as in G.726, and refer to: 4.1.1 Input PCM | |
| 239 * format conversion and difference signal computation 4.1.2 Adaptive | |
| 240 * quantizer 4.1.3 Inverse adaptive quantizer 4.1.4 Quantizer scale factor | |
| 241 * adaptation 4.1.5 Adaptation speed control 4.1.6 Adaptive predictor and | |
| 242 * reconstructed signal calculator 4.1.7 Tone and transition detector 4.1.8 | |
| 243 * (Only in the decoder) */ | |
| 244 for (j = 0; j < smpno; j++, r = 0) { | |
| 245 s = inp_buf[j]; | |
| 246 | |
| 247 /* Process `known-state' part of 4.2.6 */ | |
| 248 G726_delayd(&r, &state->sr1, &sr2); | |
| 249 G726_delayd(&r, &state->sr0, &state->sr1); | |
| 250 G726_delaya(&r, &state->a2r, &a2); | |
| 251 G726_delaya(&r, &state->a1r, &a1); | |
| 252 G726_fmult(&a2, &sr2, &wa2); | |
| 253 G726_fmult(&a1, &state->sr1, &wa1); | |
| 254 | |
| 255 G726_delayd(&r, &state->dq5, &dq6); | |
| 256 G726_delayd(&r, &state->dq4, &state->dq5); | |
| 257 G726_delayd(&r, &state->dq3, &state->dq4); | |
| 258 G726_delayd(&r, &state->dq2, &state->dq3); | |
| 259 G726_delayd(&r, &state->dq1, &state->dq2); | |
| 260 G726_delayd(&r, &state->dq0, &state->dq1); | |
| 261 | |
| 262 G726_delaya(&r, &state->b1r, &b1); | |
| 263 G726_delaya(&r, &state->b2r, &b2); | |
| 264 G726_delaya(&r, &state->b3r, &b3); | |
| 265 G726_delaya(&r, &state->b4r, &b4); | |
| 266 G726_delaya(&r, &state->b5r, &b5); | |
| 267 G726_delaya(&r, &state->b6r, &b6); | |
| 268 | |
| 269 G726_fmult(&b1, &state->dq1, &wb1); | |
| 270 G726_fmult(&b2, &state->dq2, &wb2); | |
| 271 G726_fmult(&b3, &state->dq3, &wb3); | |
| 272 G726_fmult(&b4, &state->dq4, &wb4); | |
| 273 G726_fmult(&b5, &state->dq5, &wb5); | |
| 274 G726_fmult(&b6, &dq6, &wb6); | |
| 275 | |
| 276 G726_accum(&wa1, &wa2, &wb1, &wb2, &wb3, &wb4, &wb5, &wb6, &se, | |
| 277 &sez); | |
| 278 | |
| 279 /* Process 4.2.1 */ | |
| 280 G726_expand(&s, law, &sl); | |
| 281 G726_subta(&sl, &se, &d); | |
| 282 | |
| 283 /* Process delays and `know-state' part of 4.2.5 */ | |
| 284 G726_delaya(&r, &state->dmsp, &dms); | |
| 285 G726_delaya(&r, &state->dmlp, &dml); | |
| 286 G726_delaya(&r, &state->apr, &ap); | |
| 287 G726_lima(&ap, &al); | |
| 288 | |
| 289 /* Process `know-state' parts of 4.2.4 */ | |
| 290 G726_delayb(&r, &state->yup, &yu); | |
| 291 G726_delayc(&r, &state->ylp, &yl); | |
| 292 G726_mix(&al, &yu, &yl, &y); | |
| 293 | |
| 294 /* Process 4.2.2 */ | |
| 295 G726_log(&d, &dl, &ds); | |
| 296 G726_subtb(&dl, &y, &dln); | |
| 297 G726_quan(rate, &dln, &ds, &i); | |
| 298 | |
| 299 /* Save ADPCM quantized sample into output buffer */ | |
| 300 out_buf[j] = i; | |
| 301 | |
| 302 /* Process 4.2.3 */ | |
| 303 G726_reconst(rate, &i, &dqln, &dqs); | |
| 304 G726_adda(&dqln, &y, &dql); | |
| 305 G726_antilog(&dql, &dqs, &dq); | |
| 306 | |
| 307 /* Part of 4.2.5 */ | |
| 308 G726_functf(rate, &i, &fi); | |
| 309 G726_filta(&fi, &dms, &state->dmsp); | |
| 310 G726_filtb(&fi, &dml, &state->dmlp); | |
| 311 | |
| 312 /* Remaining part of 4.2.4 */ | |
| 313 G726_functw(rate, &i, &wi); | |
| 314 G726_filtd(&wi, &y, &yut); | |
| 315 G726_limb(&yut, &state->yup); | |
| 316 G726_filte(&state->yup, &yl, &state->ylp); | |
| 317 | |
| 318 /* Process `known-state' part of 4.2.7 */ | |
| 319 G726_delaya(&r, &state->tdr, &td); | |
| 320 G726_trans(&td, &yl, &dq, &tr); | |
| 321 | |
| 322 /* More `known-state' parts of 4.2.6: update of `pk's */ | |
| 323 G726_delaya(&r, &state->pk1, &pk2); | |
| 324 G726_delaya(&r, &state->pk0, &state->pk1); | |
| 325 G726_addc(&dq, &sez, &state->pk0, &sigpk); | |
| 326 | |
| 327 /* 4.2.6: find sr0 */ | |
| 328 G726_addb(&dq, &se, &sr); | |
| 329 G726_floatb(&sr, &state->sr0); | |
| 330 | |
| 331 /* 4.2.6: find dq0 */ | |
| 332 G726_floata(&dq, &state->dq0); | |
| 333 | |
| 334 /* 4.2.6: prepar a2(r) */ | |
| 335 G726_upa2(&state->pk0, &state->pk1, &pk2, &a2, &a1, &sigpk, &a2t); | |
| 336 G726_limc(&a2t, &a2p); | |
| 337 G726_trigb(&tr, &a2p, &state->a2r); | |
| 338 | |
| 339 /* 4.2.6: prepar a1(r) */ | |
| 340 G726_upa1(&state->pk0, &state->pk1, &a1, &sigpk, &a1t); | |
| 341 G726_limd(&a1t, &a2p, &a1p); | |
| 342 G726_trigb(&tr, &a1p, &state->a1r); | |
| 343 | |
| 344 /* Remaining of 4.2.7 */ | |
| 345 G726_tone(&a2p, &tdp); | |
| 346 G726_trigb(&tr, &tdp, &state->tdr); | |
| 347 | |
| 348 /* Remaining of 4.2.5 */ | |
| 349 G726_subtc(&state->dmsp, &state->dmlp, &tdp, &y, &ax); | |
| 350 G726_filtc(&ax, &ap, &app); | |
| 351 G726_triga(&tr, &app, &state->apr); | |
| 352 | |
| 353 /* Remaining of 4.2.6: update of all `b's */ | |
| 354 G726_xor(&state->dq1, &dq, &u1); /* Here, b1 */ | |
| 355 G726_upb(rate, &u1, &b1, &dq, &b1p); | |
| 356 G726_trigb(&tr, &b1p, &state->b1r); | |
| 357 | |
| 358 G726_xor(&state->dq2, &dq, &u2); /* Here, b2 */ | |
| 359 G726_upb(rate, &u2, &b2, &dq, &b2p); | |
| 360 G726_trigb(&tr, &b2p, &state->b2r); | |
| 361 | |
| 362 G726_xor(&state->dq3, &dq, &u3); /* Here, b3 */ | |
| 363 G726_upb(rate, &u3, &b3, &dq, &b3p); | |
| 364 G726_trigb(&tr, &b3p, &state->b3r); | |
| 365 | |
| 366 G726_xor(&state->dq4, &dq, &u4); /* Here, b4 */ | |
| 367 G726_upb(rate, &u4, &b4, &dq, &b4p); | |
| 368 G726_trigb(&tr, &b4p, &state->b4r); | |
| 369 | |
| 370 G726_xor(&state->dq5, &dq, &u5); /* Here, b5 */ | |
| 371 G726_upb(rate, &u5, &b5, &dq, &b5p); | |
| 372 G726_trigb(&tr, &b5p, &state->b5r); | |
| 373 | |
| 374 G726_xor(&dq6, &dq, &u6); /* At last, b6 */ | |
| 375 G726_upb(rate, &u6, &b6, &dq, &b6p); | |
| 376 G726_trigb(&tr, &b6p, &state->b6r); | |
| 377 } | |
| 378 } | |
| 379 | |
| 380 /* ........................ end of G726_encode() ....................... */ | |
| 381 | |
| 382 | |
| 383 /* | |
| 384 ---------------------------------------------------------------------------- | |
| 385 | |
| 386 void G726_decode (short *inp_buf, short *out_buf, long smpno, | |
| 387 ~~~~~~~~~~~~~~~~ char *law, short rate, short r, G726_state *state); | |
| 388 | |
| 389 Description: | |
| 390 ~~~~~~~~~~~~ | |
| 391 | |
| 392 Simulation of the ITU-T G.726 ADPCM decoder. Takes the ADPCM | |
| 393 input array of shorts `inp_buf' (16 bit, right- justified, | |
| 394 without sign extension) of length `smpno', and saves the | |
| 395 decoded samples (A or mu law) in the array of shorts | |
| 396 `out_buf', with the same number of samples and | |
| 397 right-justified. | |
| 398 | |
| 399 The state variables are saved in the structure `state', and the | |
| 400 reset can be stablished by making r equal to 1. The law is A if | |
| 401 `law'=='1', and mu law if `law'=='0'. | |
| 402 | |
| 403 | |
| 404 Return value: | |
| 405 ~~~~~~~~~~~~~ | |
| 406 None. | |
| 407 | |
| 408 Prototype: in file g726.h | |
| 409 ~~~~~~~~~~ | |
| 410 | |
| 411 History: | |
| 412 ~~~~~~~~ | |
| 413 31.Jan.91 v1.0f Version 1.0 in Fortran | |
| 414 <tdsindi@venus.cpqd.ansp.br> | |
| 415 05.Feb.92 v1.0c Version 1.0 in C, by translating Fortran to C (f2c) | |
| 416 <tdsimao@venus.cpqd.ansp.br> | |
| 417 | |
| 418 ---------------------------------------------------------------------------- | |
| 419 */ | |
| 420 void G726_decode(inp_buf, out_buf, smpno, law, rate, r, state) | |
| 421 short *inp_buf; | |
| 422 unsigned char *out_buf; | |
| 423 long smpno; | |
| 424 char *law; | |
| 425 short r; | |
| 426 short rate; | |
| 427 G726_state *state; | |
| 428 { | |
| 429 short i; | |
| 430 short y; | |
| 431 short sigpk; | |
| 432 short sr, tr; | |
| 433 short sp, dlnx, dsx, sd, slx, dlx, dx; /* these are unique to | |
| 434 * the decoder */ | |
| 435 long yl; | |
| 436 short yu; | |
| 437 short al, fi, ap, dq, se, ax, td, wi; | |
| 438 short u1, u2, u3, u4, u5, u6; | |
| 439 short a1, a2, b1, b2, b3, b4, b5, b6; | |
| 440 short dqln; | |
| 441 short a1p, a2p, a1t, a2t, b1p, b2p, b3p, b4p, b5p, b6p, dq6, pk2, | |
| 442 sr2, wa1, wa2, wb1, wb2, wb3, wb4, wb5, wb6; | |
| 443 short dml, app, dql, dms; | |
| 444 short dqs, tdp; | |
| 445 short sez; | |
| 446 short yut; | |
| 447 long j; | |
| 448 | |
| 449 /* Process all desired samples in inp_buf to out_buf; The comments about | |
| 450 * general blocks are given as in G.726, and refer to: 4.1.1 Input PCM | |
| 451 * format conversion and difference signal computation 4.1.2 Adaptive | |
| 452 * quantizer 4.1.3 Inverse adaptive quantizer 4.1.4 Quantizer scale factor | |
| 453 * adaptation 4.1.5 Adaptation speed control 4.1.6 Adaptive predictor and | |
| 454 * reconstructed signal calculator 4.1.7 Tone and transition detector 4.1.8 | |
| 455 * Output PCM format conversion and synchronous coding adjustment */ | |
| 456 for (j = 0; j < smpno; j++, r = 0) { | |
| 457 /* Process `known-state' part of 4.2.6 */ | |
| 458 G726_delayd(&r, &state->sr1, &sr2); | |
| 459 G726_delayd(&r, &state->sr0, &state->sr1); | |
| 460 G726_delaya(&r, &state->a2r, &a2); | |
| 461 G726_delaya(&r, &state->a1r, &a1); | |
| 462 G726_fmult(&a2, &sr2, &wa2); | |
| 463 G726_fmult(&a1, &state->sr1, &wa1); | |
| 464 | |
| 465 G726_delayd(&r, &state->dq5, &dq6); | |
| 466 G726_delayd(&r, &state->dq4, &state->dq5); | |
| 467 G726_delayd(&r, &state->dq3, &state->dq4); | |
| 468 G726_delayd(&r, &state->dq2, &state->dq3); | |
| 469 G726_delayd(&r, &state->dq1, &state->dq2); | |
| 470 G726_delayd(&r, &state->dq0, &state->dq1); | |
| 471 | |
| 472 G726_delaya(&r, &state->b1r, &b1); | |
| 473 G726_delaya(&r, &state->b2r, &b2); | |
| 474 G726_delaya(&r, &state->b3r, &b3); | |
| 475 G726_delaya(&r, &state->b4r, &b4); | |
| 476 G726_delaya(&r, &state->b5r, &b5); | |
| 477 G726_delaya(&r, &state->b6r, &b6); | |
| 478 | |
| 479 G726_fmult(&b1, &state->dq1, &wb1); | |
| 480 G726_fmult(&b2, &state->dq2, &wb2); | |
| 481 G726_fmult(&b3, &state->dq3, &wb3); | |
| 482 G726_fmult(&b4, &state->dq4, &wb4); | |
| 483 G726_fmult(&b5, &state->dq5, &wb5); | |
| 484 G726_fmult(&b6, &dq6, &wb6); | |
| 485 | |
| 486 G726_accum(&wa1, &wa2, &wb1, &wb2, &wb3, &wb4, &wb5, &wb6, &se, | |
| 487 &sez); | |
| 488 | |
| 489 /* Process delays and `know-state' part of 4.2.5 */ | |
| 490 G726_delaya(&r, &state->dmsp, &dms); | |
| 491 G726_delaya(&r, &state->dmlp, &dml); | |
| 492 G726_delaya(&r, &state->apr, &ap); | |
| 493 G726_lima(&ap, &al); | |
| 494 | |
| 495 /* Process `know-state' parts of 4.2.4 */ | |
| 496 G726_delayb(&r, &state->yup, &yu); | |
| 497 G726_delayc(&r, &state->ylp, &yl); | |
| 498 G726_mix(&al, &yu, &yl, &y); | |
| 499 | |
| 500 /* Retrieve ADPCM sample from input buffer */ | |
| 501 i = inp_buf[j]; | |
| 502 | |
| 503 /* Process 4.2.3 */ | |
| 504 G726_reconst(rate, &i, &dqln, &dqs); | |
| 505 G726_adda(&dqln, &y, &dql); | |
| 506 G726_antilog(&dql, &dqs, &dq); | |
| 507 | |
| 508 /* Process `known-state' part of 4.2.7 */ | |
| 509 G726_delaya(&r, &state->tdr, &td); | |
| 510 G726_trans(&td, &yl, &dq, &tr); | |
| 511 | |
| 512 /* Part of 4.2.5 */ | |
| 513 G726_functf(rate, &i, &fi); | |
| 514 G726_filta(&fi, &dms, &state->dmsp); | |
| 515 G726_filtb(&fi, &dml, &state->dmlp); | |
| 516 | |
| 517 /* Remaining part of 4.2.4 */ | |
| 518 G726_functw(rate, &i, &wi); | |
| 519 G726_filtd(&wi, &y, &yut); | |
| 520 G726_limb(&yut, &state->yup); | |
| 521 G726_filte(&state->yup, &yl, &state->ylp); | |
| 522 | |
| 523 /* More `known-state' parts of 4.2.6: update of `pk's */ | |
| 524 G726_delaya(&r, &state->pk1, &pk2); | |
| 525 G726_delaya(&r, &state->pk0, &state->pk1); | |
| 526 G726_addc(&dq, &sez, &state->pk0, &sigpk); | |
| 527 | |
| 528 /* 4.2.6: find sr0 */ | |
| 529 G726_addb(&dq, &se, &sr); | |
| 530 G726_floatb(&sr, &state->sr0); | |
| 531 | |
| 532 /* 4.2.6: find dq0 */ | |
| 533 G726_floata(&dq, &state->dq0); | |
| 534 | |
| 535 /* Process 4.2.8 */ | |
| 536 G726_compress(&sr, law, &sp); | |
| 537 G726_expand(&sp, law, &slx); | |
| 538 G726_subta(&slx, &se, &dx); | |
| 539 G726_log(&dx, &dlx, &dsx); | |
| 540 G726_subtb(&dlx, &y, &dlnx); | |
| 541 G726_sync(rate, &i, &sp, &dlnx, &dsx, law, &sd); | |
| 542 | |
| 543 /* Save output PCM word in output buffer */ | |
| 544 out_buf[j] = sd; | |
| 545 | |
| 546 /* 4.2.6: prepar a2(r) */ | |
| 547 G726_upa2(&state->pk0, &state->pk1, &pk2, &a2, &a1, &sigpk, &a2t); | |
| 548 G726_limc(&a2t, &a2p); | |
| 549 G726_trigb(&tr, &a2p, &state->a2r); | |
| 550 | |
| 551 /* 4.2.6: prepar a1(r) */ | |
| 552 G726_upa1(&state->pk0, &state->pk1, &a1, &sigpk, &a1t); | |
| 553 G726_limd(&a1t, &a2p, &a1p); | |
| 554 G726_trigb(&tr, &a1p, &state->a1r); | |
| 555 | |
| 556 /* Remaining of 4.2.7 */ | |
| 557 G726_tone(&a2p, &tdp); | |
| 558 G726_trigb(&tr, &tdp, &state->tdr); | |
| 559 | |
| 560 /* Remaining of 4.2.5 */ | |
| 561 G726_subtc(&state->dmsp, &state->dmlp, &tdp, &y, &ax); | |
| 562 G726_filtc(&ax, &ap, &app); | |
| 563 G726_triga(&tr, &app, &state->apr); | |
| 564 | |
| 565 /* Remaining of 4.2.6: update of all `b's */ | |
| 566 G726_xor(&state->dq1, &dq, &u1); /* Here, b1 */ | |
| 567 G726_upb(rate, &u1, &b1, &dq, &b1p); | |
| 568 G726_trigb(&tr, &b1p, &state->b1r); | |
| 569 | |
| 570 G726_xor(&state->dq2, &dq, &u2); /* Here, b2 */ | |
| 571 G726_upb(rate, &u2, &b2, &dq, &b2p); | |
| 572 G726_trigb(&tr, &b2p, &state->b2r); | |
| 573 | |
| 574 G726_xor(&state->dq3, &dq, &u3); /* Here, b3 */ | |
| 575 G726_upb(rate, &u3, &b3, &dq, &b3p); | |
| 576 G726_trigb(&tr, &b3p, &state->b3r); | |
| 577 | |
| 578 G726_xor(&state->dq4, &dq, &u4); /* Here, b4 */ | |
| 579 G726_upb(rate, &u4, &b4, &dq, &b4p); | |
| 580 G726_trigb(&tr, &b4p, &state->b4r); | |
| 581 | |
| 582 G726_xor(&state->dq5, &dq, &u5); /* Here, b5 */ | |
| 583 G726_upb(rate, &u5, &b5, &dq, &b5p); | |
| 584 G726_trigb(&tr, &b5p, &state->b5r); | |
| 585 | |
| 586 G726_xor(&dq6, &dq, &u6); /* At last, b6 */ | |
| 587 G726_upb(rate, &u6, &b6, &dq, &b6p); | |
| 588 G726_trigb(&tr, &b6p, &state->b6r); | |
| 589 } | |
| 590 | |
| 591 /* Invert even bits if A law */ | |
| 592 if (*law == '1') { | |
| 593 for (j = 0; j < smpno; j++) | |
| 594 out_buf[j] ^= 85; | |
| 595 } | |
| 596 | |
| 597 } | |
| 598 | |
| 599 /* ...................... end of G726_decode() ...................... */ | |
| 600 | |
| 601 | |
| 602 /* | |
| 603 ---------------------------------------------------------------------- | |
| 604 | |
| 605 void G726_expand (short *s, char *law, short *sl); | |
| 606 ~~~~~~~~~~~~~~~~ | |
| 607 | |
| 608 Description: | |
| 609 ~~~~~~~~~~~~ | |
| 610 | |
| 611 Convert either a-law (law=1) or u-law (law=0) to uniform pcm. | |
| 612 | |
| 613 Inputs: s (sp in decoder), law | |
| 614 Output: sl (slx in decoder) | |
| 615 | |
| 616 Return value: none. | |
| 617 ~~~~~~~~~~~~~ | |
| 618 | |
| 619 Prototype: in g726.h | |
| 620 ~~~~~~~~~~ | |
| 621 | |
| 622 History: | |
| 623 ~~~~~~~~ | |
| 624 31.Jan.91 v1.0f Release of 1st Fortran version to UGST. | |
| 625 <tdsindi@venus.cpqd.ansp.br> | |
| 626 13.Feb.92 v1.0c 1st version in C translated from Fortran (f2c) | |
| 627 <tdsimao@venus.cpqd.ansp.br> | |
| 628 | |
| 629 ---------------------------------------------------------------------- | |
| 630 */ | |
| 631 void G726_expand(s, law, sl) | |
| 632 short *s; | |
| 633 char *law; | |
| 634 short *sl; | |
| 635 { | |
| 636 long mant, iexp; | |
| 637 short s1, ss, sig, ssm, ssq, sss; | |
| 638 | |
| 639 s1 = *s; | |
| 640 | |
| 641 if (*law == '1') { | |
| 642 /* Invert sign bit */ | |
| 643 s1 ^= 128; | |
| 644 if (s1 >= 128) { | |
| 645 s1 += -128; | |
| 646 sig = 4096; | |
| 647 } else { | |
| 648 sig = 0; | |
| 649 | |
| 650 } | |
| 651 iexp = s1 / 16; | |
| 652 | |
| 653 mant = s1 - (iexp << 4); | |
| 654 ss = (iexp == 0) ? | |
| 655 ((mant << 1) + 1 + sig) : | |
| 656 ((1 << (iexp - 1)) * ((mant << 1) + 33) + sig); | |
| 657 | |
| 658 sss = ss / 4096; | |
| 659 ssm = ss & 4095; | |
| 660 ssq = ssm << 1; | |
| 661 } else { | |
| 662 /* Invert sign bit */ | |
| 663 s1 ^= 128; | |
| 664 if (s1 >= 128) { | |
| 665 s1 += -128; | |
| 666 s1 ^= 127; | |
| 667 sig = 8192; | |
| 668 } else { | |
| 669 sig = 0; | |
| 670 s1 ^= 127; | |
| 671 } | |
| 672 iexp = s1 / 16; | |
| 673 | |
| 674 mant = s1 - (iexp << 4); | |
| 675 | |
| 676 ss = (iexp == 0) ? | |
| 677 ((mant << 1) + sig) : | |
| 678 ((1 << iexp) * ((mant << 1) + 33) - 33 + sig); | |
| 679 | |
| 680 sss = ss / 8192; | |
| 681 ssq = ss & 8191; | |
| 682 } | |
| 683 | |
| 684 *sl = (sss == 0) ? ssq : ((16384 - ssq) & 16383); | |
| 685 | |
| 686 } | |
| 687 | |
| 688 /* ...................... end of G726_expand() ...................... */ | |
| 689 | |
| 690 | |
| 691 /* | |
| 692 ---------------------------------------------------------------------- | |
| 693 | |
| 694 void G726_subta (short *sl, short *se, short *d); | |
| 695 ~~~~~~~~~~~~~~~ | |
| 696 | |
| 697 Description: | |
| 698 ~~~~~~~~~~~~ | |
| 699 | |
| 700 Compute difference signal by subtracting signal estimate from | |
| 701 input signal (or quantized reconstructed signal in decoder). | |
| 702 | |
| 703 Inputs: sl (slx in decoder), se | |
| 704 Output: d (dx in decoder) | |
| 705 | |
| 706 | |
| 707 Return value: none. | |
| 708 ~~~~~~~~~~~~~ | |
| 709 | |
| 710 Prototype: in g726.h | |
| 711 ~~~~~~~~~~ | |
| 712 | |
| 713 History: | |
| 714 ~~~~~~~~ | |
| 715 31.Jan.91 v1.0f Release of 1st Fortran version to UGST. | |
| 716 <tdsindi@venus.cpqd.ansp.br> | |
| 717 13.Feb.92 v1.0c 1st version in C translated from Fortran (f2c) | |
| 718 <tdsimao@venus.cpqd.ansp.br> | |
| 719 | |
| 720 | |
| 721 ---------------------------------------------------------------------- | |
| 722 */ | |
| 723 void G726_subta(sl, se, d) | |
| 724 short *sl, *se, *d; | |
| 725 { | |
| 726 long se1; | |
| 727 long sl1, sei, sli; | |
| 728 short ses, sls; | |
| 729 | |
| 730 sls = (*sl >> 13); | |
| 731 | |
| 732 sl1 = *sl; | |
| 733 se1 = *se; | |
| 734 | |
| 735 /* Sign extension */ | |
| 736 sli = (sls == 0) ? sl1 : (sl1 + 49152); | |
| 737 | |
| 738 ses = (*se >> 14); | |
| 739 | |
| 740 /* Sign extension */ | |
| 741 sei = (ses == 0) ? se1 : (se1 + 32768); | |
| 742 | |
| 743 /* 16 bit TC */ | |
| 744 *d = (short) ((sli + 65536 - sei) & 65535); | |
| 745 | |
| 746 } | |
| 747 | |
| 748 /* ......................... end of G726_subta() ......................... */ | |
| 749 | |
| 750 | |
| 751 /* | |
| 752 -------------------------------------------------------------------------- | |
| 753 | |
| 754 void G726_log (short *d, short *dl, short *ds); | |
| 755 ~~~~~~~~~~~~~ | |
| 756 | |
| 757 Description: | |
| 758 ~~~~~~~~~~~~ | |
| 759 | |
| 760 Convert difference signal from linear to the logarithmic domain. | |
| 761 | |
| 762 Prototype: in g726.h | |
| 763 ~~~~~~~~~~ | |
| 764 | |
| 765 History: | |
| 766 ~~~~~~~~ | |
| 767 31.Jan.91 v1.0f 1st release to UGST, in Fortran. | |
| 768 <tdsindi@venus.cpqd.ansp.br> | |
| 769 13.Feb.92 v1.0c release of 1st version, in C. | |
| 770 <tdsimao@venus.cpqd.ansp.br> | |
| 771 | |
| 772 -------------------------------------------------------------------------- | |
| 773 */ | |
| 774 void G726_log(d, dl, ds) | |
| 775 short *d, *dl, *ds; | |
| 776 { | |
| 777 long mant; | |
| 778 long d1; | |
| 779 long dqm, exp_; | |
| 780 | |
| 781 *ds = (*d >> 15); | |
| 782 | |
| 783 d1 = *d; | |
| 784 | |
| 785 /* Convert from 2-complement to signed magnitude */ | |
| 786 dqm = (*ds) ? ((65536 - d1) & 32767) : d1; | |
| 787 | |
| 788 /* Compute exponent */ | |
| 789 if (dqm >= 16384) | |
| 790 exp_ = 14; | |
| 791 else if (dqm >= 8192) | |
| 792 exp_ = 13; | |
| 793 else if (dqm >= 4096) | |
| 794 exp_ = 12; | |
| 795 else if (dqm >= 2048) | |
| 796 exp_ = 11; | |
| 797 else if (dqm >= 1024) | |
| 798 exp_ = 10; | |
| 799 else if (dqm >= 512) | |
| 800 exp_ = 9; | |
| 801 else if (dqm >= 256) | |
| 802 exp_ = 8; | |
| 803 else if (dqm >= 128) | |
| 804 exp_ = 7; | |
| 805 else if (dqm >= 64) | |
| 806 exp_ = 6; | |
| 807 else if (dqm >= 32) | |
| 808 exp_ = 5; | |
| 809 else if (dqm >= 16) | |
| 810 exp_ = 4; | |
| 811 else if (dqm >= 8) | |
| 812 exp_ = 3; | |
| 813 else if (dqm >= 4) | |
| 814 exp_ = 2; | |
| 815 else if (dqm >= 2) | |
| 816 exp_ = 1; | |
| 817 else | |
| 818 exp_ = 0; | |
| 819 | |
| 820 /* Compute approximation log2(1+x) = x */ | |
| 821 mant = ((dqm << 7) >> exp_) & 127; | |
| 822 | |
| 823 /* Combine mantissa and exponent (7 and 4) bits into a 11-bit word */ | |
| 824 *dl = (short) ((exp_ << 7) + mant); | |
| 825 | |
| 826 } | |
| 827 | |
| 828 /* ........................ end of G726_log() ....................... */ | |
| 829 | |
| 830 | |
| 831 /* | |
| 832 ---------------------------------------------------------------------- | |
| 833 | |
| 834 void G726_quan (short rate, short *dln, short *ds, short *i); | |
| 835 ~~~~~~~~~~~~~~ | |
| 836 | |
| 837 Description: | |
| 838 ~~~~~~~~~~~~ | |
| 839 | |
| 840 Quantize difference signal in logarithmic | |
| 841 domain. | |
| 842 | |
| 843 Inputs: dln, ds, rate | |
| 844 Output: i | |
| 845 | |
| 846 | |
| 847 Return value: none. | |
| 848 ~~~~~~~~~~~~~ | |
| 849 | |
| 850 Prototype: in g726.h | |
| 851 ~~~~~~~~~~ | |
| 852 | |
| 853 History: | |
| 854 ~~~~~~~~ | |
| 855 31.Jan.91 v1.0f Release of 1st Fortran version to UGST. | |
| 856 <tdsindi@venus.cpqd.ansp.br> | |
| 857 13.Feb.92 v1.0c 1st version in C translated from Fortran (f2c) | |
| 858 <tdsimao@venus.cpqd.ansp.br> | |
| 859 | |
| 860 ---------------------------------------------------------------------- | |
| 861 */ | |
| 862 void G726_quan(rate, dln, ds, i) | |
| 863 short *dln, *ds, *i; | |
| 864 short rate; | |
| 865 { | |
| 866 if (rate == 4) { | |
| 867 if (*dln >= 3972) | |
| 868 *i = 1; | |
| 869 else if (*dln >= 2048) | |
| 870 *i = 15; | |
| 871 else if (*dln >= 400) | |
| 872 *i = 7; | |
| 873 else if (*dln >= 349) | |
| 874 *i = 6; | |
| 875 else if (*dln >= 300) | |
| 876 *i = 5; | |
| 877 else if (*dln >= 246) | |
| 878 *i = 4; | |
| 879 else if (*dln >= 178) | |
| 880 *i = 3; | |
| 881 else if (*dln >= 80) | |
| 882 *i = 2; | |
| 883 else | |
| 884 *i = 1; | |
| 885 | |
| 886 /* Adjust for sign */ | |
| 887 if (*ds) | |
| 888 *i = 15 - *i; | |
| 889 | |
| 890 if (*i == 0) | |
| 891 *i = 15; | |
| 892 } | |
| 893 | |
| 894 /* ......... end of 32 kbit part ........... */ | |
| 895 else if (rate == 3) { | |
| 896 if (*dln >= 2048) | |
| 897 *i = 7; | |
| 898 else if (*dln >= 331) | |
| 899 *i = 3; | |
| 900 else if (*dln >= 218) | |
| 901 *i = 2; | |
| 902 else if (*dln >= 8) | |
| 903 *i = 1; | |
| 904 else if (*dln >= 0) | |
| 905 *i = 7; | |
| 906 | |
| 907 /* Adjust for sign */ | |
| 908 if (*ds) | |
| 909 *i = 7 - *i; | |
| 910 | |
| 911 if (*i == 0) | |
| 912 *i = 7; | |
| 913 } | |
| 914 /* ......... end of 24 kbit part ........... */ | |
| 915 else if (rate == 2) { | |
| 916 if (*dln >= 2048) | |
| 917 *i = 0; | |
| 918 else if (*dln >= 261) | |
| 919 *i = 1; | |
| 920 else | |
| 921 *i = 0; | |
| 922 | |
| 923 /* Adjust for sign */ | |
| 924 if (*ds) | |
| 925 *i = 3 - *i; | |
| 926 } | |
| 927 /* ......... end of 16 kbit part ........... */ | |
| 928 else { | |
| 929 if (*dln >= 4080) | |
| 930 *i = 2; | |
| 931 else if (*dln >= 3974) | |
| 932 *i = 1; | |
| 933 else if (*dln >= 2048) | |
| 934 *i = 31; | |
| 935 else if (*dln >= 553) | |
| 936 *i = 15; | |
| 937 else if (*dln >= 528) | |
| 938 *i = 14; | |
| 939 else if (*dln >= 502) | |
| 940 *i = 13; | |
| 941 else if (*dln >= 475) | |
| 942 *i = 12; | |
| 943 else if (*dln >= 445) | |
| 944 *i = 11; | |
| 945 else if (*dln >= 413) | |
| 946 *i = 10; | |
| 947 else if (*dln >= 378) | |
| 948 *i = 9; | |
| 949 else if (*dln >= 339) | |
| 950 *i = 8; | |
| 951 else if (*dln >= 298) | |
| 952 *i = 7; | |
| 953 else if (*dln >= 250) | |
| 954 *i = 6; | |
| 955 else if (*dln >= 198) | |
| 956 *i = 5; | |
| 957 else if (*dln >= 139) | |
| 958 *i = 4; | |
| 959 else if (*dln >= 68) | |
| 960 *i = 3; | |
| 961 else if (*dln >= 0) | |
| 962 *i = 2; | |
| 963 | |
| 964 if (*ds) | |
| 965 *i = 31 - *i; | |
| 966 | |
| 967 if (*i == 0) | |
| 968 *i = 31; | |
| 969 | |
| 970 } /* ......... end of 40 kbit part ........... */ | |
| 971 | |
| 972 } | |
| 973 | |
| 974 /* ........................ end of G726_quan() ........................ */ | |
| 975 | |
| 976 | |
| 977 /* | |
| 978 ---------------------------------------------------------------------- | |
| 979 | |
| 980 void G726_subtb (short *dl, short *y, short *dln); | |
| 981 ~~~~~~~~~~~~~~~ | |
| 982 | |
| 983 Description: | |
| 984 ~~~~~~~~~~~~ | |
| 985 | |
| 986 Scale logarithmic version of difference signal by subtracting | |
| 987 scale factor. | |
| 988 | |
| 989 Inputs: dl (dlx no decodificador), y | |
| 990 Output: dln (dlnx no decodificador) | |
| 991 | |
| 992 | |
| 993 Return value: none. | |
| 994 ~~~~~~~~~~~~~ | |
| 995 | |
| 996 Prototype: in g726.h | |
| 997 ~~~~~~~~~~ | |
| 998 | |
| 999 History: | |
| 1000 ~~~~~~~~ | |
| 1001 31.Jan.91 v1.0f Release of 1st Fortran version to UGST. | |
| 1002 <tdsindi@venus.cpqd.ansp.br> | |
| 1003 13.Feb.92 v1.0c 1st version in C translated from Fortran (f2c) | |
| 1004 <tdsimao@venus.cpqd.ansp.br> | |
| 1005 | |
| 1006 ---------------------------------------------------------------------- | |
| 1007 */ | |
| 1008 void G726_subtb(dl, y, dln) | |
| 1009 short *dl, *y, *dln; | |
| 1010 { | |
| 1011 *dln = (*dl + 4096 - (*y >> 2)) & 4095; | |
| 1012 | |
| 1013 } | |
| 1014 | |
| 1015 /* ........................ end of G726_subtb() ........................ */ | |
| 1016 | |
| 1017 | |
| 1018 /* | |
| 1019 ---------------------------------------------------------------------- | |
| 1020 | |
| 1021 void G726_adda (short *dqln, short *y, short *dql); | |
| 1022 ~~~~~~~~~~~~~~ | |
| 1023 | |
| 1024 Description: | |
| 1025 ~~~~~~~~~~~~ | |
| 1026 | |
| 1027 Addition of scale factor to logarithmic version of quantized | |
| 1028 difference signal. | |
| 1029 | |
| 1030 Inputs: dqln, y | |
| 1031 Output: dql | |
| 1032 | |
| 1033 | |
| 1034 Return value: none. | |
| 1035 ~~~~~~~~~~~~~ | |
| 1036 | |
| 1037 Prototype: in g726.h | |
| 1038 ~~~~~~~~~~ | |
| 1039 | |
| 1040 History: | |
| 1041 ~~~~~~~~ | |
| 1042 31.Jan.91 v1.0f Release of 1st Fortran version to UGST. | |
| 1043 <tdsindi@venus.cpqd.ansp.br> | |
| 1044 13.Feb.92 v1.0c 1st version in C translated from Fortran (f2c) | |
| 1045 <tdsimao@venus.cpqd.ansp.br> | |
| 1046 | |
| 1047 ---------------------------------------------------------------------- | |
| 1048 */ | |
| 1049 void G726_adda(dqln, y, dql) | |
| 1050 short *dqln, *y, *dql; | |
| 1051 { | |
| 1052 *dql = (*dqln + (*y >> 2)) & 4095; | |
| 1053 | |
| 1054 } | |
| 1055 | |
| 1056 /* ....................... end of G726_adda() ....................... */ | |
| 1057 | |
| 1058 | |
| 1059 /* | |
| 1060 ---------------------------------------------------------------------- | |
| 1061 | |
| 1062 void G726_antilog (short *dql, short *dqs, short *dq); | |
| 1063 ~~~~~~~~~~~~~~~~~ | |
| 1064 | |
| 1065 Description: | |
| 1066 ~~~~~~~~~~~~ | |
| 1067 | |
| 1068 Convert quantized difference signal from the logarithmic to | |
| 1069 the linear domain. | |
| 1070 | |
| 1071 Inputs: dql, dqs | |
| 1072 Output: dq | |
| 1073 | |
| 1074 Return value: none. | |
| 1075 ~~~~~~~~~~~~~ | |
| 1076 | |
| 1077 Prototype: in g726.h | |
| 1078 ~~~~~~~~~~ | |
| 1079 | |
| 1080 History: | |
| 1081 ~~~~~~~~ | |
| 1082 31.Jan.91 v1.0f Release of 1st Fortran version to UGST. | |
| 1083 <tdsindi@venus.cpqd.ansp.br> | |
| 1084 13.Feb.92 v1.0c 1st version in C translated from Fortran (f2c) | |
| 1085 <tdsimao@venus.cpqd.ansp.br> | |
| 1086 | |
| 1087 ---------------------------------------------------------------------- | |
| 1088 */ | |
| 1089 void G726_antilog(dql, dqs, dq) | |
| 1090 short *dql, *dqs, *dq; | |
| 1091 { | |
| 1092 long dqmag; | |
| 1093 long ds, dmn, dex, dqt; | |
| 1094 | |
| 1095 /* Extract 4-bit exponent */ | |
| 1096 ds = (*dql >> 11); | |
| 1097 dex = (*dql >> 7) & 15; | |
| 1098 | |
| 1099 /* Extract 7-bit mantissa */ | |
| 1100 dmn = *dql & 127; | |
| 1101 | |
| 1102 dqt = dmn + 128; | |
| 1103 | |
| 1104 /* Convert mantissa to linear using the approx. 2**x = 1+x */ | |
| 1105 dqmag = ds ? 0 : ((dqt << 7) >> (14 - dex)); | |
| 1106 | |
| 1107 /* Attach sign bit to signed mag. word */ | |
| 1108 *dq = (short) (*dqs << 15) + dqmag; | |
| 1109 } | |
| 1110 | |
| 1111 /* ..................... end of G726_antilog() ..................... */ | |
| 1112 | |
| 1113 | |
| 1114 /* | |
| 1115 ---------------------------------------------------------------------- | |
| 1116 | |
| 1117 void G726_reconst (short rate, short *i, short *dqln, short *dqs); | |
| 1118 ~~~~~~~~~~~~~~~~~ | |
| 1119 | |
| 1120 Description: | |
| 1121 ~~~~~~~~~~~~ | |
| 1122 | |
| 1123 Reconstruction of quantized difference signal in the | |
| 1124 logarithmic domain. | |
| 1125 | |
| 1126 Inputs: i, rate | |
| 1127 Outputs: dqln, dqs | |
| 1128 | |
| 1129 Return value: none. | |
| 1130 ~~~~~~~~~~~~~ | |
| 1131 | |
| 1132 Prototype: in g726.h | |
| 1133 ~~~~~~~~~~ | |
| 1134 | |
| 1135 History: | |
| 1136 ~~~~~~~~ | |
| 1137 31.Jan.91 v1.0f Release of 1st Fortran version to UGST. | |
| 1138 <tdsindi@venus.cpqd.ansp.br> | |
| 1139 13.Feb.92 v1.0c 1st version in C translated from Fortran (f2c) | |
| 1140 <tdsimao@venus.cpqd.ansp.br> | |
| 1141 | |
| 1142 ---------------------------------------------------------------------- | |
| 1143 */ | |
| 1144 void G726_reconst(rate, i, dqln, dqs) | |
| 1145 short *i, *dqln, *dqs; | |
| 1146 short rate; | |
| 1147 { | |
| 1148 if (rate == 4) { | |
| 1149 /* Initialized data */ | |
| 1150 static short tab[16] = { 2048, 4, 135, 213, 273, 323, 373, 425, | |
| 1151 425, 373, 323, 273, 213, 135, 4, 2048 | |
| 1152 }; | |
| 1153 | |
| 1154 /* Extract sign */ | |
| 1155 *dqs = (*i >> 3); | |
| 1156 | |
| 1157 /* Table look-up */ | |
| 1158 *dqln = tab[*i]; | |
| 1159 } | |
| 1160 /* ............... end of 32 kbit part | |
| 1161 * ................. */ | |
| 1162 else if (rate == 3) { | |
| 1163 /* Initialized data */ | |
| 1164 static short tab[8] = { 2048, 135, 273, 373, 373, 273, 135, 2048 }; | |
| 1165 | |
| 1166 *dqs = (*i >> 2); | |
| 1167 | |
| 1168 /* Table look-up */ | |
| 1169 *dqln = tab[*i]; | |
| 1170 | |
| 1171 } | |
| 1172 | |
| 1173 /* ............... end of 24 kbit part | |
| 1174 * ................. */ | |
| 1175 else if (rate == 2) { | |
| 1176 /* Initialized data */ | |
| 1177 static short tab[4] = { 116, 365, 365, 116 }; | |
| 1178 | |
| 1179 *dqs = (*i >> 1); | |
| 1180 | |
| 1181 /* Table look-up */ | |
| 1182 *dqln = tab[*i]; | |
| 1183 | |
| 1184 } /* ............... end of 16 kbit part | |
| 1185 * ................. */ | |
| 1186 else { | |
| 1187 /* Initialized data */ | |
| 1188 static short tab[32] = | |
| 1189 { 2048, 4030, 28, 104, 169, 224, 274, 318, 358, 395, 429, | |
| 1190 459, 488, 514, 539, 566, 566, 539, 514, 488, 459, 429, 395, 358, | |
| 1191 318, 274, 224, | |
| 1192 169, 104, 28, 4030, 2048 | |
| 1193 }; | |
| 1194 | |
| 1195 *dqs = (*i >> 4); | |
| 1196 | |
| 1197 /* Table look-up */ | |
| 1198 *dqln = tab[*i]; | |
| 1199 | |
| 1200 } /* ................ end of 40 kbit part | |
| 1201 * ................... */ | |
| 1202 | |
| 1203 | |
| 1204 } | |
| 1205 | |
| 1206 /* ....................... end of G726_reconst() ....................... */ | |
| 1207 | |
| 1208 | |
| 1209 /* | |
| 1210 ---------------------------------------------------------------------- | |
| 1211 | |
| 1212 void G726_delaya (short *r, short *x, short *y); | |
| 1213 ~~~~~~~~~~~~~~~~ | |
| 1214 | |
| 1215 Description: | |
| 1216 ~~~~~~~~~~~~ | |
| 1217 | |
| 1218 Memory block. | |
| 1219 | |
| 1220 Inputs: r, x | |
| 1221 Output: y | |
| 1222 | |
| 1223 Return value: none. | |
| 1224 ~~~~~~~~~~~~~ | |
| 1225 | |
| 1226 Prototype: in g726.h | |
| 1227 ~~~~~~~~~~ | |
| 1228 | |
| 1229 History: | |
| 1230 ~~~~~~~~ | |
| 1231 31.Jan.91 v1.0f Release of 1st Fortran version to UGST. | |
| 1232 <tdsindi@venus.cpqd.ansp.br> | |
| 1233 13.Feb.92 v1.0c 1st version in C translated from Fortran (f2c) | |
| 1234 <tdsimao@venus.cpqd.ansp.br> | |
| 1235 | |
| 1236 ---------------------------------------------------------------------- | |
| 1237 */ | |
| 1238 void G726_delaya(r, x, y) | |
| 1239 short *r, *x, *y; | |
| 1240 { | |
| 1241 *y = (*r == 0) ? *x : 0; | |
| 1242 | |
| 1243 } | |
| 1244 | |
| 1245 /* ....................... end of G726_delaya() ....................... */ | |
| 1246 | |
| 1247 | |
| 1248 /* | |
| 1249 ---------------------------------------------------------------------- | |
| 1250 | |
| 1251 void G726_delayb (short *r, short *x, short *y); | |
| 1252 ~~~~~~~~~~~~~~~~ | |
| 1253 | |
| 1254 Description: | |
| 1255 ~~~~~~~~~~~~ | |
| 1256 | |
| 1257 Memory block. | |
| 1258 | |
| 1259 Inputs: r, x | |
| 1260 Output: y | |
| 1261 | |
| 1262 Return value: none. | |
| 1263 ~~~~~~~~~~~~~ | |
| 1264 | |
| 1265 Prototype: in g726.h | |
| 1266 ~~~~~~~~~~ | |
| 1267 | |
| 1268 History: | |
| 1269 ~~~~~~~~ | |
| 1270 31.Jan.91 v1.0f Release of 1st Fortran version to UGST. | |
| 1271 <tdsindi@venus.cpqd.ansp.br> | |
| 1272 13.Feb.92 v1.0c 1st version in C translated from Fortran (f2c) | |
| 1273 <tdsimao@venus.cpqd.ansp.br> | |
| 1274 | |
| 1275 ---------------------------------------------------------------------- | |
| 1276 */ | |
| 1277 void G726_delayb(r, x, y) | |
| 1278 short *r, *x, *y; | |
| 1279 { | |
| 1280 *y = (*r == 0) ? *x : 544; | |
| 1281 | |
| 1282 } | |
| 1283 | |
| 1284 /* ....................... end of G726_delayb() ....................... */ | |
| 1285 | |
| 1286 | |
| 1287 /* | |
| 1288 ---------------------------------------------------------------------- | |
| 1289 | |
| 1290 void G726_delayc (short *r, long *x, long *y); | |
| 1291 ~~~~~~~~~~~~~~~~ | |
| 1292 | |
| 1293 Description: | |
| 1294 ~~~~~~~~~~~~ | |
| 1295 | |
| 1296 Memory block. | |
| 1297 | |
| 1298 Inputs: r, x | |
| 1299 Output: y | |
| 1300 | |
| 1301 Return value: none. | |
| 1302 ~~~~~~~~~~~~~ | |
| 1303 | |
| 1304 Prototype: in g726.h | |
| 1305 ~~~~~~~~~~ | |
| 1306 | |
| 1307 History: | |
| 1308 ~~~~~~~~ | |
| 1309 31.Jan.91 v1.0f Release of 1st Fortran version to UGST. | |
| 1310 <tdsindi@venus.cpqd.ansp.br> | |
| 1311 13.Feb.92 v1.0c 1st version in C translated from Fortran (f2c) | |
| 1312 <tdsimao@venus.cpqd.ansp.br> | |
| 1313 | |
| 1314 ---------------------------------------------------------------------- | |
| 1315 */ | |
| 1316 void G726_delayc(r, x, y) | |
| 1317 short *r; | |
| 1318 long *x, *y; | |
| 1319 { | |
| 1320 *y = (*r == 0) ? *x : 34816; | |
| 1321 | |
| 1322 } | |
| 1323 | |
| 1324 /* ....................... end of G726_delayc() ....................... */ | |
| 1325 | |
| 1326 | |
| 1327 /* | |
| 1328 ---------------------------------------------------------------------- | |
| 1329 | |
| 1330 void G726_delayd (short *r, short *x, short *y); | |
| 1331 ~~~~~~~~~~~~~~~~ | |
| 1332 | |
| 1333 Description: | |
| 1334 ~~~~~~~~~~~~ | |
| 1335 | |
| 1336 Memory block | |
| 1337 | |
| 1338 Inputs: r, x | |
| 1339 Output: y | |
| 1340 | |
| 1341 Return value: none. | |
| 1342 ~~~~~~~~~~~~~ | |
| 1343 | |
| 1344 Prototype: in g726.h | |
| 1345 ~~~~~~~~~~ | |
| 1346 | |
| 1347 History: | |
| 1348 ~~~~~~~~ | |
| 1349 31.Jan.91 v1.0f Release of 1st Fortran version to UGST. | |
| 1350 <tdsindi@venus.cpqd.ansp.br> | |
| 1351 13.Feb.92 v1.0c 1st version in C translated from Fortran (f2c) | |
| 1352 <tdsimao@venus.cpqd.ansp.br> | |
| 1353 | |
| 1354 ---------------------------------------------------------------------- | |
| 1355 */ | |
| 1356 void G726_delayd(r, x, y) | |
| 1357 short *r, *x, *y; | |
| 1358 { | |
| 1359 *y = (*r == 0) ? *x : 32; | |
| 1360 | |
| 1361 } | |
| 1362 | |
| 1363 /* ....................... end of G726_delayd() ....................... */ | |
| 1364 | |
| 1365 | |
| 1366 /* | |
| 1367 ---------------------------------------------------------------------- | |
| 1368 | |
| 1369 void G726_filtd (short *wi, short *y, short *yut); | |
| 1370 ~~~~~~~~~~~~~~~ | |
| 1371 | |
| 1372 Description: | |
| 1373 ~~~~~~~~~~~~ | |
| 1374 | |
| 1375 Update of fast quantizer scale factor. | |
| 1376 | |
| 1377 Inputs: wi, y | |
| 1378 Output: yut | |
| 1379 | |
| 1380 Return value: none. | |
| 1381 ~~~~~~~~~~~~~ | |
| 1382 | |
| 1383 Prototype: in g726.h | |
| 1384 ~~~~~~~~~~ | |
| 1385 | |
| 1386 History: | |
| 1387 ~~~~~~~~ | |
| 1388 31.Jan.91 v1.0f Release of 1st Fortran version to UGST. | |
| 1389 <tdsindi@venus.cpqd.ansp.br> | |
| 1390 13.Feb.92 v1.0c 1st version in C translated from Fortran (f2c) | |
| 1391 <tdsimao@venus.cpqd.ansp.br> | |
| 1392 | |
| 1393 ---------------------------------------------------------------------- | |
| 1394 */ | |
| 1395 void G726_filtd(wi, y, yut) | |
| 1396 short *wi, *y, *yut; | |
| 1397 { | |
| 1398 long difs, difsx; | |
| 1399 long y1; | |
| 1400 long wi1, dif; | |
| 1401 | |
| 1402 /* Compute difference */ | |
| 1403 wi1 = *wi; | |
| 1404 y1 = *y; | |
| 1405 dif = ((wi1 << 5) + 131072 - y1) & 131071; | |
| 1406 difs = (dif >> 16); | |
| 1407 | |
| 1408 /* Time constant is 1/32; sign extension */ | |
| 1409 difsx = (difs == 0) ? (dif >> 5) : ((dif >> 5) + 4096); | |
| 1410 | |
| 1411 *yut = (short) ((y1 + difsx) & 8191); | |
| 1412 | |
| 1413 } | |
| 1414 | |
| 1415 /* ....................... end of G726_filte() ....................... */ | |
| 1416 | |
| 1417 | |
| 1418 /* | |
| 1419 ---------------------------------------------------------------------- | |
| 1420 | |
| 1421 void G726_filte (short *yup, long *yl, long *ylp); | |
| 1422 ~~~~~~~~~~~~~~~ | |
| 1423 | |
| 1424 Description: | |
| 1425 ~~~~~~~~~~~~ | |
| 1426 | |
| 1427 Update of slow quantizer scale factor. | |
| 1428 | |
| 1429 | |
| 1430 Inputs: yup, yl | |
| 1431 Output: ylp | |
| 1432 | |
| 1433 Return value: none. | |
| 1434 ~~~~~~~~~~~~~ | |
| 1435 | |
| 1436 Prototype: in g726.h | |
| 1437 ~~~~~~~~~~ | |
| 1438 | |
| 1439 History: | |
| 1440 ~~~~~~~~ | |
| 1441 31.Jan.91 v1.0f Release of 1st Fortran version to UGST. | |
| 1442 <tdsindi@venus.cpqd.ansp.br> | |
| 1443 13.Feb.92 v1.0c 1st version in C translated from Fortran (f2c) | |
| 1444 <tdsimao@venus.cpqd.ansp.br> | |
| 1445 | |
| 1446 ---------------------------------------------------------------------- | |
| 1447 */ | |
| 1448 void G726_filte(yup, yl, ylp) | |
| 1449 short *yup; | |
| 1450 long *yl, *ylp; | |
| 1451 { | |
| 1452 long difs, difsx; | |
| 1453 long dif, dif1, yup1; | |
| 1454 | |
| 1455 /* Compute difference */ | |
| 1456 yup1 = *yup; | |
| 1457 dif1 = 1048576 - *yl; | |
| 1458 dif = (yup1 + (dif1 >> 6)) & 16383; | |
| 1459 difs = (dif >> 13); | |
| 1460 | |
| 1461 /* Sign extension */ | |
| 1462 difsx = (difs == 0) ? dif : (dif + 507904); | |
| 1463 | |
| 1464 *ylp = (*yl + difsx) & 524287; | |
| 1465 | |
| 1466 } | |
| 1467 | |
| 1468 /* ....................... end of G726_filte() ....................... */ | |
| 1469 | |
| 1470 | |
| 1471 /* | |
| 1472 ---------------------------------------------------------------------- | |
| 1473 | |
| 1474 void G726_functw (short rate, short *i, short *wi); | |
| 1475 ~~~~~~~~~~~~~~~~ | |
| 1476 | |
| 1477 Description: | |
| 1478 ~~~~~~~~~~~~ | |
| 1479 | |
| 1480 Map quantizer output into logarithmic version of scale factor | |
| 1481 multiplier. | |
| 1482 | |
| 1483 Inputs: i, rate | |
| 1484 Output: wi | |
| 1485 | |
| 1486 Return value: none. | |
| 1487 ~~~~~~~~~~~~~ | |
| 1488 | |
| 1489 Prototype: in g726.h | |
| 1490 ~~~~~~~~~~ | |
| 1491 | |
| 1492 History: | |
| 1493 ~~~~~~~~ | |
| 1494 31.Jan.91 v1.0f Release of 1st Fortran version to UGST. | |
| 1495 <tdsindi@venus.cpqd.ansp.br> | |
| 1496 13.Feb.92 v1.0c 1st version in C translated from Fortran (f2c) | |
| 1497 <tdsimao@venus.cpqd.ansp.br> | |
| 1498 | |
| 1499 ---------------------------------------------------------------------- | |
| 1500 */ | |
| 1501 void G726_functw(rate, i, wi) | |
| 1502 short *i, *wi; | |
| 1503 short rate; | |
| 1504 { | |
| 1505 if (rate == 4) { | |
| 1506 /* Initialized data */ | |
| 1507 static short tab[8] = { 4084, 18, 41, 64, 112, 198, 355, 1122 }; | |
| 1508 short im, is; | |
| 1509 | |
| 1510 is = (*i >> 3); | |
| 1511 | |
| 1512 im = (is == 0) ? (*i & 7) : ((15 - *i) & 7); | |
| 1513 | |
| 1514 /* Scale factor multiplier */ | |
| 1515 *wi = tab[im]; | |
| 1516 | |
| 1517 | |
| 1518 } | |
| 1519 | |
| 1520 | |
| 1521 | |
| 1522 | |
| 1523 /* ................. end of 32 kbit part | |
| 1524 * .............. */ | |
| 1525 else if (rate == 3) { | |
| 1526 | |
| 1527 /* Initialized data */ | |
| 1528 static short tab[4] = { 4092, 30, 137, 582 }; | |
| 1529 short im, is; | |
| 1530 | |
| 1531 | |
| 1532 is = (*i >> 2); | |
| 1533 | |
| 1534 im = (is == 0) ? (*i & 3) : ((7 - *i) & 3); | |
| 1535 | |
| 1536 *wi = tab[im]; | |
| 1537 | |
| 1538 | |
| 1539 | |
| 1540 } | |
| 1541 | |
| 1542 | |
| 1543 | |
| 1544 | |
| 1545 /* ................. end of 24 kbit part | |
| 1546 * .............. */ | |
| 1547 else if (rate == 2) { | |
| 1548 /* Initialized data */ | |
| 1549 static short tab[2] = { 4074, 439 }; | |
| 1550 short im, is; | |
| 1551 | |
| 1552 | |
| 1553 is = (*i >> 1); | |
| 1554 | |
| 1555 im = (is == 0) ? (*i & 1) : ((3 - *i) & 1); | |
| 1556 | |
| 1557 *wi = tab[im]; | |
| 1558 | |
| 1559 } | |
| 1560 | |
| 1561 | |
| 1562 | |
| 1563 | |
| 1564 /* ................. end of 16 kbit part | |
| 1565 * .............. */ | |
| 1566 else { | |
| 1567 /* Initialized data */ | |
| 1568 static short tab[16] = | |
| 1569 { 14, 14, 24, 39, 40, 41, 58, 100, 141, 179, 219, 280, 358, | |
| 1570 440, 529, 696 | |
| 1571 }; | |
| 1572 short im, is; | |
| 1573 | |
| 1574 is = (*i >> 4); | |
| 1575 | |
| 1576 im = (is == 0) ? (*i & 15) : ((31 - *i) & 15); | |
| 1577 | |
| 1578 *wi = tab[im]; | |
| 1579 } /* ................. end of 40 kbit part | |
| 1580 * .............. */ | |
| 1581 } | |
| 1582 | |
| 1583 /* ....................... end of G726_functw() ....................... */ | |
| 1584 | |
| 1585 | |
| 1586 /* | |
| 1587 ---------------------------------------------------------------------- | |
| 1588 | |
| 1589 void G726_limb (short *yut, short *yup); | |
| 1590 ~~~~~~~~~~~~~~ | |
| 1591 | |
| 1592 Description: | |
| 1593 ~~~~~~~~~~~~ | |
| 1594 | |
| 1595 Limit quantizer scale factor. | |
| 1596 | |
| 1597 Inputs: yut | |
| 1598 Output: yup | |
| 1599 | |
| 1600 Return value: none. | |
| 1601 ~~~~~~~~~~~~~ | |
| 1602 | |
| 1603 Prototype: in g726.h | |
| 1604 ~~~~~~~~~~ | |
| 1605 | |
| 1606 History: | |
| 1607 ~~~~~~~~ | |
| 1608 31.Jan.91 v1.0f Release of 1st Fortran version to UGST. | |
| 1609 <tdsindi@venus.cpqd.ansp.br> | |
| 1610 13.Feb.92 v1.0c 1st version in C translated from Fortran (f2c) | |
| 1611 <tdsimao@venus.cpqd.ansp.br> | |
| 1612 | |
| 1613 ---------------------------------------------------------------------- | |
| 1614 */ | |
| 1615 void G726_limb(yut, yup) | |
| 1616 short *yut, *yup; | |
| 1617 { | |
| 1618 short gell, geul; | |
| 1619 | |
| 1620 geul = ((*yut + 11264) & 16383) >> 13; | |
| 1621 gell = ((*yut + 15840) & 16383) >> 13; | |
| 1622 | |
| 1623 if (gell == 1) | |
| 1624 *yup = 544; /* Lower limit is 1.06 */ | |
| 1625 else if (geul == 0) | |
| 1626 *yup = 5120; /* Upper limit is 10.0 */ | |
| 1627 else | |
| 1628 *yup = *yut; | |
| 1629 | |
| 1630 } | |
| 1631 | |
| 1632 /* ....................... end of G726_limb() ....................... */ | |
| 1633 | |
| 1634 | |
| 1635 /* | |
| 1636 ---------------------------------------------------------------------- | |
| 1637 | |
| 1638 void G726_mix (short *al, short *yu, long *yl, short *y); | |
| 1639 ~~~~~~~~~~~~~ | |
| 1640 | |
| 1641 Description: | |
| 1642 ~~~~~~~~~~~~ | |
| 1643 | |
| 1644 Form linear combination of fast and slow quantizer scale | |
| 1645 factors. | |
| 1646 | |
| 1647 Inputs: al, yu, yl | |
| 1648 Output: y | |
| 1649 | |
| 1650 | |
| 1651 Return value: none. | |
| 1652 ~~~~~~~~~~~~~ | |
| 1653 | |
| 1654 Prototype: in g726.h | |
| 1655 ~~~~~~~~~~ | |
| 1656 | |
| 1657 History: | |
| 1658 ~~~~~~~~ | |
| 1659 31.Jan.91 v1.0f Release of 1st Fortran version to UGST. | |
| 1660 <tdsindi@venus.cpqd.ansp.br> | |
| 1661 13.Feb.92 v1.0c 1st version in C translated from Fortran (f2c) | |
| 1662 <tdsimao@venus.cpqd.ansp.br> | |
| 1663 | |
| 1664 ---------------------------------------------------------------------- | |
| 1665 */ | |
| 1666 void G726_mix(al, yu, yl, y) | |
| 1667 short *al, *yu; | |
| 1668 long *yl; | |
| 1669 short *y; | |
| 1670 { | |
| 1671 long difm, difs, prod; | |
| 1672 long prodm, al1; | |
| 1673 long yu1, dif; | |
| 1674 | |
| 1675 /* Preamble */ | |
| 1676 al1 = *al; | |
| 1677 yu1 = *yu; | |
| 1678 | |
| 1679 /* Compute difference */ | |
| 1680 dif = (yu1 + 16384 - (*yl >> 6)) & 16383; | |
| 1681 difs = (dif >> 13); | |
| 1682 | |
| 1683 /* Compute magnitude of difference */ | |
| 1684 difm = (difs == 0) ? dif : ((16384 - dif) & 8191); | |
| 1685 | |
| 1686 /* Compute magnitude of product */ | |
| 1687 prodm = ((difm * al1) >> 6); | |
| 1688 | |
| 1689 /* Convert magnitude to two's complement */ | |
| 1690 prod = (difs == 0) ? prodm : ((16384 - prodm) & 16383); | |
| 1691 | |
| 1692 *y = (short) (((*yl >> 6) + prod) & 8191); | |
| 1693 | |
| 1694 } | |
| 1695 | |
| 1696 /* ....................... end of G726_mix() ....................... */ | |
| 1697 | |
| 1698 | |
| 1699 /* | |
| 1700 ---------------------------------------------------------------------- | |
| 1701 | |
| 1702 void G726_filta (short *fi, short *dms, short *dmsp); | |
| 1703 ~~~~~~~~~~~~~~~ | |
| 1704 | |
| 1705 Description: | |
| 1706 ~~~~~~~~~~~~ | |
| 1707 | |
| 1708 Update of short term average of f(i). | |
| 1709 | |
| 1710 Inputs: fi, dms | |
| 1711 Output: dmsp | |
| 1712 | |
| 1713 Return value: none. | |
| 1714 ~~~~~~~~~~~~~ | |
| 1715 | |
| 1716 Prototype: in g726.h | |
| 1717 ~~~~~~~~~~ | |
| 1718 | |
| 1719 History: | |
| 1720 ~~~~~~~~ | |
| 1721 31.Jan.91 v1.0f Release of 1st Fortran version to UGST. | |
| 1722 <tdsindi@venus.cpqd.ansp.br> | |
| 1723 13.Feb.92 v1.0c 1st version in C translated from Fortran (f2c) | |
| 1724 <tdsimao@venus.cpqd.ansp.br> | |
| 1725 | |
| 1726 ---------------------------------------------------------------------- | |
| 1727 */ | |
| 1728 void G726_filta(fi, dms, dmsp) | |
| 1729 short *fi, *dms, *dmsp; | |
| 1730 { | |
| 1731 short difs, difsx; | |
| 1732 short dif; | |
| 1733 | |
| 1734 /* Compute difference */ | |
| 1735 dif = ((*fi << 9) + 8192 - *dms) & 8191; | |
| 1736 difs = (dif >> 12); | |
| 1737 | |
| 1738 /* Time constant is 1/32, sign extension */ | |
| 1739 difsx = (difs == 0) ? (dif >> 5) : ((dif >> 5) + 3840); | |
| 1740 | |
| 1741 *dmsp = (difsx + *dms) & 4095; | |
| 1742 | |
| 1743 } | |
| 1744 | |
| 1745 /* ....................... end of G726_filta() ....................... */ | |
| 1746 | |
| 1747 | |
| 1748 /* | |
| 1749 ---------------------------------------------------------------------- | |
| 1750 | |
| 1751 void G726_filtb (short *fi, short *dml, short *dmlp); | |
| 1752 ~~~~~~~~~~~~~~~ | |
| 1753 | |
| 1754 Description: | |
| 1755 ~~~~~~~~~~~~ | |
| 1756 | |
| 1757 Update of long term average of f(i). | |
| 1758 | |
| 1759 Inputs: fi, dml | |
| 1760 Output: dmlp | |
| 1761 | |
| 1762 Return value: none. | |
| 1763 ~~~~~~~~~~~~~ | |
| 1764 | |
| 1765 Prototype: in g726.h | |
| 1766 ~~~~~~~~~~ | |
| 1767 | |
| 1768 History: | |
| 1769 ~~~~~~~~ | |
| 1770 31.Jan.91 v1.0f Release of 1st Fortran version to UGST. | |
| 1771 <tdsindi@venus.cpqd.ansp.br> | |
| 1772 13.Feb.92 v1.0c 1st version in C translated from Fortran (f2c) | |
| 1773 <tdsimao@venus.cpqd.ansp.br> | |
| 1774 | |
| 1775 ---------------------------------------------------------------------- | |
| 1776 */ | |
| 1777 void G726_filtb(fi, dml, dmlp) | |
| 1778 short *fi, *dml, *dmlp; | |
| 1779 { | |
| 1780 long difs, difsx; | |
| 1781 long fi1; | |
| 1782 long dif, dml1; | |
| 1783 | |
| 1784 /* Preamble */ | |
| 1785 fi1 = *fi; | |
| 1786 dml1 = *dml; | |
| 1787 | |
| 1788 /* Compute difference */ | |
| 1789 dif = ((fi1 << 11) + 32768 - dml1) & 32767; | |
| 1790 difs = (dif >> 14); | |
| 1791 | |
| 1792 /* Time constant is 1/28, sign extension */ | |
| 1793 difsx = (difs == 0) ? (dif >> 7) : ((dif >> 7) + 16128); | |
| 1794 | |
| 1795 *dmlp = (short) ((difsx + dml1) & 16383); | |
| 1796 | |
| 1797 } | |
| 1798 | |
| 1799 /* ....................... end of G726_filtb() ....................... */ | |
| 1800 | |
| 1801 | |
| 1802 /* | |
| 1803 ---------------------------------------------------------------------- | |
| 1804 | |
| 1805 void G726_filtc (short *ax, short *ap, short *app); | |
| 1806 ~~~~~~~~~~~~~~~ | |
| 1807 | |
| 1808 Description: | |
| 1809 ~~~~~~~~~~~~ | |
| 1810 | |
| 1811 Low pass filter of speed control parameter. | |
| 1812 | |
| 1813 Inputs: ax, ap | |
| 1814 Output: app | |
| 1815 | |
| 1816 Return value: none. | |
| 1817 ~~~~~~~~~~~~~ | |
| 1818 | |
| 1819 Prototype: in g726.h | |
| 1820 ~~~~~~~~~~ | |
| 1821 | |
| 1822 History: | |
| 1823 ~~~~~~~~ | |
| 1824 31.Jan.91 v1.0f Release of 1st Fortran version to UGST. | |
| 1825 <tdsindi@venus.cpqd.ansp.br> | |
| 1826 13.Feb.92 v1.0c 1st version in C translated from Fortran (f2c) | |
| 1827 <tdsimao@venus.cpqd.ansp.br> | |
| 1828 | |
| 1829 ---------------------------------------------------------------------- | |
| 1830 */ | |
| 1831 void G726_filtc(ax, ap, app) | |
| 1832 short *ax, *ap, *app; | |
| 1833 { | |
| 1834 short difs, difsx; | |
| 1835 short dif; | |
| 1836 | |
| 1837 /* Compute difference */ | |
| 1838 dif = ((*ax << 9) + 2048 - *ap) & 2047; | |
| 1839 difs = (dif >> 10); | |
| 1840 | |
| 1841 /* Time constant is 1/16, sign extension */ | |
| 1842 difsx = (difs == 0) ? (dif >> 4) : ((dif >> 4) + 896); | |
| 1843 | |
| 1844 *app = (difsx + *ap) & 1023; | |
| 1845 | |
| 1846 } | |
| 1847 | |
| 1848 /* .................... end of G726_filtc() .................... */ | |
| 1849 | |
| 1850 | |
| 1851 /* | |
| 1852 ---------------------------------------------------------------------- | |
| 1853 | |
| 1854 void G726_functf (short rate, short *i, short *fi); | |
| 1855 ~~~~~~~~~~~~~~~~ | |
| 1856 | |
| 1857 Description: | |
| 1858 ~~~~~~~~~~~~ | |
| 1859 | |
| 1860 Map quantizer output into the f(i) function. | |
| 1861 | |
| 1862 Inputs: i, rate | |
| 1863 Output: fi | |
| 1864 | |
| 1865 Return value: none. | |
| 1866 ~~~~~~~~~~~~~ | |
| 1867 | |
| 1868 Prototype: in g726.h | |
| 1869 ~~~~~~~~~~ | |
| 1870 | |
| 1871 History: | |
| 1872 ~~~~~~~~ | |
| 1873 31.Jan.91 v1.0f Release of 1st Fortran version to UGST. | |
| 1874 <tdsindi@venus.cpqd.ansp.br> | |
| 1875 13.Feb.92 v1.0c 1st version in C translated from Fortran (f2c) | |
| 1876 <tdsimao@venus.cpqd.ansp.br> | |
| 1877 | |
| 1878 ---------------------------------------------------------------------- | |
| 1879 */ | |
| 1880 void G726_functf(rate, i, fi) | |
| 1881 short *i, *fi; | |
| 1882 short rate; | |
| 1883 | |
| 1884 { | |
| 1885 short im, is; | |
| 1886 | |
| 1887 if (rate == 4) { | |
| 1888 /* Initialized data */ | |
| 1889 static short tab[8] = { 0, 0, 0, 1, 1, 1, 3, 7 }; | |
| 1890 | |
| 1891 is = (*i >> 3); | |
| 1892 | |
| 1893 im = (is == 0) ? (*i & 7) : ((15 - *i) & 7); | |
| 1894 | |
| 1895 *fi = tab[im]; | |
| 1896 } | |
| 1897 /* ................ end of 32 kbit part | |
| 1898 * ................. */ | |
| 1899 else if (rate == 3) { | |
| 1900 /* Initialized data */ | |
| 1901 static short tab[4] = { 0, 1, 2, 7 }; | |
| 1902 | |
| 1903 is = (*i >> 2); | |
| 1904 | |
| 1905 im = (is == 0) ? (*i & 3) : ((7 - *i) & 3); | |
| 1906 | |
| 1907 *fi = tab[im]; | |
| 1908 | |
| 1909 } /* ................ end of 24 kbit part | |
| 1910 * ................. */ | |
| 1911 else if (rate == 2) { | |
| 1912 /* Initialized data */ | |
| 1913 static short tab[2] = { 0, 7 }; | |
| 1914 | |
| 1915 | |
| 1916 is = (*i >> 1); | |
| 1917 | |
| 1918 im = (is == 0) ? (*i & 1) : ((3 - *i) & 1); | |
| 1919 | |
| 1920 *fi = tab[im]; | |
| 1921 | |
| 1922 } | |
| 1923 /* ................ end of 16 kbit part | |
| 1924 * ................. */ | |
| 1925 else { | |
| 1926 /* Initialized data */ | |
| 1927 static short tab[16] = | |
| 1928 { 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, 6 }; | |
| 1929 | |
| 1930 | |
| 1931 is = (*i >> 4); | |
| 1932 | |
| 1933 im = (is == 0) ? (*i & 15) : ((31 - *i) & 15); | |
| 1934 | |
| 1935 *fi = tab[im]; | |
| 1936 | |
| 1937 } /* ................ end of 40 kbit part | |
| 1938 * ................. */ | |
| 1939 } | |
| 1940 | |
| 1941 /* ...................... end of G726_functf() ...................... */ | |
| 1942 | |
| 1943 | |
| 1944 /* | |
| 1945 ---------------------------------------------------------------------- | |
| 1946 | |
| 1947 void G726_lima (short *ap, short *al); | |
| 1948 ~~~~~~~~~~~~~~ | |
| 1949 | |
| 1950 Description: | |
| 1951 ~~~~~~~~~~~~ | |
| 1952 | |
| 1953 Limit speed control parameter. | |
| 1954 | |
| 1955 Inputs: ap | |
| 1956 Output: al | |
| 1957 | |
| 1958 Return value: none. | |
| 1959 ~~~~~~~~~~~~~ | |
| 1960 | |
| 1961 Prototype: in g726.h | |
| 1962 ~~~~~~~~~~ | |
| 1963 | |
| 1964 History: | |
| 1965 ~~~~~~~~ | |
| 1966 31.Jan.91 v1.0f Release of 1st Fortran version to UGST. | |
| 1967 <tdsindi@venus.cpqd.ansp.br> | |
| 1968 13.Feb.92 v1.0c 1st version in C translated from Fortran (f2c) | |
| 1969 <tdsimao@venus.cpqd.ansp.br> | |
| 1970 | |
| 1971 ---------------------------------------------------------------------- | |
| 1972 */ | |
| 1973 void G726_lima(ap, al) | |
| 1974 short *ap, *al; | |
| 1975 { | |
| 1976 *al = (*ap >= 256) ? 64 : (*ap >> 2); | |
| 1977 | |
| 1978 } | |
| 1979 | |
| 1980 /* ....................... end of G726_lima() ....................... */ | |
| 1981 | |
| 1982 | |
| 1983 /* | |
| 1984 ---------------------------------------------------------------------- | |
| 1985 | |
| 1986 void G726_subtc (short *dmsp, short *dmlp, short *tdp, | |
| 1987 ~~~~~~~~~~~~~~~ short *y, short *ax); | |
| 1988 | |
| 1989 Description: | |
| 1990 ~~~~~~~~~~~~ | |
| 1991 | |
| 1992 Functions of quantizer output sequence and then perform | |
| 1993 threshold comparison for quantizing speed control parameter. | |
| 1994 compute magnitude of the difference of short and long-term | |
| 1995 | |
| 1996 Inputs: dmsp, dmlp, tdp, y | |
| 1997 Output: ax | |
| 1998 | |
| 1999 Return value: none. | |
| 2000 ~~~~~~~~~~~~~ | |
| 2001 | |
| 2002 Prototype: in g726.h | |
| 2003 ~~~~~~~~~~ | |
| 2004 | |
| 2005 History: | |
| 2006 ~~~~~~~~ | |
| 2007 31.Jan.91 v1.0f Release of 1st Fortran version to UGST. | |
| 2008 <tdsindi@venus.cpqd.ansp.br> | |
| 2009 13.Feb.92 v1.0c 1st version in C translated from Fortran (f2c) | |
| 2010 <tdsimao@venus.cpqd.ansp.br> | |
| 2011 | |
| 2012 ---------------------------------------------------------------------- | |
| 2013 */ | |
| 2014 void G726_subtc(dmsp, dmlp, tdp, y, ax) | |
| 2015 short *dmsp, *dmlp, *tdp, *y, *ax; | |
| 2016 { | |
| 2017 long difm, difs, dthr, dmlp1, dmsp1; | |
| 2018 long dif; | |
| 2019 | |
| 2020 /* Preamble */ | |
| 2021 dmsp1 = *dmsp; | |
| 2022 dmlp1 = *dmlp; | |
| 2023 | |
| 2024 /* Compute difference */ | |
| 2025 dif = ((dmsp1 << 2) + 32768 - dmlp1) & 32767; | |
| 2026 difs = (dif >> 14); | |
| 2027 | |
| 2028 /* Compute magnitude of difference */ | |
| 2029 difm = (difs == 0) ? dif : ((32768 - dif) & 16383); | |
| 2030 | |
| 2031 /* Compute threshold */ | |
| 2032 dthr = (dmlp1 >> 3); | |
| 2033 | |
| 2034 /* Quantize speed control parameter */ | |
| 2035 *ax = (*y >= 1536 && difm < dthr && *tdp == 0) ? 0 : 1; | |
| 2036 | |
| 2037 } | |
| 2038 | |
| 2039 /* ....................... end of G726_subtc() ....................... */ | |
| 2040 | |
| 2041 | |
| 2042 /* | |
| 2043 ---------------------------------------------------------------------- | |
| 2044 | |
| 2045 void G726_triga (short *tr, short *app, short *apr); | |
| 2046 ~~~~~~~~~~~~~~~ | |
| 2047 | |
| 2048 Description: | |
| 2049 ~~~~~~~~~~~~ | |
| 2050 | |
| 2051 Speed control trigger block. | |
| 2052 | |
| 2053 Inputs: tr, app | |
| 2054 Output: apr | |
| 2055 | |
| 2056 Return value: none. | |
| 2057 ~~~~~~~~~~~~~ | |
| 2058 | |
| 2059 Prototype: in g726.h | |
| 2060 ~~~~~~~~~~ | |
| 2061 | |
| 2062 History: | |
| 2063 ~~~~~~~~ | |
| 2064 31.Jan.91 v1.0f Release of 1st Fortran version to UGST. | |
| 2065 <tdsindi@venus.cpqd.ansp.br> | |
| 2066 13.Feb.92 v1.0c 1st version in C translated from Fortran (f2c) | |
| 2067 <tdsimao@venus.cpqd.ansp.br> | |
| 2068 | |
| 2069 ---------------------------------------------------------------------- | |
| 2070 */ | |
| 2071 void G726_triga(tr, app, apr) | |
| 2072 short *tr, *app, *apr; | |
| 2073 { | |
| 2074 *apr = (*tr == 0) ? (*app) : 256; | |
| 2075 | |
| 2076 } | |
| 2077 | |
| 2078 /* ....................... end of G726_triga() ....................... */ | |
| 2079 | |
| 2080 | |
| 2081 /* | |
| 2082 ---------------------------------------------------------------------- | |
| 2083 | |
| 2084 void G726_accum (short *wa1, short *wa2, short *wb1, | |
| 2085 ~~~~~~~~~~~~~~~ short *wb2, short *wb3, short *wb4, | |
| 2086 short *wb5, short *wb6, short *se, short *sez); | |
| 2087 | |
| 2088 Description: | |
| 2089 ~~~~~~~~~~~~ | |
| 2090 | |
| 2091 Addition of predictor outputs to form the partial signal | |
| 2092 estimate (from the sixth order predictor) and the signal | |
| 2093 estimate. | |
| 2094 | |
| 2095 Inputs: wa1, wa2, wb1, wb2, wb3, wb4, wb5, wb6 | |
| 2096 Output: se, sez | |
| 2097 | |
| 2098 Return value: none. | |
| 2099 ~~~~~~~~~~~~~ | |
| 2100 | |
| 2101 Prototype: in g726.h | |
| 2102 ~~~~~~~~~~ | |
| 2103 | |
| 2104 History: | |
| 2105 ~~~~~~~~ | |
| 2106 31.Jan.91 v1.0f Release of 1st Fortran version to UGST. | |
| 2107 <tdsindi@venus.cpqd.ansp.br> | |
| 2108 13.Feb.92 v1.0c 1st version in C translated from Fortran (f2c) | |
| 2109 <tdsimao@venus.cpqd.ansp.br> | |
| 2110 | |
| 2111 ---------------------------------------------------------------------- | |
| 2112 */ | |
| 2113 void G726_accum(wa1, wa2, wb1, wb2, wb3, wb4, wb5, wb6, se, sez) | |
| 2114 short *wa1, *wa2, *wb1, *wb2, *wb3, *wb4, *wb5, *wb6, *se, *sez; | |
| 2115 { | |
| 2116 unsigned long sezi; | |
| 2117 unsigned long wa11, wa21, wb11, wb21, wb31, wb41, wb51, wb61, sei; | |
| 2118 | |
| 2119 /* Preamble */ | |
| 2120 wa11 = *wa1; | |
| 2121 wa21 = *wa2; | |
| 2122 wb11 = *wb1; | |
| 2123 wb21 = *wb2; | |
| 2124 wb31 = *wb3; | |
| 2125 wb41 = *wb4; | |
| 2126 wb51 = *wb5; | |
| 2127 wb61 = *wb6; | |
| 2128 | |
| 2129 /* Sum of partial signal estimate */ | |
| 2130 sezi = (((((((((wb11 + wb21) & 65535) + wb31) & 65535) | |
| 2131 + wb41) & 65535) + wb51) & 65535) + wb61) & 65535; | |
| 2132 | |
| 2133 /* Complete sum for signal estimate */ | |
| 2134 sei = (((sezi + wa21) & 65535) + wa11) & 65535; | |
| 2135 | |
| 2136 *sez = (short) (sezi >> 1); | |
| 2137 *se = (short) (sei >> 1); | |
| 2138 | |
| 2139 } | |
| 2140 | |
| 2141 /* ....................... end of G726_accum() ....................... */ | |
| 2142 | |
| 2143 | |
| 2144 /* | |
| 2145 ---------------------------------------------------------------------- | |
| 2146 | |
| 2147 void G726_addb (short *dq, short *se, short *sr); | |
| 2148 ~~~~~~~~~~~~~~ | |
| 2149 | |
| 2150 Description: | |
| 2151 ~~~~~~~~~~~~ | |
| 2152 | |
| 2153 Addition of quantized difference signal and signal estimate | |
| 2154 to form reconstructed signal. | |
| 2155 | |
| 2156 Inputs: dq, se | |
| 2157 Output: sr | |
| 2158 | |
| 2159 Return value: none. | |
| 2160 ~~~~~~~~~~~~~ | |
| 2161 | |
| 2162 Prototype: in g726.h | |
| 2163 ~~~~~~~~~~ | |
| 2164 | |
| 2165 History: | |
| 2166 ~~~~~~~~ | |
| 2167 31.Jan.91 v1.0f Release of 1st Fortran version to UGST. | |
| 2168 <tdsindi@venus.cpqd.ansp.br> | |
| 2169 13.Feb.92 v1.0c 1st version in C translated from Fortran (f2c) | |
| 2170 <tdsimao@venus.cpqd.ansp.br> | |
| 2171 | |
| 2172 ---------------------------------------------------------------------- | |
| 2173 */ | |
| 2174 void G726_addb(dq, se, sr) | |
| 2175 short *dq, *se, *sr; | |
| 2176 { | |
| 2177 unsigned long dq1, se1; | |
| 2178 unsigned long dqi, sei; | |
| 2179 short dqs, ses; | |
| 2180 | |
| 2181 /* Preamble */ | |
| 2182 dq1 = *dq & 65535; | |
| 2183 se1 = *se; | |
| 2184 | |
| 2185 /* Sign */ | |
| 2186 dqs = (*dq >> 15) & 1; | |
| 2187 | |
| 2188 /* Convert signed magnitude to 2's complement */ | |
| 2189 dqi = (dqs == 0) ? dq1 : ((65536 - (dq1 & 32767)) & 65535); | |
| 2190 | |
| 2191 ses = (*se >> 14); | |
| 2192 | |
| 2193 /* Sign extension */ | |
| 2194 sei = (ses == 0) ? se1 : ((1 << 15) + se1); | |
| 2195 | |
| 2196 *sr = (short) ((dqi + sei) & 65535); | |
| 2197 | |
| 2198 } | |
| 2199 | |
| 2200 /* ....................... end of G726_addb() ....................... */ | |
| 2201 | |
| 2202 | |
| 2203 /* | |
| 2204 ---------------------------------------------------------------------- | |
| 2205 | |
| 2206 void G726_addc (short *dq, short *sez, short *pk0, | |
| 2207 ~~~~~~~~~~~~~~ short *sigpk); | |
| 2208 | |
| 2209 Description: | |
| 2210 ~~~~~~~~~~~~ | |
| 2211 | |
| 2212 Obtain sign of addition of quantized difference signal and | |
| 2213 partial signal estimate. | |
| 2214 | |
| 2215 Inputs: dq, sez | |
| 2216 Outputs: pk0, sigpk | |
| 2217 | |
| 2218 Return value: none. | |
| 2219 ~~~~~~~~~~~~~ | |
| 2220 | |
| 2221 Prototype: in g726.h | |
| 2222 ~~~~~~~~~~ | |
| 2223 | |
| 2224 History: | |
| 2225 ~~~~~~~~ | |
| 2226 31.Jan.91 v1.0f Release of 1st Fortran version to UGST. | |
| 2227 <tdsindi@venus.cpqd.ansp.br> | |
| 2228 13.Feb.92 v1.0c 1st version in C translated from Fortran (f2c) | |
| 2229 <tdsimao@venus.cpqd.ansp.br> | |
| 2230 | |
| 2231 ---------------------------------------------------------------------- | |
| 2232 */ | |
| 2233 void G726_addc(dq, sez, pk0, sigpk) | |
| 2234 short *dq, *sez, *pk0, *sigpk; | |
| 2235 { | |
| 2236 unsigned long sezi; | |
| 2237 short sezs; | |
| 2238 unsigned long dqsez, dq1; | |
| 2239 unsigned long dqi; | |
| 2240 short dqs; | |
| 2241 unsigned long sez1; | |
| 2242 | |
| 2243 /* Preamble */ | |
| 2244 dq1 = *dq & 65535; | |
| 2245 sez1 = *sez; | |
| 2246 | |
| 2247 /* Get sign */ | |
| 2248 dqs = (*dq >> 15) & 1; | |
| 2249 | |
| 2250 /* Convert signed magnitude to 2's compelemnent */ | |
| 2251 dqi = (dqs == 0) ? dq1 : ((65536 - (dq1 & 32767)) & 65535); | |
| 2252 | |
| 2253 sezs = (*sez >> 14); | |
| 2254 | |
| 2255 /* Sign extension */ | |
| 2256 sezi = (sezs == 0) ? sez1 : (sez1 + 32768); | |
| 2257 | |
| 2258 dqsez = (dqi + sezi) & 65535; | |
| 2259 | |
| 2260 *pk0 = (short) (dqsez >> 15); | |
| 2261 *sigpk = (dqsez == 0) ? 1 : 0; | |
| 2262 | |
| 2263 } | |
| 2264 | |
| 2265 /* ....................... end of G726_addc() ....................... */ | |
| 2266 | |
| 2267 | |
| 2268 /* | |
| 2269 ---------------------------------------------------------------------- | |
| 2270 | |
| 2271 void G726_floata (short *dq, short *dq0); | |
| 2272 ~~~~~~~~~~~~~~~~ | |
| 2273 | |
| 2274 Description: | |
| 2275 ~~~~~~~~~~~~ | |
| 2276 | |
| 2277 Convert 16-bit signed magnitude to floating point. | |
| 2278 | |
| 2279 Inputs: dq | |
| 2280 Output: dq0 | |
| 2281 | |
| 2282 Return value: none. | |
| 2283 ~~~~~~~~~~~~~ | |
| 2284 | |
| 2285 Prototype: in g726.h | |
| 2286 ~~~~~~~~~~ | |
| 2287 | |
| 2288 History: | |
| 2289 ~~~~~~~~ | |
| 2290 31.Jan.91 v1.0f Release of 1st Fortran version to UGST. | |
| 2291 <tdsindi@venus.cpqd.ansp.br> | |
| 2292 13.Feb.92 v1.0c 1st version in C translated from Fortran (f2c) | |
| 2293 <tdsimao@venus.cpqd.ansp.br> | |
| 2294 | |
| 2295 ---------------------------------------------------------------------- | |
| 2296 */ | |
| 2297 void G726_floata(dq, dq0) | |
| 2298 short *dq, *dq0; | |
| 2299 { | |
| 2300 long mant; | |
| 2301 long mag, exp_; | |
| 2302 long dqs; | |
| 2303 | |
| 2304 dqs = (*dq >> 15) & 1; | |
| 2305 | |
| 2306 /* Compute magnitude */ | |
| 2307 mag = *dq & 32767; | |
| 2308 | |
| 2309 /* Exponent */ | |
| 2310 if (mag >= 16384) | |
| 2311 exp_ = 15; | |
| 2312 else if (mag >= 8192) | |
| 2313 exp_ = 14; | |
| 2314 else if (mag >= 4096) | |
| 2315 exp_ = 13; | |
| 2316 else if (mag >= 2048) | |
| 2317 exp_ = 12; | |
| 2318 else if (mag >= 1024) | |
| 2319 exp_ = 11; | |
| 2320 else if (mag >= 512) | |
| 2321 exp_ = 10; | |
| 2322 else if (mag >= 256) | |
| 2323 exp_ = 9; | |
| 2324 else if (mag >= 128) | |
| 2325 exp_ = 8; | |
| 2326 else if (mag >= 64) | |
| 2327 exp_ = 7; | |
| 2328 else if (mag >= 32) | |
| 2329 exp_ = 6; | |
| 2330 else if (mag >= 16) | |
| 2331 exp_ = 5; | |
| 2332 else if (mag >= 8) | |
| 2333 exp_ = 4; | |
| 2334 else if (mag >= 4) | |
| 2335 exp_ = 3; | |
| 2336 else if (mag >= 2) | |
| 2337 exp_ = 2; | |
| 2338 else if (mag == 1) | |
| 2339 exp_ = 1; | |
| 2340 else | |
| 2341 exp_ = 0; | |
| 2342 | |
| 2343 /* Compute mantissa w/a 1 in the most sig. bit */ | |
| 2344 mant = (mag == 0) ? (1 << 5) : ((mag << 6) >> exp_); | |
| 2345 /* Combine sign, exponent and mantissa (1,4,6) bits in a word */ | |
| 2346 *dq0 = (short) ((dqs << 10) + (exp_ << 6) + mant); | |
| 2347 | |
| 2348 } | |
| 2349 | |
| 2350 /* ....................... end of G726_floata() ....................... */ | |
| 2351 | |
| 2352 | |
| 2353 /* | |
| 2354 ---------------------------------------------------------------------- | |
| 2355 | |
| 2356 void G726_floatb (short *sr, short *sr0); | |
| 2357 ~~~~~~~~~~~~~~~~ | |
| 2358 | |
| 2359 Description: | |
| 2360 ~~~~~~~~~~~~ | |
| 2361 | |
| 2362 Convert 16-bit two's complement to floating point. | |
| 2363 | |
| 2364 Inputs: sr | |
| 2365 Output: sr0 | |
| 2366 | |
| 2367 Return value: none. | |
| 2368 ~~~~~~~~~~~~~ | |
| 2369 | |
| 2370 Prototype: in g726.h | |
| 2371 ~~~~~~~~~~ | |
| 2372 | |
| 2373 History: | |
| 2374 ~~~~~~~~ | |
| 2375 31.Jan.91 v1.0f Release of 1st Fortran version to UGST. | |
| 2376 <tdsindi@venus.cpqd.ansp.br> | |
| 2377 13.Feb.92 v1.0c 1st version in C translated from Fortran (f2c) | |
| 2378 <tdsimao@venus.cpqd.ansp.br> | |
| 2379 | |
| 2380 ---------------------------------------------------------------------- | |
| 2381 */ | |
| 2382 void G726_floatb(sr, sr0) | |
| 2383 short *sr, *sr0; | |
| 2384 { | |
| 2385 long mant; | |
| 2386 long mag, exp_, srr, srs; | |
| 2387 | |
| 2388 /* Preamble */ | |
| 2389 srr = *sr & 65535; | |
| 2390 | |
| 2391 /* Sign */ | |
| 2392 srs = (srr >> 15); | |
| 2393 | |
| 2394 /* Compute magnitude */ | |
| 2395 mag = (srs == 0) ? srr : ((65536 - srr) & 32767); | |
| 2396 | |
| 2397 /* Exponent */ | |
| 2398 if (mag >= 16384) | |
| 2399 exp_ = 15; | |
| 2400 else if (mag >= 8192) | |
| 2401 exp_ = 14; | |
| 2402 else if (mag >= 4096) | |
| 2403 exp_ = 13; | |
| 2404 else if (mag >= 2048) | |
| 2405 exp_ = 12; | |
| 2406 else if (mag >= 1024) | |
| 2407 exp_ = 11; | |
| 2408 else if (mag >= 512) | |
| 2409 exp_ = 10; | |
| 2410 else if (mag >= 256) | |
| 2411 exp_ = 9; | |
| 2412 else if (mag >= 128) | |
| 2413 exp_ = 8; | |
| 2414 else if (mag >= 64) | |
| 2415 exp_ = 7; | |
| 2416 else if (mag >= 32) | |
| 2417 exp_ = 6; | |
| 2418 else if (mag >= 16) | |
| 2419 exp_ = 5; | |
| 2420 else if (mag >= 8) | |
| 2421 exp_ = 4; | |
| 2422 else if (mag >= 4) | |
| 2423 exp_ = 3; | |
| 2424 else if (mag >= 2) | |
| 2425 exp_ = 2; | |
| 2426 else if (mag == 1) | |
| 2427 exp_ = 1; | |
| 2428 else | |
| 2429 exp_ = 0; | |
| 2430 | |
| 2431 /* Compute mantissa w/a 1 in the most sig. bit */ | |
| 2432 mant = (mag == 0) ? (1 << 5) : ((mag << 6) >> exp_); | |
| 2433 | |
| 2434 /* Combine sign, exponent and mantissa (1,4,6) bits in a word */ | |
| 2435 *sr0 = (short) ((srs << 10) + (exp_ << 6) + mant); | |
| 2436 | |
| 2437 } | |
| 2438 | |
| 2439 /* ....................... end of G726_floatb() ....................... */ | |
| 2440 | |
| 2441 | |
| 2442 /* | |
| 2443 ---------------------------------------------------------------------- | |
| 2444 | |
| 2445 void G726_fmult (short *a, short *srn, short *wa); | |
| 2446 ~~~~~~~~~~~~~~~ | |
| 2447 | |
| 2448 Description: | |
| 2449 ~~~~~~~~~~~~ | |
| 2450 | |
| 2451 Multiply predictor coefficients with corresponding quantized | |
| 2452 difference signal or reconstructed signal. multiplication is | |
| 2453 done in floating piont format | |
| 2454 | |
| 2455 Inputs: a (or b), srn (or dqn) | |
| 2456 Outputs: wa (or wb) | |
| 2457 | |
| 2458 Return value: none. | |
| 2459 ~~~~~~~~~~~~~ | |
| 2460 | |
| 2461 Prototype: in g726.h | |
| 2462 ~~~~~~~~~~ | |
| 2463 | |
| 2464 History: | |
| 2465 ~~~~~~~~ | |
| 2466 31.Jan.91 v1.0f Release of 1st Fortran version to UGST. | |
| 2467 <tdsindi@venus.cpqd.ansp.br> | |
| 2468 13.Feb.92 v1.0c 1st version in C translated from Fortran (f2c) | |
| 2469 <tdsimao@venus.cpqd.ansp.br> | |
| 2470 | |
| 2471 ---------------------------------------------------------------------- | |
| 2472 */ | |
| 2473 void G726_fmult(An, SRn, WAn) | |
| 2474 short *An, *SRn, *WAn; | |
| 2475 { | |
| 2476 long anmag, anexp, wanmag, anmant; | |
| 2477 long wanexp, srnexp, an, ans, wanmant, srnmant; | |
| 2478 long wan, wans, srns, srn1; | |
| 2479 | |
| 2480 /* Preamble */ | |
| 2481 an = *An & 65535; | |
| 2482 srn1 = *SRn & 65535; | |
| 2483 | |
| 2484 /* Sign */ | |
| 2485 ans = an & 32768; | |
| 2486 ans = (ans >> 15); | |
| 2487 | |
| 2488 /* Convert 2's complement to signed magnitude */ | |
| 2489 anmag = (ans == 0) ? (an >> 2) : ((16384 - (an >> 2)) & 8191); | |
| 2490 | |
| 2491 /* Exponent */ | |
| 2492 if (anmag >= 4096) | |
| 2493 anexp = 13; | |
| 2494 else if (anmag >= 2048) | |
| 2495 anexp = 12; | |
| 2496 else if (anmag >= 1024) | |
| 2497 anexp = 11; | |
| 2498 else if (anmag >= 512) | |
| 2499 anexp = 10; | |
| 2500 else if (anmag >= 256) | |
| 2501 anexp = 9; | |
| 2502 else if (anmag >= 128) | |
| 2503 anexp = 8; | |
| 2504 else if (anmag >= 64) | |
| 2505 anexp = 7; | |
| 2506 else if (anmag >= 32) | |
| 2507 anexp = 6; | |
| 2508 else if (anmag >= 16) | |
| 2509 anexp = 5; | |
| 2510 else if (anmag >= 8) | |
| 2511 anexp = 4; | |
| 2512 else if (anmag >= 4) | |
| 2513 anexp = 3; | |
| 2514 else if (anmag >= 2) | |
| 2515 anexp = 2; | |
| 2516 else if (anmag == 1) | |
| 2517 anexp = 1; | |
| 2518 else | |
| 2519 anexp = 0; | |
| 2520 | |
| 2521 /* Compute mantissa w/a 1 in the most sig. bit */ | |
| 2522 anmant = (anmag == 0) ? (1 << 5) : ((anmag << 6) >> anexp); | |
| 2523 | |
| 2524 /* Split floating point word into sign, exponent and mantissa */ | |
| 2525 srns = (srn1 >> 10); | |
| 2526 srnexp = (srn1 >> 6) & 15; | |
| 2527 srnmant = srn1 & 63; | |
| 2528 | |
| 2529 /* Floating point multiplication */ | |
| 2530 wans = srns ^ ans; | |
| 2531 wanexp = srnexp + anexp; | |
| 2532 wanmant = ((srnmant * anmant) + 48) >> 4; | |
| 2533 | |
| 2534 /* Convert floating point to magnitude */ | |
| 2535 wanmag = (wanexp <= 26) ? | |
| 2536 (wanmant << 7) >> (26 - wanexp) : | |
| 2537 ((wanmant << 7) << (wanexp - 26)) & 32767; | |
| 2538 | |
| 2539 /* Convert mag. to 2's complement */ | |
| 2540 wan = (wans == 0) ? wanmag : ((65536 - wanmag) & 65535); | |
| 2541 | |
| 2542 *WAn = (short) wan; | |
| 2543 | |
| 2544 } | |
| 2545 | |
| 2546 /* ....................... end of G726_fmult() ....................... */ | |
| 2547 | |
| 2548 | |
| 2549 /* | |
| 2550 ---------------------------------------------------------------------- | |
| 2551 | |
| 2552 void G726_limc (short *a2t, short *a2p); | |
| 2553 ~~~~~~~~~~~~~~ | |
| 2554 | |
| 2555 Description: | |
| 2556 ~~~~~~~~~~~~ | |
| 2557 | |
| 2558 Limits on a2 coefficient of second order predictor. | |
| 2559 | |
| 2560 Inputs: a2t | |
| 2561 Output: a2p | |
| 2562 | |
| 2563 Return value: none. | |
| 2564 ~~~~~~~~~~~~~ | |
| 2565 | |
| 2566 Prototype: in g726.h | |
| 2567 ~~~~~~~~~~ | |
| 2568 | |
| 2569 History: | |
| 2570 ~~~~~~~~ | |
| 2571 31.Jan.91 v1.0f Release of 1st Fortran version to UGST. | |
| 2572 <tdsindi@venus.cpqd.ansp.br> | |
| 2573 13.Feb.92 v1.0c 1st version in C translated from Fortran (f2c) | |
| 2574 <tdsimao@venus.cpqd.ansp.br> | |
| 2575 | |
| 2576 ---------------------------------------------------------------------- | |
| 2577 */ | |
| 2578 | |
| 2579 void G726_limc(a2t, a2p) | |
| 2580 short *a2t, *a2p; | |
| 2581 { | |
| 2582 long a2p1, a2t1, a2ll, a2ul; | |
| 2583 | |
| 2584 a2t1 = *a2t & 65535; | |
| 2585 | |
| 2586 a2ul = 12288; /* Upper limit of +.75 */ | |
| 2587 a2ll = 53248; /* Lower limit of -.75 */ | |
| 2588 | |
| 2589 if (a2t1 >= 32768 && a2t1 <= a2ll) | |
| 2590 a2p1 = a2ll; | |
| 2591 else if (a2t1 >= a2ul && a2t1 <= 32767) | |
| 2592 a2p1 = a2ul; | |
| 2593 else | |
| 2594 a2p1 = a2t1; | |
| 2595 | |
| 2596 *a2p = (short) a2p1; | |
| 2597 | |
| 2598 } | |
| 2599 | |
| 2600 /* ....................... end of G726_limc() ....................... */ | |
| 2601 | |
| 2602 | |
| 2603 /* | |
| 2604 ---------------------------------------------------------------------- | |
| 2605 | |
| 2606 void G726_limd (short *a1t, short *a2p, short *a1p); | |
| 2607 ~~~~~~~~~~~~~~ | |
| 2608 | |
| 2609 Description: | |
| 2610 ~~~~~~~~~~~~ | |
| 2611 | |
| 2612 Limits on a1 coefficient of second order predictor. | |
| 2613 | |
| 2614 Inputs: a1t, a2p | |
| 2615 Output: a1p | |
| 2616 | |
| 2617 Return value: none. | |
| 2618 ~~~~~~~~~~~~~ | |
| 2619 | |
| 2620 Prototype: in g726.h | |
| 2621 ~~~~~~~~~~ | |
| 2622 | |
| 2623 History: | |
| 2624 ~~~~~~~~ | |
| 2625 31.Jan.91 v1.0f Release of 1st Fortran version to UGST. | |
| 2626 <tdsindi@venus.cpqd.ansp.br> | |
| 2627 13.Feb.92 v1.0c 1st version in C translated from Fortran (f2c) | |
| 2628 <tdsimao@venus.cpqd.ansp.br> | |
| 2629 | |
| 2630 ---------------------------------------------------------------------- | |
| 2631 */ | |
| 2632 void G726_limd(a1t, a2p, a1p) | |
| 2633 short *a1t, *a2p, *a1p; | |
| 2634 { | |
| 2635 long a1p1, a2p1, a1t1, ome, a1ll, a1ul; | |
| 2636 | |
| 2637 /* Preamble */ | |
| 2638 a1t1 = *a1t & 65535; | |
| 2639 a2p1 = *a2p & 65535; | |
| 2640 | |
| 2641 /* (1-epsilon), where epsilon = (1/16) */ | |
| 2642 ome = 15360; | |
| 2643 | |
| 2644 /* Compute upper limit */ | |
| 2645 a1ul = (ome + 65536 - a2p1) & 65535; | |
| 2646 | |
| 2647 /* Compute lower limit */ | |
| 2648 a1ll = (a2p1 + 65536 - ome) & 65535; | |
| 2649 | |
| 2650 if (a1t1 >= 32768 && a1t1 <= a1ll) | |
| 2651 a1p1 = a1ll; | |
| 2652 else if (a1t1 >= a1ul && a1t1 <= 32767) | |
| 2653 a1p1 = a1ul; | |
| 2654 else | |
| 2655 a1p1 = a1t1; | |
| 2656 | |
| 2657 *a1p = (short) a1p1; | |
| 2658 | |
| 2659 } | |
| 2660 | |
| 2661 /* ....................... end of G726_limd() ....................... */ | |
| 2662 | |
| 2663 | |
| 2664 /* | |
| 2665 ---------------------------------------------------------------------- | |
| 2666 | |
| 2667 void G726_trigb (short *tr, short *ap, short *ar); | |
| 2668 ~~~~~~~~~~~~~~~ | |
| 2669 | |
| 2670 Description: | |
| 2671 ~~~~~~~~~~~~ | |
| 2672 | |
| 2673 Predictor trigger block. | |
| 2674 | |
| 2675 Inputs: tr, ap (ou bp ou tdp) | |
| 2676 Output: ar (ou br ou tdr) | |
| 2677 | |
| 2678 Return value: none. | |
| 2679 ~~~~~~~~~~~~~ | |
| 2680 | |
| 2681 Prototype: in g726.h | |
| 2682 ~~~~~~~~~~ | |
| 2683 | |
| 2684 History: | |
| 2685 ~~~~~~~~ | |
| 2686 31.Jan.91 v1.0f Release of 1st Fortran version to UGST. | |
| 2687 <tdsindi@venus.cpqd.ansp.br> | |
| 2688 13.Feb.92 v1.0c 1st version in C translated from Fortran (f2c) | |
| 2689 <tdsimao@venus.cpqd.ansp.br> | |
| 2690 | |
| 2691 ---------------------------------------------------------------------- | |
| 2692 */ | |
| 2693 void G726_trigb(tr, ap, ar) | |
| 2694 short *tr, *ap, *ar; | |
| 2695 { | |
| 2696 *ar = (*tr == 0) ? *ap : 0; | |
| 2697 | |
| 2698 } | |
| 2699 | |
| 2700 /* ....................... end of G726_trigb() ....................... */ | |
| 2701 | |
| 2702 | |
| 2703 /* | |
| 2704 ---------------------------------------------------------------------- | |
| 2705 | |
| 2706 void G726_upa1 (short *pk0, short *pk1, short *a1, | |
| 2707 ~~~~~~~~~~~~~~ short *sigpk, short *a1t); | |
| 2708 | |
| 2709 Description: | |
| 2710 ~~~~~~~~~~~~ | |
| 2711 | |
| 2712 Update a1 coefficient of second order predictor. | |
| 2713 | |
| 2714 Inputs: pk0, pk1, a1, sigpk | |
| 2715 Output: a1t | |
| 2716 | |
| 2717 Return value: none. | |
| 2718 ~~~~~~~~~~~~~ | |
| 2719 | |
| 2720 Prototype: in g726.h | |
| 2721 ~~~~~~~~~~ | |
| 2722 | |
| 2723 History: | |
| 2724 ~~~~~~~~ | |
| 2725 31.Jan.91 v1.0f Release of 1st Fortran version to UGST. | |
| 2726 <tdsindi@venus.cpqd.ansp.br> | |
| 2727 13.Feb.92 v1.0c 1st version in C translated from Fortran (f2c) | |
| 2728 <tdsimao@venus.cpqd.ansp.br> | |
| 2729 | |
| 2730 ---------------------------------------------------------------------- | |
| 2731 */ | |
| 2732 void G726_upa1(pk0, pk1, a1, sigpk, a1t) | |
| 2733 short *pk0, *pk1, *a1, *sigpk, *a1t; | |
| 2734 { | |
| 2735 long a11, a1s, ua1; | |
| 2736 long ash; | |
| 2737 short pks; | |
| 2738 long uga1, ula1; | |
| 2739 | |
| 2740 /* Preamble */ | |
| 2741 a11 = *a1 & 65535; | |
| 2742 | |
| 2743 pks = (*pk0) ^ (*pk1); | |
| 2744 | |
| 2745 /* Gain is +/- (3/256) */ | |
| 2746 uga1 = (*sigpk == 1) ? 0 : ((pks == 0) ? 192 : 65344); | |
| 2747 | |
| 2748 a1s = (a11 >> 15); | |
| 2749 | |
| 2750 /* Leak factor is (1/256) */ | |
| 2751 ash = (a11 >> 8); | |
| 2752 ula1 = ((a1s == 0) ? (65536 - ash) : (65536 - (ash + 65280))) & 65535; | |
| 2753 | |
| 2754 /* Compute update */ | |
| 2755 ua1 = (uga1 + ula1) & 65535; | |
| 2756 *a1t = (short) ((a11 + ua1) & 65535); | |
| 2757 | |
| 2758 } | |
| 2759 | |
| 2760 /* ....................... end of G726_upa1() ....................... */ | |
| 2761 | |
| 2762 | |
| 2763 /* | |
| 2764 ---------------------------------------------------------------------- | |
| 2765 | |
| 2766 void G726_upa2 (short *pk0, short *pk1, short *pk2, | |
| 2767 ~~~~~~~~~~~~~~ short *a2, short *a1, short *sigpk, short *a2t); | |
| 2768 | |
| 2769 Description: | |
| 2770 ~~~~~~~~~~~~ | |
| 2771 | |
| 2772 Update a2 coefficient of second order predictor. | |
| 2773 | |
| 2774 Inputs: pk0, pk1, pk2, a2, a1, sigpk | |
| 2775 Output: a2t | |
| 2776 | |
| 2777 Return value: none. | |
| 2778 ~~~~~~~~~~~~~ | |
| 2779 | |
| 2780 Prototype: in g726.h | |
| 2781 ~~~~~~~~~~ | |
| 2782 | |
| 2783 History: | |
| 2784 ~~~~~~~~ | |
| 2785 31.Jan.91 v1.0f Release of 1st Fortran version to UGST. | |
| 2786 <tdsindi@venus.cpqd.ansp.br> | |
| 2787 13.Feb.92 v1.0c 1st version in C translated from Fortran (f2c) | |
| 2788 <tdsimao@venus.cpqd.ansp.br> | |
| 2789 | |
| 2790 ---------------------------------------------------------------------- | |
| 2791 */ | |
| 2792 void G726_upa2(pk0, pk1, pk2, a2, a1, sigpk, a2t) | |
| 2793 short *pk0, *pk1, *pk2, *a2, *a1, *sigpk, *a2t; | |
| 2794 { | |
| 2795 long uga2a, uga2b, uga2s; | |
| 2796 long a11, a21, fa, fa1; | |
| 2797 short a1s, a2s; | |
| 2798 long ua2; | |
| 2799 long uga2, ula2; | |
| 2800 short pks1, pks2; | |
| 2801 | |
| 2802 /* Preamble */ | |
| 2803 a11 = *a1 & 65535; | |
| 2804 a21 = *a2 & 65535; | |
| 2805 | |
| 2806 /* 1 bit xors */ | |
| 2807 pks1 = (*pk0 ^ *pk1); | |
| 2808 pks2 = (*pk0 ^ *pk2); | |
| 2809 | |
| 2810 uga2a = (pks2 == 0) ? 16384 : 114688; | |
| 2811 | |
| 2812 a1s = (*a1 >> 15); | |
| 2813 | |
| 2814 /* Implement f(a1) w/ limiting at +/-(1/2) */ | |
| 2815 if (a1s == 0) | |
| 2816 fa1 = (a11 <= 8191) ? (a11 << 2) : (8191 << 2); | |
| 2817 else | |
| 2818 fa1 = (a11 >= 57345) ? ((a11 << 2) & 131071) : (24577 << 2); | |
| 2819 | |
| 2820 /* Attach sign to the result of f(a1) */ | |
| 2821 fa = (pks1) ? fa1 : ((131072 - fa1) & 131071); | |
| 2822 | |
| 2823 uga2b = (uga2a + fa) & 131071; | |
| 2824 uga2s = (uga2b >> 16); | |
| 2825 | |
| 2826 uga2 = (*sigpk == 1) ? 0 : | |
| 2827 ((uga2s) ? ((uga2b >> 7) + 64512) : (uga2b >> 7)); | |
| 2828 | |
| 2829 a2s = (*a2 >> 15); | |
| 2830 | |
| 2831 ula2 = (a2s == 0) ? (65536 - (a21 >> 7)) & 65535 : | |
| 2832 (65536 - ((a21 >> 7) + 65024)) & 65535; | |
| 2833 | |
| 2834 /* Compute update */ | |
| 2835 ua2 = (uga2 + ula2) & 65535; | |
| 2836 *a2t = (short) ((a21 + ua2) & 65535); | |
| 2837 | |
| 2838 } | |
| 2839 | |
| 2840 /* ....................... end of G726_upa2() ....................... */ | |
| 2841 | |
| 2842 | |
| 2843 /* | |
| 2844 ---------------------------------------------------------------------- | |
| 2845 | |
| 2846 void G726_upb (short rate, short *u, short *b, short *dq, short *bp); | |
| 2847 ~~~~~~~~~~~~~ | |
| 2848 | |
| 2849 Description: | |
| 2850 ~~~~~~~~~~~~ | |
| 2851 | |
| 2852 Update for coefficients of sixth order predictor. | |
| 2853 | |
| 2854 Inputs: u, b, dq, rate | |
| 2855 Output: bp | |
| 2856 | |
| 2857 Return value: none. | |
| 2858 ~~~~~~~~~~~~~ | |
| 2859 | |
| 2860 Prototype: in g726.h | |
| 2861 ~~~~~~~~~~ | |
| 2862 | |
| 2863 History: | |
| 2864 ~~~~~~~~ | |
| 2865 31.Jan.91 v1.0f Release of 1st Fortran version to UGST. | |
| 2866 <tdsindi@venus.cpqd.ansp.br> | |
| 2867 13.Feb.92 v1.0c 1st version in C translated from Fortran (f2c) | |
| 2868 <tdsimao@venus.cpqd.ansp.br> | |
| 2869 | |
| 2870 ---------------------------------------------------------------------- | |
| 2871 */ | |
| 2872 void G726_upb(rate, u, b, dq, bp) | |
| 2873 short *u, *b, *dq, *bp; | |
| 2874 short rate; | |
| 2875 { | |
| 2876 short dqmag; | |
| 2877 long bb, bs, ub; | |
| 2878 long ugb, ulb; | |
| 2879 short param; | |
| 2880 short leak; | |
| 2881 | |
| 2882 /* Preamble */ | |
| 2883 bb = *b & 65535; | |
| 2884 | |
| 2885 dqmag = *dq & 32767; | |
| 2886 if (rate != 5) { | |
| 2887 leak = 8; | |
| 2888 param = 65280; | |
| 2889 } else { | |
| 2890 leak = 9; | |
| 2891 param = 65408; | |
| 2892 } | |
| 2893 /* gain is 0 or +/- (1/128) */ | |
| 2894 ugb = (dqmag == 0) ? 0 : ((*u == 0) ? 128 : 65408); | |
| 2895 | |
| 2896 bs = (bb >> 15); | |
| 2897 | |
| 2898 /* Leak factor is (1/256 or 1/512 for 40 kbit/s) */ | |
| 2899 | |
| 2900 ulb = (bs == 0) ? | |
| 2901 ((65536 - (bb >> leak)) & 65535) : | |
| 2902 ((65536 - ((bb >> leak) + param)) & 65535); | |
| 2903 | |
| 2904 /* Compute update */ | |
| 2905 ub = (ugb + ulb) & 65535; | |
| 2906 /* aux = bb + ub;*/ | |
| 2907 | |
| 2908 *bp = (short) ((bb + ub) & 65535); | |
| 2909 | |
| 2910 } | |
| 2911 | |
| 2912 /* ....................... end of G726_upb() ....................... */ | |
| 2913 | |
| 2914 | |
| 2915 /* | |
| 2916 ---------------------------------------------------------------------- | |
| 2917 | |
| 2918 void G726_xor (short *dqn, short *dq, short *u); | |
| 2919 ~~~~~~~~~~~~~ | |
| 2920 | |
| 2921 Description: | |
| 2922 ~~~~~~~~~~~~ | |
| 2923 | |
| 2924 One bit "exclusive or" of sign of difference signal and sign | |
| 2925 of delayed difference signal. | |
| 2926 | |
| 2927 Inputs: dqn, dq | |
| 2928 Output: u | |
| 2929 | |
| 2930 | |
| 2931 Return value: none. | |
| 2932 ~~~~~~~~~~~~~ | |
| 2933 | |
| 2934 Prototype: in g726.h | |
| 2935 ~~~~~~~~~~ | |
| 2936 | |
| 2937 History: | |
| 2938 ~~~~~~~~ | |
| 2939 31.Jan.91 v1.0f Release of 1st Fortran version to UGST. | |
| 2940 <tdsindi@venus.cpqd.ansp.br> | |
| 2941 13.Feb.92 v1.0c 1st version in C translated from Fortran (f2c) | |
| 2942 <tdsimao@venus.cpqd.ansp.br> | |
| 2943 | |
| 2944 ---------------------------------------------------------------------- | |
| 2945 */ | |
| 2946 void G726_xor(dqn, dq, u) | |
| 2947 short *dqn, *dq, *u; | |
| 2948 { | |
| 2949 short dqns; | |
| 2950 short dqs; | |
| 2951 | |
| 2952 dqs = (*dq >> 15) & 1; | |
| 2953 | |
| 2954 dqns = (*dqn >> 10); | |
| 2955 | |
| 2956 *u = (dqs ^ dqns); | |
| 2957 | |
| 2958 } | |
| 2959 | |
| 2960 /* ....................... end of G726_xor() ....................... */ | |
| 2961 | |
| 2962 | |
| 2963 /* | |
| 2964 ---------------------------------------------------------------------- | |
| 2965 | |
| 2966 void G726_tone (short *a2p, short *tdp); | |
| 2967 ~~~~~~~~~~~~~~ | |
| 2968 | |
| 2969 Description: | |
| 2970 ~~~~~~~~~~~~ | |
| 2971 | |
| 2972 Partial band signal detection. | |
| 2973 | |
| 2974 Inputs: a2p | |
| 2975 Output: tdp | |
| 2976 | |
| 2977 Return value: none. | |
| 2978 ~~~~~~~~~~~~~ | |
| 2979 | |
| 2980 Prototype: in g726.h | |
| 2981 ~~~~~~~~~~ | |
| 2982 | |
| 2983 History: | |
| 2984 ~~~~~~~~ | |
| 2985 31.Jan.91 v1.0f Release of 1st Fortran version to UGST. | |
| 2986 <tdsindi@venus.cpqd.ansp.br> | |
| 2987 13.Feb.92 v1.0c 1st version in C translated from Fortran (f2c) | |
| 2988 <tdsimao@venus.cpqd.ansp.br> | |
| 2989 | |
| 2990 ---------------------------------------------------------------------- | |
| 2991 */ | |
| 2992 void G726_tone(a2p, tdp) | |
| 2993 short *a2p, *tdp; | |
| 2994 { | |
| 2995 long a2p1; | |
| 2996 | |
| 2997 a2p1 = *a2p & 65535; | |
| 2998 | |
| 2999 *tdp = (a2p1 >= 32768 && a2p1 < 53760) ? 1 : 0; | |
| 3000 | |
| 3001 } | |
| 3002 | |
| 3003 /* ....................... end of G726_tone() ....................... */ | |
| 3004 | |
| 3005 | |
| 3006 /* | |
| 3007 ---------------------------------------------------------------------- | |
| 3008 | |
| 3009 void G726_trans (short *td, long *yl, short *dq, short *tr); | |
| 3010 ~~~~~~~~~~~~~~~ | |
| 3011 | |
| 3012 Description: | |
| 3013 ~~~~~~~~~~~~ | |
| 3014 | |
| 3015 Transition detector. | |
| 3016 | |
| 3017 Inputs: td, yl, dq | |
| 3018 Output: tr | |
| 3019 | |
| 3020 Return value: none. | |
| 3021 ~~~~~~~~~~~~~ | |
| 3022 | |
| 3023 Prototype: in g726.h | |
| 3024 ~~~~~~~~~~ | |
| 3025 | |
| 3026 History: | |
| 3027 ~~~~~~~~ | |
| 3028 31.Jan.91 v1.0f Release of 1st Fortran version to UGST. | |
| 3029 <tdsindi@venus.cpqd.ansp.br> | |
| 3030 13.Feb.92 v1.0c 1st version in C translated from Fortran (f2c) | |
| 3031 <tdsimao@venus.cpqd.ansp.br> | |
| 3032 | |
| 3033 ---------------------------------------------------------------------- | |
| 3034 */ | |
| 3035 void G726_trans(td, yl, dq, tr) | |
| 3036 short *td; | |
| 3037 long *yl; | |
| 3038 short *dq, *tr; | |
| 3039 { | |
| 3040 short dqmag; | |
| 3041 long dqthr; | |
| 3042 short ylint; | |
| 3043 long dqmag1; | |
| 3044 short ylfrac; | |
| 3045 long thr1, thr2; | |
| 3046 | |
| 3047 dqmag = *dq & 32767; | |
| 3048 | |
| 3049 ylint = (*yl >> 15); | |
| 3050 | |
| 3051 ylfrac = (*yl >> 10) & 31; | |
| 3052 | |
| 3053 thr1 = (ylfrac + 32) << ylint; | |
| 3054 | |
| 3055 thr2 = (ylint > 9) ? 31744 : thr1; | |
| 3056 | |
| 3057 dqthr = (thr2 + (thr2 >> 1)) >> 1; | |
| 3058 | |
| 3059 dqmag1 = dqmag; | |
| 3060 | |
| 3061 *tr = (dqmag1 > dqthr && *td == 1) ? 1 : 0; | |
| 3062 | |
| 3063 } | |
| 3064 | |
| 3065 /* ....................... end of G726_trans() ....................... */ | |
| 3066 | |
| 3067 | |
| 3068 /* | |
| 3069 ---------------------------------------------------------------------- | |
| 3070 | |
| 3071 void G726_compress (short *sr, char *law, short *sp); | |
| 3072 ~~~~~~~~~~~~~~~~~~ | |
| 3073 | |
| 3074 Description: | |
| 3075 ~~~~~~~~~~~~ | |
| 3076 | |
| 3077 Convert from uniform pcm to either a-law or u-law pcm | |
| 3078 | |
| 3079 Inputs: sr, law | |
| 3080 Output: sp | |
| 3081 | |
| 3082 Return value: none. | |
| 3083 ~~~~~~~~~~~~~ | |
| 3084 | |
| 3085 Prototype: in g726.h | |
| 3086 ~~~~~~~~~~ | |
| 3087 | |
| 3088 History: | |
| 3089 ~~~~~~~~ | |
| 3090 31.Jan.91 v1.0f Release of 1st Fortran version to UGST. | |
| 3091 <tdsindi@venus.cpqd.ansp.br> | |
| 3092 13.Feb.92 v1.0c 1st version in C translated from Fortran (f2c) | |
| 3093 <tdsimao@venus.cpqd.ansp.br> | |
| 3094 24.Jan.00 v2.0 Corrected im calculation that caused incorrect | |
| 3095 processing of test vector ri40fa. Corrected | |
| 3096 code provided by Jayesh Patel <jayesh@dspse.com>. | |
| 3097 Verified by <simao.campos@labs.comsat.com> | |
| 3098 ---------------------------------------------------------------------- | |
| 3099 */ | |
| 3100 void G726_compress(sr, law, sp) | |
| 3101 short *sr; | |
| 3102 char *law; | |
| 3103 short *sp; | |
| 3104 { | |
| 3105 short imag, iesp, ofst; | |
| 3106 short ofst1; | |
| 3107 long i; | |
| 3108 long im; | |
| 3109 short is; | |
| 3110 long srr; | |
| 3111 | |
| 3112 is = (*sr >> 15); | |
| 3113 srr = (*sr & 65535); | |
| 3114 | |
| 3115 /* Convert 2-complement to signed magnitude */ | |
| 3116 im = (is == 0) ? srr : ((65536 - srr) & 32767); | |
| 3117 | |
| 3118 /* Compress ... */ | |
| 3119 if (*law == '1') { | |
| 3120 | |
| 3121 /* Next line added by J.Patel to fix a with test vector ri40fa.o */ | |
| 3122 im = (*sr == -32768) ? 2 : im; /* *** */ | |
| 3123 | |
| 3124 imag = (is == 0) ? (im >> 1) : ((im + 1) >> 1); | |
| 3125 | |
| 3126 if (is) | |
| 3127 --imag; | |
| 3128 | |
| 3129 /* Saturation */ | |
| 3130 if (imag > 4095) | |
| 3131 imag = 4095; | |
| 3132 | |
| 3133 iesp = 7; | |
| 3134 for (i = 1; i <= 7; ++i) { | |
| 3135 imag += imag; | |
| 3136 if (imag >= 4096) | |
| 3137 break; | |
| 3138 iesp = 7 - i; | |
| 3139 } | |
| 3140 | |
| 3141 imag &= 4095; | |
| 3142 | |
| 3143 imag = (imag >> 8); | |
| 3144 *sp = (is == 0) ? imag + (iesp << 4) : imag + (iesp << 4) + 128; | |
| 3145 | |
| 3146 /* Sign bit inversion */ | |
| 3147 *sp ^= 128; | |
| 3148 } else { | |
| 3149 imag = im; | |
| 3150 | |
| 3151 if (imag > 8158) | |
| 3152 imag = 8158; /* Saturation */ | |
| 3153 | |
| 3154 ++imag; | |
| 3155 iesp = 0; | |
| 3156 ofst = 31; | |
| 3157 | |
| 3158 if (imag > ofst) { | |
| 3159 for (iesp = 1; iesp <= 8; ++iesp) { | |
| 3160 ofst1 = ofst; | |
| 3161 ofst += (1 << (iesp + 5)); | |
| 3162 if (imag <= ofst) | |
| 3163 break; | |
| 3164 } | |
| 3165 imag -= ofst1 + 1; | |
| 3166 } | |
| 3167 | |
| 3168 imag /= (1 << (iesp + 1)); | |
| 3169 | |
| 3170 *sp = (is == 0) ? (imag + (iesp << 4)) : (imag + (iesp << 4) + 128); | |
| 3171 | |
| 3172 /* Sign bit inversion */ | |
| 3173 *sp ^= 128; | |
| 3174 *sp ^= 127; | |
| 3175 } | |
| 3176 | |
| 3177 } | |
| 3178 | |
| 3179 /* ....................... end of G726_compress()....................... */ | |
| 3180 | |
| 3181 | |
| 3182 /* | |
| 3183 ---------------------------------------------------------------------- | |
| 3184 | |
| 3185 void G726_sync (short rate, short *i, short *sp, short *dlnx, | |
| 3186 ~~~~~~~~~~~~~~ short *dsx, char *law, short *sd); | |
| 3187 | |
| 3188 Description: | |
| 3189 ~~~~~~~~~~~~ | |
| 3190 | |
| 3191 Re-encode output pcm sample in decoder for synchronous tandem | |
| 3192 coding. | |
| 3193 | |
| 3194 Inputs: i, sp, dlnx, dsx, law, rate | |
| 3195 Output: sd | |
| 3196 | |
| 3197 Return value: none. | |
| 3198 ~~~~~~~~~~~~~ | |
| 3199 | |
| 3200 Prototype: in g726.h | |
| 3201 ~~~~~~~~~~ | |
| 3202 | |
| 3203 History: | |
| 3204 ~~~~~~~~ | |
| 3205 31.Jan.91 v1.0f Release of 1st Fortran version to UGST. | |
| 3206 <tdsindi@venus.cpqd.ansp.br> | |
| 3207 13.Feb.92 v1.0c 1st version in C translated from Fortran (f2c) | |
| 3208 <tdsimao@venus.cpqd.ansp.br> | |
| 3209 | |
| 3210 ---------------------------------------------------------------------- | |
| 3211 */ | |
| 3212 void G726_sync(rate, i, sp, dlnx, dsx, law, sd) | |
| 3213 short *i, *sp, *dlnx, *dsx; | |
| 3214 char *law; | |
| 3215 short *sd; | |
| 3216 short rate; | |
| 3217 { | |
| 3218 short mask, id, im, is, ss; | |
| 3219 | |
| 3220 if (rate == 4) { | |
| 3221 is = (*i >> 3); | |
| 3222 | |
| 3223 im = (is == 0) ? (*i + 8) : (*i & 7); | |
| 3224 | |
| 3225 /* Find value of `id' as in Table 17/G.726 */ | |
| 3226 if (*dlnx >= 3972) | |
| 3227 id = 9; | |
| 3228 else if (*dlnx >= 2048) | |
| 3229 id = 7; | |
| 3230 else if (*dlnx >= 400) | |
| 3231 id = 15; | |
| 3232 else if (*dlnx >= 349) | |
| 3233 id = 14; | |
| 3234 else if (*dlnx >= 300) | |
| 3235 id = 13; | |
| 3236 else if (*dlnx >= 246) | |
| 3237 id = 12; | |
| 3238 else if (*dlnx >= 178) | |
| 3239 id = 11; | |
| 3240 else if (*dlnx >= 80) | |
| 3241 id = 10; | |
| 3242 else | |
| 3243 id = 9; | |
| 3244 | |
| 3245 /* Account for the negative part of the table */ | |
| 3246 if (*dsx) | |
| 3247 id = 15 - id; | |
| 3248 | |
| 3249 if (id == 8) | |
| 3250 id = 7; | |
| 3251 } /* ............... end of 32 kbit part | |
| 3252 * ................. */ | |
| 3253 else if (rate == 3) { | |
| 3254 is = (*i >> 2); | |
| 3255 | |
| 3256 im = (is == 0) ? (*i + 4) : (*i & 3); | |
| 3257 | |
| 3258 /* Find value of `id' as in the Table 18/G.726 */ | |
| 3259 if (*dlnx >= 2048) | |
| 3260 id = 3; | |
| 3261 else if (*dlnx >= 331) | |
| 3262 id = 7; | |
| 3263 else if (*dlnx >= 218) | |
| 3264 id = 6; | |
| 3265 else if (*dlnx >= 8) | |
| 3266 id = 5; | |
| 3267 else if (*dlnx >= 0) | |
| 3268 id = 3; | |
| 3269 | |
| 3270 | |
| 3271 if (*dsx) | |
| 3272 id = 7 - id; | |
| 3273 | |
| 3274 if (id == 4) | |
| 3275 id = 3; | |
| 3276 } /* ............... end of 24 kbit part | |
| 3277 * ................. */ | |
| 3278 else if (rate == 2) { | |
| 3279 is = (*i >> 1); | |
| 3280 | |
| 3281 im = (is == 0) ? (*i + 2) : (*i & 1); | |
| 3282 | |
| 3283 /* Find value of `id' as in the Table 19/G.726 */ | |
| 3284 if (*dlnx >= 2048) | |
| 3285 id = 2; | |
| 3286 else if (*dlnx >= 261) | |
| 3287 id = 3; | |
| 3288 else if (*dlnx >= 0) | |
| 3289 id = 2; | |
| 3290 | |
| 3291 if (*dsx) | |
| 3292 id = 3 - id; | |
| 3293 | |
| 3294 } /* ............... end of 16 kbit part | |
| 3295 * ................. */ | |
| 3296 else { | |
| 3297 is = (*i >> 4); | |
| 3298 | |
| 3299 im = (is == 0) ? (*i + 16) : (*i & 15); | |
| 3300 | |
| 3301 /* Find value of `id' as in the Table 16/G.726 */ | |
| 3302 | |
| 3303 if (*dlnx >= 4080) | |
| 3304 id = 18; | |
| 3305 else if (*dlnx >= 3974) | |
| 3306 id = 17; | |
| 3307 else if (*dlnx >= 2048) | |
| 3308 id = 15; | |
| 3309 else if (*dlnx >= 553) | |
| 3310 id = 31; | |
| 3311 else if (*dlnx >= 528) | |
| 3312 id = 30; | |
| 3313 else if (*dlnx >= 502) | |
| 3314 id = 29; | |
| 3315 else if (*dlnx >= 475) | |
| 3316 id = 28; | |
| 3317 else if (*dlnx >= 445) | |
| 3318 id = 27; | |
| 3319 else if (*dlnx >= 413) | |
| 3320 id = 26; | |
| 3321 else if (*dlnx >= 378) | |
| 3322 id = 25; | |
| 3323 else if (*dlnx >= 339) | |
| 3324 id = 24; | |
| 3325 else if (*dlnx >= 298) | |
| 3326 id = 23; | |
| 3327 else if (*dlnx >= 250) | |
| 3328 id = 22; | |
| 3329 else if (*dlnx >= 198) | |
| 3330 id = 21; | |
| 3331 else if (*dlnx >= 139) | |
| 3332 id = 20; | |
| 3333 else if (*dlnx >= 68) | |
| 3334 id = 19; | |
| 3335 else if (*dlnx >= 0) | |
| 3336 id = 18; | |
| 3337 | |
| 3338 if (*dsx) | |
| 3339 id = 31 - id; | |
| 3340 | |
| 3341 if (id == 16) | |
| 3342 id = 15; | |
| 3343 | |
| 3344 } /* ............... end of 40 kbit part | |
| 3345 * ................. */ | |
| 3346 | |
| 3347 /* Choose sd as sp, sp+ or sp- */ | |
| 3348 | |
| 3349 ss = (*sp & 128) >> 7; | |
| 3350 mask = (*sp & 127); | |
| 3351 | |
| 3352 if (*law == '1') { /* ......... A-law */ | |
| 3353 if (id > im && ss == 1 && mask == 0) | |
| 3354 ss = 0; | |
| 3355 else if (id > im && ss == 1 && mask != 0) | |
| 3356 mask--; | |
| 3357 else if (id > im && ss == 0 && mask != 127) | |
| 3358 mask++; | |
| 3359 else if (id < im && ss == 1 && mask != 127) | |
| 3360 mask++; | |
| 3361 else if (id < im && ss == 0 && mask == 0) | |
| 3362 ss = 1; | |
| 3363 else if (id < im && ss == 0 && mask != 0) | |
| 3364 mask--; | |
| 3365 } else { /* ......... u-law */ | |
| 3366 if (id > im && ss == 1 && mask == 127) { | |
| 3367 ss = 0; | |
| 3368 mask--; | |
| 3369 } else if (id > im && ss == 1 && mask != 127) | |
| 3370 mask++; | |
| 3371 else if (id > im && ss == 0 && mask != 0) | |
| 3372 mask--; | |
| 3373 else if (id < im && ss == 1 && mask != 0) | |
| 3374 mask--; | |
| 3375 else if (id < im && ss == 0 && mask == 127) | |
| 3376 ss = 1; | |
| 3377 else if (id < im && ss == 0 && mask != 127) | |
| 3378 mask++; | |
| 3379 } | |
| 3380 | |
| 3381 *sd = mask + (ss << 7); | |
| 3382 | |
| 3383 } | |
| 3384 | |
| 3385 /* ........................ end of G726_sync() ........................ */ | |
| 3386 | |
| 3387 /* ************************* END OF G726.C ************************* */ |
