blob: a19227757c5d298bbc068b183f8689cbc23868fa
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 | 1.2206911375946939E-05, 1.7261986723798209E-05, 1.2300093657077942E-05, |
47 | -1.0833943097791965E-05, -5.7772498639901686E-05, -1.2764767618947719E-04, |
48 | -2.0965186675013334E-04, -2.8166673689263850E-04, -3.1234860429017460E-04, |
49 | -2.6738519958452353E-04, -1.1949424681824722E-04, 1.3965139412648678E-04, |
50 | 4.8864136409185725E-04, 8.7044629275148344E-04, 1.1949430269934793E-03, |
51 | 1.3519708175026700E-03, 1.2346314373964412E-03, 7.6953209114159191E-04, |
52 | -5.2242432579537141E-05, -1.1516092887213454E-03, -2.3538469841711277E-03, |
53 | -3.4033123072127277E-03, -4.0028551071986133E-03, -3.8745415659693259E-03, |
54 | -2.8321073426874310E-03, -8.5038892323704195E-04, 1.8856751185350931E-03, |
55 | 4.9688741735340923E-03, 7.8056704536795926E-03, 9.7027909685901654E-03, |
56 | 9.9960423120166159E-03, 8.2019366335594487E-03, 4.1642072876103365E-03, |
57 | -1.8364453822737758E-03, -9.0384863094167686E-03, -1.6241528177129844E-02, |
58 | -2.1939551286300665E-02, -2.4533179947088161E-02, -2.2591663337768787E-02, |
59 | -1.5122066420044672E-02, -1.7971713448186293E-03, 1.6903413428575379E-02, |
60 | 3.9672315874127042E-02, 6.4487527248102796E-02, 8.8850025474701726E-02, |
61 | 0.1101132906105560 , 0.1258540205143761 , 0.1342239368467012 |
62 | }; |
63 | |
64 | for (j = 0; j < 48; ++j) { |
65 | p_proto[j] = p_proto[95 - j] = a_half[j]; |
66 | } |
67 | } |
68 | |
69 | void gc_setcoef_eff_pqfsyn(int mm, |
70 | int kk, |
71 | real_t *p_proto, |
72 | real_t ***ppp_q0, |
73 | real_t ***ppp_t0, |
74 | real_t ***ppp_t1) |
75 | { |
76 | int i, k, n; |
77 | real_t w; |
78 | |
79 | /* Set 1st Mul&Acc Coef's */ |
80 | *ppp_q0 = (real_t **) calloc(mm, sizeof(real_t *)); |
81 | for (n = 0; n < mm; ++n) { |
82 | (*ppp_q0)[n] = (real_t *) calloc(mm, sizeof(real_t)); |
83 | } |
84 | for (n = 0; n < mm / 2; ++n) { |
85 | for (i = 0; i < mm; ++i) { |
86 | w = (2 * i + 1) * (2 * n + 1 - mm) * M_PI / (4 * mm); |
87 | (*ppp_q0)[n][i] = 2.0 * cos((real_t) w); |
88 | |
89 | w = (2 * i + 1) * (2 * (mm + n) + 1 - mm) * M_PI / (4 * mm); |
90 | (*ppp_q0)[n + mm / 2][i] = 2.0 * cos((real_t) w); |
91 | } |
92 | } |
93 | |
94 | /* Set 2nd Mul&Acc Coef's */ |
95 | *ppp_t0 = (real_t **) calloc(mm, sizeof(real_t *)); |
96 | *ppp_t1 = (real_t **) calloc(mm, sizeof(real_t *)); |
97 | for (n = 0; n < mm; ++n) { |
98 | (*ppp_t0)[n] = (real_t *) calloc(kk, sizeof(real_t)); |
99 | (*ppp_t1)[n] = (real_t *) calloc(kk, sizeof(real_t)); |
100 | } |
101 | for (n = 0; n < mm; ++n) { |
102 | for (k = 0; k < kk; ++k) { |
103 | (*ppp_t0)[n][k] = mm * p_proto[2 * k * mm + n]; |
104 | (*ppp_t1)[n][k] = mm * p_proto[(2 * k + 1) * mm + n]; |
105 | |
106 | if (k % 2 != 0) { |
107 | (*ppp_t0)[n][k] = -(*ppp_t0)[n][k]; |
108 | (*ppp_t1)[n][k] = -(*ppp_t1)[n][k]; |
109 | } |
110 | } |
111 | } |
112 | } |
113 | |
114 | void ssr_ipqf(ssr_info *ssr, real_t *in_data, real_t *out_data, |
115 | real_t buffer[SSR_BANDS][96 / 4], |
116 | uint16_t frame_len, uint8_t bands) |
117 | { |
118 | static int initFlag = 0; |
119 | real_t a_pqfproto[PQFTAPS]; |
120 | |
121 | int i; |
122 | |
123 | if (initFlag == 0) { |
124 | gc_set_protopqf(a_pqfproto); |
125 | gc_setcoef_eff_pqfsyn(SSR_BANDS, PQFTAPS / (2 * SSR_BANDS), a_pqfproto, |
126 | &pp_q0, &pp_t0, &pp_t1); |
127 | initFlag = 1; |
128 | } |
129 | |
130 | for (i = 0; i < frame_len / SSR_BANDS; i++) { |
131 | int l, n, k; |
132 | int mm = SSR_BANDS; |
133 | int kk = PQFTAPS / (2 * SSR_BANDS); |
134 | |
135 | for (n = 0; n < mm; n++) { |
136 | for (k = 0; k < 2 * kk - 1; k++) { |
137 | buffer[n][k] = buffer[n][k + 1]; |
138 | } |
139 | } |
140 | |
141 | for (n = 0; n < mm; n++) { |
142 | real_t acc = 0.0; |
143 | for (l = 0; l < mm; l++) { |
144 | acc += pp_q0[n][l] * in_data[l * frame_len / SSR_BANDS + i]; |
145 | } |
146 | buffer[n][2 * kk - 1] = acc; |
147 | } |
148 | |
149 | for (n = 0; n < mm / 2; n++) { |
150 | real_t acc = 0.0; |
151 | for (k = 0; k < kk; k++) { |
152 | acc += pp_t0[n][k] * buffer[n][2 * kk - 1 - 2 * k]; |
153 | } |
154 | for (k = 0; k < kk; ++k) { |
155 | acc += pp_t1[n][k] * buffer[n + mm / 2][2 * kk - 2 - 2 * k]; |
156 | } |
157 | out_data[i * SSR_BANDS + n] = acc; |
158 | |
159 | acc = 0.0; |
160 | for (k = 0; k < kk; k++) { |
161 | acc += pp_t0[mm - 1 - n][k] * buffer[n][2 * kk - 1 - 2 * k]; |
162 | } |
163 | for (k = 0; k < kk; k++) { |
164 | acc -= pp_t1[mm - 1 - n][k] * buffer[n + mm / 2][2 * kk - 2 - 2 * k]; |
165 | } |
166 | out_data[i * SSR_BANDS + mm - 1 - n] = acc; |
167 | } |
168 | } |
169 | } |
170 | |
171 | #endif |
172 |