2 ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding
3 ** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com
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.
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.
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.
19 ** Any non-GPL usage of this software or parts of this software is strictly
22 ** Commercial non-GPL licensing of this software is possible.
23 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
25 ** $Id: ssr_ipqf.c,v 1.14 2004/09/04 14:56:29 menno Exp $
36 static real_t
**app_pqfbuf
;
37 static real_t
**pp_q0
, **pp_t0
, **pp_t1
;
39 void gc_set_protopqf(real_t
*p_proto
)
42 static real_t a_half
[48] =
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
62 for (j
= 0; j
< 48; ++j
)
64 p_proto
[j
] = p_proto
[95-j
] = a_half
[j
];
68 void gc_setcoef_eff_pqfsyn(int mm
,
78 /* Set 1st Mul&Acc Coef's */
79 *ppp_q0
= (real_t
**) calloc(mm
, sizeof(real_t
*));
80 for (n
= 0; n
< mm
; ++n
)
82 (*ppp_q0
)[n
] = (real_t
*) calloc(mm
, sizeof(real_t
));
84 for (n
= 0; n
< mm
/2; ++n
)
86 for (i
= 0; i
< mm
; ++i
)
88 w
= (2*i
+1)*(2*n
+1-mm
)*M_PI
/(4*mm
);
89 (*ppp_q0
)[n
][i
] = 2.0 * cos((real_t
) w
);
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
);
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
)
101 (*ppp_t0
)[n
] = (real_t
*) calloc(kk
, sizeof(real_t
));
102 (*ppp_t1
)[n
] = (real_t
*) calloc(kk
, sizeof(real_t
));
104 for (n
= 0; n
< mm
; ++n
)
106 for (k
= 0; k
< kk
; ++k
)
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
];
113 (*ppp_t0
)[n
][k
] = -(*ppp_t0
)[n
][k
];
114 (*ppp_t1
)[n
][k
] = -(*ppp_t1
)[n
][k
];
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
)
124 static int initFlag
= 0;
125 real_t a_pqfproto
[PQFTAPS
];
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
);
137 for (i
= 0; i
< frame_len
/ SSR_BANDS
; i
++)
141 int kk
= PQFTAPS
/(2*SSR_BANDS
);
143 for (n
= 0; n
< mm
; n
++)
145 for (k
= 0; k
< 2*kk
-1; k
++)
147 buffer
[n
][k
] = buffer
[n
][k
+1];
151 for (n
= 0; n
< mm
; n
++)
154 for (l
= 0; l
< mm
; l
++)
156 acc
+= pp_q0
[n
][l
] * in_data
[l
*frame_len
/SSR_BANDS
+ i
];
158 buffer
[n
][2*kk
-1] = acc
;
161 for (n
= 0; n
< mm
/2; n
++)
164 for (k
= 0; k
< kk
; k
++)
166 acc
+= pp_t0
[n
][k
] * buffer
[n
][2*kk
-1-2*k
];
168 for (k
= 0; k
< kk
; ++k
)
170 acc
+= pp_t1
[n
][k
] * buffer
[n
+ mm
/2][2*kk
-2-2*k
];
172 out_data
[i
*SSR_BANDS
+ n
] = acc
;
175 for (k
= 0; k
< kk
; k
++)
177 acc
+= pp_t0
[mm
-1-n
][k
] * buffer
[n
][2*kk
-1-2*k
];
179 for (k
= 0; k
< kk
; k
++)
181 acc
-= pp_t1
[mm
-1-n
][k
] * buffer
[n
+ mm
/2][2*kk
-2-2*k
];
183 out_data
[i
*SSR_BANDS
+ mm
-1-n
] = acc
;