Coverage Report

Created: 2026-09-01 06:32

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libxaac/encoder/ixheaace_mps_polyphase.c
Line
Count
Source
1
/******************************************************************************
2
 *                                                                            *
3
 * Copyright (C) 2023 The Android Open Source Project
4
 *
5
 * Licensed under the Apache License, Version 2.0 (the "License");
6
 * you may not use this file except in compliance with the License.
7
 * You may obtain a copy of the License at:
8
 *
9
 * http://www.apache.org/licenses/LICENSE-2.0
10
 *
11
 * Unless required by applicable law or agreed to in writing, software
12
 * distributed under the License is distributed on an "AS IS" BASIS,
13
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
 * See the License for the specific language governing permissions and
15
 * limitations under the License.
16
 *
17
 *****************************************************************************
18
 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19
 */
20
21
#include <string.h>
22
#include <math.h>
23
#include "ixheaac_type_def.h"
24
#include "ixheaace_mps_common_fix.h"
25
#include "ixheaace_mps_defines.h"
26
#include "ixheaace_mps_common_define.h"
27
#include "ixheaace_bitbuffer.h"
28
29
#include "ixheaace_mps_struct_def.h"
30
#include "ixheaace_mps_sac_polyphase.h"
31
#include "ixheaace_mps_sac_hybfilter.h"
32
#include "ixheaace_mps_spatial_bitstream.h"
33
#include "ixheaace_mps_bitstream.h"
34
#include "ixheaace_mps_param_extract.h"
35
#include "ixheaace_mps_tree.h"
36
#include "ixheaace_mps_rom.h"
37
38
180M
static VOID ixheaace_mps_bit_reversal(FLOAT32 *a, FLOAT32 *b) {
39
180M
  FLOAT32 temp;
40
180M
  temp = *a;
41
180M
  *a = *b;
42
180M
  *b = temp;
43
180M
}
44
45
212M
static VOID ixheaace_mps_bit_add_sub1(FLOAT32 *a, FLOAT32 *b) {
46
212M
  FLOAT32 temp;
47
212M
  temp = *a + *b;
48
212M
  *b = *b - *a;
49
212M
  *a = temp;
50
212M
}
51
52
310M
static VOID ixheaace_mps_bit_add_sub2(FLOAT32 *a, FLOAT32 *b) {
53
310M
  FLOAT32 temp;
54
310M
  temp = *a + *b;
55
310M
  *b = *a - *b;
56
310M
  *a = temp;
57
310M
}
58
59
1.12M
static VOID ixheaace_mps_fft32(FLOAT32 *subband) {
60
1.12M
  FLOAT32 val_0, val_1, val_2, val_3, val_4, val_5, val_6, val_7, val_8, val_9, val_10, val_11,
61
1.12M
      val_12, val_13, val_14, val_15;
62
1.12M
  FLOAT32 val_1_0, val_1_1, val_1_2, val_1_3, val_1_4, val_1_5, val_1_6, val_1_7, val_1_8,
63
1.12M
      val_1_9, val_1_10, val_1_11, val_1_12, val_1_13, val_1_14, val_1_15;
64
1.12M
  FLOAT32 val_2_0, val_2_1, val_2_2, val_2_3, val_2_4, val_2_5, val_2_6, val_2_7, val_2_8,
65
1.12M
      val_2_9, val_2_10, val_2_11, val_2_12, val_2_13, val_2_14, val_2_15;
66
1.12M
  FLOAT32 val_3_0, val_3_1, val_3_2, val_3_3, val_3_4, val_3_5, val_3_6, val_3_7, val_3_8,
67
1.12M
      val_3_9, val_3_10, val_3_11, val_3_12, val_3_13, val_3_14, val_3_15;
68
1.12M
  FLOAT32 val_3_16, val_3_17, val_3_18, val_3_19, val_3_20, val_3_21, val_3_22, val_3_23,
69
1.12M
      val_3_24, val_3_25, val_3_26, val_3_27, val_3_28, val_3_29, val_3_30, val_3_31;
70
1.12M
  FLOAT32 val_4_0, val_4_1, val_4_2, val_4_3, val_4_4, val_4_5, val_4_6, val_4_7, val_4_8,
71
1.12M
      val_4_9, val_4_10, val_4_11, val_4_12, val_4_13, val_4_14, val_4_15;
72
73
1.12M
  val_2_0 = subband[2] - subband[34];
74
1.12M
  val_2_1 = subband[3] - subband[35];
75
1.12M
  val_3_0 = subband[0] + subband[32];
76
1.12M
  val_3_1 = subband[1] + subband[33];
77
1.12M
  val_3_2 = subband[2] + subband[34];
78
1.12M
  val_3_3 = subband[3] + subband[35];
79
80
1.12M
  val_2_2 = subband[6] - subband[38];
81
1.12M
  val_2_3 = subband[7] - subband[39];
82
1.12M
  val_3_4 = subband[4] + subband[36];
83
1.12M
  val_3_5 = subband[5] + subband[37];
84
1.12M
  val_3_6 = subband[6] + subband[38];
85
1.12M
  val_3_7 = subband[7] + subband[39];
86
87
1.12M
  val_2_4 = subband[10] - subband[42];
88
1.12M
  val_2_5 = subband[11] - subband[43];
89
1.12M
  val_3_8 = subband[8] + subband[40];
90
1.12M
  val_3_9 = subband[9] + subband[41];
91
1.12M
  val_3_10 = subband[10] + subband[42];
92
1.12M
  val_3_11 = subband[11] + subband[43];
93
94
1.12M
  val_2_6 = subband[14] - subband[46];
95
1.12M
  val_2_7 = subband[15] - subband[47];
96
1.12M
  val_3_12 = subband[12] + subband[44];
97
1.12M
  val_3_13 = subband[13] + subband[45];
98
1.12M
  val_3_14 = subband[14] + subband[46];
99
1.12M
  val_3_15 = subband[15] + subband[47];
100
101
1.12M
  val_2_8 = subband[18] - subband[50];
102
1.12M
  val_2_9 = subband[19] - subband[51];
103
1.12M
  val_3_16 = subband[16] + subband[48];
104
1.12M
  val_3_17 = subband[17] + subband[49];
105
1.12M
  val_3_18 = subband[18] + subband[50];
106
1.12M
  val_3_19 = subband[19] + subband[51];
107
108
1.12M
  val_2_10 = subband[22] - subband[54];
109
1.12M
  val_2_11 = subband[23] - subband[55];
110
1.12M
  val_3_20 = subband[20] + subband[52];
111
1.12M
  val_3_21 = subband[21] + subband[53];
112
1.12M
  val_3_22 = subband[22] + subband[54];
113
1.12M
  val_3_23 = subband[23] + subband[55];
114
115
1.12M
  val_2_12 = subband[26] - subband[58];
116
1.12M
  val_2_13 = subband[27] - subband[59];
117
1.12M
  val_3_24 = subband[24] + subband[56];
118
1.12M
  val_3_25 = subband[25] + subband[57];
119
1.12M
  val_3_26 = subband[26] + subband[58];
120
1.12M
  val_3_27 = subband[27] + subband[59];
121
122
1.12M
  val_2_14 = subband[30] - subband[62];
123
1.12M
  val_2_15 = subband[31] - subband[63];
124
1.12M
  val_3_28 = subband[28] + subband[60];
125
1.12M
  val_3_29 = subband[29] + subband[61];
126
1.12M
  val_3_30 = subband[30] + subband[62];
127
1.12M
  val_3_31 = subband[31] + subband[63];
128
129
1.12M
  val_4_1 = -(val_2_0 + val_2_14);
130
1.12M
  val_4_2 = val_2_0 - val_2_14;
131
1.12M
  val_4_0 = val_2_1 + val_2_15;
132
1.12M
  val_4_3 = val_2_1 - val_2_15;
133
1.12M
  val_4_5 = -(val_2_2 + val_2_12);
134
1.12M
  val_4_6 = val_2_2 - val_2_12;
135
1.12M
  val_4_4 = val_2_3 + val_2_13;
136
1.12M
  val_4_7 = val_2_3 - val_2_13;
137
1.12M
  val_4_9 = -(val_2_4 + val_2_10);
138
1.12M
  val_4_10 = val_2_4 - val_2_10;
139
1.12M
  val_4_8 = val_2_5 + val_2_11;
140
1.12M
  val_4_11 = val_2_5 - val_2_11;
141
1.12M
  val_4_13 = -(val_2_6 + val_2_8);
142
1.12M
  val_4_14 = val_2_6 - val_2_8;
143
1.12M
  val_4_12 = val_2_7 + val_2_9;
144
1.12M
  val_4_15 = val_2_7 - val_2_9;
145
146
1.12M
  val_2_0 = val_4_0 * fft_c[3] + val_4_4 * fft_c[2] + val_4_8 * fft_c[1] + val_4_12 * fft_c[0];
147
148
1.12M
  val_2_4 = val_4_0 * fft_c[2] + val_4_4 * fft_c[0] + val_4_8 * fft_c[3] - val_4_12 * fft_c[1];
149
1.12M
  val_2_8 = val_4_0 * fft_c[1] + val_4_4 * fft_c[3] - val_4_8 * fft_c[0] + val_4_12 * fft_c[2];
150
151
1.12M
  val_2_12 = val_4_0 * fft_c[0] - val_4_4 * fft_c[1] + val_4_8 * fft_c[2] - val_4_12 * fft_c[3];
152
153
1.12M
  val_2_1 = val_4_1 * fft_c[3] + val_4_5 * fft_c[2] + val_4_9 * fft_c[1] + val_4_13 * fft_c[0];
154
155
1.12M
  val_2_5 = val_4_1 * fft_c[2] + val_4_5 * fft_c[0] + val_4_9 * fft_c[3] - val_4_13 * fft_c[1];
156
1.12M
  val_2_9 = val_4_1 * fft_c[1] + val_4_5 * fft_c[3] - val_4_9 * fft_c[0] + val_4_13 * fft_c[2];
157
158
1.12M
  val_2_13 = val_4_1 * fft_c[0] - val_4_5 * fft_c[1] + val_4_9 * fft_c[2] - val_4_13 * fft_c[3];
159
160
1.12M
  val_2_2 = val_4_2 * fft_c[0] + val_4_6 * fft_c[1] + val_4_10 * fft_c[2] + val_4_14 * fft_c[3];
161
162
1.12M
  val_2_6 = val_4_2 * fft_c[1] - val_4_6 * fft_c[3] - val_4_10 * fft_c[0] - val_4_14 * fft_c[2];
163
164
1.12M
  val_2_10 = val_4_2 * fft_c[2] - val_4_6 * fft_c[0] + val_4_10 * fft_c[3] + val_4_14 * fft_c[1];
165
166
1.12M
  val_2_14 = val_4_2 * fft_c[3] - val_4_6 * fft_c[2] + val_4_10 * fft_c[1] - val_4_14 * fft_c[0];
167
168
1.12M
  val_2_3 = val_4_3 * fft_c[0] + val_4_7 * fft_c[1] + val_4_11 * fft_c[2] + val_4_15 * fft_c[3];
169
170
1.12M
  val_2_7 = val_4_3 * fft_c[1] - val_4_7 * fft_c[3] - val_4_11 * fft_c[0] - val_4_15 * fft_c[2];
171
172
1.12M
  val_2_11 = val_4_3 * fft_c[2] - val_4_7 * fft_c[0] + val_4_11 * fft_c[3] + val_4_15 * fft_c[1];
173
174
1.12M
  val_2_15 = val_4_3 * fft_c[3] - val_4_7 * fft_c[2] + val_4_11 * fft_c[1] - val_4_15 * fft_c[0];
175
176
1.12M
  val_4_0 = val_2_0 + val_2_2;
177
1.12M
  val_4_14 = val_2_0 - val_2_2;
178
1.12M
  val_4_1 = val_2_1 + val_2_3;
179
1.12M
  val_4_15 = val_2_1 - val_2_3;
180
1.12M
  val_4_2 = val_2_4 + val_2_6;
181
1.12M
  val_4_12 = val_2_4 - val_2_6;
182
1.12M
  val_4_3 = val_2_5 + val_2_7;
183
1.12M
  val_4_13 = val_2_5 - val_2_7;
184
1.12M
  val_4_4 = val_2_8 + val_2_10;
185
1.12M
  val_4_10 = val_2_8 - val_2_10;
186
1.12M
  val_4_5 = val_2_9 + val_2_11;
187
1.12M
  val_4_11 = val_2_9 - val_2_11;
188
1.12M
  val_4_6 = val_2_12 + val_2_14;
189
1.12M
  val_4_8 = val_2_12 - val_2_14;
190
1.12M
  val_4_7 = val_2_13 + val_2_15;
191
1.12M
  val_4_9 = val_2_13 - val_2_15;
192
193
1.12M
  val_1_0 = val_3_0 + val_3_16;
194
1.12M
  val_1_1 = val_3_1 + val_3_17;
195
1.12M
  val_1_2 = val_3_2 + val_3_18;
196
1.12M
  val_1_3 = val_3_3 + val_3_19;
197
1.12M
  val_1_4 = val_3_4 + val_3_20;
198
1.12M
  val_1_5 = val_3_5 + val_3_21;
199
1.12M
  val_1_6 = val_3_6 + val_3_22;
200
1.12M
  val_1_7 = val_3_7 + val_3_23;
201
1.12M
  val_1_8 = val_3_8 + val_3_24;
202
1.12M
  val_1_9 = val_3_9 + val_3_25;
203
1.12M
  val_1_10 = val_3_10 + val_3_26;
204
1.12M
  val_1_11 = val_3_11 + val_3_27;
205
1.12M
  val_1_12 = val_3_12 + val_3_28;
206
1.12M
  val_1_13 = val_3_13 + val_3_29;
207
1.12M
  val_1_14 = val_3_14 + val_3_30;
208
1.12M
  val_1_15 = val_3_15 + val_3_31;
209
210
1.12M
  val_0 = val_1_0 + val_1_8;
211
1.12M
  val_2 = val_1_0 - val_1_8;
212
1.12M
  val_1 = val_1_1 + val_1_9;
213
1.12M
  val_3 = val_1_1 - val_1_9;
214
1.12M
  val_4 = val_1_2 + val_1_10;
215
1.12M
  val_6 = val_1_2 - val_1_10;
216
1.12M
  val_5 = val_1_3 + val_1_11;
217
1.12M
  val_7 = val_1_3 - val_1_11;
218
1.12M
  val_8 = val_1_4 + val_1_12;
219
1.12M
  val_10 = val_1_4 - val_1_12;
220
1.12M
  val_9 = val_1_5 + val_1_13;
221
1.12M
  val_11 = val_1_5 - val_1_13;
222
1.12M
  val_12 = val_1_6 + val_1_14;
223
1.12M
  val_14 = val_1_6 - val_1_14;
224
1.12M
  val_13 = val_1_7 + val_1_15;
225
1.12M
  val_15 = val_1_7 - val_1_15;
226
227
1.12M
  val_2_0 = val_0 + val_8;
228
1.12M
  val_2_4 = val_0 - val_8;
229
1.12M
  val_2_1 = val_1 + val_9;
230
1.12M
  val_2_5 = val_1 - val_9;
231
1.12M
  val_2_8 = val_2 - val_11;
232
1.12M
  val_2_10 = val_2 + val_11;
233
1.12M
  val_2_9 = val_3 + val_10;
234
1.12M
  val_2_11 = val_3 - val_10;
235
1.12M
  val_2_2 = val_4 + val_12;
236
1.12M
  val_2_7 = val_4 - val_12;
237
1.12M
  val_2_3 = val_5 + val_13;
238
1.12M
  val_2_6 = val_13 - val_5;
239
240
1.12M
  val_1 = val_6 + val_14;
241
1.12M
  val_2 = val_6 - val_14;
242
1.12M
  val_0 = val_7 + val_15;
243
1.12M
  val_3 = val_7 - val_15;
244
245
1.12M
  val_2_12 = (val_0 + val_2) * MPS_INV_SQRT2;
246
1.12M
  val_2_14 = (val_0 - val_2) * MPS_INV_SQRT2;
247
1.12M
  val_2_13 = (val_3 - val_1) * MPS_INV_SQRT2;
248
1.12M
  val_2_15 = (val_1 + val_3) * -MPS_INV_SQRT2;
249
250
1.12M
  val_1_0 = val_3_0 - val_3_16;
251
1.12M
  val_1_1 = val_3_1 - val_3_17;
252
1.12M
  val_1_2 = val_3_2 - val_3_18;
253
1.12M
  val_1_3 = val_3_3 - val_3_19;
254
1.12M
  val_1_4 = val_3_4 - val_3_20;
255
1.12M
  val_1_5 = val_3_5 - val_3_21;
256
1.12M
  val_1_6 = val_3_6 - val_3_22;
257
1.12M
  val_1_7 = val_3_7 - val_3_23;
258
1.12M
  val_1_8 = val_3_8 - val_3_24;
259
1.12M
  val_1_9 = val_3_9 - val_3_25;
260
1.12M
  val_1_10 = val_3_10 - val_3_26;
261
1.12M
  val_1_11 = val_3_11 - val_3_27;
262
1.12M
  val_1_12 = val_3_12 - val_3_28;
263
1.12M
  val_1_13 = val_3_13 - val_3_29;
264
1.12M
  val_1_14 = val_3_14 - val_3_30;
265
1.12M
  val_1_15 = val_3_15 - val_3_31;
266
267
1.12M
  val_3_0 = val_2_0 + val_2_2;
268
1.12M
  val_3_16 = val_2_0 - val_2_2;
269
1.12M
  val_3_1 = val_2_1 + val_2_3;
270
1.12M
  val_3_17 = val_2_1 - val_2_3;
271
1.12M
  val_3_8 = val_2_4 - val_2_6;
272
1.12M
  val_3_24 = val_2_4 + val_2_6;
273
1.12M
  val_3_9 = val_2_5 - val_2_7;
274
1.12M
  val_3_25 = val_2_5 + val_2_7;
275
1.12M
  val_3_12 = val_2_8 + val_2_14;
276
1.12M
  val_3_28 = val_2_8 - val_2_14;
277
1.12M
  val_3_13 = val_2_9 + val_2_15;
278
1.12M
  val_3_29 = val_2_9 - val_2_15;
279
1.12M
  val_3_4 = val_2_10 + val_2_12;
280
1.12M
  val_3_20 = val_2_10 - val_2_12;
281
1.12M
  val_3_5 = val_2_11 + val_2_13;
282
1.12M
  val_3_21 = val_2_11 - val_2_13;
283
284
1.12M
  val_9 = (val_1_2 + val_1_14) * -MPS_COS_3PI_DIV8;
285
1.12M
  val_10 = (val_1_2 - val_1_14) * MPS_COS_PI_DIV8;
286
1.12M
  val_8 = (val_1_3 + val_1_15) * MPS_COS_3PI_DIV8;
287
1.12M
  val_11 = (val_1_3 - val_1_15) * MPS_COS_PI_DIV8;
288
1.12M
  val_5 = (val_1_4 + val_1_12) * -MPS_INV_SQRT2;
289
1.12M
  val_6 = (val_1_4 - val_1_12) * MPS_INV_SQRT2;
290
1.12M
  val_4 = (val_1_5 + val_1_13) * MPS_INV_SQRT2;
291
1.12M
  val_7 = (val_1_5 - val_1_13) * MPS_INV_SQRT2;
292
1.12M
  val_13 = (val_1_6 + val_1_10) * -MPS_COS_PI_DIV8;
293
1.12M
  val_14 = (val_1_6 - val_1_10) * MPS_COS_3PI_DIV8;
294
1.12M
  val_12 = (val_1_7 + val_1_11) * MPS_COS_PI_DIV8;
295
1.12M
  val_15 = (val_1_7 - val_1_11) * MPS_COS_3PI_DIV8;
296
297
1.12M
  val_1_2 = val_8 * MPS_SQRT2PLUS1 - val_12 * MPS_SQRT2MINUS1;
298
1.12M
  val_1_3 = val_9 * MPS_SQRT2PLUS1 - val_13 * MPS_SQRT2MINUS1;
299
1.12M
  val_1_4 = val_10 * MPS_SQRT2MINUS1 - val_14 * MPS_SQRT2PLUS1;
300
1.12M
  val_1_5 = val_11 * MPS_SQRT2MINUS1 - val_15 * MPS_SQRT2PLUS1;
301
302
1.12M
  val_8 += val_12;
303
1.12M
  val_9 += val_13;
304
1.12M
  val_10 += val_14;
305
1.12M
  val_11 += val_15;
306
1.12M
  val_1_6 = val_1_0 + val_4;
307
1.12M
  val_1_10 = val_1_0 - val_4;
308
1.12M
  val_1_7 = val_1_1 + val_5;
309
1.12M
  val_1_11 = val_1_1 - val_5;
310
311
1.12M
  val_1_12 = val_6 - val_1_9;
312
1.12M
  val_1_14 = val_6 + val_1_9;
313
1.12M
  val_1_13 = val_1_8 + val_7;
314
1.12M
  val_1_15 = val_1_8 - val_7;
315
316
1.12M
  val_0 = val_1_6 - val_1_14;
317
1.12M
  val_2 = val_1_6 + val_1_14;
318
1.12M
  val_1 = val_1_7 + val_1_15;
319
1.12M
  val_3 = val_1_7 - val_1_15;
320
1.12M
  val_4 = val_1_10 + val_1_12;
321
1.12M
  val_6 = val_1_10 - val_1_12;
322
1.12M
  val_5 = val_1_11 + val_1_13;
323
1.12M
  val_7 = val_1_11 - val_1_13;
324
325
1.12M
  val_1_10 = val_8 + val_10;
326
1.12M
  val_10 = val_8 - val_10;
327
1.12M
  val_1_11 = val_9 + val_11;
328
1.12M
  val_11 = val_9 - val_11;
329
330
1.12M
  val_12 = val_1_2 + val_1_4;
331
1.12M
  val_14 = val_1_2 - val_1_4;
332
1.12M
  val_13 = val_1_3 + val_1_5;
333
1.12M
  val_15 = val_1_3 - val_1_5;
334
335
1.12M
  val_3_2 = val_2 + val_1_10;
336
1.12M
  val_3_18 = val_2 - val_1_10;
337
1.12M
  val_3_3 = val_3 + val_1_11;
338
1.12M
  val_3_19 = val_3 - val_1_11;
339
1.12M
  val_3_6 = val_0 + val_12;
340
1.12M
  val_3_22 = val_0 - val_12;
341
1.12M
  val_3_7 = val_1 + val_13;
342
1.12M
  val_3_23 = val_1 - val_13;
343
1.12M
  val_3_14 = val_4 + val_10;
344
1.12M
  val_3_30 = val_4 - val_10;
345
1.12M
  val_3_15 = val_5 + val_11;
346
1.12M
  val_3_31 = val_5 - val_11;
347
1.12M
  val_3_10 = val_6 + val_14;
348
1.12M
  val_3_26 = val_6 - val_14;
349
1.12M
  val_3_11 = val_7 + val_15;
350
1.12M
  val_3_27 = val_7 - val_15;
351
352
1.12M
  val_1_0 = subband[0] - subband[32];
353
1.12M
  val_1_1 = subband[1] - subband[33];
354
1.12M
  val_1_2 = subband[4] - subband[36];
355
1.12M
  val_1_3 = subband[5] - subband[37];
356
1.12M
  val_1_4 = subband[8] - subband[40];
357
1.12M
  val_1_5 = subband[9] - subband[41];
358
1.12M
  val_1_6 = subband[12] - subband[44];
359
1.12M
  val_1_7 = subband[13] - subband[45];
360
1.12M
  val_1_8 = subband[16] - subband[48];
361
1.12M
  val_1_9 = subband[17] - subband[49];
362
1.12M
  val_1_10 = subband[20] - subband[52];
363
1.12M
  val_1_11 = subband[21] - subband[53];
364
1.12M
  val_1_12 = subband[24] - subband[56];
365
1.12M
  val_1_13 = subband[25] - subband[57];
366
1.12M
  val_1_14 = subband[28] - subband[60];
367
1.12M
  val_1_15 = subband[29] - subband[61];
368
369
1.12M
  val_9 = (val_1_2 + val_1_14) * -MPS_COS_3PI_DIV8;
370
1.12M
  val_10 = (val_1_2 - val_1_14) * MPS_COS_PI_DIV8;
371
1.12M
  val_8 = (val_1_3 + val_1_15) * MPS_COS_3PI_DIV8;
372
1.12M
  val_11 = (val_1_3 - val_1_15) * MPS_COS_PI_DIV8;
373
1.12M
  val_5 = (val_1_4 + val_1_12) * -MPS_INV_SQRT2;
374
1.12M
  val_6 = (val_1_4 - val_1_12) * MPS_INV_SQRT2;
375
1.12M
  val_4 = (val_1_5 + val_1_13) * MPS_INV_SQRT2;
376
1.12M
  val_7 = (val_1_5 - val_1_13) * MPS_INV_SQRT2;
377
1.12M
  val_13 = (val_1_6 + val_1_10) * -MPS_COS_PI_DIV8;
378
1.12M
  val_14 = (val_1_6 - val_1_10) * MPS_COS_3PI_DIV8;
379
1.12M
  val_12 = (val_1_7 + val_1_11) * MPS_COS_PI_DIV8;
380
1.12M
  val_15 = (val_1_7 - val_1_11) * MPS_COS_3PI_DIV8;
381
382
1.12M
  val_1_2 = val_8 * MPS_SQRT2PLUS1 - val_12 * MPS_SQRT2MINUS1;
383
1.12M
  val_1_3 = val_9 * MPS_SQRT2PLUS1 - val_13 * MPS_SQRT2MINUS1;
384
1.12M
  val_1_4 = val_10 * MPS_SQRT2MINUS1 - val_14 * MPS_SQRT2PLUS1;
385
1.12M
  val_1_5 = val_11 * MPS_SQRT2MINUS1 - val_15 * MPS_SQRT2PLUS1;
386
387
1.12M
  val_8 += val_12;
388
1.12M
  val_9 += val_13;
389
1.12M
  val_10 += val_14;
390
1.12M
  val_11 += val_15;
391
1.12M
  val_1_6 = val_1_0 + val_4;
392
1.12M
  val_1_10 = val_1_0 - val_4;
393
1.12M
  val_1_7 = val_1_1 + val_5;
394
1.12M
  val_1_11 = val_1_1 - val_5;
395
396
1.12M
  val_1_12 = val_6 - val_1_9;
397
1.12M
  val_1_14 = val_6 + val_1_9;
398
1.12M
  val_1_13 = val_1_8 + val_7;
399
1.12M
  val_1_15 = val_1_8 - val_7;
400
401
1.12M
  val_0 = val_1_6 - val_1_14;
402
1.12M
  val_2 = val_1_6 + val_1_14;
403
1.12M
  val_1 = val_1_7 + val_1_15;
404
1.12M
  val_3 = val_1_7 - val_1_15;
405
1.12M
  val_4 = val_1_10 + val_1_12;
406
1.12M
  val_6 = val_1_10 - val_1_12;
407
1.12M
  val_5 = val_1_11 + val_1_13;
408
1.12M
  val_7 = val_1_11 - val_1_13;
409
410
1.12M
  val_1_10 = val_8 + val_10;
411
1.12M
  val_10 = val_8 - val_10;
412
1.12M
  val_1_11 = val_9 + val_11;
413
1.12M
  val_11 = val_9 - val_11;
414
415
1.12M
  val_12 = val_1_2 + val_1_4;
416
1.12M
  val_14 = val_1_2 - val_1_4;
417
1.12M
  val_13 = val_1_3 + val_1_5;
418
1.12M
  val_15 = val_1_3 - val_1_5;
419
420
1.12M
  val_1_0 = val_2 + val_1_10;
421
1.12M
  val_1_8 = val_2 - val_1_10;
422
1.12M
  val_1_1 = val_3 + val_1_11;
423
1.12M
  val_1_9 = val_3 - val_1_11;
424
1.12M
  val_1_2 = val_0 + val_12;
425
1.12M
  val_1_10 = val_0 - val_12;
426
1.12M
  val_1_3 = val_1 + val_13;
427
1.12M
  val_1_11 = val_1 - val_13;
428
1.12M
  val_1_6 = val_4 + val_10;
429
1.12M
  val_1_14 = val_4 - val_10;
430
1.12M
  val_1_7 = val_5 + val_11;
431
1.12M
  val_1_15 = val_5 - val_11;
432
1.12M
  val_1_4 = val_6 + val_14;
433
1.12M
  val_1_12 = val_6 - val_14;
434
1.12M
  val_1_5 = val_7 + val_15;
435
1.12M
  val_1_13 = val_7 - val_15;
436
437
1.12M
  *subband++ = val_3_0;
438
1.12M
  *subband++ = val_3_1;
439
1.12M
  *subband++ = val_1_0 + val_4_0;
440
1.12M
  *subband++ = val_1_1 + val_4_1;
441
1.12M
  *subband++ = val_3_2;
442
1.12M
  *subband++ = val_3_3;
443
1.12M
  *subband++ = val_1_2 + val_4_2;
444
1.12M
  *subband++ = val_1_3 + val_4_3;
445
1.12M
  *subband++ = val_3_4;
446
1.12M
  *subband++ = val_3_5;
447
1.12M
  *subband++ = val_1_4 + val_4_4;
448
1.12M
  *subband++ = val_1_5 + val_4_5;
449
1.12M
  *subband++ = val_3_6;
450
1.12M
  *subband++ = val_3_7;
451
1.12M
  *subband++ = val_1_6 + val_4_6;
452
1.12M
  *subband++ = val_1_7 + val_4_7;
453
1.12M
  *subband++ = val_3_8;
454
1.12M
  *subband++ = val_3_9;
455
1.12M
  *subband++ = val_1_8 + val_4_8;
456
1.12M
  *subband++ = val_1_9 + val_4_9;
457
1.12M
  *subband++ = val_3_10;
458
1.12M
  *subband++ = val_3_11;
459
1.12M
  *subband++ = val_1_10 + val_4_10;
460
1.12M
  *subband++ = val_1_11 + val_4_11;
461
1.12M
  *subband++ = val_3_12;
462
1.12M
  *subband++ = val_3_13;
463
1.12M
  *subband++ = val_1_12 + val_4_12;
464
1.12M
  *subband++ = val_1_13 + val_4_13;
465
1.12M
  *subband++ = val_3_14;
466
1.12M
  *subband++ = val_3_15;
467
1.12M
  *subband++ = val_1_14 + val_4_14;
468
1.12M
  *subband++ = val_1_15 + val_4_15;
469
1.12M
  *subband++ = val_3_16;
470
1.12M
  *subband++ = val_3_17;
471
1.12M
  *subband++ = val_1_0 - val_4_0;
472
1.12M
  *subband++ = val_1_1 - val_4_1;
473
1.12M
  *subband++ = val_3_18;
474
1.12M
  *subband++ = val_3_19;
475
1.12M
  *subband++ = val_1_2 - val_4_2;
476
1.12M
  *subband++ = val_1_3 - val_4_3;
477
1.12M
  *subband++ = val_3_20;
478
1.12M
  *subband++ = val_3_21;
479
1.12M
  *subband++ = val_1_4 - val_4_4;
480
1.12M
  *subband++ = val_1_5 - val_4_5;
481
1.12M
  *subband++ = val_3_22;
482
1.12M
  *subband++ = val_3_23;
483
1.12M
  *subband++ = val_1_6 - val_4_6;
484
1.12M
  *subband++ = val_1_7 - val_4_7;
485
1.12M
  *subband++ = val_3_24;
486
1.12M
  *subband++ = val_3_25;
487
1.12M
  *subband++ = val_1_8 - val_4_8;
488
1.12M
  *subband++ = val_1_9 - val_4_9;
489
1.12M
  *subband++ = val_3_26;
490
1.12M
  *subband++ = val_3_27;
491
1.12M
  *subband++ = val_1_10 - val_4_10;
492
1.12M
  *subband++ = val_1_11 - val_4_11;
493
1.12M
  *subband++ = val_3_28;
494
1.12M
  *subband++ = val_3_29;
495
1.12M
  *subband++ = val_1_12 - val_4_12;
496
1.12M
  *subband++ = val_1_13 - val_4_13;
497
1.12M
  *subband++ = val_3_30;
498
1.12M
  *subband++ = val_3_31;
499
1.12M
  *subband++ = val_1_14 - val_4_14;
500
1.12M
  *subband++ = val_1_15 - val_4_15;
501
1.12M
}
502
503
static VOID ixheaace_mps_cos_mod(
504
560k
    FLOAT32 *subband, ixheaace_mps_sac_pstr_qmf_synth_filter_bank pstr_qmf_synth_filter_bank) {
505
560k
  WORD32 idx, length;
506
560k
  FLOAT32 weight_imag, weight_real;
507
560k
  FLOAT32 real_1, real_2;
508
560k
  FLOAT32 imag_1, imag_2;
509
560k
  FLOAT32 accu1, accu2;
510
511
560k
  length = 32;
512
513
9.52M
  for (idx = 0; idx < (length / 2); idx++) {
514
8.96M
    real_1 = subband[2 * idx];
515
8.96M
    imag_2 = subband[2 * idx + 1];
516
8.96M
    real_2 = subband[2 * length - 2 - 2 * idx];
517
8.96M
    imag_1 = subband[2 * length - 1 - 2 * idx];
518
519
8.96M
    weight_imag = pstr_qmf_synth_filter_bank->sin_twiddle[idx];
520
8.96M
    weight_real = pstr_qmf_synth_filter_bank->cos_twiddle[idx];
521
522
8.96M
    accu1 = imag_1 * weight_imag + real_1 * weight_real;
523
8.96M
    accu2 = imag_1 * weight_real - real_1 * weight_imag;
524
525
8.96M
    subband[2 * idx] = accu1;
526
8.96M
    subband[2 * idx + 1] = accu2;
527
528
8.96M
    weight_imag = pstr_qmf_synth_filter_bank->sin_twiddle[length - 1 - idx];
529
8.96M
    weight_real = pstr_qmf_synth_filter_bank->cos_twiddle[length - 1 - idx];
530
531
8.96M
    accu1 = imag_2 * weight_imag + real_2 * weight_real;
532
8.96M
    accu2 = imag_2 * weight_real - real_2 * weight_imag;
533
534
8.96M
    subband[2 * length - 2 - 2 * idx] = accu1;
535
8.96M
    subband[2 * length - 1 - 2 * idx] = accu2;
536
8.96M
  }
537
538
560k
  ixheaace_mps_fft32(subband);
539
540
560k
  weight_imag = pstr_qmf_synth_filter_bank->alt_sin_twiddle[0];
541
560k
  weight_real = pstr_qmf_synth_filter_bank->alt_sin_twiddle[length];
542
543
9.52M
  for (idx = 0; idx < length / 2; idx++) {
544
8.96M
    real_1 = subband[2 * idx];
545
8.96M
    imag_1 = subband[2 * idx + 1];
546
8.96M
    real_2 = subband[2 * length - 2 - 2 * idx];
547
8.96M
    imag_2 = subband[2 * length - 1 - 2 * idx];
548
549
8.96M
    accu1 = real_1 * weight_real + imag_1 * weight_imag;
550
8.96M
    accu2 = real_1 * weight_imag - imag_1 * weight_real;
551
552
8.96M
    subband[2 * idx] = accu1;
553
8.96M
    subband[2 * length - 1 - 2 * idx] = accu2;
554
555
8.96M
    weight_imag = pstr_qmf_synth_filter_bank->alt_sin_twiddle[idx + 1];
556
8.96M
    weight_real = pstr_qmf_synth_filter_bank->alt_sin_twiddle[length - 1 - idx];
557
558
8.96M
    accu1 = real_2 * weight_imag + imag_2 * weight_real;
559
8.96M
    accu2 = real_2 * weight_real - imag_2 * weight_imag;
560
561
8.96M
    subband[2 * length - 2 - 2 * idx] = accu1;
562
8.96M
    subband[2 * idx + 1] = accu2;
563
8.96M
  }
564
560k
}
565
566
static VOID ixheaace_mps_sin_mod(
567
560k
    FLOAT32 *subband, ixheaace_mps_sac_pstr_qmf_synth_filter_bank pstr_qmf_synth_filter_bank) {
568
560k
  WORD32 idx, length;
569
560k
  FLOAT32 weight_real, weight_imag;
570
560k
  FLOAT32 real_1, imag_1, real_2, imag_2;
571
560k
  FLOAT32 accu1, accu2;
572
573
560k
  length = 32;
574
575
9.52M
  for (idx = 0; idx < length / 2; idx++) {
576
8.96M
    real_1 = subband[2 * idx];
577
8.96M
    imag_2 = subband[2 * idx + 1];
578
8.96M
    real_2 = subband[2 * length - 2 - 2 * idx];
579
8.96M
    imag_1 = subband[2 * length - 1 - 2 * idx];
580
581
8.96M
    weight_real = pstr_qmf_synth_filter_bank->sin_twiddle[idx];
582
8.96M
    weight_imag = pstr_qmf_synth_filter_bank->cos_twiddle[idx];
583
584
8.96M
    accu1 = imag_1 * weight_imag + real_1 * weight_real;
585
8.96M
    accu2 = imag_1 * weight_real - real_1 * weight_imag;
586
587
8.96M
    subband[2 * idx + 1] = accu1;
588
8.96M
    subband[2 * idx] = accu2;
589
590
8.96M
    weight_real = pstr_qmf_synth_filter_bank->sin_twiddle[length - 1 - idx];
591
8.96M
    weight_imag = pstr_qmf_synth_filter_bank->cos_twiddle[length - 1 - idx];
592
593
8.96M
    accu1 = imag_2 * weight_imag + real_2 * weight_real;
594
8.96M
    accu2 = imag_2 * weight_real - real_2 * weight_imag;
595
596
8.96M
    subband[2 * length - 1 - 2 * idx] = accu1;
597
8.96M
    subband[2 * length - 2 - 2 * idx] = accu2;
598
8.96M
  }
599
600
560k
  ixheaace_mps_fft32(subband);
601
602
560k
  weight_imag = pstr_qmf_synth_filter_bank->alt_sin_twiddle[0];
603
560k
  weight_real = pstr_qmf_synth_filter_bank->alt_sin_twiddle[length];
604
605
9.52M
  for (idx = 0; idx < length / 2; idx++) {
606
8.96M
    real_1 = subband[2 * idx];
607
8.96M
    imag_1 = subband[2 * idx + 1];
608
8.96M
    real_2 = subband[2 * length - 2 - 2 * idx];
609
8.96M
    imag_2 = subband[2 * length - 1 - 2 * idx];
610
611
8.96M
    accu1 = -(real_1 * weight_real + imag_1 * weight_imag);
612
8.96M
    accu2 = -(real_1 * weight_imag - imag_1 * weight_real);
613
614
8.96M
    subband[2 * length - 1 - 2 * idx] = accu1;
615
8.96M
    subband[2 * idx] = accu2;
616
617
8.96M
    weight_imag = pstr_qmf_synth_filter_bank->alt_sin_twiddle[idx + 1];
618
8.96M
    weight_real = pstr_qmf_synth_filter_bank->alt_sin_twiddle[length - 1 - idx];
619
620
8.96M
    accu1 = -(real_2 * weight_imag + imag_2 * weight_real);
621
8.96M
    accu2 = -(real_2 * weight_real - imag_2 * weight_imag);
622
623
8.96M
    subband[2 * idx + 1] = accu1;
624
8.96M
    subband[2 * length - 2 - 2 * idx] = accu2;
625
8.96M
  }
626
560k
}
627
628
static VOID ixheaace_mps_inverse_modulation(
629
    FLOAT32 *qmf_real, FLOAT32 *qmf_imag,
630
560k
    ixheaace_mps_sac_pstr_qmf_synth_filter_bank pstr_qmf_synth_filter_bank) {
631
560k
  WORD32 idx, no_synthesis_channels, length;
632
633
560k
  FLOAT32 r1, i1, r2, i2;
634
635
560k
  no_synthesis_channels = NUM_QMF_BANDS;
636
637
560k
  length = no_synthesis_channels / 2;
638
639
560k
  ixheaace_mps_cos_mod(qmf_real, pstr_qmf_synth_filter_bank);
640
560k
  ixheaace_mps_sin_mod(qmf_imag, pstr_qmf_synth_filter_bank);
641
642
18.4M
  for (idx = 0; idx < length; idx++) {
643
17.9M
    r1 = qmf_real[idx];
644
17.9M
    i2 = qmf_imag[no_synthesis_channels - 1 - idx];
645
17.9M
    r2 = qmf_real[no_synthesis_channels - idx - 1];
646
17.9M
    i1 = qmf_imag[idx];
647
648
17.9M
    qmf_real[idx] = (r1 - i1);
649
17.9M
    qmf_imag[no_synthesis_channels - 1 - idx] = -(r1 + i1);
650
17.9M
    qmf_real[no_synthesis_channels - idx - 1] = (r2 - i2);
651
17.9M
    qmf_imag[idx] = -(r2 + i2);
652
17.9M
  }
653
560k
}
654
655
24.5M
static VOID ixheaace_mps_fct3_4(FLOAT32 *subband) {
656
24.5M
  FLOAT32 val_00, val_01, val_10, val_11;
657
658
24.5M
  subband[1] *= MPS_INV_SQRT2;
659
660
24.5M
  val_00 = subband[0] + subband[1];
661
24.5M
  val_01 = subband[0] - subband[1];
662
663
24.5M
  val_10 = subband[2] * MPS_COS_6_PI_BY_16 + subband[3] * MPS_SIN_6_PI_BY_16;
664
24.5M
  val_11 = subband[2] * MPS_SIN_6_PI_BY_16 - subband[3] * MPS_COS_6_PI_BY_16;
665
666
24.5M
  subband[0] = val_00 + val_10;
667
24.5M
  subband[3] = val_00 - val_10;
668
24.5M
  subband[1] = val_01 + val_11;
669
24.5M
  subband[2] = val_01 - val_11;
670
24.5M
}
671
672
20.4M
static VOID ixheaace_mps_fst3_4r(FLOAT32 *subband) {
673
20.4M
  FLOAT32 val_00, val_01, val_10, val_11;
674
675
20.4M
  subband[2] *= MPS_INV_SQRT2;
676
677
20.4M
  val_00 = subband[3] + subband[2];
678
20.4M
  val_01 = subband[3] - subband[2];
679
680
20.4M
  val_10 = subband[1] * MPS_COS_6_PI_BY_16 + subband[0] * MPS_SIN_6_PI_BY_16;
681
20.4M
  val_11 = subband[0] * MPS_COS_6_PI_BY_16 - subband[1] * MPS_SIN_6_PI_BY_16;
682
683
20.4M
  subband[3] = val_00 + val_10;
684
20.4M
  subband[0] = val_10 - val_00;
685
20.4M
  subband[2] = val_11 - val_01;
686
20.4M
  subband[1] = val_11 + val_01;
687
20.4M
}
688
689
12.2M
static VOID ixheaace_mps_fct4_4r(FLOAT32 *subband) {
690
12.2M
  FLOAT32 val_00, val_01, val_10, val_11;
691
12.2M
  subband[1] *= MPS_INV_SQRT2;
692
693
12.2M
  val_00 = subband[0] + subband[1];
694
12.2M
  val_01 = subband[0] - subband[1];
695
696
12.2M
  subband[2] *= MPS_INV_SQRT2;
697
698
12.2M
  val_11 = subband[3] - subband[2];
699
12.2M
  val_10 = subband[3] + subband[2];
700
701
12.2M
  subband[3] = val_00 * MPS_COS_PI_BY_16 + val_10 * MPS_SIN_PI_BY_16;
702
12.2M
  subband[0] = val_00 * MPS_SIN_PI_BY_16 - val_10 * MPS_COS_PI_BY_16;
703
704
12.2M
  subband[2] = val_01 * MPS_COS_3_PI_BY_16 - val_11 * MPS_SIN_3_PI_BY_16;
705
12.2M
  subband[1] = val_01 * MPS_SIN_3_PI_BY_16 + val_11 * MPS_COS_3_PI_BY_16;
706
12.2M
}
707
708
8.18M
static VOID ixheaace_mps_fst4_4(FLOAT32 *subband) {
709
8.18M
  FLOAT32 val_00, val_01, val_10, val_11;
710
711
8.18M
  subband[1] *= MPS_INV_SQRT2;
712
713
8.18M
  val_10 = subband[0] + subband[1];
714
8.18M
  val_11 = subband[0] - subband[1];
715
716
8.18M
  subband[2] *= MPS_INV_SQRT2;
717
718
8.18M
  val_01 = subband[3] - subband[2];
719
8.18M
  val_00 = subband[3] + subband[2];
720
721
8.18M
  subband[0] = val_00 * MPS_COS_PI_BY_16 + val_10 * MPS_SIN_PI_BY_16;
722
8.18M
  subband[3] = val_10 * MPS_COS_PI_BY_16 - val_00 * MPS_SIN_PI_BY_16;
723
724
8.18M
  subband[1] = val_11 * MPS_SIN_3_PI_BY_16 - val_01 * MPS_COS_3_PI_BY_16;
725
8.18M
  subband[2] = val_01 * MPS_SIN_3_PI_BY_16 + val_11 * MPS_COS_3_PI_BY_16;
726
8.18M
}
727
728
4.09M
static VOID ixheaace_mps_fct3_64(FLOAT32 *subband) {
729
4.09M
  WORD32 idx;
730
4.09M
  const FLOAT32 *t_ptr;
731
4.09M
  FLOAT32 cos_val, sine_val;
732
4.09M
  FLOAT32 xp;
733
734
4.09M
  ixheaace_mps_bit_reversal(&subband[1], &subband[32]);
735
4.09M
  ixheaace_mps_bit_reversal(&subband[2], &subband[16]);
736
4.09M
  ixheaace_mps_bit_reversal(&subband[3], &subband[48]);
737
4.09M
  ixheaace_mps_bit_reversal(&subband[4], &subband[8]);
738
4.09M
  ixheaace_mps_bit_reversal(&subband[5], &subband[40]);
739
4.09M
  ixheaace_mps_bit_reversal(&subband[6], &subband[24]);
740
4.09M
  ixheaace_mps_bit_reversal(&subband[7], &subband[56]);
741
4.09M
  ixheaace_mps_bit_reversal(&subband[9], &subband[36]);
742
4.09M
  ixheaace_mps_bit_reversal(&subband[10], &subband[20]);
743
4.09M
  ixheaace_mps_bit_reversal(&subband[11], &subband[52]);
744
4.09M
  ixheaace_mps_bit_reversal(&subband[13], &subband[44]);
745
4.09M
  ixheaace_mps_bit_reversal(&subband[14], &subband[28]);
746
4.09M
  ixheaace_mps_bit_reversal(&subband[15], &subband[60]);
747
4.09M
  ixheaace_mps_bit_reversal(&subband[17], &subband[34]);
748
4.09M
  ixheaace_mps_bit_reversal(&subband[19], &subband[50]);
749
4.09M
  ixheaace_mps_bit_reversal(&subband[21], &subband[42]);
750
4.09M
  ixheaace_mps_bit_reversal(&subband[22], &subband[26]);
751
4.09M
  ixheaace_mps_bit_reversal(&subband[23], &subband[58]);
752
4.09M
  ixheaace_mps_bit_reversal(&subband[25], &subband[38]);
753
4.09M
  ixheaace_mps_bit_reversal(&subband[27], &subband[54]);
754
4.09M
  ixheaace_mps_bit_reversal(&subband[29], &subband[46]);
755
4.09M
  ixheaace_mps_bit_reversal(&subband[31], &subband[62]);
756
4.09M
  ixheaace_mps_bit_reversal(&subband[35], &subband[49]);
757
4.09M
  ixheaace_mps_bit_reversal(&subband[37], &subband[41]);
758
4.09M
  ixheaace_mps_bit_reversal(&subband[39], &subband[57]);
759
4.09M
  ixheaace_mps_bit_reversal(&subband[43], &subband[53]);
760
4.09M
  ixheaace_mps_bit_reversal(&subband[47], &subband[61]);
761
4.09M
  ixheaace_mps_bit_reversal(&subband[55], &subband[59]);
762
763
4.09M
  ixheaace_mps_bit_add_sub1(&subband[33], &subband[62]);
764
4.09M
  ixheaace_mps_bit_add_sub1(&subband[34], &subband[60]);
765
4.09M
  ixheaace_mps_bit_add_sub1(&subband[35], &subband[61]);
766
4.09M
  ixheaace_mps_bit_add_sub1(&subband[36], &subband[56]);
767
4.09M
  ixheaace_mps_bit_add_sub1(&subband[37], &subband[57]);
768
4.09M
  ixheaace_mps_bit_add_sub1(&subband[38], &subband[58]);
769
4.09M
  ixheaace_mps_bit_add_sub1(&subband[39], &subband[59]);
770
4.09M
  ixheaace_mps_bit_add_sub1(&subband[40], &subband[48]);
771
4.09M
  ixheaace_mps_bit_add_sub1(&subband[41], &subband[49]);
772
4.09M
  ixheaace_mps_bit_add_sub1(&subband[42], &subband[50]);
773
4.09M
  ixheaace_mps_bit_add_sub1(&subband[43], &subband[51]);
774
4.09M
  ixheaace_mps_bit_add_sub1(&subband[44], &subband[52]);
775
4.09M
  ixheaace_mps_bit_add_sub1(&subband[45], &subband[53]);
776
4.09M
  ixheaace_mps_bit_add_sub1(&subband[46], &subband[54]);
777
4.09M
  ixheaace_mps_bit_add_sub1(&subband[47], &subband[55]);
778
4.09M
  ixheaace_mps_bit_add_sub1(&subband[17], &subband[30]);
779
4.09M
  ixheaace_mps_bit_add_sub1(&subband[18], &subband[28]);
780
4.09M
  ixheaace_mps_bit_add_sub1(&subband[19], &subband[29]);
781
4.09M
  ixheaace_mps_bit_add_sub1(&subband[20], &subband[24]);
782
4.09M
  ixheaace_mps_bit_add_sub1(&subband[21], &subband[25]);
783
4.09M
  ixheaace_mps_bit_add_sub1(&subband[22], &subband[26]);
784
4.09M
  ixheaace_mps_bit_add_sub1(&subband[23], &subband[27]);
785
4.09M
  ixheaace_mps_bit_add_sub1(&subband[9], &subband[14]);
786
4.09M
  ixheaace_mps_bit_add_sub1(&subband[10], &subband[12]);
787
4.09M
  ixheaace_mps_bit_add_sub1(&subband[11], &subband[13]);
788
4.09M
  ixheaace_mps_bit_add_sub1(&subband[41], &subband[46]);
789
4.09M
  ixheaace_mps_bit_add_sub1(&subband[42], &subband[44]);
790
4.09M
  ixheaace_mps_bit_add_sub1(&subband[43], &subband[45]);
791
4.09M
  ixheaace_mps_bit_add_sub1(&subband[54], &subband[49]);
792
4.09M
  ixheaace_mps_bit_add_sub1(&subband[52], &subband[50]);
793
4.09M
  ixheaace_mps_bit_add_sub1(&subband[53], &subband[51]);
794
4.09M
  ixheaace_mps_bit_add_sub1(&subband[5], &subband[6]);
795
4.09M
  ixheaace_mps_bit_add_sub1(&subband[21], &subband[22]);
796
4.09M
  ixheaace_mps_bit_add_sub1(&subband[26], &subband[25]);
797
4.09M
  ixheaace_mps_bit_add_sub1(&subband[37], &subband[38]);
798
4.09M
  ixheaace_mps_bit_add_sub1(&subband[58], &subband[57]);
799
800
4.09M
  ixheaace_mps_fct3_4(subband);
801
4.09M
  ixheaace_mps_fct4_4r(subband + 4);
802
4.09M
  ixheaace_mps_fct3_4(subband + 8);
803
4.09M
  ixheaace_mps_fst3_4r(subband + 12);
804
4.09M
  ixheaace_mps_fct3_4(subband + 16);
805
4.09M
  ixheaace_mps_fct4_4r(subband + 20);
806
4.09M
  ixheaace_mps_fst4_4(subband + 24);
807
4.09M
  ixheaace_mps_fst3_4r(subband + 28);
808
4.09M
  ixheaace_mps_fct3_4(subband + 32);
809
4.09M
  ixheaace_mps_fct4_4r(subband + 36);
810
4.09M
  ixheaace_mps_fct3_4(subband + 40);
811
4.09M
  ixheaace_mps_fst3_4r(subband + 44);
812
4.09M
  ixheaace_mps_fct3_4(subband + 48);
813
4.09M
  ixheaace_mps_fst3_4r(subband + 52);
814
4.09M
  ixheaace_mps_fst4_4(subband + 56);
815
4.09M
  ixheaace_mps_fst3_4r(subband + 60);
816
817
20.4M
  for (idx = 0; idx < 4; idx++) {
818
16.3M
    ixheaace_mps_bit_add_sub2(&subband[idx], &subband[7 - idx]);
819
16.3M
    ixheaace_mps_bit_add_sub2(&subband[16 + idx], &subband[23 - idx]);
820
16.3M
    ixheaace_mps_bit_add_sub1(&subband[31 - idx], &subband[24 + idx]);
821
16.3M
    ixheaace_mps_bit_add_sub2(&subband[32 + idx], &subband[39 - idx]);
822
16.3M
    ixheaace_mps_bit_add_sub1(&subband[63 - idx], &subband[56 + idx]);
823
16.3M
  }
824
4.09M
  t_ptr = trig_data_fct4_8;
825
826
20.4M
  for (idx = 0; idx < 4; idx++) {
827
16.3M
    cos_val = *t_ptr++;
828
16.3M
    sine_val = *t_ptr++;
829
830
16.3M
    xp = subband[8 + idx] * cos_val + subband[15 - idx] * sine_val;
831
16.3M
    subband[8 + idx] = subband[8 + idx] * sine_val - subband[15 - idx] * cos_val;
832
16.3M
    subband[15 - idx] = xp;
833
16.3M
    xp = subband[40 + idx] * cos_val + subband[47 - idx] * sine_val;
834
16.3M
    subband[40 + idx] = subband[40 + idx] * sine_val - subband[47 - idx] * cos_val;
835
16.3M
    subband[47 - idx] = xp;
836
16.3M
    xp = subband[48 + idx] * sine_val + subband[55 - idx] * cos_val;
837
16.3M
    subband[55 - idx] = subband[48 + idx] * cos_val - subband[55 - idx] * sine_val;
838
16.3M
    subband[48 + idx] = xp;
839
16.3M
  }
840
841
36.8M
  for (idx = 0; idx < 8; idx++) {
842
32.7M
    ixheaace_mps_bit_add_sub2(&subband[idx], &subband[15 - idx]);
843
32.7M
    ixheaace_mps_bit_add_sub2(&subband[32 + idx], &subband[47 - idx]);
844
32.7M
    ixheaace_mps_bit_add_sub1(&subband[63 - idx], &subband[48 + idx]);
845
32.7M
  }
846
847
4.09M
  t_ptr = trig_data_fct4_16;
848
849
36.8M
  for (idx = 0; idx < 8; idx++) {
850
32.7M
    cos_val = *t_ptr++;
851
32.7M
    sine_val = *t_ptr++;
852
853
32.7M
    xp = subband[16 + idx] * cos_val + subband[31 - idx] * sine_val;
854
32.7M
    subband[16 + idx] = subband[16 + idx] * sine_val - subband[31 - idx] * cos_val;
855
32.7M
    subband[31 - idx] = xp;
856
32.7M
  }
857
858
69.5M
  for (idx = 0; idx < 16; idx++) {
859
65.4M
    ixheaace_mps_bit_add_sub2(&subband[idx], &subband[31 - idx]);
860
65.4M
  }
861
862
4.09M
  t_ptr = trig_data_fct4_32;
863
864
69.5M
  for (idx = 0; idx < 16; idx++) {
865
65.4M
    cos_val = *t_ptr++;
866
65.4M
    sine_val = *t_ptr++;
867
868
65.4M
    xp = subband[32 + idx] * cos_val + subband[63 - idx] * sine_val;
869
65.4M
    subband[32 + idx] = subband[32 + idx] * sine_val - subband[63 - idx] * cos_val;
870
65.4M
    subband[63 - idx] = xp;
871
65.4M
  }
872
873
135M
  for (idx = 0; idx < 32; idx++) {
874
130M
    ixheaace_mps_bit_add_sub2(&subband[idx], &subband[63 - idx]);
875
130M
  }
876
4.09M
}
877
878
2.04M
static VOID ixheaace_mps_fst3_64(FLOAT32 *subband) {
879
2.04M
  WORD32 k;
880
881
67.5M
  for (k = 0; k < 32; k++) {
882
65.4M
    ixheaace_mps_bit_reversal(&subband[k], &subband[63 - k]);
883
65.4M
  }
884
885
2.04M
  ixheaace_mps_fct3_64(subband);
886
887
67.5M
  for (k = 1; k < NUM_QMF_BANDS; k += 2) {
888
65.4M
    subband[k] = -subband[k];
889
65.4M
  }
890
2.04M
}
891
892
static VOID ixheaace_mps_forward_modulation(const FLOAT32 *time_in, FLOAT32 *real_subband,
893
2.04M
                                            FLOAT32 *imag_subband) {
894
2.04M
  WORD32 idx;
895
2.04M
  real_subband[0] = time_in[0];
896
897
130M
  for (idx = 1; idx < NUM_QMF_BANDS; idx++) {
898
128M
    real_subband[idx] = time_in[idx] - time_in[(NUM_QMF_BANDS * 2) - idx];
899
128M
    imag_subband[idx - 1] = time_in[idx] + time_in[(NUM_QMF_BANDS * 2) - idx];
900
128M
  }
901
902
2.04M
  imag_subband[63] = time_in[NUM_QMF_BANDS];
903
904
2.04M
  ixheaace_mps_fct3_64(real_subband);
905
906
2.04M
  ixheaace_mps_fst3_64(imag_subband);
907
2.04M
}
908
909
VOID ixheaace_mps_515_calculate_sbr_syn_filterbank(
910
    FLOAT32 *real_subband, FLOAT32 *imag_subband, FLOAT32 *time_sig, WORD32 channel,
911
    ixheaace_mps_sac_pstr_qmf_synth_filter_bank pstr_qmf_synth_filter_bank, WORD32 slots,
912
36.1k
    FLOAT32 *sbr_qmf_states_synthesis_per) {
913
36.1k
  WORD32 idx, subband, slot;
914
36.1k
  const FLOAT32 *ptr_filter;
915
36.1k
  FLOAT32 accumlate;
916
36.1k
  FLOAT32 *synth_buf;
917
918
36.1k
  synth_buf = &(sbr_qmf_states_synthesis_per[channel * QMF_FILTER_STATE_SYN_SIZE]);
919
920
596k
  for (slot = 0; slot < slots; slot++) {
921
560k
    ptr_filter = pstr_qmf_synth_filter_bank->p_filter;
922
560k
    ixheaace_mps_inverse_modulation(real_subband + NUM_QMF_BANDS * slot,
923
560k
                                    imag_subband + NUM_QMF_BANDS * slot,
924
560k
                                    pstr_qmf_synth_filter_bank);
925
926
36.4M
    for (subband = 0; subband < NUM_QMF_BANDS; subband++) {
927
35.8M
      real_subband[NUM_QMF_BANDS * slot + subband] =
928
35.8M
          real_subband[NUM_QMF_BANDS * slot + subband] * (-0.015625f);
929
35.8M
      imag_subband[NUM_QMF_BANDS * slot + subband] =
930
35.8M
          imag_subband[NUM_QMF_BANDS * slot + subband] * (-0.015625f);
931
35.8M
    }
932
933
36.4M
    for (subband = 0; subband < NUM_QMF_BANDS; subband++) {
934
35.8M
      FLOAT32 new_sample;
935
35.8M
      new_sample = imag_subband[NUM_QMF_BANDS * slot + 63 - subband];
936
937
215M
      for (idx = 0; idx < 5; idx++) {
938
179M
        accumlate = synth_buf[2 * idx * NUM_QMF_BANDS + subband] + (*ptr_filter++) * new_sample;
939
179M
        synth_buf[2 * idx * NUM_QMF_BANDS + subband] = accumlate;
940
179M
      }
941
35.8M
    }
942
943
3.36M
    for (idx = 0; idx < 5; idx++) {
944
2.80M
      accumlate = synth_buf[2 * idx * NUM_QMF_BANDS + NUM_QMF_BANDS + (NUM_QMF_BANDS - 1)] +
945
2.80M
                  (*ptr_filter++) * real_subband[NUM_QMF_BANDS * slot];
946
2.80M
      synth_buf[2 * idx * NUM_QMF_BANDS + NUM_QMF_BANDS + (NUM_QMF_BANDS - 1)] = accumlate;
947
2.80M
    }
948
560k
    time_sig[0] = accumlate;
949
950
560k
    ptr_filter -= 10;
951
952
35.8M
    for (subband = 0; subband < 63; subband++) {
953
35.3M
      FLOAT32 new_sample;
954
955
35.3M
      new_sample = real_subband[NUM_QMF_BANDS * slot + 63 - subband];
956
957
211M
      for (idx = 0; idx < 5; idx++) {
958
176M
        accumlate = synth_buf[2 * idx * NUM_QMF_BANDS + NUM_QMF_BANDS + subband] +
959
176M
                    (*--ptr_filter) * new_sample;
960
176M
        synth_buf[2 * idx * NUM_QMF_BANDS + NUM_QMF_BANDS + subband] = accumlate;
961
176M
      }
962
963
35.3M
      time_sig[NUM_QMF_BANDS - 1 - subband] = accumlate;
964
35.3M
    }
965
966
560k
    time_sig += NUM_QMF_BANDS;
967
968
560k
    memmove((synth_buf + NUM_QMF_BANDS), synth_buf, (640 - NUM_QMF_BANDS) * sizeof(FLOAT32));
969
970
560k
    memset((synth_buf), 0, NUM_QMF_BANDS * sizeof(FLOAT32));
971
560k
  }
972
36.1k
}
973
974
VOID ixheaace_mps_515_calculate_ana_filterbank(
975
    ixheaace_mps_sac_sbr_encoder_ana_filter_bank *pstr_sbr_enc_ana_filter_bank, FLOAT32 *time_sig,
976
    FLOAT32 *real_subband, FLOAT32 *imag_subband,
977
2.04M
    ixheaace_mps_sac_pstr_qmf_ana_filter_bank pstr_qmf_synth_filter_bank) {
978
2.04M
  WORD32 idx;
979
2.04M
  FLOAT32 temp_array[128];
980
2.04M
  const FLOAT32 *ptr_filter = pstr_qmf_synth_filter_bank->p_filter;
981
2.04M
  FLOAT32 accumlate;
982
983
1.18G
  for (idx = 0; idx < 576; idx++) {
984
1.17G
    pstr_sbr_enc_ana_filter_bank->x[idx] = pstr_sbr_enc_ana_filter_bank->x[idx + NUM_QMF_BANDS];
985
1.17G
  }
986
132M
  for (idx = 0; idx < NUM_QMF_BANDS; idx++) {
987
130M
    pstr_sbr_enc_ana_filter_bank->x[idx + 576] = time_sig[idx];
988
130M
  }
989
990
132M
  for (idx = 0; idx < NUM_QMF_BANDS; idx++) {
991
130M
    accumlate = 0.0f;
992
130M
    accumlate += (*ptr_filter++ * pstr_sbr_enc_ana_filter_bank->x[idx]);
993
130M
    accumlate += (*ptr_filter++ * pstr_sbr_enc_ana_filter_bank->x[idx + (NUM_QMF_BANDS * 2)]);
994
130M
    accumlate += (*ptr_filter++ * pstr_sbr_enc_ana_filter_bank->x[idx + (NUM_QMF_BANDS * 4)]);
995
130M
    accumlate += (*ptr_filter++ * pstr_sbr_enc_ana_filter_bank->x[idx + (NUM_QMF_BANDS * 6)]);
996
130M
    accumlate += (*ptr_filter++ * pstr_sbr_enc_ana_filter_bank->x[idx + (NUM_QMF_BANDS * 8)]);
997
130M
    temp_array[127 - idx] = accumlate;
998
130M
  }
999
1000
2.04M
  accumlate = 0.0f;
1001
12.2M
  for (idx = 0; idx < 5; idx++) {
1002
10.2M
    accumlate +=
1003
10.2M
        (*ptr_filter++ * pstr_sbr_enc_ana_filter_bank->x[127 + idx * (NUM_QMF_BANDS * 2)]);
1004
10.2M
  }
1005
2.04M
  temp_array[0] = accumlate;
1006
1007
2.04M
  ptr_filter -= 10;
1008
130M
  for (idx = 0; idx < 63; idx++) {
1009
128M
    accumlate = 0.0f;
1010
128M
    accumlate += (*--ptr_filter * pstr_sbr_enc_ana_filter_bank->x[NUM_QMF_BANDS + idx]);
1011
128M
    accumlate += (*--ptr_filter *
1012
128M
                  pstr_sbr_enc_ana_filter_bank->x[NUM_QMF_BANDS + idx + (NUM_QMF_BANDS * 2)]);
1013
128M
    accumlate += (*--ptr_filter *
1014
128M
                  pstr_sbr_enc_ana_filter_bank->x[NUM_QMF_BANDS + idx + (NUM_QMF_BANDS * 4)]);
1015
128M
    accumlate += (*--ptr_filter *
1016
128M
                  pstr_sbr_enc_ana_filter_bank->x[NUM_QMF_BANDS + idx + (NUM_QMF_BANDS * 6)]);
1017
128M
    accumlate += (*--ptr_filter *
1018
128M
                  pstr_sbr_enc_ana_filter_bank->x[NUM_QMF_BANDS + idx + (NUM_QMF_BANDS * 8)]);
1019
128M
    temp_array[63 - idx] = accumlate;
1020
128M
  }
1021
1022
2.04M
  ixheaace_mps_forward_modulation(temp_array, real_subband, imag_subband);
1023
2.04M
}