Mercurial > hg > audiostuff
annotate spandsp-0.0.6pre17/src/gsm0610_rpe.c @ 4:26cd8f1ef0b1
import spandsp-0.0.6pre17
| author | Peter Meerwald <pmeerw@cosy.sbg.ac.at> | 
|---|---|
| date | Fri, 25 Jun 2010 15:50:58 +0200 | 
| parents | |
| children | 
| rev | line source | 
|---|---|
| 4 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 1 /* | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 2 * SpanDSP - a series of DSP components for telephony | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 3 * | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 4 * gsm0610_rpe.c - GSM 06.10 full rate speech codec. | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 5 * | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 6 * Written by Steve Underwood <steveu@coppice.org> | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 7 * | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 8 * Copyright (C) 2006 Steve Underwood | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 9 * | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 10 * All rights reserved. | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 11 * | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 12 * This program is free software; you can redistribute it and/or modify | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 13 * it under the terms of the GNU Lesser General Public License version 2.1, | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 14 * as published by the Free Software Foundation. | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 15 * | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 16 * This program is distributed in the hope that it will be useful, | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 17 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 19 * GNU Lesser General Public License for more details. | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 20 * | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 21 * You should have received a copy of the GNU Lesser General Public | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 22 * License along with this program; if not, write to the Free Software | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 23 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 24 * | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 25 * This code is based on the widely used GSM 06.10 code available from | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 26 * http://kbs.cs.tu-berlin.de/~jutta/toast.html | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 27 * | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 28 * $Id: gsm0610_rpe.c,v 1.25.4.2 2009/12/28 11:54:58 steveu Exp $ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 29 */ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 30 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 31 /*! \file */ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 32 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 33 #if defined(HAVE_CONFIG_H) | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 34 #include "config.h" | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 35 #endif | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 36 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 37 #include <assert.h> | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 38 #include <inttypes.h> | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 39 #if defined(HAVE_TGMATH_H) | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 40 #include <tgmath.h> | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 41 #endif | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 42 #if defined(HAVE_MATH_H) | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 43 #include <math.h> | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 44 #endif | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 45 #include "floating_fudge.h" | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 46 #include <stdlib.h> | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 47 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 48 #include "mmx_sse_decs.h" | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 49 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 50 #include "spandsp/telephony.h" | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 51 #include "spandsp/fast_convert.h" | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 52 #include "spandsp/bitstream.h" | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 53 #include "spandsp/saturated.h" | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 54 #include "spandsp/gsm0610.h" | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 55 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 56 #include "gsm0610_local.h" | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 57 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 58 /* 4.2.13 .. 4.2.17 RPE ENCODING SECTION */ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 59 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 60 /* 4.2.13 */ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 61 static void weighting_filter(int16_t x[40], | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 62 const int16_t *e) // signal [-5..0.39.44] IN) | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 63 { | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 64 #if defined(__GNUC__) && defined(SPANDSP_USE_MMX) && defined(__x86_64__) | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 65 /* Table 4.4 Coefficients of the weighting filter */ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 66 /* This must be padded to a multiple of 4 for MMX to work */ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 67 static const union | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 68 { | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 69 int16_t gsm_H[12]; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 70 __m64 x[3]; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 71 } gsm_H = | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 72 { | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 73 { | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 74 -134, -374, 0, 2054, 5741, 8192, 5741, 2054, 0, -374, -134, 0 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 75 } | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 76 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 77 }; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 78 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 79 __asm__ __volatile__( | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 80 " emms;\n" | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 81 " addq $-10,%%rcx;\n" | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 82 " leaq %[gsm_H],%%rax;\n" | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 83 " movq (%%rax),%%mm1;\n" | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 84 " movq 8(%%rax),%%mm2;\n" | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 85 " movq 16(%%rax),%%mm3;\n" | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 86 " movq $0x1000,%%rax;\n" | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 87 " movq %%rax,%%mm5;\n" /* For rounding */ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 88 " xorq %%rsi,%%rsi;\n" | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 89 " .p2align 2;\n" | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 90 "1:\n" | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 91 " movq (%%rcx,%%rsi,2),%%mm0;\n" | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 92 " pmaddwd %%mm1,%%mm0;\n" | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 93 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 94 " movq 8(%%rcx,%%rsi,2),%%mm4;\n" | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 95 " pmaddwd %%mm2,%%mm4;\n" | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 96 " paddd %%mm4,%%mm0;\n" | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 97 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 98 " movq 16(%%rcx,%%rsi,2),%%mm4;\n" | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 99 " pmaddwd %%mm3,%%mm4;\n" | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 100 " paddd %%mm4,%%mm0;\n" | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 101 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 102 " movq %%mm0,%%mm4;\n" | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 103 " punpckhdq %%mm0,%%mm4;\n" /* mm4 has high int32 of mm0 dup'd */ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 104 " paddd %%mm4,%%mm0;\n" | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 105 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 106 " paddd %%mm5,%%mm0;\n" /* Add for roundoff */ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 107 " psrad $13,%%mm0;\n" | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 108 " packssdw %%mm0,%%mm0;\n" | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 109 " movd %%mm0,%%eax;\n" /* eax has result */ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 110 " movw %%ax,(%%rdi,%%rsi,2);\n" | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 111 " incq %%rsi;\n" | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 112 " cmpq $39,%%rsi;\n" | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 113 " jle 1b;\n" | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 114 " emms;\n" | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 115 : | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 116 : "c" (e), "D" (x), [gsm_H] "X" (gsm_H) | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 117 : "rax", "rdx", "rsi", "memory" | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 118 ); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 119 #elif defined(__GNUC__) && defined(SPANDSP_USE_MMX) && defined(__i386__) | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 120 /* Table 4.4 Coefficients of the weighting filter */ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 121 /* This must be padded to a multiple of 4 for MMX to work */ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 122 static const union | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 123 { | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 124 int16_t gsm_H[12]; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 125 __m64 x[3]; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 126 } gsm_H = | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 127 { | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 128 { | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 129 -134, -374, 0, 2054, 5741, 8192, 5741, 2054, 0, -374, -134, 0 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 130 } | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 131 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 132 }; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 133 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 134 __asm__ __volatile__( | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 135 " emms;\n" | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 136 " addl $-10,%%ecx;\n" | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 137 " leal %[gsm_H],%%eax;\n" | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 138 " movq (%%eax),%%mm1;\n" | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 139 " movq 8(%%eax),%%mm2;\n" | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 140 " movq 16(%%eax),%%mm3;\n" | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 141 " movl $0x1000,%%eax;\n" | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 142 " movd %%eax,%%mm5;\n" /* For rounding */ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 143 " xorl %%esi,%%esi;\n" | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 144 " .p2align 2;\n" | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 145 "1:\n" | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 146 " movq (%%ecx,%%esi,2),%%mm0;\n" | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 147 " pmaddwd %%mm1,%%mm0;\n" | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 148 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 149 " movq 8(%%ecx,%%esi,2),%%mm4;\n" | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 150 " pmaddwd %%mm2,%%mm4;\n" | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 151 " paddd %%mm4,%%mm0;\n" | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 152 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 153 " movq 16(%%ecx,%%esi,2),%%mm4;\n" | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 154 " pmaddwd %%mm3,%%mm4;\n" | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 155 " paddd %%mm4,%%mm0;\n" | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 156 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 157 " movq %%mm0,%%mm4;\n" | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 158 " punpckhdq %%mm0,%%mm4;\n" /* mm4 has high int32 of mm0 dup'd */ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 159 " paddd %%mm4,%%mm0;\n" | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 160 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 161 " paddd %%mm5,%%mm0;\n" /* Add for roundoff */ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 162 " psrad $13,%%mm0;\n" | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 163 " packssdw %%mm0,%%mm0;\n" | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 164 " movd %%mm0,%%eax;\n" /* eax has result */ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 165 " movw %%ax,(%%edi,%%esi,2);\n" | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 166 " incl %%esi;\n" | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 167 " cmpl $39,%%esi;\n" | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 168 " jle 1b;\n" | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 169 " emms;\n" | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 170 : | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 171 : "c" (e), "D" (x), [gsm_H] "X" (gsm_H) | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 172 : "eax", "edx", "esi", "memory" | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 173 ); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 174 #else | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 175 int32_t L_result; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 176 int k; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 177 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 178 /* The coefficients of the weighting filter are stored in a table | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 179 (see table 4.4). The following scaling is used: | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 180 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 181 H[0..10] = integer(real_H[0..10] * 8192); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 182 */ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 183 /* Initialization of a temporary working array wt[0...49] */ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 184 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 185 /* for (k = 0; k <= 4; k++) wt[k] = 0; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 186 * for (k = 5; k <= 44; k++) wt[k] = *e++; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 187 * for (k = 45; k <= 49; k++) wt[k] = 0; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 188 * | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 189 * (e[-5..-1] and e[40..44] are allocated by the caller, | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 190 * are initially zero and are not written anywhere.) | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 191 */ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 192 e -= 5; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 193 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 194 /* Compute the signal x[0..39] */ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 195 for (k = 0; k < 40; k++) | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 196 { | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 197 L_result = 8192 >> 1; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 198 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 199 /* for (i = 0; i <= 10; i++) | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 200 * { | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 201 * L_temp = saturated_mul_16_32(wt[k + i], gsm_H[i]); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 202 * L_result = saturated_add32(L_result, L_temp); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 203 * } | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 204 */ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 205 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 206 #undef STEP | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 207 #define STEP(i,H) (e[k + i] * (int32_t) H) | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 208 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 209 /* Every one of these multiplications is done twice, | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 210 but I don't see an elegant way to optimize this. | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 211 Do you? | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 212 */ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 213 L_result += STEP( 0, -134); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 214 L_result += STEP( 1, -374); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 215 /* += STEP( 2, 0 ); */ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 216 L_result += STEP( 3, 2054); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 217 L_result += STEP( 4, 5741); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 218 L_result += STEP( 5, 8192); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 219 L_result += STEP( 6, 5741); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 220 L_result += STEP( 7, 2054); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 221 /* += STEP( 8, 0 ); */ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 222 L_result += STEP( 9, -374); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 223 L_result += STEP(10, -134); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 224 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 225 /* 2 adds vs. >> 16 => 14, minus one shift to compensate for | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 226 those we lost when replacing L_MULT by '*'. */ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 227 L_result >>= 13; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 228 x[k] = saturate(L_result); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 229 } | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 230 /*endfor*/ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 231 #endif | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 232 } | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 233 /*- End of function --------------------------------------------------------*/ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 234 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 235 /* 4.2.14 */ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 236 static void rpe_grid_selection(int16_t x[40], int16_t xM[13], int16_t *Mc_out) | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 237 { | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 238 int i; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 239 int32_t L_result; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 240 int32_t L_temp; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 241 int32_t EM; /* xxx should be L_EM? */ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 242 int16_t Mc; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 243 int32_t L_common_0_3; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 244 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 245 /* The signal x[0..39] is used to select the RPE grid which is | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 246 represented by Mc. */ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 247 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 248 EM = 0; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 249 Mc = 0; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 250 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 251 #undef STEP | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 252 #define STEP(m,i) \ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 253 L_temp = x[m + 3*i] >> 2; \ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 254 L_result += L_temp*L_temp; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 255 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 256 /* Common part of 0 and 3 */ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 257 L_result = 0; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 258 STEP(0, 1); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 259 STEP(0, 2); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 260 STEP(0, 3); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 261 STEP(0, 4); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 262 STEP(0, 5); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 263 STEP(0, 6); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 264 STEP(0, 7); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 265 STEP(0, 8); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 266 STEP(0, 9); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 267 STEP(0, 10); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 268 STEP(0, 11); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 269 STEP(0, 12); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 270 L_common_0_3 = L_result; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 271 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 272 /* i = 0 */ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 273 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 274 STEP(0, 0); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 275 L_result <<= 1; /* implicit in L_MULT */ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 276 EM = L_result; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 277 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 278 /* i = 1 */ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 279 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 280 L_result = 0; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 281 STEP(1, 0); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 282 STEP(1, 1); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 283 STEP(1, 2); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 284 STEP(1, 3); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 285 STEP(1, 4); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 286 STEP(1, 5); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 287 STEP(1, 6); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 288 STEP(1, 7); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 289 STEP(1, 8); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 290 STEP(1, 9); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 291 STEP(1, 10); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 292 STEP(1, 11); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 293 STEP(1, 12); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 294 L_result <<= 1; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 295 if (L_result > EM) | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 296 { | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 297 Mc = 1; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 298 EM = L_result; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 299 } | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 300 /*endif*/ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 301 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 302 /* i = 2 */ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 303 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 304 L_result = 0; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 305 STEP(2, 0); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 306 STEP(2, 1); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 307 STEP(2, 2); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 308 STEP(2, 3); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 309 STEP(2, 4); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 310 STEP(2, 5); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 311 STEP(2, 6); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 312 STEP(2, 7); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 313 STEP(2, 8); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 314 STEP(2, 9); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 315 STEP(2, 10); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 316 STEP(2, 11); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 317 STEP(2, 12); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 318 L_result <<= 1; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 319 if (L_result > EM) | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 320 { | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 321 Mc = 2; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 322 EM = L_result; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 323 } | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 324 /*endif*/ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 325 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 326 /* i = 3 */ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 327 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 328 L_result = L_common_0_3; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 329 STEP(3, 12); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 330 L_result <<= 1; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 331 if (L_result > EM) | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 332 { | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 333 Mc = 3; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 334 EM = L_result; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 335 } | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 336 /*endif*/ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 337 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 338 /* Down-sampling by a factor 3 to get the selected xM[0..12] | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 339 RPE sequence. */ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 340 for (i = 0; i < 13; i++) | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 341 xM[i] = x[Mc + 3*i]; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 342 /*endfor*/ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 343 *Mc_out = Mc; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 344 } | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 345 /*- End of function --------------------------------------------------------*/ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 346 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 347 /* 4.12.15 */ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 348 static void apcm_quantization_xmaxc_to_exp_mant(int16_t xmaxc, | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 349 int16_t *exp_out, | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 350 int16_t *mant_out) | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 351 { | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 352 int16_t exp; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 353 int16_t mant; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 354 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 355 /* Compute exponent and mantissa of the decoded version of xmaxc */ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 356 exp = 0; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 357 if (xmaxc > 15) | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 358 exp = (int16_t) ((xmaxc >> 3) - 1); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 359 /*endif*/ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 360 mant = xmaxc - (exp << 3); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 361 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 362 if (mant == 0) | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 363 { | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 364 exp = -4; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 365 mant = 7; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 366 } | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 367 else | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 368 { | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 369 while (mant <= 7) | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 370 { | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 371 mant = (int16_t) (mant << 1 | 1); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 372 exp--; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 373 } | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 374 /*endwhile*/ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 375 mant -= 8; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 376 } | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 377 /*endif*/ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 378 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 379 assert(exp >= -4 && exp <= 6); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 380 assert(mant >= 0 && mant <= 7); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 381 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 382 *exp_out = exp; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 383 *mant_out = mant; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 384 } | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 385 /*- End of function --------------------------------------------------------*/ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 386 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 387 static void apcm_quantization(int16_t xM[13], | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 388 int16_t xMc[13], | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 389 int16_t *mant_out, | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 390 int16_t *exp_out, | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 391 int16_t *xmaxc_out) | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 392 { | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 393 /* Table 4.5 Normalized inverse mantissa used to compute xM/xmax */ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 394 static const int16_t gsm_NRFAC[8] = | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 395 { | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 396 29128, 26215, 23832, 21846, 20165, 18725, 17476, 16384 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 397 }; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 398 int i; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 399 int itest; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 400 int16_t xmax; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 401 int16_t xmaxc; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 402 int16_t temp; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 403 int16_t temp1; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 404 int16_t temp2; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 405 int16_t exp; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 406 int16_t mant; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 407 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 408 /* Find the maximum absolute value xmax of xM[0..12]. */ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 409 xmax = 0; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 410 for (i = 0; i < 13; i++) | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 411 { | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 412 temp = xM[i]; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 413 temp = saturated_abs16(temp); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 414 if (temp > xmax) | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 415 xmax = temp; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 416 /*endif*/ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 417 } | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 418 /*endfor*/ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 419 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 420 /* Quantizing and coding of xmax to get xmaxc. */ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 421 exp = 0; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 422 temp = xmax >> 9; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 423 itest = 0; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 424 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 425 for (i = 0; i <= 5; i++) | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 426 { | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 427 itest |= (temp <= 0); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 428 temp >>= 1; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 429 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 430 assert(exp <= 5); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 431 if (itest == 0) | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 432 exp++; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 433 /*endif*/ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 434 } | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 435 /*endfor*/ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 436 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 437 assert(exp <= 6 && exp >= 0); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 438 temp = (int16_t) (exp + 5); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 439 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 440 assert(temp <= 11 && temp >= 0); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 441 xmaxc = saturated_add16((xmax >> temp), exp << 3); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 442 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 443 /* Quantizing and coding of the xM[0..12] RPE sequence | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 444 to get the xMc[0..12] */ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 445 apcm_quantization_xmaxc_to_exp_mant(xmaxc, &exp, &mant); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 446 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 447 /* This computation uses the fact that the decoded version of xmaxc | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 448 can be calculated by using the exponent and the mantissa part of | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 449 xmaxc (logarithmic table). | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 450 So, this method avoids any division and uses only a scaling | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 451 of the RPE samples by a function of the exponent. A direct | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 452 multiplication by the inverse of the mantissa (NRFAC[0..7] | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 453 found in table 4.5) gives the 3 bit coded version xMc[0..12] | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 454 of the RPE samples. | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 455 */ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 456 /* Direct computation of xMc[0..12] using table 4.5 */ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 457 assert(exp <= 4096 && exp >= -4096); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 458 assert(mant >= 0 && mant <= 7); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 459 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 460 temp1 = (int16_t) (6 - exp); /* Normalization by the exponent */ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 461 temp2 = gsm_NRFAC[mant]; /* Inverse mantissa */ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 462 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 463 for (i = 0; i < 13; i++) | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 464 { | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 465 assert(temp1 >= 0 && temp1 < 16); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 466 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 467 temp = xM[i] << temp1; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 468 temp = saturated_mul16(temp, temp2); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 469 temp >>= 12; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 470 xMc[i] = (int16_t) (temp + 4); /* See note below */ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 471 } | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 472 /*endfor*/ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 473 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 474 /* NOTE: This equation is used to make all the xMc[i] positive. */ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 475 *mant_out = mant; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 476 *exp_out = exp; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 477 *xmaxc_out = xmaxc; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 478 } | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 479 /*- End of function --------------------------------------------------------*/ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 480 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 481 /* 4.2.16 */ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 482 static void apcm_inverse_quantization(int16_t xMc[13], | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 483 int16_t mant, | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 484 int16_t exp, | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 485 int16_t xMp[13]) | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 486 { | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 487 /* Table 4.6 Normalized direct mantissa used to compute xM/xmax */ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 488 static const int16_t gsm_FAC[8] = | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 489 { | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 490 18431, 20479, 22527, 24575, 26623, 28671, 30719, 32767 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 491 }; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 492 int i; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 493 int16_t temp; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 494 int16_t temp1; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 495 int16_t temp2; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 496 int16_t temp3; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 497 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 498 /* This part is for decoding the RPE sequence of coded xMc[0..12] | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 499 samples to obtain the xMp[0..12] array. Table 4.6 is used to get | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 500 the mantissa of xmaxc (FAC[0..7]). | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 501 */ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 502 #if 0 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 503 assert(mant >= 0 && mant <= 7); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 504 #endif | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 505 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 506 temp1 = gsm_FAC[mant]; /* See 4.2-15 for mant */ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 507 temp2 = saturated_sub16(6, exp); /* See 4.2-15 for exp */ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 508 temp3 = gsm_asl(1, saturated_sub16(temp2, 1)); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 509 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 510 for (i = 0; i < 13; i++) | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 511 { | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 512 assert(xMc[i] >= 0 && xMc[i] <= 7); /* 3 bit unsigned */ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 513 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 514 temp = (int16_t) ((xMc[i] << 1) - 7); /* Restore sign */ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 515 assert(temp <= 7 && temp >= -7); /* 4 bit signed */ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 516 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 517 temp <<= 12; /* 16 bit signed */ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 518 temp = gsm_mult_r(temp1, temp); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 519 temp = saturated_add16(temp, temp3); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 520 xMp[i] = gsm_asr(temp, temp2); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 521 } | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 522 /*endfor*/ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 523 } | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 524 /*- End of function --------------------------------------------------------*/ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 525 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 526 /* 4.2.17 */ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 527 static void rpe_grid_positioning(int16_t Mc, | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 528 int16_t xMp[13], | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 529 int16_t ep[40]) | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 530 { | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 531 int i = 13; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 532 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 533 /* This procedure computes the reconstructed long term residual signal | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 534 ep[0..39] for the LTP analysis filter. The inputs are the Mc | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 535 which is the grid position selection and the xMp[0..12] decoded | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 536 RPE samples which are upsampled by a factor of 3 by inserting zero | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 537 values. | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 538 */ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 539 assert(0 <= Mc && Mc <= 3); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 540 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 541 switch (Mc) | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 542 { | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 543 case 3: | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 544 *ep++ = 0; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 545 case 2: | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 546 do | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 547 { | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 548 *ep++ = 0; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 549 case 1: | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 550 *ep++ = 0; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 551 case 0: | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 552 *ep++ = *xMp++; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 553 } | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 554 while (--i); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 555 } | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 556 /*endswitch*/ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 557 while (++Mc < 4) | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 558 *ep++ = 0; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 559 /*endwhile*/ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 560 } | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 561 /*- End of function --------------------------------------------------------*/ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 562 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 563 void gsm0610_rpe_encoding(gsm0610_state_t *s, | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 564 int16_t *e, // [-5..-1][0..39][40..44] | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 565 int16_t *xmaxc, | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 566 int16_t *Mc, | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 567 int16_t xMc[13]) | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 568 { | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 569 int16_t x[40]; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 570 int16_t xM[13]; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 571 int16_t xMp[13]; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 572 int16_t mant; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 573 int16_t exp; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 574 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 575 weighting_filter(x, e); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 576 rpe_grid_selection(x, xM, Mc); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 577 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 578 apcm_quantization(xM, xMc, &mant, &exp, xmaxc); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 579 apcm_inverse_quantization(xMc, mant, exp, xMp); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 580 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 581 rpe_grid_positioning(*Mc, xMp, e); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 582 } | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 583 /*- End of function --------------------------------------------------------*/ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 584 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 585 void gsm0610_rpe_decoding(gsm0610_state_t *s, | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 586 int16_t xmaxc, | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 587 int16_t Mcr, | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 588 int16_t xMcr[13], | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 589 int16_t erp[40]) | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 590 { | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 591 int16_t exp; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 592 int16_t mant; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 593 int16_t xMp[13]; | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 594 | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 595 apcm_quantization_xmaxc_to_exp_mant(xmaxc, &exp, &mant); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 596 apcm_inverse_quantization(xMcr, mant, exp, xMp); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 597 rpe_grid_positioning(Mcr, xMp, erp); | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 598 } | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 599 /*- End of function --------------------------------------------------------*/ | 
| 
26cd8f1ef0b1
import spandsp-0.0.6pre17
 Peter Meerwald <pmeerw@cosy.sbg.ac.at> parents: diff
changeset | 600 /*- End of file ------------------------------------------------------------*/ | 
