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 */
78 static 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 
498 static 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 ------------------------------------------------------------*/