blob: 2f5c6a25aa64e3087e23f91a30a4a839b07f5e1f [file] [log] [blame]
Neels Hofmeyr17518fe2017-06-20 04:35:06 +02001/*! \file gsm660.c
2 * GSM 06.60 - GSM EFR Codec. */
Sylvain Munaut1a4ea5b2010-10-08 15:09:16 +02003/*
4 * (C) 2010 Sylvain Munaut <tnt@246tNt.com>
5 *
6 * All Rights Reserved
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License along
19 * with this program; if not, write to the Free Software Foundation, Inc.,
20 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21 *
22 */
23
24#include <stdint.h>
Harald Weltedee71722017-05-31 02:48:48 +020025#include <osmocom/codec/codec.h>
Sylvain Munaut1a4ea5b2010-10-08 15:09:16 +020026
27/* GSM EFR - subjective importance bit ordering */
28 /* This array encodes GSM 05.03 Table 6.
29 *
30 * It converts between serial parameter output (as described in
31 * GSM 06.60 Table 6 and GSM 05.03 Table 5) and the order needed
32 * before channel encoding. CRC poly and bit repetition must be
33 * applied prior to this table, as in GSM 05.03 3.1.1, to get 260
34 * bits from a 244 bits raw EFR frame.
35 */
Diego Elio Pettenò23431c72012-06-29 13:01:27 -070036const uint16_t gsm660_bitorder[260] = {
Sylvain Munaut1a4ea5b2010-10-08 15:09:16 +020037 38, 39, 40, 41, 42, 43, /* 0 -> LTP-LAG 1: b8..b3 */
38 145, 146, 147, 148, 149, 150, /* 6 -> LTP-LAG 3: b8..b3 */
39 93, 94, /* 12 -> LTP-LAG 2: b5..b4 */
40 200, 201, /* 14 -> LTP-LAG 4: b5..b4 */
41 47, /* 16 -> LTP-GAIN 1: b3 */
42 88, /* 17 -> FCB-GAIN 1: b4 */
43 99, /* 18 -> LTP-GAIN 2: b3 */
44 140, /* 19 -> FCB-GAIN 2: b4 */
45 44, /* 20 -> LTP-LAG 1: b2 */
46 151, /* 21 -> LTP-LAG 3: b2 */
47 95, /* 22 -> LTP-LAG 2: b3 */
48 202, /* 23 -> LTP-LAG 4: b3 */
49 1, 2, /* 24 -> LPC 1: b5..b4 */
50 7, /* 26 -> LPC 2: b7 */
51 9, /* 27 -> LPC 2: b5 */
52 17, 18, /* 28 -> LPC 3: b6..b5 */
53 23, /* 30 -> LPC 3: b0 */
54 45, 46, /* 31 -> LTP-LAG 1: b1..b0 */
55 152, 153, /* 33 -> LTP-LAG 3: b1..b0 */
56 96, /* 35 -> LTP-LAG 2: b2 */
57 203, /* 36 -> LTP-LAG 4: b2 */
58 3, 4, /* 37 -> LPC 1: b3..b2 */
59 10, 11, /* 39 -> LPC 2: b4..b3 */
60 15, /* 41 -> LPC 3: b8 */
61 8, /* 42 -> LPC 2: b6 */
62 5, 6, /* 43 -> LPC 1: b1..b0 */
63 12, /* 45 -> LPC 2: b2 */
64 16, /* 46 -> LPC 3: b7 */
65 19, /* 47 -> LPC 3: b4 */
66 97, /* 48 -> LTP-LAG 2: b1 */
67 204, /* 49 -> LTP-LAG 4: b1 */
68 0, /* 50 -> LPC 1: b6 */
69 13, 14, /* 51 -> LPC 2: b1..b0 */
70 20, /* 53 -> LPC 3: b3 */
71 24, 25, /* 54 -> LPC 4: b7..b6 */
72 27, /* 56 -> LPC 4: b4 */
73 154, /* 57 -> LTP-GAIN 3: b3 */
74 206, /* 58 -> LTP-GAIN 4: b3 */
75 195, /* 59 -> FCB-GAIN 3: b4 */
76 247, /* 60 -> FCB-GAIN 4: b4 */
77 89, /* 61 -> FCB-GAIN 1: b3 */
78 141, /* 62 -> FCB-GAIN 2: b3 */
79 196, /* 63 -> FCB-GAIN 3: b3 */
80 248, /* 64 -> FCB-GAIN 4: b3 */
81 252, 253, 254, 255, 256, 257, 258, 259, /* 65 -> CRC-POLY: b7..b0 */
82 48, /* 73 -> LTP-GAIN 1: b2 */
83 100, /* 74 -> LTP-GAIN 2: b2 */
84 155, /* 75 -> LTP-GAIN 3: b2 */
85 207, /* 76 -> LTP-GAIN 4: b2 */
86 21, 22, /* 77 -> LPC 3: b2..b1 */
87 26, /* 79 -> LPC 4: b5 */
88 28, /* 80 -> LPC 4: b3 */
89 51, /* 81 -> PULSE 1_1: b3 */
90 55, /* 82 -> PULSE 1_2: b3 */
91 59, /* 83 -> PULSE 1_3: b3 */
92 63, /* 84 -> PULSE 1_4: b3 */
93 67, /* 85 -> PULSE 1_5: b3 */
94 103, /* 86 -> PULSE 2_1: b3 */
95 107, /* 87 -> PULSE 2_2: b3 */
96 111, /* 88 -> PULSE 2_3: b3 */
97 115, /* 89 -> PULSE 2_4: b3 */
98 119, /* 90 -> PULSE 2_5: b3 */
99 158, /* 91 -> PULSE 3_1: b3 */
100 162, /* 92 -> PULSE 3_2: b3 */
101 166, /* 93 -> PULSE 3_3: b3 */
102 170, /* 94 -> PULSE 3_4: b3 */
103 174, /* 95 -> PULSE 3_5: b3 */
104 210, /* 96 -> PULSE 4_1: b3 */
105 214, /* 97 -> PULSE 4_2: b3 */
106 218, /* 98 -> PULSE 4_3: b3 */
107 222, /* 99 -> PULSE 4_4: b3 */
108 226, /* 100 -> PULSE 4_5: b3 */
109 90, /* 101 -> FCB-GAIN 1: b2 */
110 142, /* 102 -> FCB-GAIN 2: b2 */
111 197, /* 103 -> FCB-GAIN 3: b2 */
112 249, /* 104 -> FCB-GAIN 4: b2 */
113 49, /* 105 -> LTP-GAIN 1: b1 */
114 101, /* 106 -> LTP-GAIN 2: b1 */
115 156, /* 107 -> LTP-GAIN 3: b1 */
116 208, /* 108 -> LTP-GAIN 4: b1 */
117 29, 30, 31, /* 109 -> LPC 4: b2..b0 */
118 32, 33, 34, 35, /* 112 -> LPC 5: b5..b2 */
119 98, /* 116 -> LTP-LAG 2: b0 */
120 205, /* 117 -> LTP-LAG 4: b0 */
121 52, /* 118 -> PULSE 1_1: b2 */
122 56, /* 119 -> PULSE 1_2: b2 */
123 60, /* 120 -> PULSE 1_3: b2 */
124 64, /* 121 -> PULSE 1_4: b2 */
125 68, /* 122 -> PULSE 1_5: b2 */
126 104, /* 123 -> PULSE 2_1: b2 */
127 108, /* 124 -> PULSE 2_2: b2 */
128 112, /* 125 -> PULSE 2_3: b2 */
129 116, /* 126 -> PULSE 2_4: b2 */
130 120, /* 127 -> PULSE 2_5: b2 */
131 159, /* 128 -> PULSE 3_1: b2 */
132 163, /* 129 -> PULSE 3_2: b2 */
133 167, /* 130 -> PULSE 3_3: b2 */
134 171, /* 131 -> PULSE 3_4: b2 */
135 175, /* 132 -> PULSE 3_5: b2 */
136 211, /* 133 -> PULSE 4_1: b2 */
137 215, /* 134 -> PULSE 4_2: b2 */
138 219, /* 135 -> PULSE 4_3: b2 */
139 223, /* 136 -> PULSE 4_4: b2 */
140 227, /* 137 -> PULSE 4_5: b2 */
141 53, /* 138 -> PULSE 1_1: b1 */
142 57, /* 139 -> PULSE 1_2: b1 */
143 61, /* 140 -> PULSE 1_3: b1 */
144 65, /* 141 -> PULSE 1_4: b1 */
145 105, /* 142 -> PULSE 2_1: b1 */
146 109, /* 143 -> PULSE 2_2: b1 */
147 113, /* 144 -> PULSE 2_3: b1 */
148 117, /* 145 -> PULSE 2_4: b1 */
149 160, /* 146 -> PULSE 3_1: b1 */
150 164, /* 147 -> PULSE 3_2: b1 */
151 168, /* 148 -> PULSE 3_3: b1 */
152 172, /* 149 -> PULSE 3_4: b1 */
153 212, /* 150 -> PULSE 4_1: b1 */
154 220, /* 151 -> PULSE 4_3: b1 */
155 224, /* 152 -> PULSE 4_4: b1 */
156 91, /* 153 -> FCB-GAIN 1: b1 */
157 143, /* 154 -> FCB-GAIN 2: b1 */
158 198, /* 155 -> FCB-GAIN 3: b1 */
159 250, /* 156 -> FCB-GAIN 4: b1 */
160 50, /* 157 -> LTP-GAIN 1: b0 */
161 102, /* 158 -> LTP-GAIN 2: b0 */
162 157, /* 159 -> LTP-GAIN 3: b0 */
163 209, /* 160 -> LTP-GAIN 4: b0 */
164 92, /* 161 -> FCB-GAIN 1: b0 */
165 144, /* 162 -> FCB-GAIN 2: b0 */
166 199, /* 163 -> FCB-GAIN 3: b0 */
167 251, /* 164 -> FCB-GAIN 4: b0 */
168 54, /* 165 -> PULSE 1_1: b0 */
169 58, /* 166 -> PULSE 1_2: b0 */
170 62, /* 167 -> PULSE 1_3: b0 */
171 66, /* 168 -> PULSE 1_4: b0 */
172 106, /* 169 -> PULSE 2_1: b0 */
173 110, /* 170 -> PULSE 2_2: b0 */
174 114, /* 171 -> PULSE 2_3: b0 */
175 118, /* 172 -> PULSE 2_4: b0 */
176 161, /* 173 -> PULSE 3_1: b0 */
177 165, /* 174 -> PULSE 3_2: b0 */
178 169, /* 175 -> PULSE 3_3: b0 */
179 173, /* 176 -> PULSE 3_4: b0 */
180 213, /* 177 -> PULSE 4_1: b0 */
181 221, /* 178 -> PULSE 4_3: b0 */
182 225, /* 179 -> PULSE 4_4: b0 */
183 36, 37, /* 180 -> LPC 5: b1..b0 */
184 69, /* 182 -> PULSE 1_5: b1 */
185 71, 72, /* 183 -> PULSE 1_5: b1..b1 */
186 121, /* 185 -> PULSE 2_5: b1 */
187 123, 124, /* 186 -> PULSE 2_5: b1..b1 */
188 176, /* 188 -> PULSE 3_5: b1 */
189 178, 179, /* 189 -> PULSE 3_5: b1..b1 */
190 228, /* 191 -> PULSE 4_5: b1 */
191 230, 231, /* 192 -> PULSE 4_5: b1..b1 */
192 216, 217, /* 194 -> PULSE 4_2: b1..b0 */
193 70, /* 196 -> PULSE 1_5: b0 */
194 122, /* 197 -> PULSE 2_5: b0 */
195 177, /* 198 -> PULSE 3_5: b0 */
196 229, /* 199 -> PULSE 4_5: b0 */
197 73, /* 200 -> PULSE 1_6: b2 */
198 76, /* 201 -> PULSE 1_7: b2 */
199 79, /* 202 -> PULSE 1_8: b2 */
200 82, /* 203 -> PULSE 1_9: b2 */
201 85, /* 204 -> PULSE 1_10: b2 */
202 125, /* 205 -> PULSE 2_6: b2 */
203 128, /* 206 -> PULSE 2_7: b2 */
204 131, /* 207 -> PULSE 2_8: b2 */
205 134, /* 208 -> PULSE 2_9: b2 */
206 137, /* 209 -> PULSE 2_10: b2 */
207 180, /* 210 -> PULSE 3_6: b2 */
208 183, /* 211 -> PULSE 3_7: b2 */
209 186, /* 212 -> PULSE 3_8: b2 */
210 189, /* 213 -> PULSE 3_9: b2 */
211 192, /* 214 -> PULSE 3_10: b2 */
212 232, /* 215 -> PULSE 4_6: b2 */
213 235, /* 216 -> PULSE 4_7: b2 */
214 238, /* 217 -> PULSE 4_8: b2 */
215 241, /* 218 -> PULSE 4_9: b2 */
216 244, /* 219 -> PULSE 4_10: b2 */
217 74, /* 220 -> PULSE 1_6: b1 */
218 77, /* 221 -> PULSE 1_7: b1 */
219 80, /* 222 -> PULSE 1_8: b1 */
220 83, /* 223 -> PULSE 1_9: b1 */
221 86, /* 224 -> PULSE 1_10: b1 */
222 126, /* 225 -> PULSE 2_6: b1 */
223 129, /* 226 -> PULSE 2_7: b1 */
224 132, /* 227 -> PULSE 2_8: b1 */
225 135, /* 228 -> PULSE 2_9: b1 */
226 138, /* 229 -> PULSE 2_10: b1 */
227 181, /* 230 -> PULSE 3_6: b1 */
228 184, /* 231 -> PULSE 3_7: b1 */
229 187, /* 232 -> PULSE 3_8: b1 */
230 190, /* 233 -> PULSE 3_9: b1 */
231 193, /* 234 -> PULSE 3_10: b1 */
232 233, /* 235 -> PULSE 4_6: b1 */
233 236, /* 236 -> PULSE 4_7: b1 */
234 239, /* 237 -> PULSE 4_8: b1 */
235 242, /* 238 -> PULSE 4_9: b1 */
236 245, /* 239 -> PULSE 4_10: b1 */
237 75, /* 240 -> PULSE 1_6: b0 */
238 78, /* 241 -> PULSE 1_7: b0 */
239 81, /* 242 -> PULSE 1_8: b0 */
240 84, /* 243 -> PULSE 1_9: b0 */
241 87, /* 244 -> PULSE 1_10: b0 */
242 127, /* 245 -> PULSE 2_6: b0 */
243 130, /* 246 -> PULSE 2_7: b0 */
244 133, /* 247 -> PULSE 2_8: b0 */
245 136, /* 248 -> PULSE 2_9: b0 */
246 139, /* 249 -> PULSE 2_10: b0 */
247 182, /* 250 -> PULSE 3_6: b0 */
248 185, /* 251 -> PULSE 3_7: b0 */
249 188, /* 252 -> PULSE 3_8: b0 */
250 191, /* 253 -> PULSE 3_9: b0 */
251 194, /* 254 -> PULSE 3_10: b0 */
252 234, /* 255 -> PULSE 4_6: b0 */
253 237, /* 256 -> PULSE 4_7: b0 */
254 240, /* 257 -> PULSE 4_8: b0 */
255 243, /* 258 -> PULSE 4_9: b0 */
256 246, /* 259 -> PULSE 4_10: b0 */
257};