Home | History | Annotate | Download | only in src
      1 /* ------------------------------------------------------------------
      2  * Copyright (C) 1998-2009 PacketVideo
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
     13  * express or implied.
     14  * See the License for the specific language governing permissions
     15  * and limitations under the License.
     16  * -------------------------------------------------------------------
     17  */
     18 /****************************************************************************************
     19 Portions of this file are derived from the following 3GPP standard:
     20 
     21     3GPP TS 26.173
     22     ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
     23     Available from http://www.3gpp.org
     24 
     25 (C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
     26 Permission to distribute, modify and use this file under the standard license
     27 terms listed above has been obtained from the copyright holder.
     28 ****************************************************************************************/
     29 /*
     30 ------------------------------------------------------------------------------
     31 
     32 
     33 
     34  Filename: isp_az.cpp
     35 
     36      Date: 05/08/2004
     37 
     38 ------------------------------------------------------------------------------
     39  REVISION HISTORY
     40 
     41 
     42  Description:
     43 
     44 ------------------------------------------------------------------------------
     45  INPUT AND OUTPUT DEFINITIONS
     46 
     47      int16 isp[],              (i) Q15 : Immittance spectral pairs
     48      int16 a[],                (o) Q12 : predictor coefficients (order=M)
     49      int16 m,                  (i)     : order
     50      int16 adaptive_scaling    (i) 0   : adaptive scaling disabled
     51                                    1   : adaptive scaling enabled
     52 
     53 
     54 ------------------------------------------------------------------------------
     55  FUNCTION DESCRIPTION
     56 
     57     Compute the LPC coefficients from isp (order=M)
     58 ------------------------------------------------------------------------------
     59  REQUIREMENTS
     60 
     61 
     62 ------------------------------------------------------------------------------
     63  REFERENCES
     64 
     65 ------------------------------------------------------------------------------
     66  PSEUDO-CODE
     67 
     68 ------------------------------------------------------------------------------
     69 */
     70 
     71 
     72 /*----------------------------------------------------------------------------
     73 ; INCLUDES
     74 ----------------------------------------------------------------------------*/
     75 
     76 #include "pv_amr_wb_type_defs.h"
     77 #include "pvamrwbdecoder_basic_op.h"
     78 #include "pvamrwbdecoder_cnst.h"
     79 #include "pvamrwbdecoder_acelp.h"
     80 #include "pvamrwb_math_op.h"
     81 
     82 /*----------------------------------------------------------------------------
     83 ; MACROS
     84 ; Define module specific macros here
     85 ----------------------------------------------------------------------------*/
     86 
     87 
     88 /*----------------------------------------------------------------------------
     89 ; DEFINES
     90 ; Include all pre-processor statements here. Include conditional
     91 ; compile variables also.
     92 ----------------------------------------------------------------------------*/
     93 #define NC (M/2)
     94 #define NC16k (M16k/2)
     95 
     96 /*----------------------------------------------------------------------------
     97 ; LOCAL FUNCTION DEFINITIONS
     98 ; Function Prototype declaration
     99 ----------------------------------------------------------------------------*/
    100 
    101 
    102 #ifdef __cplusplus
    103 extern "C"
    104 {
    105 #endif
    106 
    107     void Get_isp_pol(int16 * isp, int32 * f, int16 n);
    108     void Get_isp_pol_16kHz(int16 * isp, int32 * f, int16 n);
    109 
    110 #ifdef __cplusplus
    111 }
    112 #endif
    113 
    114 /*----------------------------------------------------------------------------
    115 ; LOCAL STORE/BUFFER/POINTER DEFINITIONS
    116 ; Variable declaration - defined here and used outside this module
    117 ----------------------------------------------------------------------------*/
    118 
    119 /*----------------------------------------------------------------------------
    120 ; EXTERNAL FUNCTION REFERENCES
    121 ; Declare functions defined elsewhere and referenced in this module
    122 ----------------------------------------------------------------------------*/
    123 
    124 /*----------------------------------------------------------------------------
    125 ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
    126 ; Declare variables used in this module but defined elsewhere
    127 ----------------------------------------------------------------------------*/
    128 
    129 /*----------------------------------------------------------------------------
    130 ; FUNCTION CODE
    131 ----------------------------------------------------------------------------*/
    132 
    133 void Isp_Az(
    134     int16 isp[],            /* (i) Q15 : Immittance spectral pairs         */
    135     int16 a[],              /* (o) Q12 : predictor coefficients (order=M)  */
    136     int16 m,                /* (i)     : order                     */
    137     int16 adaptive_scaling  /* (i) 0   : adaptive scaling disabled */
    138     /*     1   : adaptive scaling enabled  */
    139 )
    140 {
    141     int16 i, j;
    142     int32 f1[NC16k + 1], f2[NC16k];
    143     int16 nc;
    144     int32 t0;
    145     int32 t1;
    146     int16 q, q_sug;
    147     int32 tmax;
    148 
    149     nc = m >> 1;
    150 
    151 
    152     if (nc > 8)
    153     {
    154         Get_isp_pol_16kHz(&isp[0], f1, nc);
    155         for (i = 0; i <= nc; i++)
    156         {
    157             f1[i] = shl_int32(f1[i], 2);
    158         }
    159         Get_isp_pol_16kHz(&isp[1], f2, nc - 1);
    160         for (i = 0; i <= nc - 1; i++)
    161         {
    162             f2[i] = shl_int32(f2[i], 2);
    163         }
    164     }
    165     else
    166     {
    167         Get_isp_pol(&isp[0], f1, nc);
    168         Get_isp_pol(&isp[1], f2, nc - 1);
    169     }
    170 
    171     /*
    172      *  Multiply F2(z) by (1 - z^-2)
    173      */
    174 
    175     for (i = nc - 1; i > 1; i--)
    176     {
    177         f2[i] -= f2[i - 2];      /* f2[i] -= f2[i-2]; */
    178     }
    179 
    180     /*
    181      *  Scale F1(z) by (1+isp[m-1])  and  F2(z) by (1-isp[m-1])
    182      */
    183 
    184     for (i = 0; i < nc; i++)
    185     {
    186         /* f1[i] *= (1.0 + isp[M-1]); */
    187 
    188         /* f2[i] *= (1.0 - isp[M-1]); */
    189         t0 = f1[i];
    190         t1 = f2[i];
    191         t0 = fxp_mul32_by_16b(t0, isp[m - 1]) << 1;
    192         t1 = fxp_mul32_by_16b(t1, isp[m - 1]) << 1;
    193         f1[i] += t0;
    194         f2[i] -= t1;
    195 
    196     }
    197 
    198     /*
    199      *  A(z) = (F1(z)+F2(z))/2
    200      *  F1(z) is symmetric and F2(z) is antisymmetric
    201      */
    202 
    203     /* a[0] = 1.0; */
    204     a[0] = 4096;
    205     tmax = 1;
    206     j = m - 1;
    207     for (i = 1;  i < nc; i++)
    208     {
    209         /* a[i] = 0.5*(f1[i] + f2[i]); */
    210 
    211         t0 = add_int32(f1[i], f2[i]);          /* f1[i] + f2[i]             */
    212         /* compute t1 = abs(t0) */
    213         t1 = t0 - (t0 < 0);
    214         t1 = t1 ^(t1 >> 31);  /* t1 = t1 ^sign(t1) */
    215 
    216         tmax |= t1;
    217         /* from Q23 to Q12 and * 0.5 */
    218         a[i] = (int16)((t0 >> 12) + ((t0 >> 11) & 1));
    219 
    220 
    221         /* a[j] = 0.5*(f1[i] - f2[i]); */
    222 
    223         t0 = sub_int32(f1[i], f2[i]);          /* f1[i] - f2[i]             */
    224         /* compute t1 = abs(t0) */
    225         t1 = t0 - (t0 < 0);
    226         t1 = t1 ^(t1 >> 31);  /* t1 = t1 ^sign(t1) */
    227 
    228         tmax |= t1;
    229 
    230         /* from Q23 to Q12 and * 0.5 */
    231         a[j--] = (int16)((t0 >> 12) + ((t0 >> 11) & 1));
    232 
    233     }
    234 
    235     /* rescale data if overflow has occured and reprocess the loop */
    236 
    237 
    238     if (adaptive_scaling == 1)
    239     {
    240         q = 4 - normalize_amr_wb(tmax);        /* adaptive scaling enabled */
    241     }
    242     else
    243     {
    244         q = 0;                   /* adaptive scaling disabled */
    245     }
    246 
    247 
    248     if (q > 0)
    249     {
    250         q_sug = 12 + q;
    251         for (i = 1, j = m - 1; i < nc; i++, j--)
    252         {
    253             /* a[i] = 0.5*(f1[i] + f2[i]); */
    254 
    255             t0 = add_int32(f1[i], f2[i]);          /* f1[i] + f2[i]             */
    256             /* from Q23 to Q12 and * 0.5 */
    257             a[i] = (int16)((t0 >> q_sug) + ((t0 >> (q_sug - 1)) & 1));
    258 
    259 
    260             /* a[j] = 0.5*(f1[i] - f2[i]); */
    261 
    262             t0 = sub_int32(f1[i], f2[i]);          /* f1[i] - f2[i]             */
    263             /* from Q23 to Q12 and * 0.5 */
    264             a[j] = (int16)((t0 >> q_sug) + ((t0 >> (q_sug - 1)) & 1));
    265 
    266         }
    267         a[0] >>=  q;
    268     }
    269     else
    270     {
    271         q_sug = 12;
    272         q     = 0;
    273     }
    274 
    275     /* a[NC] = 0.5*f1[NC]*(1.0 + isp[M-1]); */
    276 
    277 
    278     t0 = (int32)(((int64)f1[nc] * isp[m - 1]) >> 16) << 1;
    279 
    280 
    281     t0 = add_int32(f1[nc], t0);
    282 
    283     /* from Q23 to Q12 and * 0.5 */
    284     a[nc] = (int16)((t0 >> q_sug) + ((t0 >> (q_sug - 1)) & 1));
    285     a[m] = shr_rnd(isp[m - 1], (3 + q));           /* from Q15 to Q12          */
    286 
    287     /* a[m] = isp[m-1]; */
    288 
    289 
    290     return;
    291 }
    292 
    293 
    294 
    295 /*
    296 Get_isp_pol
    297 ------------------------------------------------------------------------------
    298  INPUT AND OUTPUT DEFINITIONS
    299 
    300    isp[]   : isp vector (cosine domaine)         in Q15
    301    f[]     : the coefficients of F1 or F2        in Q23
    302    n       : == NC for F1(z); == NC-1 for F2(z)
    303 
    304 
    305 ------------------------------------------------------------------------------
    306  FUNCTION DESCRIPTION
    307 
    308     Find the polynomial F1(z) or F2(z) from the ISPs.
    309   This is performed by expanding the product polynomials:
    310 
    311   F1(z) =   product   ( 1 - 2 isp_i z^-1 + z^-2 )
    312           i=0,2,4,6,8
    313   F2(z) =   product   ( 1 - 2 isp_i z^-1 + z^-2 )
    314           i=1,3,5,7
    315 
    316   where isp_i are the ISPs in the cosine domain.
    317 ------------------------------------------------------------------------------
    318  REQUIREMENTS
    319 
    320 
    321 ------------------------------------------------------------------------------
    322  REFERENCES
    323 
    324 ------------------------------------------------------------------------------
    325  PSEUDO-CODE
    326 
    327 ----------------------------------------------------------------------------*/
    328 
    329 /*----------------------------------------------------------------------------
    330 ; FUNCTION CODE
    331 ----------------------------------------------------------------------------*/
    332 
    333 
    334 void Get_isp_pol(int16 * isp, int32 * f, int16 n)
    335 {
    336     int16 i, j;
    337     int32 t0;
    338 
    339 
    340     /* All computation in Q23 */
    341 
    342     f[0] = 0x00800000;                        /* f[0] = 1.0;        in Q23  */
    343     f[1] = -isp[0] << 9;                      /* f[1] = -2.0*isp[0] in Q23  */
    344 
    345     f += 2;                                   /* Advance f pointer          */
    346     isp += 2;                                 /* Advance isp pointer        */
    347 
    348     for (i = 2; i <= n; i++)
    349     {
    350         *f = f[-2];
    351 
    352         for (j = 1; j < i; j++)
    353         {
    354 
    355             t0 = fxp_mul32_by_16b(f[-1], *isp);
    356             t0 = shl_int32(t0, 2);
    357 
    358             *f -= t0;                      /* *f -= t0            */
    359             *(f) += f[-2];                 /* *f += f[-2]         */
    360             f--;
    361 
    362 
    363         }
    364         *f -= *isp << 9;
    365 
    366         f += i;                            /* Advance f pointer   */
    367         isp += 2;                          /* Advance isp pointer */
    368     }
    369 }
    370 
    371 void Get_isp_pol_16kHz(int16 * isp, int32 * f, int16 n)
    372 {
    373     int16 i, j;
    374     int32 t0;
    375 
    376     /* All computation in Q23 */
    377 
    378     f[0] = 0x00200000;                        /* f[0] = 0.25;        in Q23  */
    379 
    380     f[1] = -isp[0] << 7;                      /* f[1] = -0.5*isp[0] in Q23  */
    381 
    382     f += 2;                                   /* Advance f pointer          */
    383     isp += 2;                                 /* Advance isp pointer        */
    384 
    385     for (i = 2; i <= n; i++)
    386     {
    387         *f = f[-2];
    388 
    389         for (j = 1; j < i; j++, f--)
    390         {
    391             t0 = fxp_mul32_by_16b(f[-1], *isp);
    392             t0 = shl_int32(t0, 2);
    393 
    394             *f -= t0;                      /* *f -= t0            */
    395             *f += f[-2];                   /* *f += f[-2]         */
    396         }
    397         *f -= *isp << 7;
    398         f += i;                            /* Advance f pointer   */
    399         isp += 2;                          /* Advance isp pointer */
    400     }
    401     return;
    402 }
    403 
    404