1*aef9bcd9SKiyoung Kim /*
2*aef9bcd9SKiyoung Kim * Copyright (C) 2003 - 2016 Sony Corporation
3*aef9bcd9SKiyoung Kim *
4*aef9bcd9SKiyoung Kim * Licensed under the Apache License, Version 2.0 (the "License");
5*aef9bcd9SKiyoung Kim * you may not use this file except in compliance with the License.
6*aef9bcd9SKiyoung Kim * You may obtain a copy of the License at
7*aef9bcd9SKiyoung Kim *
8*aef9bcd9SKiyoung Kim * http://www.apache.org/licenses/LICENSE-2.0
9*aef9bcd9SKiyoung Kim *
10*aef9bcd9SKiyoung Kim * Unless required by applicable law or agreed to in writing, software
11*aef9bcd9SKiyoung Kim * distributed under the License is distributed on an "AS IS" BASIS,
12*aef9bcd9SKiyoung Kim * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*aef9bcd9SKiyoung Kim * See the License for the specific language governing permissions and
14*aef9bcd9SKiyoung Kim * limitations under the License.
15*aef9bcd9SKiyoung Kim */
16*aef9bcd9SKiyoung Kim
17*aef9bcd9SKiyoung Kim #include "ldac.h"
18*aef9bcd9SKiyoung Kim
19*aef9bcd9SKiyoung Kim /***************************************************************************************************
20*aef9bcd9SKiyoung Kim Subfunction: Process MDCT Core
21*aef9bcd9SKiyoung Kim ***************************************************************************************************/
proc_mdct_core_ldac(SCALAR * p_x,SCALAR * p_y,int nlnn)22*aef9bcd9SKiyoung Kim static void proc_mdct_core_ldac(
23*aef9bcd9SKiyoung Kim SCALAR *p_x,
24*aef9bcd9SKiyoung Kim SCALAR *p_y,
25*aef9bcd9SKiyoung Kim int nlnn)
26*aef9bcd9SKiyoung Kim {
27*aef9bcd9SKiyoung Kim int i, j, k;
28*aef9bcd9SKiyoung Kim int loop1, loop2;
29*aef9bcd9SKiyoung Kim int coef, index0, index1, offset;
30*aef9bcd9SKiyoung Kim int nsmpl = npow2_ldac(nlnn);
31*aef9bcd9SKiyoung Kim const int *p_p;
32*aef9bcd9SKiyoung Kim const SCALAR *p_w, *p_c, *p_s;
33*aef9bcd9SKiyoung Kim SCALAR a_work[LDAC_MAXLSU];
34*aef9bcd9SKiyoung Kim SCALAR *p_work = a_work;
35*aef9bcd9SKiyoung Kim SCALAR a, b, c, d, tmp;
36*aef9bcd9SKiyoung Kim SCALAR cc, cs;
37*aef9bcd9SKiyoung Kim
38*aef9bcd9SKiyoung Kim i = nlnn - LDAC_1FSLNN;
39*aef9bcd9SKiyoung Kim p_w = gaa_fwin_ldac[i];
40*aef9bcd9SKiyoung Kim p_c = gaa_wcos_ldac[i];
41*aef9bcd9SKiyoung Kim p_s = gaa_wsin_ldac[i];
42*aef9bcd9SKiyoung Kim p_p = gaa_perm_ldac[i];
43*aef9bcd9SKiyoung Kim
44*aef9bcd9SKiyoung Kim /* Windowing */
45*aef9bcd9SKiyoung Kim for (i = 0; i < nsmpl>>1; i++) {
46*aef9bcd9SKiyoung Kim 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*aef9bcd9SKiyoung Kim
48*aef9bcd9SKiyoung Kim p_work[p_p[nsmpl/2+i]] = p_x[i] * p_w[i] - p_x[nsmpl-1-i] * p_w[nsmpl-1-i];
49*aef9bcd9SKiyoung Kim }
50*aef9bcd9SKiyoung Kim
51*aef9bcd9SKiyoung Kim /* Butterfly */
52*aef9bcd9SKiyoung Kim coef = 0;
53*aef9bcd9SKiyoung Kim for (i = 0; i < nlnn-1; ++i) {
54*aef9bcd9SKiyoung Kim loop1 = 1 << (nlnn-2-i);
55*aef9bcd9SKiyoung Kim loop2 = 1 << i;
56*aef9bcd9SKiyoung Kim index0 = 0;
57*aef9bcd9SKiyoung Kim index1 = 1 << (i+1);
58*aef9bcd9SKiyoung Kim offset = 1 << (i+2);
59*aef9bcd9SKiyoung Kim
60*aef9bcd9SKiyoung Kim for (k = 0; k < loop2; ++k) {
61*aef9bcd9SKiyoung Kim cc = p_c[coef];
62*aef9bcd9SKiyoung Kim cs = p_s[coef++];
63*aef9bcd9SKiyoung Kim for (j = 0; j < loop1; ++j) {
64*aef9bcd9SKiyoung Kim a = p_work[index0+0];
65*aef9bcd9SKiyoung Kim b = p_work[index0+1];
66*aef9bcd9SKiyoung Kim c = p_work[index1+0] * cc + p_work[index1+1] * cs;
67*aef9bcd9SKiyoung Kim d = p_work[index1+0] * cs - p_work[index1+1] * cc;
68*aef9bcd9SKiyoung Kim
69*aef9bcd9SKiyoung Kim p_work[index0+0] = a + c;
70*aef9bcd9SKiyoung Kim p_work[index0+1] = b + d;
71*aef9bcd9SKiyoung Kim p_work[index1+0] = a - c;
72*aef9bcd9SKiyoung Kim p_work[index1+1] = b - d;
73*aef9bcd9SKiyoung Kim index0 += offset;
74*aef9bcd9SKiyoung Kim index1 += offset;
75*aef9bcd9SKiyoung Kim }
76*aef9bcd9SKiyoung Kim index0 += 2 - nsmpl;
77*aef9bcd9SKiyoung Kim index1 += 2 - nsmpl;
78*aef9bcd9SKiyoung Kim }
79*aef9bcd9SKiyoung Kim }
80*aef9bcd9SKiyoung Kim
81*aef9bcd9SKiyoung Kim tmp = _scalar(1.0) / (SCALAR)(nsmpl>>1);
82*aef9bcd9SKiyoung Kim for (i = 0; i < nsmpl>>1; i++) {
83*aef9bcd9SKiyoung Kim cc = p_c[coef];
84*aef9bcd9SKiyoung Kim cs = p_s[coef++];
85*aef9bcd9SKiyoung Kim
86*aef9bcd9SKiyoung Kim index0 = i << 1;
87*aef9bcd9SKiyoung Kim a = p_work[index0] * cc + p_work[index0+1] * cs;
88*aef9bcd9SKiyoung Kim b = p_work[index0] * cs - p_work[index0+1] * cc;
89*aef9bcd9SKiyoung Kim
90*aef9bcd9SKiyoung Kim p_y[index0] = a * tmp;
91*aef9bcd9SKiyoung Kim p_y[nsmpl-index0-1] = b * tmp;
92*aef9bcd9SKiyoung Kim }
93*aef9bcd9SKiyoung Kim
94*aef9bcd9SKiyoung Kim return;
95*aef9bcd9SKiyoung Kim }
96*aef9bcd9SKiyoung Kim
97*aef9bcd9SKiyoung Kim /***************************************************************************************************
98*aef9bcd9SKiyoung Kim Process MDCT
99*aef9bcd9SKiyoung Kim ***************************************************************************************************/
proc_mdct_ldac(SFINFO * p_sfinfo,int nlnn)100*aef9bcd9SKiyoung Kim DECLFUNC void proc_mdct_ldac(
101*aef9bcd9SKiyoung Kim SFINFO *p_sfinfo,
102*aef9bcd9SKiyoung Kim int nlnn)
103*aef9bcd9SKiyoung Kim {
104*aef9bcd9SKiyoung Kim AC *p_ac;
105*aef9bcd9SKiyoung Kim int ich;
106*aef9bcd9SKiyoung Kim int nchs = p_sfinfo->cfg.ch;
107*aef9bcd9SKiyoung Kim
108*aef9bcd9SKiyoung Kim for (ich = 0; ich < nchs; ich++) {
109*aef9bcd9SKiyoung Kim p_ac = p_sfinfo->ap_ac[ich];
110*aef9bcd9SKiyoung Kim proc_mdct_core_ldac(p_ac->p_acsub->a_time, p_ac->p_acsub->a_spec, nlnn);
111*aef9bcd9SKiyoung Kim }
112*aef9bcd9SKiyoung Kim
113*aef9bcd9SKiyoung Kim return;
114*aef9bcd9SKiyoung Kim }
115*aef9bcd9SKiyoung Kim
116