spandsp 3.0.0
v34_superconstellation_map.h
1/*
2 * SpanDSP - a series of DSP components for telephony
3 *
4 * v34_superconstellation_map.h - ITU V.34 modem superconstellation mapping.
5 *
6 * Written by Steve Underwood <steveu@coppice.org>
7 *
8 * Copyright (C) 2009 Steve Underwood
9 *
10 * All rights reserved.
11 *
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU Lesser General Public License version 2.1,
14 * as published by the Free Software Foundation.
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU Lesser General Public License for more details.
20 *
21 * You should have received a copy of the GNU Lesser General Public
22 * License along with this program; if not, write to the Free Software
23 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 */
25
26/* The 1/4 superconstellation from Figure 5/V.34
27
28 45 408 396 394 400 414
29
30 41 398 375 349 339 329 326 335 347 359 386
31
32 37 412 371 340 314 290 279 269 265 273 281 302 322 353 390
33
34 33 401 357 318 282 257 236 224 216 212 218 228 247 270 298 337 378
35
36 29 406 350 306 266 234 206 185 173 164 162 170 181 197 220 253 288 327 379
37
38 25 360 310 263 226 193 165 146 133 123 121 125 137 154 179 207 242 289 338 391
39
40 21 384 324 277 229 189 156 131 110 96 87 83 92 100 117 140 172 208 254 299 354
41
42 17 355 294 243 201 160 126 98 79 64 58 54 62 71 90 112 141 180 221 271 323 387
43
44 13 392 330 274 222 177 135 102 77 55 41 35 31 37 48 65 91 118 155 198 248 303 361
45
46 9 380 316 255 203 158 119 84 60 39 24 17 15 20 30 49 72 101 138 182 230 283 348 415
47
48 5 367 304 244 194 148 108 75 50 28 13 6 4 8 21 38 63 93 127 171 219 275 336 402
49
50 1 362 296 238 186 142 103 69 43 22 9 1 0 5 16 32 56 85 122 163 213 267 328 395
51
52 -3 365 300 240 190 144 106 73 45 25 11 3 2 7 18 36 59 88 124 166 217 272 331 397
53
54 -7 372 307 251 199 152 113 80 52 33 19 12 10 14 26 42 66 97 134 174 225 280 341 409
55
56-11 388 320 261 210 167 128 94 67 47 34 27 23 29 40 57 81 111 147 187 237 291 351
57
58-15 410 343 284 232 183 149 115 89 68 53 46 44 51 61 78 99 132 168 209 258 315 376
59
60-19 369 311 259 214 175 139 116 95 82 74 70 76 86 104 129 157 195 235 285 342 399
61
62-23 403 345 292 249 205 176 150 130 114 107 105 109 120 136 161 191 227 268 319 373
63
64-27 382 332 287 250 215 184 169 153 145 143 151 159 178 202 231 264 308 358 413
65
66-31 377 333 293 260 233 211 200 192 188 196 204 223 245 278 312 352 404
67
68-35 383 346 313 286 262 252 241 239 246 256 276 295 325 363 407
69
70-39 405 370 344 321 309 301 297 305 317 334 356 385
71
72-43 411 389 374 366 364 368 381 393
73
74 -43 -39 -35 -31 -27 -23 -19 -15 -11 -7 -3 1 5 9 13 17 21 25 29 33 37 41 45
75*/
76
77/* This is actually one quarter of the super-constellation */
78static const int8_t v34_superconstellation[1664/4][2] =
79{
80 { 1, 1}, /* 0 */
81 { -3, 1}, /* 1 */
82 { 1, -3}, /* 2 */
83 { -3, -3}, /* 3 */
84 { 1, 5}, /* 4 */
85 { 5, 1}, /* 5 */
86 { -3, 5}, /* 6 */
87 { 5, -3}, /* 7 */
88 { 5, 5}, /* 8 */
89 { -7, 1}, /* 9 */
90 { 1, -7}, /* 10 */
91 { -7, -3}, /* 11 */
92 { -3, -7}, /* 12 */
93 { -7, 5}, /* 13 */
94 { 5, -7}, /* 14 */
95 { 1, 9}, /* 15 */
96 { 9, 1}, /* 16 */
97 { -3, 9}, /* 17 */
98 { 9, -3}, /* 18 */
99 { -7, -7}, /* 19 */
100 { 5, 9}, /* 20 */
101 { 9, 5}, /* 21 */
102 {-11, 1}, /* 22 */
103 { 1, -11}, /* 23 */
104 { -7, 9}, /* 24 */
105 {-11, -3}, /* 25 */
106 { 9, -7}, /* 26 */
107 { -3, -11}, /* 27 */
108 {-11, 5}, /* 28 */
109 { 5, -11}, /* 29 */
110 { 9, 9}, /* 30 */
111 { 1, 13}, /* 31 */
112 { 13, 1}, /* 32 */
113 {-11, -7}, /* 33 */
114 { -7, -11}, /* 34 */
115 { -3, 13}, /* 35 */
116 { 13, -3}, /* 36 */
117 { 5, 13}, /* 37 */
118 { 13, 5}, /* 38 */
119 {-11, 9}, /* 39 */
120 { 9, -11}, /* 40 */
121 { -7, 13}, /* 41 */
122 { 13, -7}, /* 42 */
123 {-15, 1}, /* 43 */
124 { 1, -15}, /* 44 */
125 {-15, -3}, /* 45 */
126 { -3, -15}, /* 46 */
127 {-11, -11}, /* 47 */
128 { 9, 13}, /* 48 */
129 { 13, 9}, /* 49 */
130 {-15, 5}, /* 50 */
131 { 5, -15}, /* 51 */
132 {-15, -7}, /* 52 */
133 { -7, -15}, /* 53 */
134 { 1, 17}, /* 54 */
135 {-11, 13}, /* 55 */
136 { 17, 1}, /* 56 */
137 { 13, -11}, /* 57 */
138 { -3, 17}, /* 58 */
139 { 17, -3}, /* 59 */
140 {-15, 9}, /* 60 */
141 { 9, -15}, /* 61 */
142 { 5, 17}, /* 62 */
143 { 17, 5}, /* 63 */
144 { -7, 17}, /* 64 */
145 { 13, 13}, /* 65 */
146 { 17, -7}, /* 66 */
147 {-15, -11}, /* 67 */
148 {-11, -15}, /* 68 */
149 {-19, 1}, /* 69 */
150 { 1, -19}, /* 70 */
151 { 9, 17}, /* 71 */
152 { 17, 9}, /* 72 */
153 {-19, -3}, /* 73 */
154 { -3, -19}, /* 74 */
155 {-19, 5}, /* 75 */
156 { 5, -19}, /* 76 */
157 {-15, 13}, /* 77 */
158 { 13, -15}, /* 78 */
159 {-11, 17}, /* 79 */
160 {-19, -7}, /* 80 */
161 { 17, -11}, /* 81 */
162 { -7, -19}, /* 82 */
163 { 1, 21}, /* 83 */
164 {-19, 9}, /* 84 */
165 { 21, 1}, /* 85 */
166 { 9, -19}, /* 86 */
167 { -3, 21}, /* 87 */
168 { 21, -3}, /* 88 */
169 {-15, -15}, /* 89 */
170 { 13, 17}, /* 90 */
171 { 17, 13}, /* 91 */
172 { 5, 21}, /* 92 */
173 { 21, 5}, /* 93 */
174 {-19, -11}, /* 94 */
175 {-11, -19}, /* 95 */
176 { -7, 21}, /* 96 */
177 { 21, -7}, /* 97 */
178 {-15, 17}, /* 98 */
179 { 17, -15}, /* 99 */
180 { 9, 21}, /* 100 */
181 { 21, 9}, /* 101 */
182 {-19, 13}, /* 102 */
183 {-23, 1}, /* 103 */
184 { 13, -19}, /* 104 */
185 { 1, -23}, /* 105 */
186 {-23, -3}, /* 106 */
187 { -3, -23}, /* 107 */
188 {-23, 5}, /* 108 */
189 { 5, -23}, /* 109 */
190 {-11, 21}, /* 110 */
191 { 21, -11}, /* 111 */
192 { 17, 17}, /* 112 */
193 {-23, -7}, /* 113 */
194 { -7, -23}, /* 114 */
195 {-19, -15}, /* 115 */
196 {-15, -19}, /* 116 */
197 { 13, 21}, /* 117 */
198 { 21, 13}, /* 118 */
199 {-23, 9}, /* 119 */
200 { 9, -23}, /* 120 */
201 { 1, 25}, /* 121 */
202 { 25, 1}, /* 122 */
203 { -3, 25}, /* 123 */
204 { 25, -3}, /* 124 */
205 { 5, 25}, /* 125 */
206 {-19, 17}, /* 126 */
207 { 25, 5}, /* 127 */
208 {-23, -11}, /* 128 */
209 { 17, -19}, /* 129 */
210 {-11, -23}, /* 130 */
211 {-15, 21}, /* 131 */
212 { 21, -15}, /* 132 */
213 { -7, 25}, /* 133 */
214 { 25, -7}, /* 134 */
215 {-23, 13}, /* 135 */
216 { 13, -23}, /* 136 */
217 { 9, 25}, /* 137 */
218 { 25, 9}, /* 138 */
219 {-19, -19}, /* 139 */
220 { 17, 21}, /* 140 */
221 { 21, 17}, /* 141 */
222 {-27, 1}, /* 142 */
223 { 1, -27}, /* 143 */
224 {-27, -3}, /* 144 */
225 { -3, -27}, /* 145 */
226 {-11, 25}, /* 146 */
227 { 25, -11}, /* 147 */
228 {-27, 5}, /* 148 */
229 {-23, -15}, /* 149 */
230 {-15, -23}, /* 150 */
231 { 5, -27}, /* 151 */
232 {-27, -7}, /* 152 */
233 { -7, -27}, /* 153 */
234 { 13, 25}, /* 154 */
235 { 25, 13}, /* 155 */
236 {-19, 21}, /* 156 */
237 { 21, -19}, /* 157 */
238 {-27, 9}, /* 158 */
239 { 9, -27}, /* 159 */
240 {-23, 17}, /* 160 */
241 { 17, -23}, /* 161 */
242 { 1, 29}, /* 162 */
243 { 29, 1}, /* 163 */
244 { -3, 29}, /* 164 */
245 {-15, 25}, /* 165 */
246 { 29, -3}, /* 166 */
247 {-27, -11}, /* 167 */
248 { 25, -15}, /* 168 */
249 {-11, -27}, /* 169 */
250 { 5, 29}, /* 170 */
251 { 29, 5}, /* 171 */
252 { 21, 21}, /* 172 */
253 { -7, 29}, /* 173 */
254 { 29, -7}, /* 174 */
255 {-23, -19}, /* 175 */
256 {-19, -23}, /* 176 */
257 {-27, 13}, /* 177 */
258 { 13, -27}, /* 178 */
259 { 17, 25}, /* 179 */
260 { 25, 17}, /* 180 */
261 { 9, 29}, /* 181 */
262 { 29, 9}, /* 182 */
263 {-27, -15}, /* 183 */
264 {-15, -27}, /* 184 */
265 {-11, 29}, /* 185 */
266 {-31, 1}, /* 186 */
267 { 29, -11}, /* 187 */
268 { 1, -31}, /* 188 */
269 {-23, 21}, /* 189 */
270 {-31, -3}, /* 190 */
271 { 21, -23}, /* 191 */
272 { -3, -31}, /* 192 */
273 {-19, 25}, /* 193 */
274 {-31, 5}, /* 194 */
275 { 25, -19}, /* 195 */
276 { 5, -31}, /* 196 */
277 { 13, 29}, /* 197 */
278 { 29, 13}, /* 198 */
279 {-31, -7}, /* 199 */
280 { -7, -31}, /* 200 */
281 {-27, 17}, /* 201 */
282 { 17, -27}, /* 202 */
283 {-31, 9}, /* 203 */
284 { 9, -31}, /* 204 */
285 {-23, -23}, /* 205 */
286 {-15, 29}, /* 206 */
287 { 21, 25}, /* 207 */
288 { 25, 21}, /* 208 */
289 { 29, -15}, /* 209 */
290 {-31, -11}, /* 210 */
291 {-11, -31}, /* 211 */
292 { 1, 33}, /* 212 */
293 { 33, 1}, /* 213 */
294 {-27, -19}, /* 214 */
295 {-19, -27}, /* 215 */
296 { -3, 33}, /* 216 */
297 { 33, -3}, /* 217 */
298 { 5, 33}, /* 218 */
299 { 33, 5}, /* 219 */
300 { 17, 29}, /* 220 */
301 { 29, 17}, /* 221 */
302 {-31, 13}, /* 222 */
303 { 13, -31}, /* 223 */
304 { -7, 33}, /* 224 */
305 { 33, -7}, /* 225 */
306 {-23, 25}, /* 226 */
307 { 25, -23}, /* 227 */
308 { 9, 33}, /* 228 */
309 {-27, 21}, /* 229 */
310 { 33, 9}, /* 230 */
311 { 21, -27}, /* 231 */
312 {-31, -15}, /* 232 */
313 {-15, -31}, /* 233 */
314 {-19, 29}, /* 234 */
315 { 29, -19}, /* 235 */
316 {-11, 33}, /* 236 */
317 { 33, -11}, /* 237 */
318 {-35, 1}, /* 238 */
319 { 1, -35}, /* 239 */
320 {-35, -3}, /* 240 */
321 { -3, -35}, /* 241 */
322 { 25, 25}, /* 242 */
323 {-31, 17}, /* 243 */
324 {-35, 5}, /* 244 */
325 { 17, -31}, /* 245 */
326 { 5, -35}, /* 246 */
327 { 13, 33}, /* 247 */
328 { 33, 13}, /* 248 */
329 {-27, -23}, /* 249 */
330 {-23, -27}, /* 250 */
331 {-35, -7}, /* 251 */
332 { -7, -35}, /* 252 */
333 { 21, 29}, /* 253 */
334 { 29, 21}, /* 254 */
335 {-35, 9}, /* 255 */
336 { 9, -35}, /* 256 */
337 {-15, 33}, /* 257 */
338 { 33, -15}, /* 258 */
339 {-31, -19}, /* 259 */
340 {-19, -31}, /* 260 */
341 {-35, -11}, /* 261 */
342 {-11, -35}, /* 262 */
343 {-27, 25}, /* 263 */
344 { 25, -27}, /* 264 */
345 { 1, 37}, /* 265 */
346 {-23, 29}, /* 266 */
347 { 37, 1}, /* 267 */
348 { 29, -23}, /* 268 */
349 { -3, 37}, /* 269 */
350 { 17, 33}, /* 270 */
351 { 33, 17}, /* 271 */
352 { 37, -3}, /* 272 */
353 { 5, 37}, /* 273 */
354 {-35, 13}, /* 274 */
355 { 37, 5}, /* 275 */
356 { 13, -35}, /* 276 */
357 {-31, 21}, /* 277 */
358 { 21, -31}, /* 278 */
359 { -7, 37}, /* 279 */
360 { 37, -7}, /* 280 */
361 { 9, 37}, /* 281 */
362 {-19, 33}, /* 282 */
363 { 37, 9}, /* 283 */
364 {-35, -15}, /* 284 */
365 { 33, -19}, /* 285 */
366 {-15, -35}, /* 286 */
367 {-27, -27}, /* 287 */
368 { 25, 29}, /* 288 */
369 { 29, 25}, /* 289 */
370 {-11, 37}, /* 290 */
371 { 37, -11}, /* 291 */
372 {-31, -23}, /* 292 */
373 {-23, -31}, /* 293 */
374 {-35, 17}, /* 294 */
375 { 17, -35}, /* 295 */
376 {-39, 1}, /* 296 */
377 { 1, -39}, /* 297 */
378 { 21, 33}, /* 298 */
379 { 33, 21}, /* 299 */
380 {-39, -3}, /* 300 */
381 { -3, -39}, /* 301 */
382 { 13, 37}, /* 302 */
383 { 37, 13}, /* 303 */
384 {-39, 5}, /* 304 */
385 { 5, -39}, /* 305 */
386 {-27, 29}, /* 306 */
387 {-39, -7}, /* 307 */
388 { 29, -27}, /* 308 */
389 { -7, -39}, /* 309 */
390 {-31, 25}, /* 310 */
391 {-35, -19}, /* 311 */
392 { 25, -31}, /* 312 */
393 {-19, -35}, /* 313 */
394 {-15, 37}, /* 314 */
395 { 37, -15}, /* 315 */
396 {-39, 9}, /* 316 */
397 { 9, -39}, /* 317 */
398 {-23, 33}, /* 318 */
399 { 33, -23}, /* 319 */
400 {-39, -11}, /* 320 */
401 {-11, -39}, /* 321 */
402 { 17, 37}, /* 322 */
403 { 37, 17}, /* 323 */
404 {-35, 21}, /* 324 */
405 { 21, -35}, /* 325 */
406 { 1, 41}, /* 326 */
407 { 29, 29}, /* 327 */
408 { 41, 1}, /* 328 */
409 { -3, 41}, /* 329 */
410 {-39, 13}, /* 330 */
411 { 41, -3}, /* 331 */
412 {-31, -27}, /* 332 */
413 {-27, -31}, /* 333 */
414 { 13, -39}, /* 334 */
415 { 5, 41}, /* 335 */
416 { 41, 5}, /* 336 */
417 { 25, 33}, /* 337 */
418 { 33, 25}, /* 338 */
419 { -7, 41}, /* 339 */
420 {-19, 37}, /* 340 */
421 { 41, -7}, /* 341 */
422 { 37, -19}, /* 342 */
423 {-39, -15}, /* 343 */
424 {-15, -39}, /* 344 */
425 {-35, -23}, /* 345 */
426 {-23, -35}, /* 346 */
427 { 9, 41}, /* 347 */
428 { 41, 9}, /* 348 */
429 {-11, 41}, /* 349 */
430 {-31, 29}, /* 350 */
431 { 41, -11}, /* 351 */
432 { 29, -31}, /* 352 */
433 { 21, 37}, /* 353 */
434 { 37, 21}, /* 354 */
435 {-39, 17}, /* 355 */
436 { 17, -39}, /* 356 */
437 {-27, 33}, /* 357 */
438 { 33, -27}, /* 358 */
439 { 13, 41}, /* 359 */
440 {-35, 25}, /* 360 */
441 { 41, 13}, /* 361 */
442 {-43, 1}, /* 362 */
443 { 25, -35}, /* 363 */
444 { 1, -43}, /* 364 */
445 {-43, -3}, /* 365 */
446 { -3, -43}, /* 366 */
447 {-43, 5}, /* 367 */
448 { 5, -43}, /* 368 */
449 {-39, -19}, /* 369 */
450 {-19, -39}, /* 370 */
451 {-23, 37}, /* 371 */
452 {-43, -7}, /* 372 */
453 { 37, -23}, /* 373 */
454 { -7, -43}, /* 374 */
455 {-15, 41}, /* 375 */
456 { 41, -15}, /* 376 */
457 {-31, -31}, /* 377 */
458 { 29, 33}, /* 378 */
459 { 33, 29}, /* 379 */
460 {-43, 9}, /* 380 */
461 { 9, -43}, /* 381 */
462 {-35, -27}, /* 382 */
463 {-27, -35}, /* 383 */
464 {-39, 21}, /* 384 */
465 { 21, -39}, /* 385 */
466 { 17, 41}, /* 386 */
467 { 41, 17}, /* 387 */
468 {-43, -11}, /* 388 */
469 {-11, -43}, /* 389 */
470 { 25, 37}, /* 390 */
471 { 37, 25}, /* 391 */
472 {-43, 13}, /* 392 */
473 { 13, -43}, /* 393 */
474 { 1, 45}, /* 394 */
475 { 45, 1}, /* 395 */
476 { -3, 45}, /* 396 */
477 { 45, -3}, /* 397 */
478 {-19, 41}, /* 398 */
479 { 41, -19}, /* 399 */
480 { 5, 45}, /* 400 */
481 {-31, 33}, /* 401 */
482 { 45, 5}, /* 402 */
483 {-39, -23}, /* 403 */
484 { 33, -31}, /* 404 */
485 {-23, -39}, /* 405 */
486 {-35, 29}, /* 406 */
487 { 29, -35}, /* 407 */
488 { -7, 45}, /* 408 */
489 { 45, -7}, /* 409 */
490 {-43, -15}, /* 410 */
491 {-15, -43}, /* 411 */
492 {-27, 37}, /* 412 */
493 { 37, -27}, /* 413 */
494 { 9, 45}, /* 414 */
495 { 45, 9} /* 415 */
496};
497
498static const int16_t v34_inverse_superconstellation[23][23] =
499{
500 { 0, 0, 0, 0, 0, 0, 0,411,389,374,366,364,368,381,393, 0, 0, 0, 0, 0, 0, 0, 0},
501 { 0, 0, 0, 0, 0,405,370,344,321,309,301,297,305,317,334,356,385, 0, 0, 0, 0, 0, 0},
502 { 0, 0, 0, 0,383,346,313,286,262,252,241,239,246,256,276,295,325,363,407, 0, 0, 0, 0},
503 { 0, 0, 0,377,333,293,260,233,211,200,192,188,196,204,223,245,278,312,352,404, 0, 0, 0},
504 { 0, 0,382,332,287,250,215,184,169,153,145,143,151,159,178,202,231,264,308,358,413, 0, 0},
505 { 0,403,345,292,249,205,176,150,130,114,107,105,109,120,136,161,191,227,268,319,373, 0, 0},
506 { 0,369,311,259,214,175,139,116, 95, 82, 74, 70, 76, 86,104,129,157,195,235,285,342,399, 0},
507 {410,343,284,232,183,149,115, 89, 68, 53, 46, 44, 51, 61, 78, 99,132,168,209,258,315,376, 0},
508 {388,320,261,210,167,128, 94, 67, 47, 34, 27, 23, 29, 40, 57, 81,111,147,187,237,291,351, 0},
509 {372,307,251,199,152,113, 80, 52, 33, 19, 12, 10, 14, 26, 42, 66, 97,134,174,225,280,341,409},
510 {365,300,240,190,144,106, 73, 45, 25, 11, 3, 2, 7, 18, 36, 59, 88,124,166,217,272,331,397},
511 {362,296,238,186,142,103, 69, 43, 22, 9, 1, 0, 5, 16, 32, 56, 85,122,163,213,267,328,395},
512 {367,304,244,194,148,108, 75, 50, 28, 13, 6, 4, 8, 21, 38, 63, 93,127,171,219,275,336,402},
513 {380,316,255,203,158,119, 84, 60, 39, 24, 17, 15, 20, 30, 49, 72,101,138,182,230,283,348,415},
514 {392,330,274,222,177,135,102, 77, 55, 41, 35, 31, 37, 48, 65, 91,118,155,198,248,303,361, 0},
515 { 0,355,294,243,201,160,126, 98, 79, 64, 58, 54, 62, 71, 90,112,141,180,221,271,323,387, 0},
516 { 0,384,324,277,229,189,156,131,110, 96, 87, 83, 92,100,117,140,172,208,254,299,354, 0, 0},
517 { 0, 0,360,310,263,226,193,165,146,133,123,121,125,137,154,179,207,242,289,338,391, 0, 0},
518 { 0, 0,406,350,306,266,234,206,185,173,164,162,170,181,197,220,253,288,327,379, 0, 0, 0},
519 { 0, 0, 0,401,357,318,282,257,236,224,216,212,218,228,247,270,298,337,378, 0, 0, 0, 0},
520 { 0, 0, 0, 0,412,371,340,314,290,279,269,265,273,281,302,322,353,390, 0, 0, 0, 0, 0},
521 { 0, 0, 0, 0, 0, 0,398,375,349,339,329,326,335,347,359,386, 0, 0, 0, 0, 0, 0, 0},
522 { 0, 0, 0, 0, 0, 0, 0, 0, 0,408,396,394,400,414, 0, 0, 0, 0, 0, 0, 0, 0, 0}
523};
524
525/*- End of file ------------------------------------------------------------*/