]> 4ch.mooo.com Git - 16.git/blob - src/lib/doslib/ext/faad/ssr_ipqf.c
wwww
[16.git] / src / lib / doslib / ext / faad / ssr_ipqf.c
1 /*
2 ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding
3 ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com
4 **  
5 ** This program is free software; you can redistribute it and/or modify
6 ** it under the terms of the GNU General Public License as published by
7 ** the Free Software Foundation; either version 2 of the License, or
8 ** (at your option) any later version.
9 ** 
10 ** This program is distributed in the hope that it will be useful,
11 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
12 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 ** GNU General Public License for more details.
14 ** 
15 ** You should have received a copy of the GNU General Public License
16 ** along with this program; if not, write to the Free Software 
17 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18 **
19 ** Any non-GPL usage of this software or parts of this software is strictly
20 ** forbidden.
21 **
22 ** The "appropriate copyright message" mentioned in section 2c of the GPLv2
23 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com"
24 **
25 ** Commercial non-GPL licensing of this software is possible.
26 ** For more info contact Nero AG through Mpeg4AAClicense@nero.com.
27 **
28 ** $Id: ssr_ipqf.c,v 1.18 2007/11/01 12:33:39 menno Exp $
29 **/
30
31 #include "common.h"
32 #include "structs.h"
33
34 #ifdef SSR_DEC
35
36 #include "ssr.h"
37 #include "ssr_ipqf.h"
38
39 static real_t **app_pqfbuf;
40 static real_t **pp_q0, **pp_t0, **pp_t1;
41
42 void gc_set_protopqf(real_t *p_proto)
43 {
44     int j;
45     static real_t a_half[48] =
46     {
47         1.2206911375946939E-05,  1.7261986723798209E-05,  1.2300093657077942E-05,
48         -1.0833943097791965E-05, -5.7772498639901686E-05, -1.2764767618947719E-04,
49         -2.0965186675013334E-04, -2.8166673689263850E-04, -3.1234860429017460E-04,
50         -2.6738519958452353E-04, -1.1949424681824722E-04,  1.3965139412648678E-04,
51         4.8864136409185725E-04,  8.7044629275148344E-04,  1.1949430269934793E-03,
52         1.3519708175026700E-03,  1.2346314373964412E-03,  7.6953209114159191E-04,
53         -5.2242432579537141E-05, -1.1516092887213454E-03, -2.3538469841711277E-03,
54         -3.4033123072127277E-03, -4.0028551071986133E-03, -3.8745415659693259E-03,
55         -2.8321073426874310E-03, -8.5038892323704195E-04,  1.8856751185350931E-03,
56         4.9688741735340923E-03,  7.8056704536795926E-03,  9.7027909685901654E-03,
57         9.9960423120166159E-03,  8.2019366335594487E-03,  4.1642072876103365E-03,
58         -1.8364453822737758E-03, -9.0384863094167686E-03, -1.6241528177129844E-02,
59         -2.1939551286300665E-02, -2.4533179947088161E-02, -2.2591663337768787E-02,
60         -1.5122066420044672E-02, -1.7971713448186293E-03,  1.6903413428575379E-02,
61         3.9672315874127042E-02,  6.4487527248102796E-02,  8.8850025474701726E-02,
62         0.1101132906105560    ,  0.1258540205143761    ,  0.1342239368467012    
63     };
64
65     for (j = 0; j < 48; ++j)
66     {
67         p_proto[j] = p_proto[95-j] = a_half[j];
68     }
69 }
70
71 void gc_setcoef_eff_pqfsyn(int mm,
72                            int kk,
73                            real_t *p_proto,
74                            real_t ***ppp_q0,
75                            real_t ***ppp_t0,
76                            real_t ***ppp_t1)
77 {
78     int i, k, n;
79     real_t      w;
80
81     /* Set 1st Mul&Acc Coef's */
82     *ppp_q0 = (real_t **) calloc(mm, sizeof(real_t *));
83     for (n = 0; n < mm; ++n)
84     {
85         (*ppp_q0)[n] = (real_t *) calloc(mm, sizeof(real_t));
86     }
87     for (n = 0; n < mm/2; ++n)
88     {
89         for (i = 0; i < mm; ++i)
90         {
91             w = (2*i+1)*(2*n+1-mm)*M_PI/(4*mm);
92             (*ppp_q0)[n][i] = 2.0 * cos((real_t) w);
93
94             w = (2*i+1)*(2*(mm+n)+1-mm)*M_PI/(4*mm);
95             (*ppp_q0)[n + mm/2][i] = 2.0 * cos((real_t) w);
96         }
97     }
98
99     /* Set 2nd Mul&Acc Coef's */
100     *ppp_t0 = (real_t **) calloc(mm, sizeof(real_t *));
101     *ppp_t1 = (real_t **) calloc(mm, sizeof(real_t *));
102     for (n = 0; n < mm; ++n)
103     {
104         (*ppp_t0)[n] = (real_t *) calloc(kk, sizeof(real_t));
105         (*ppp_t1)[n] = (real_t *) calloc(kk, sizeof(real_t));
106     }
107     for (n = 0; n < mm; ++n)
108     {
109         for (k = 0; k < kk; ++k)
110         {
111             (*ppp_t0)[n][k] = mm * p_proto[2*k    *mm + n];
112             (*ppp_t1)[n][k] = mm * p_proto[(2*k+1)*mm + n];
113
114             if (k%2 != 0)
115             {
116                 (*ppp_t0)[n][k] = -(*ppp_t0)[n][k];
117                 (*ppp_t1)[n][k] = -(*ppp_t1)[n][k];
118             }
119         }
120     }
121 }
122
123 void ssr_ipqf(ssr_info *ssr, real_t *in_data, real_t *out_data,
124               real_t buffer[SSR_BANDS][96/4],
125               uint16_t frame_len, uint8_t bands)
126 {
127     static int initFlag = 0;
128     real_t a_pqfproto[PQFTAPS];
129
130     int i;
131
132     if (initFlag == 0)
133     {
134         gc_set_protopqf(a_pqfproto);
135         gc_setcoef_eff_pqfsyn(SSR_BANDS, PQFTAPS/(2*SSR_BANDS), a_pqfproto,
136             &pp_q0, &pp_t0, &pp_t1);
137         initFlag = 1;
138     }
139
140     for (i = 0; i < frame_len / SSR_BANDS; i++)
141     {
142         int l, n, k;
143         int mm = SSR_BANDS;
144         int kk = PQFTAPS/(2*SSR_BANDS);
145
146         for (n = 0; n < mm; n++)
147         {
148             for (k = 0; k < 2*kk-1; k++)
149             {
150                 buffer[n][k] = buffer[n][k+1];
151             }
152         }
153
154         for (n = 0; n < mm; n++)
155         {
156             real_t acc = 0.0;
157             for (l = 0; l < mm; l++)
158             {
159                 acc += pp_q0[n][l] * in_data[l*frame_len/SSR_BANDS + i];
160             }
161             buffer[n][2*kk-1] = acc;
162         }
163
164         for (n = 0; n < mm/2; n++)
165         {
166             real_t acc = 0.0;
167             for (k = 0; k < kk; k++)
168             {
169                 acc += pp_t0[n][k] * buffer[n][2*kk-1-2*k];
170             }
171             for (k = 0; k < kk; ++k)
172             {
173                 acc += pp_t1[n][k] * buffer[n + mm/2][2*kk-2-2*k];
174             }
175             out_data[i*SSR_BANDS + n] = acc;
176
177             acc = 0.0;
178             for (k = 0; k < kk; k++)
179             {
180                 acc += pp_t0[mm-1-n][k] * buffer[n][2*kk-1-2*k];
181             }
182             for (k = 0; k < kk; k++)
183             {
184                 acc -= pp_t1[mm-1-n][k] * buffer[n + mm/2][2*kk-2-2*k];
185             }
186             out_data[i*SSR_BANDS + mm-1-n] = acc;
187         }
188     }
189 }
190
191 #endif