Home | History | Annotate | Download | only in src
      1 /*
      2  * Copyright (C) 2003 - 2016 Sony Corporation
      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 express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #include "ldac.h"
     18 
     19 /***************************************************************************************************
     20     Subfunction: Process MDCT Core
     21 ***************************************************************************************************/
     22 static void proc_mdct_core_ldac(
     23 SCALAR *p_x,
     24 SCALAR *p_y,
     25 int nlnn)
     26 {
     27     int i, j, k;
     28     int loop1, loop2;
     29     int coef, index0, index1, offset;
     30     int nsmpl = npow2_ldac(nlnn);
     31     const int *p_p;
     32     const SCALAR *p_w, *p_c, *p_s;
     33     SCALAR a_work[LDAC_MAXLSU];
     34     SCALAR *p_work = a_work;
     35     SCALAR a, b, c, d, tmp;
     36     SCALAR cc, cs;
     37 
     38     i = nlnn - LDAC_1FSLNN;
     39     p_w = gaa_fwin_ldac[i];
     40     p_c = gaa_wcos_ldac[i];
     41     p_s = gaa_wsin_ldac[i];
     42     p_p = gaa_perm_ldac[i];
     43 
     44     /* Windowing */
     45     for (i = 0; i < nsmpl>>1; i++) {
     46         p_work[p_p[i]] = -p_x[3*nsmpl/2-1-i] * p_w[nsmpl/2+i] - p_x[3*nsmpl/2+i] * p_w[nsmpl/2-1-i];
     47 
     48         p_work[p_p[nsmpl/2+i]] = p_x[i] * p_w[i] - p_x[nsmpl-1-i] * p_w[nsmpl-1-i];
     49     }
     50 
     51     /* Butterfly */
     52     coef = 0;
     53     for (i = 0; i < nlnn-1; ++i) {
     54         loop1 = 1 << (nlnn-2-i);
     55         loop2 = 1 << i;
     56         index0 = 0;
     57         index1 = 1 << (i+1);
     58         offset = 1 << (i+2);
     59 
     60         for (k = 0; k < loop2; ++k) {
     61             cc = p_c[coef];
     62             cs = p_s[coef++];
     63             for (j = 0; j < loop1; ++j) {
     64                 a = p_work[index0+0];
     65                 b = p_work[index0+1];
     66                 c = p_work[index1+0] * cc + p_work[index1+1] * cs;
     67                 d = p_work[index1+0] * cs - p_work[index1+1] * cc;
     68 
     69                 p_work[index0+0] = a + c;
     70                 p_work[index0+1] = b + d;
     71                 p_work[index1+0] = a - c;
     72                 p_work[index1+1] = b - d;
     73                 index0 += offset;
     74                 index1 += offset;
     75             }
     76             index0 += 2 - nsmpl;
     77             index1 += 2 - nsmpl;
     78         }
     79     }
     80 
     81     tmp = _scalar(1.0) / (SCALAR)(nsmpl>>1);
     82     for (i = 0; i < nsmpl>>1; i++) {
     83         cc = p_c[coef];
     84         cs = p_s[coef++];
     85 
     86         index0 = i << 1;
     87         a = p_work[index0] * cc + p_work[index0+1] * cs;
     88         b = p_work[index0] * cs - p_work[index0+1] * cc;
     89 
     90         p_y[index0] = a * tmp;
     91         p_y[nsmpl-index0-1] = b * tmp;
     92     }
     93 
     94     return;
     95 }
     96 
     97 /***************************************************************************************************
     98     Process MDCT
     99 ***************************************************************************************************/
    100 DECLFUNC void proc_mdct_ldac(
    101 SFINFO *p_sfinfo,
    102 int nlnn)
    103 {
    104     AC *p_ac;
    105     int ich;
    106     int nchs = p_sfinfo->cfg.ch;
    107 
    108     for (ich = 0; ich < nchs; ich++) {
    109         p_ac = p_sfinfo->ap_ac[ich];
    110         proc_mdct_core_ldac(p_ac->p_acsub->a_time, p_ac->p_acsub->a_spec, nlnn);
    111     }
    112 
    113     return;
    114 }
    115 
    116