10725
|
1 /*
|
|
2 ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding
|
12527
|
3 ** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com
|
10725
|
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 ** Commercial non-GPL licensing of this software is possible.
|
|
23 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
|
|
24 **
|
18141
|
25 ** $Id: ssr_ipqf.c,v 1.14 2004/09/04 14:56:29 menno Exp $
|
10725
|
26 **/
|
|
27
|
|
28 #include "common.h"
|
|
29 #include "structs.h"
|
|
30
|
|
31 #ifdef SSR_DEC
|
|
32
|
|
33 #include "ssr.h"
|
|
34 #include "ssr_ipqf.h"
|
|
35
|
|
36 static real_t **app_pqfbuf;
|
|
37 static real_t **pp_q0, **pp_t0, **pp_t1;
|
|
38
|
|
39 void gc_set_protopqf(real_t *p_proto)
|
|
40 {
|
|
41 int j;
|
|
42 static real_t a_half[48] =
|
|
43 {
|
|
44 1.2206911375946939E-05, 1.7261986723798209E-05, 1.2300093657077942E-05,
|
|
45 -1.0833943097791965E-05, -5.7772498639901686E-05, -1.2764767618947719E-04,
|
|
46 -2.0965186675013334E-04, -2.8166673689263850E-04, -3.1234860429017460E-04,
|
|
47 -2.6738519958452353E-04, -1.1949424681824722E-04, 1.3965139412648678E-04,
|
|
48 4.8864136409185725E-04, 8.7044629275148344E-04, 1.1949430269934793E-03,
|
|
49 1.3519708175026700E-03, 1.2346314373964412E-03, 7.6953209114159191E-04,
|
|
50 -5.2242432579537141E-05, -1.1516092887213454E-03, -2.3538469841711277E-03,
|
|
51 -3.4033123072127277E-03, -4.0028551071986133E-03, -3.8745415659693259E-03,
|
|
52 -2.8321073426874310E-03, -8.5038892323704195E-04, 1.8856751185350931E-03,
|
|
53 4.9688741735340923E-03, 7.8056704536795926E-03, 9.7027909685901654E-03,
|
|
54 9.9960423120166159E-03, 8.2019366335594487E-03, 4.1642072876103365E-03,
|
|
55 -1.8364453822737758E-03, -9.0384863094167686E-03, -1.6241528177129844E-02,
|
|
56 -2.1939551286300665E-02, -2.4533179947088161E-02, -2.2591663337768787E-02,
|
|
57 -1.5122066420044672E-02, -1.7971713448186293E-03, 1.6903413428575379E-02,
|
|
58 3.9672315874127042E-02, 6.4487527248102796E-02, 8.8850025474701726E-02,
|
|
59 0.1101132906105560 , 0.1258540205143761 , 0.1342239368467012
|
|
60 };
|
|
61
|
|
62 for (j = 0; j < 48; ++j)
|
|
63 {
|
|
64 p_proto[j] = p_proto[95-j] = a_half[j];
|
|
65 }
|
|
66 }
|
|
67
|
|
68 void gc_setcoef_eff_pqfsyn(int mm,
|
|
69 int kk,
|
|
70 real_t *p_proto,
|
|
71 real_t ***ppp_q0,
|
|
72 real_t ***ppp_t0,
|
|
73 real_t ***ppp_t1)
|
|
74 {
|
|
75 int i, k, n;
|
|
76 real_t w;
|
|
77
|
|
78 /* Set 1st Mul&Acc Coef's */
|
|
79 *ppp_q0 = (real_t **) calloc(mm, sizeof(real_t *));
|
|
80 for (n = 0; n < mm; ++n)
|
|
81 {
|
|
82 (*ppp_q0)[n] = (real_t *) calloc(mm, sizeof(real_t));
|
|
83 }
|
|
84 for (n = 0; n < mm/2; ++n)
|
|
85 {
|
|
86 for (i = 0; i < mm; ++i)
|
|
87 {
|
|
88 w = (2*i+1)*(2*n+1-mm)*M_PI/(4*mm);
|
|
89 (*ppp_q0)[n][i] = 2.0 * cos((real_t) w);
|
|
90
|
|
91 w = (2*i+1)*(2*(mm+n)+1-mm)*M_PI/(4*mm);
|
|
92 (*ppp_q0)[n + mm/2][i] = 2.0 * cos((real_t) w);
|
|
93 }
|
|
94 }
|
|
95
|
|
96 /* Set 2nd Mul&Acc Coef's */
|
|
97 *ppp_t0 = (real_t **) calloc(mm, sizeof(real_t *));
|
|
98 *ppp_t1 = (real_t **) calloc(mm, sizeof(real_t *));
|
|
99 for (n = 0; n < mm; ++n)
|
|
100 {
|
|
101 (*ppp_t0)[n] = (real_t *) calloc(kk, sizeof(real_t));
|
|
102 (*ppp_t1)[n] = (real_t *) calloc(kk, sizeof(real_t));
|
|
103 }
|
|
104 for (n = 0; n < mm; ++n)
|
|
105 {
|
|
106 for (k = 0; k < kk; ++k)
|
|
107 {
|
|
108 (*ppp_t0)[n][k] = mm * p_proto[2*k *mm + n];
|
|
109 (*ppp_t1)[n][k] = mm * p_proto[(2*k+1)*mm + n];
|
|
110
|
|
111 if (k%2 != 0)
|
|
112 {
|
|
113 (*ppp_t0)[n][k] = -(*ppp_t0)[n][k];
|
|
114 (*ppp_t1)[n][k] = -(*ppp_t1)[n][k];
|
|
115 }
|
|
116 }
|
|
117 }
|
|
118 }
|
|
119
|
|
120 void ssr_ipqf(ssr_info *ssr, real_t *in_data, real_t *out_data,
|
|
121 real_t buffer[SSR_BANDS][96/4],
|
|
122 uint16_t frame_len, uint8_t bands)
|
|
123 {
|
|
124 static int initFlag = 0;
|
|
125 real_t a_pqfproto[PQFTAPS];
|
|
126
|
|
127 int i;
|
|
128
|
|
129 if (initFlag == 0)
|
|
130 {
|
|
131 gc_set_protopqf(a_pqfproto);
|
|
132 gc_setcoef_eff_pqfsyn(SSR_BANDS, PQFTAPS/(2*SSR_BANDS), a_pqfproto,
|
|
133 &pp_q0, &pp_t0, &pp_t1);
|
|
134 initFlag = 1;
|
|
135 }
|
|
136
|
|
137 for (i = 0; i < frame_len / SSR_BANDS; i++)
|
|
138 {
|
|
139 int l, n, k;
|
|
140 int mm = SSR_BANDS;
|
|
141 int kk = PQFTAPS/(2*SSR_BANDS);
|
|
142
|
|
143 for (n = 0; n < mm; n++)
|
|
144 {
|
|
145 for (k = 0; k < 2*kk-1; k++)
|
|
146 {
|
|
147 buffer[n][k] = buffer[n][k+1];
|
|
148 }
|
|
149 }
|
|
150
|
|
151 for (n = 0; n < mm; n++)
|
|
152 {
|
|
153 real_t acc = 0.0;
|
|
154 for (l = 0; l < mm; l++)
|
|
155 {
|
|
156 acc += pp_q0[n][l] * in_data[l*frame_len/SSR_BANDS + i];
|
|
157 }
|
|
158 buffer[n][2*kk-1] = acc;
|
|
159 }
|
|
160
|
|
161 for (n = 0; n < mm/2; n++)
|
|
162 {
|
|
163 real_t acc = 0.0;
|
|
164 for (k = 0; k < kk; k++)
|
|
165 {
|
|
166 acc += pp_t0[n][k] * buffer[n][2*kk-1-2*k];
|
|
167 }
|
|
168 for (k = 0; k < kk; ++k)
|
|
169 {
|
|
170 acc += pp_t1[n][k] * buffer[n + mm/2][2*kk-2-2*k];
|
|
171 }
|
|
172 out_data[i*SSR_BANDS + n] = acc;
|
|
173
|
|
174 acc = 0.0;
|
|
175 for (k = 0; k < kk; k++)
|
|
176 {
|
|
177 acc += pp_t0[mm-1-n][k] * buffer[n][2*kk-1-2*k];
|
|
178 }
|
|
179 for (k = 0; k < kk; k++)
|
|
180 {
|
|
181 acc -= pp_t1[mm-1-n][k] * buffer[n + mm/2][2*kk-2-2*k];
|
|
182 }
|
|
183 out_data[i*SSR_BANDS + mm-1-n] = acc;
|
|
184 }
|
|
185 }
|
|
186 }
|
|
187
|
|
188 #endif
|