summaryrefslogtreecommitdiff
path: root/audio_codec/libfaad/ssr_ipqf.c (plain)
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
39static real_t **app_pqfbuf;
40static real_t **pp_q0, **pp_t0, **pp_t1;
41
42void 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
69void 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
114void 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