Home | History | Annotate | Download | only in decoder
      1 /******************************************************************************
      2  *                                                                            *
      3  * Copyright (C) 2018 The Android Open Source Project
      4  *
      5  * Licensed under the Apache License, Version 2.0 (the "License");
      6  * you may not use this file except in compliance with the License.
      7  * You may obtain a copy of the License at:
      8  *
      9  * http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  * Unless required by applicable law or agreed to in writing, software
     12  * distributed under the License is distributed on an "AS IS" BASIS,
     13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  * See the License for the specific language governing permissions and
     15  * limitations under the License.
     16  *
     17  *****************************************************************************
     18  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
     19 */
     20 #include <math.h>
     21 #include <memory.h>
     22 #include <ixheaacd_type_def.h>
     23 
     24 #include "ixheaacd_cnst.h"
     25 #include "ixheaacd_constants.h"
     26 #include <ixheaacd_basic_ops32.h>
     27 #include <ixheaacd_basic_ops40.h>
     28 
     29 static FLOAT32 ixheaacd_gamma_table[17] = {
     30     1.0f,      0.92f,     0.8464f,   0.778688f, 0.716393f, 0.659082f,
     31     0.606355f, 0.557847f, 0.513219f, 0.472161f, 0.434389f, 0.399637f,
     32     0.367666f, 0.338253f, 0.311193f, 0.286298f, 0.263394f};
     33 
     34 WORD16 ixheaacd_rand_gen(WORD16 *seed) {
     35   *seed = (WORD16)(*seed * 31821L + 13849L);
     36   return (*seed);
     37 }
     38 
     39 VOID ixheaacd_preemphsis_tool(WORD32 *signal, WORD32 mu, WORD32 len,
     40                               WORD32 mem) {
     41   WORD32 i;
     42   WORD32 temp;
     43 
     44   temp = signal[len - 1];
     45   for (i = len - 1; i > 0; i--) {
     46     signal[i] -= (WORD32)ixheaacd_mul32_sh(mu, signal[i - 1], 16);
     47   }
     48   signal[0] -= (WORD32)ixheaacd_mul32_sh(mu, mem, 16);
     49   return;
     50 }
     51 
     52 VOID ixheaacd_preemphsis_tool_float(FLOAT32 *signal, FLOAT32 mu, WORD32 len,
     53                                     FLOAT32 mem) {
     54   WORD32 i;
     55   FLOAT32 temp;
     56   temp = signal[len - 1];
     57   for (i = len - 1; i > 0; i--) {
     58     signal[i] = signal[i] - mu * signal[i - 1];
     59   }
     60   signal[0] -= mu * mem;
     61   return;
     62 }
     63 
     64 VOID ixheaacd_deemphsis_tool(FLOAT32 *signal, WORD32 len, FLOAT32 mem) {
     65   WORD32 i;
     66   signal[0] = signal[0] + PREEMPH_FILT_FAC * mem;
     67   for (i = 1; i < len; i++) {
     68     signal[i] = signal[i] + PREEMPH_FILT_FAC * signal[i - 1];
     69   }
     70   return;
     71 }
     72 
     73 VOID ixheaacd_lpc_wt_synthesis_tool(FLOAT32 a[], FLOAT32 x[], WORD32 l) {
     74   FLOAT32 s;
     75   WORD32 i, j;
     76 
     77   for (i = 0; i < l; i++) {
     78     s = x[i];
     79     for (j = 1; j <= ORDER; j += 4) {
     80       s -= (a[j] * ixheaacd_gamma_table[j]) * x[i - j];
     81       s -= (a[j + 1] * ixheaacd_gamma_table[j + 1]) * x[i - (j + 1)];
     82       s -= (a[j + 2] * ixheaacd_gamma_table[j + 2]) * x[i - (j + 2)];
     83       s -= (a[j + 3] * ixheaacd_gamma_table[j + 3]) * x[i - (j + 3)];
     84     }
     85     x[i] = s;
     86   }
     87 
     88   return;
     89 }
     90 
     91 VOID ixheaacd_synthesis_tool_float(FLOAT32 a[], FLOAT32 x[], FLOAT32 y[],
     92                                    WORD32 l, FLOAT32 mem[]) {
     93   FLOAT32 buf[LEN_FRAME * 2];
     94   FLOAT32 s;
     95   FLOAT32 *yy;
     96   WORD32 i, j;
     97   memcpy(buf, mem, ORDER * sizeof(FLOAT32));
     98   yy = &buf[ORDER];
     99   for (i = 0; i < l; i++) {
    100     s = x[i];
    101     for (j = 1; j <= ORDER; j += 4) {
    102       s -= a[j] * yy[i - j];
    103       s -= a[j + 1] * yy[i - (j + 1)];
    104       s -= a[j + 2] * yy[i - (j + 2)];
    105       s -= a[j + 3] * yy[i - (j + 3)];
    106     }
    107     yy[i] = s;
    108     y[i] = s;
    109   }
    110 
    111   return;
    112 }
    113 
    114 VOID ixheaacd_synthesis_tool_float1(FLOAT32 a[], FLOAT32 x[], WORD32 l) {
    115   FLOAT32 s;
    116   WORD32 i, j;
    117   for (i = 0; i < l; i++) {
    118     s = x[i];
    119     for (j = 1; j <= ORDER; j += 4) {
    120       s -= a[j] * x[i - j];
    121       s -= a[j + 1] * x[i - (j + 1)];
    122       s -= a[j + 2] * x[i - (j + 2)];
    123       s -= a[j + 3] * x[i - (j + 3)];
    124     }
    125     x[i] = s;
    126   }
    127 
    128   return;
    129 }
    130 
    131 VOID ixheaacd_residual_tool(WORD32 *a, WORD32 *x, WORD32 *y, WORD32 l,
    132                             WORD32 count) {
    133   WORD32 s;
    134   WORD32 i, j;
    135   WORD32 n = l * count;
    136 
    137   for (i = 0; i < n; i++) {
    138     s = x[i];
    139     for (j = 1; j <= 16; j++)
    140       s += (WORD32)ixheaacd_mul32_sh(a[j], x[i - j], 24);
    141     y[i] = s;
    142   }
    143 
    144   return;
    145 }
    146 
    147 VOID ixheaacd_residual_tool_float(FLOAT32 *a, FLOAT32 *x, FLOAT32 *y, WORD32 l,
    148                                   WORD32 loop_count) {
    149   FLOAT32 s;
    150   WORD32 i, j;
    151   for (j = 0; j < loop_count; j++) {
    152     for (i = 0; i < l; i++) {
    153       s = x[i];
    154       s += a[1] * x[i - 1];
    155       s += a[2] * x[i - 2];
    156       s += a[3] * x[i - 3];
    157       s += a[4] * x[i - 4];
    158       s += a[5] * x[i - 5];
    159       s += a[6] * x[i - 6];
    160       s += a[7] * x[i - 7];
    161       s += a[8] * x[i - 8];
    162       s += a[9] * x[i - 9];
    163       s += a[10] * x[i - 10];
    164       s += a[11] * x[i - 11];
    165       s += a[12] * x[i - 12];
    166       s += a[13] * x[i - 13];
    167       s += a[14] * x[i - 14];
    168       s += a[15] * x[i - 15];
    169       s += a[16] * x[i - 16];
    170       y[i] = s;
    171     }
    172     a += 17;
    173     x += l;
    174     y += l;
    175   }
    176   return;
    177 }
    178 
    179 VOID ixheaacd_residual_tool_float1(FLOAT32 *a, FLOAT32 *x, FLOAT32 *y, WORD32 l,
    180                                    WORD32 loop_count) {
    181   FLOAT32 s;
    182   WORD32 i, j;
    183   for (j = 0; j < loop_count; j++) {
    184     for (i = 0; i < l; i++) {
    185       s = x[i];
    186       s += a[1] * x[i - 1];
    187       s += a[2] * x[i - 2];
    188       s += a[3] * x[i - 3];
    189       s += a[4] * x[i - 4];
    190       s += a[5] * x[i - 5];
    191       s += a[6] * x[i - 6];
    192       s += a[7] * x[i - 7];
    193       s += a[8] * x[i - 8];
    194       s += a[9] * x[i - 9];
    195       s += a[10] * x[i - 10];
    196       s += a[11] * x[i - 11];
    197       s += a[12] * x[i - 12];
    198       s += a[13] * x[i - 13];
    199       s += a[14] * x[i - 14];
    200       s += a[15] * x[i - 15];
    201       s += a[16] * x[i - 16];
    202       y[i] = s;
    203     }
    204     x += l;
    205     y += l;
    206   }
    207   return;
    208 }
    209