FreeCalypso > hg > gsm-codec-lib
annotate libtwamr/enc_lag6.c @ 514:67b13a6a63c9
libgsmhr1: implement validation for *.dec frames
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sun, 25 Aug 2024 19:14:40 +0000 |
parents | 0349de7c45b7 |
children |
rev | line source |
---|---|
363
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1 /* |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2 ******************************************************************************** |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
3 * |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
4 * GSM AMR-NB speech codec R98 Version 7.6.0 December 12, 2001 |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
5 * R99 Version 3.3.0 |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
6 * REL-4 Version 4.1.0 |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
7 * |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
8 ******************************************************************************** |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
9 * |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
10 * File : enc_lag6.c |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
11 * Purpose : Encoding of fractional pitch lag with 1/6 resolution. |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
12 * |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
13 ******************************************************************************** |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
14 */ |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
15 /* |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
16 ******************************************************************************** |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
17 * MODULE INCLUDE FILE AND VERSION ID |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
18 ******************************************************************************** |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
19 */ |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
20 #include "namespace.h" |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
21 #include "enc_lag6.h" |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
22 |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
23 /* |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
24 ******************************************************************************** |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
25 * INCLUDE FILES |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
26 ******************************************************************************** |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
27 */ |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
28 #include "typedef.h" |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
29 #include "basic_op.h" |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
30 #include "no_count.h" |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
31 |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
32 /* |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
33 ******************************************************************************** |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
34 * LOCAL VARIABLES AND TABLES |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
35 ******************************************************************************** |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
36 */ |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
37 |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
38 /* |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
39 ******************************************************************************** |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
40 * PUBLIC PROGRAM CODE |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
41 ******************************************************************************** |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
42 */ |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
43 /************************************************************************* |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
44 * |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
45 * FUNCTION: Enc_lag6 |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
46 * |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
47 * PURPOSE: Encoding of fractional pitch lag with 1/6 resolution. |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
48 * |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
49 * DESCRIPTION: |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
50 * First and third subframes: |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
51 * -------------------------- |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
52 * The pitch range is divided as follows: |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
53 * 17 3/6 to 94 3/6 resolution 1/6 |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
54 * 95 to 143 resolution 1 |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
55 * |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
56 * The period is encoded with 9 bits. |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
57 * For the range with fractions: |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
58 * index = (T-17)*6 + frac - 3; |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
59 * where T=[17..94] and frac=[-2,-1,0,1,2,3] |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
60 * and for the integer only range |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
61 * index = (T - 95) + 463; where T=[95..143] |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
62 * |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
63 * Second and fourth subframes: |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
64 * ---------------------------- |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
65 * For the 2nd and 4th subframes a resolution of 1/6 is always used, |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
66 * and the search range is relative to the lag in previous subframe. |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
67 * If t0 is the lag in the previous subframe then |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
68 * t_min=t0-5 and t_max=t0+4 and the range is given by |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
69 * (t_min-1) 3/6 to (t_max) 3/6 |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
70 * |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
71 * The period in the 2nd (and 4th) subframe is encoded with 6 bits: |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
72 * index = (T-(t_min-1))*6 + frac - 3; |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
73 * where T=[t_min-1..t_max] and frac=[-2,-1,0,1,2,3] |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
74 * |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
75 * Note that only 61 values are used. If the decoder receives 61, 62, |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
76 * or 63 as the relative pitch index, it means that a transmission |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
77 * error occurred and the pitch from previous subframe should be used. |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
78 * |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
79 *************************************************************************/ |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
80 Word16 Enc_lag6 ( /* o : Return index of encoding */ |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
81 Word16 T0, /* i : Pitch delay */ |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
82 Word16 T0_frac, /* i : Fractional pitch delay */ |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
83 Word16 T0_min, /* i : minimum of search range */ |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
84 Word16 delta_flag /* i : Flag for 1st (or 3rd) subframe */ |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
85 ) |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
86 { |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
87 Word16 index, i; |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
88 |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
89 test (); |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
90 if (delta_flag == 0) /* if 1st or 3rd subframe */ |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
91 { |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
92 /* encode pitch delay (with fraction) */ |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
93 test (); |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
94 if (sub (T0, 94) <= 0) |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
95 { |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
96 /* index = T0*6 - 105 + T0_frac */ |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
97 i = add (add (T0, T0), T0); |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
98 index = add (sub (add (i, i), 105), T0_frac); |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
99 } |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
100 else |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
101 { |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
102 index = add (T0, 368); |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
103 } |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
104 |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
105 } |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
106 else |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
107 /* if second or fourth subframe */ |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
108 { |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
109 /* index = 6*(T0-T0_min) + 3 + T0_frac */ |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
110 i = sub (T0, T0_min); |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
111 i = add (add (i, i), i); |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
112 index = add (add (add (i, i), 3), T0_frac); |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
113 } |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
114 |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
115 return index; |
0349de7c45b7
libtwamr: integrate enc_lag[36].c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
116 } |