Coverage Report

Created: 2026-07-25 07:52

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/fdk-aac/libFDK/src/dct.cpp
Line
Count
Source
1
/* -----------------------------------------------------------------------------
2
Software License for The Fraunhofer FDK AAC Codec Library for Android
3
4
© Copyright  1995 - 2020 Fraunhofer-Gesellschaft zur Förderung der angewandten
5
Forschung e.V. All rights reserved.
6
7
 1.    INTRODUCTION
8
The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software
9
that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding
10
scheme for digital audio. This FDK AAC Codec software is intended to be used on
11
a wide variety of Android devices.
12
13
AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient
14
general perceptual audio codecs. AAC-ELD is considered the best-performing
15
full-bandwidth communications codec by independent studies and is widely
16
deployed. AAC has been standardized by ISO and IEC as part of the MPEG
17
specifications.
18
19
Patent licenses for necessary patent claims for the FDK AAC Codec (including
20
those of Fraunhofer) may be obtained through Via Licensing
21
(www.vialicensing.com) or through the respective patent owners individually for
22
the purpose of encoding or decoding bit streams in products that are compliant
23
with the ISO/IEC MPEG audio standards. Please note that most manufacturers of
24
Android devices already license these patent claims through Via Licensing or
25
directly from the patent owners, and therefore FDK AAC Codec software may
26
already be covered under those patent licenses when it is used for those
27
licensed purposes only.
28
29
Commercially-licensed AAC software libraries, including floating-point versions
30
with enhanced sound quality, are also available from Fraunhofer. Users are
31
encouraged to check the Fraunhofer website for additional applications
32
information and documentation.
33
34
2.    COPYRIGHT LICENSE
35
36
Redistribution and use in source and binary forms, with or without modification,
37
are permitted without payment of copyright license fees provided that you
38
satisfy the following conditions:
39
40
You must retain the complete text of this software license in redistributions of
41
the FDK AAC Codec or your modifications thereto in source code form.
42
43
You must retain the complete text of this software license in the documentation
44
and/or other materials provided with redistributions of the FDK AAC Codec or
45
your modifications thereto in binary form. You must make available free of
46
charge copies of the complete source code of the FDK AAC Codec and your
47
modifications thereto to recipients of copies in binary form.
48
49
The name of Fraunhofer may not be used to endorse or promote products derived
50
from this library without prior written permission.
51
52
You may not charge copyright license fees for anyone to use, copy or distribute
53
the FDK AAC Codec software or your modifications thereto.
54
55
Your modified versions of the FDK AAC Codec must carry prominent notices stating
56
that you changed the software and the date of any change. For modified versions
57
of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android"
58
must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK
59
AAC Codec Library for Android."
60
61
3.    NO PATENT LICENSE
62
63
NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without
64
limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE.
65
Fraunhofer provides no warranty of patent non-infringement with respect to this
66
software.
67
68
You may use this FDK AAC Codec software or modifications thereto only for
69
purposes that are authorized by appropriate patent licenses.
70
71
4.    DISCLAIMER
72
73
This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright
74
holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
75
including but not limited to the implied warranties of merchantability and
76
fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
77
CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary,
78
or consequential damages, including but not limited to procurement of substitute
79
goods or services; loss of use, data, or profits, or business interruption,
80
however caused and on any theory of liability, whether in contract, strict
81
liability, or tort (including negligence), arising in any way out of the use of
82
this software, even if advised of the possibility of such damage.
83
84
5.    CONTACT INFORMATION
85
86
Fraunhofer Institute for Integrated Circuits IIS
87
Attention: Audio and Multimedia Departments - FDK AAC LL
88
Am Wolfsmantel 33
89
91058 Erlangen, Germany
90
91
www.iis.fraunhofer.de/amm
92
amm-info@iis.fraunhofer.de
93
----------------------------------------------------------------------------- */
94
95
/******************* Library for basic calculation routines ********************
96
97
   Author(s):
98
99
   Description:
100
101
*******************************************************************************/
102
103
/*!
104
  \file   dct.cpp
105
  \brief  DCT Implementations
106
  Library functions to calculate standard DCTs. This will most likely be
107
  replaced by hand-optimized functions for the specific target processor.
108
109
  Three different implementations of the dct type II and the dct type III
110
  transforms are provided.
111
112
  By default implementations which are based on a single, standard complex
113
  FFT-kernel are used (dctII_f() and dctIII_f()). These are specifically helpful
114
  in cases where optimized FFT libraries are already available. The FFT used in
115
  these implementation is FFT rad2 from FDK_tools.
116
117
  Of course, one might also use DCT-libraries should they be available. The DCT
118
  and DST type IV implementations are only available in a version based on a
119
  complex FFT kernel.
120
*/
121
122
#include "dct.h"
123
124
#include "FDK_tools_rom.h"
125
#include "fft.h"
126
127
void dct_getTables(const FIXP_WTP **ptwiddle, const FIXP_STP **sin_twiddle,
128
268M
                   int *sin_step, int length) {
129
268M
  const FIXP_WTP *twiddle;
130
268M
  int ld2_length;
131
132
  /* Get ld2 of length - 2 + 1
133
      -2: because first table entry is window of size 4
134
      +1: because we already include +1 because of ceil(log2(length)) */
135
268M
  ld2_length = DFRACT_BITS - 1 - fNormz((FIXP_DBL)length) - 1;
136
137
  /* Extract sort of "eigenvalue" (the 4 left most bits) of length. */
138
268M
  switch ((length) >> (ld2_length - 1)) {
139
193M
    case 0x4: /* radix 2 */
140
193M
      *sin_twiddle = SineTable1024;
141
193M
      *sin_step = 1 << (10 - ld2_length);
142
193M
      twiddle = windowSlopes[0][0][ld2_length - 1];
143
193M
      break;
144
1.73M
    case 0x7: /* 10 ms */
145
1.73M
      *sin_twiddle = SineTable480;
146
1.73M
      *sin_step = 1 << (8 - ld2_length);
147
1.73M
      twiddle = windowSlopes[0][1][ld2_length];
148
1.73M
      break;
149
72.9M
    case 0x6: /* 3/4 of radix 2 */
150
72.9M
      *sin_twiddle = SineTable384;
151
72.9M
      *sin_step = 1 << (8 - ld2_length);
152
72.9M
      twiddle = windowSlopes[0][2][ld2_length];
153
72.9M
      break;
154
464k
    case 0x5: /* 5/16 of radix 2*/
155
464k
      *sin_twiddle = SineTable80;
156
464k
      *sin_step = 1 << (6 - ld2_length);
157
464k
      twiddle = windowSlopes[0][3][ld2_length];
158
464k
      break;
159
0
    default:
160
0
      *sin_twiddle = NULL;
161
0
      *sin_step = 0;
162
0
      twiddle = NULL;
163
0
      break;
164
268M
  }
165
166
268M
  if (ptwiddle != NULL) {
167
244M
    FDK_ASSERT(twiddle != NULL);
168
244M
    *ptwiddle = twiddle;
169
244M
  }
170
171
268M
  FDK_ASSERT(*sin_step > 0);
172
268M
}
173
174
#if !defined(FUNCTION_dct_III)
175
void dct_III(FIXP_DBL *pDat, /*!< pointer to input/output */
176
             FIXP_DBL *tmp,  /*!< pointer to temporal working buffer */
177
             int L,          /*!< lenght of transform */
178
10.0M
             int *pDat_e) {
179
10.0M
  const FIXP_WTP *sin_twiddle;
180
10.0M
  int i;
181
10.0M
  FIXP_DBL xr, accu1, accu2;
182
10.0M
  int inc, index;
183
10.0M
  int M = L >> 1;
184
185
10.0M
  FDK_ASSERT(L % 4 == 0);
186
10.0M
  dct_getTables(NULL, &sin_twiddle, &inc, L);
187
10.0M
  inc >>= 1;
188
189
10.0M
  FIXP_DBL *pTmp_0 = &tmp[2];
190
10.0M
  FIXP_DBL *pTmp_1 = &tmp[(M - 1) * 2];
191
192
10.0M
  index = 4 * inc;
193
194
  /* This loop performs multiplication for index i (i*inc) */
195
80.2M
  for (i = 1; i<M>> 1; i++, pTmp_0 += 2, pTmp_1 -= 2) {
196
70.2M
    FIXP_DBL accu3, accu4, accu5, accu6;
197
198
70.2M
    cplxMultDiv2(&accu2, &accu1, pDat[L - i], pDat[i], sin_twiddle[i * inc]);
199
70.2M
    cplxMultDiv2(&accu4, &accu3, pDat[M + i], pDat[M - i],
200
70.2M
                 sin_twiddle[(M - i) * inc]);
201
70.2M
    accu3 >>= 1;
202
70.2M
    accu4 >>= 1;
203
204
    /* This method is better for ARM926, that uses operand2 shifted right by 1
205
     * always */
206
70.2M
    if (2 * i < (M / 2)) {
207
30.1M
      cplxMultDiv2(&accu6, &accu5, (accu3 - (accu1 >> 1)),
208
30.1M
                   ((accu2 >> 1) + accu4), sin_twiddle[index]);
209
40.1M
    } else {
210
40.1M
      cplxMultDiv2(&accu6, &accu5, ((accu2 >> 1) + accu4),
211
40.1M
                   (accu3 - (accu1 >> 1)), sin_twiddle[index]);
212
40.1M
      accu6 = -accu6;
213
40.1M
    }
214
70.2M
    xr = (accu1 >> 1) + accu3;
215
70.2M
    pTmp_0[0] = (xr >> 1) - accu5;
216
70.2M
    pTmp_1[0] = (xr >> 1) + accu5;
217
218
70.2M
    xr = (accu2 >> 1) - accu4;
219
70.2M
    pTmp_0[1] = (xr >> 1) - accu6;
220
70.2M
    pTmp_1[1] = -((xr >> 1) + accu6);
221
222
    /* Create index helper variables for (4*i)*inc indexed equivalent values of
223
     * short tables. */
224
70.2M
    if (2 * i < ((M / 2) - 1)) {
225
30.1M
      index += 4 * inc;
226
40.1M
    } else if (2 * i >= ((M / 2))) {
227
40.1M
      index -= 4 * inc;
228
40.1M
    }
229
70.2M
  }
230
231
10.0M
  xr = fMultDiv2(pDat[M], sin_twiddle[M * inc].v.re); /* cos((PI/(2*L))*M); */
232
10.0M
  tmp[0] = ((pDat[0] >> 1) + xr) >> 1;
233
10.0M
  tmp[1] = ((pDat[0] >> 1) - xr) >> 1;
234
235
10.0M
  cplxMultDiv2(&accu2, &accu1, pDat[L - (M / 2)], pDat[M / 2],
236
10.0M
               sin_twiddle[M * inc / 2]);
237
10.0M
  tmp[M] = accu1 >> 1;
238
10.0M
  tmp[M + 1] = accu2 >> 1;
239
240
  /* dit_fft expects 1 bit scaled input values */
241
10.0M
  fft(M, tmp, pDat_e);
242
243
  /* ARM926: 12 cycles per 2-iteration, no overhead code by compiler */
244
10.0M
  pTmp_1 = &tmp[L];
245
90.3M
  for (i = M >> 1; i--;) {
246
80.2M
    FIXP_DBL tmp1, tmp2, tmp3, tmp4;
247
80.2M
    tmp1 = *tmp++;
248
80.2M
    tmp2 = *tmp++;
249
80.2M
    tmp3 = *--pTmp_1;
250
80.2M
    tmp4 = *--pTmp_1;
251
80.2M
    *pDat++ = tmp1;
252
80.2M
    *pDat++ = tmp3;
253
80.2M
    *pDat++ = tmp2;
254
80.2M
    *pDat++ = tmp4;
255
80.2M
  }
256
257
10.0M
  *pDat_e += 2;
258
10.0M
}
259
260
void dst_III(FIXP_DBL *pDat, /*!< pointer to input/output */
261
             FIXP_DBL *tmp,  /*!< pointer to temporal working buffer */
262
             int L,          /*!< lenght of transform */
263
0
             int *pDat_e) {
264
0
  int L2 = L >> 1;
265
0
  int i;
266
0
  FIXP_DBL t;
267
268
  /* note: DCT III is reused here, direct DST III implementation might be more
269
   * efficient */
270
271
  /* mirror input */
272
0
  for (i = 0; i < L2; i++) {
273
0
    t = pDat[i];
274
0
    pDat[i] = pDat[L - 1 - i];
275
0
    pDat[L - 1 - i] = t;
276
0
  }
277
278
  /* DCT-III */
279
0
  dct_III(pDat, tmp, L, pDat_e);
280
281
  /* flip signs at odd indices */
282
0
  for (i = 1; i < L; i += 2) pDat[i] = -pDat[i];
283
0
}
284
285
#endif
286
287
#if !defined(FUNCTION_dct_II)
288
void dct_II(
289
    FIXP_DBL *pDat, /*!< pointer to input/output */
290
    FIXP_DBL *tmp,  /*!< pointer to temporal working buffer */
291
    int L, /*!< lenght of transform (has to be a multiple of 8 (or 4 in case
292
              DCT_II_L_MULTIPLE_OF_4_SUPPORT is defined) */
293
13.8M
    int *pDat_e) {
294
13.8M
  const FIXP_WTP *sin_twiddle;
295
13.8M
  FIXP_DBL accu1, accu2;
296
13.8M
  FIXP_DBL *pTmp_0, *pTmp_1;
297
298
13.8M
  int i;
299
13.8M
  int inc, index = 0;
300
13.8M
  int M = L >> 1;
301
302
13.8M
  FDK_ASSERT(L % 4 == 0);
303
13.8M
  dct_getTables(NULL, &sin_twiddle, &inc, L);
304
13.8M
  inc >>= 1;
305
306
13.8M
  {
307
360M
    for (i = 0; i < M; i++) {
308
346M
      tmp[i] = pDat[2 * i] >> 2;
309
346M
      tmp[L - 1 - i] = pDat[2 * i + 1] >> 2;
310
346M
    }
311
13.8M
  }
312
313
13.8M
  fft(M, tmp, pDat_e);
314
315
13.8M
  pTmp_0 = &tmp[2];
316
13.8M
  pTmp_1 = &tmp[(M - 1) * 2];
317
318
13.8M
  index = inc * 4;
319
320
173M
  for (i = 1; i<M>> 1; i++, pTmp_0 += 2, pTmp_1 -= 2) {
321
159M
    FIXP_DBL a1, a2;
322
159M
    FIXP_DBL accu3, accu4;
323
324
159M
    a1 = ((pTmp_0[1] >> 1) + (pTmp_1[1] >> 1));
325
159M
    a2 = ((pTmp_1[0] >> 1) - (pTmp_0[0] >> 1));
326
327
159M
    if (2 * i < (M / 2)) {
328
73.8M
      cplxMultDiv2(&accu1, &accu2, a2, a1, sin_twiddle[index]);
329
85.5M
    } else {
330
85.5M
      cplxMultDiv2(&accu1, &accu2, a1, a2, sin_twiddle[index]);
331
85.5M
      accu1 = -accu1;
332
85.5M
    }
333
159M
    accu1 <<= 1;
334
159M
    accu2 <<= 1;
335
336
159M
    a1 = ((pTmp_0[0] >> 1) + (pTmp_1[0] >> 1));
337
159M
    a2 = ((pTmp_0[1] >> 1) - (pTmp_1[1] >> 1));
338
339
159M
    cplxMult(&accu3, &accu4, (accu1 + a2), (a1 + accu2), sin_twiddle[i * inc]);
340
159M
    pDat[L - i] = -accu3;
341
159M
    pDat[i] = accu4;
342
343
159M
    cplxMult(&accu3, &accu4, (accu1 - a2), (a1 - accu2),
344
159M
             sin_twiddle[(M - i) * inc]);
345
159M
    pDat[M + i] = -accu3;
346
159M
    pDat[M - i] = accu4;
347
348
    /* Create index helper variables for (4*i)*inc indexed equivalent values of
349
     * short tables. */
350
159M
    if (2 * i < ((M / 2) - 1)) {
351
71.6M
      index += 4 * inc;
352
87.7M
    } else if (2 * i >= ((M / 2))) {
353
85.5M
      index -= 4 * inc;
354
85.5M
    }
355
159M
  }
356
357
13.8M
  cplxMult(&accu1, &accu2, tmp[M], tmp[M + 1], sin_twiddle[(M / 2) * inc]);
358
13.8M
  pDat[L - (M / 2)] = accu2;
359
13.8M
  pDat[M / 2] = accu1;
360
361
13.8M
  pDat[0] = tmp[0] + tmp[1];
362
13.8M
  pDat[M] = fMult(tmp[0] - tmp[1],
363
13.8M
                  sin_twiddle[M * inc].v.re); /* cos((PI/(2*L))*M); */
364
365
13.8M
  *pDat_e += 2;
366
13.8M
}
367
#endif
368
369
#if !defined(FUNCTION_dct_IV)
370
371
136M
void dct_IV(FIXP_DBL *pDat, int L, int *pDat_e) {
372
136M
  int sin_step = 0;
373
136M
  int M = L >> 1;
374
375
136M
  const FIXP_WTP *twiddle;
376
136M
  const FIXP_STP *sin_twiddle;
377
378
136M
  FDK_ASSERT(L >= 4);
379
380
136M
  FDK_ASSERT(L >= 4);
381
382
136M
  dct_getTables(&twiddle, &sin_twiddle, &sin_step, L);
383
384
136M
  {
385
136M
    FIXP_DBL *RESTRICT pDat_0 = &pDat[0];
386
136M
    FIXP_DBL *RESTRICT pDat_1 = &pDat[L - 2];
387
136M
    int i;
388
389
    /* 29 cycles on ARM926 */
390
2.20G
    for (i = 0; i < M - 1; i += 2, pDat_0 += 2, pDat_1 -= 2) {
391
2.07G
      FIXP_DBL accu1, accu2, accu3, accu4;
392
393
2.07G
      accu1 = pDat_1[1];
394
2.07G
      accu2 = pDat_0[0];
395
2.07G
      accu3 = pDat_0[1];
396
2.07G
      accu4 = pDat_1[0];
397
398
2.07G
      cplxMultDiv2(&accu1, &accu2, accu1, accu2, twiddle[i]);
399
2.07G
      cplxMultDiv2(&accu3, &accu4, accu4, accu3, twiddle[i + 1]);
400
401
2.07G
      pDat_0[0] = accu2 >> 1;
402
2.07G
      pDat_0[1] = accu1 >> 1;
403
2.07G
      pDat_1[0] = accu4 >> 1;
404
2.07G
      pDat_1[1] = -(accu3 >> 1);
405
2.07G
    }
406
136M
    if (M & 1) {
407
0
      FIXP_DBL accu1, accu2;
408
409
0
      accu1 = pDat_1[1];
410
0
      accu2 = pDat_0[0];
411
412
0
      cplxMultDiv2(&accu1, &accu2, accu1, accu2, twiddle[i]);
413
414
0
      pDat_0[0] = accu2 >> 1;
415
0
      pDat_0[1] = accu1 >> 1;
416
0
    }
417
136M
  }
418
419
136M
  fft(M, pDat, pDat_e);
420
421
136M
  {
422
136M
    FIXP_DBL *RESTRICT pDat_0 = &pDat[0];
423
136M
    FIXP_DBL *RESTRICT pDat_1 = &pDat[L - 2];
424
136M
    FIXP_DBL accu1, accu2, accu3, accu4;
425
136M
    int idx, i;
426
427
    /* Sin and Cos values are 0.0f and 1.0f */
428
136M
    accu1 = pDat_1[0];
429
136M
    accu2 = pDat_1[1];
430
431
136M
    pDat_1[1] = -pDat_0[1];
432
433
    /* 28 cycles for ARM926 */
434
2.07G
    for (idx = sin_step, i = 1; i<(M + 1)>> 1; i++, idx += sin_step) {
435
1.93G
      FIXP_STP twd = sin_twiddle[idx];
436
1.93G
      cplxMult(&accu3, &accu4, accu1, accu2, twd);
437
1.93G
      pDat_0[1] = accu3;
438
1.93G
      pDat_1[0] = accu4;
439
440
1.93G
      pDat_0 += 2;
441
1.93G
      pDat_1 -= 2;
442
443
1.93G
      cplxMult(&accu3, &accu4, pDat_0[1], pDat_0[0], twd);
444
445
1.93G
      accu1 = pDat_1[0];
446
1.93G
      accu2 = pDat_1[1];
447
448
1.93G
      pDat_1[1] = -accu3;
449
1.93G
      pDat_0[0] = accu4;
450
1.93G
    }
451
452
136M
    if ((M & 1) == 0) {
453
      /* Last Sin and Cos value pair are the same */
454
136M
      accu1 = fMult(accu1, WTC(0x5a82799a));
455
136M
      accu2 = fMult(accu2, WTC(0x5a82799a));
456
457
136M
      pDat_1[0] = accu1 + accu2;
458
136M
      pDat_0[1] = accu1 - accu2;
459
136M
    }
460
136M
  }
461
462
  /* Add twiddeling scale. */
463
136M
  *pDat_e += 2;
464
136M
}
465
#endif /* defined (FUNCTION_dct_IV) */
466
467
#if !defined(FUNCTION_dst_IV)
468
107M
void dst_IV(FIXP_DBL *pDat, int L, int *pDat_e) {
469
107M
  int sin_step = 0;
470
107M
  int M = L >> 1;
471
472
107M
  const FIXP_WTP *twiddle;
473
107M
  const FIXP_STP *sin_twiddle;
474
475
107M
  FDK_ASSERT(L >= 4);
476
477
107M
  FDK_ASSERT(L >= 4);
478
479
107M
  dct_getTables(&twiddle, &sin_twiddle, &sin_step, L);
480
481
107M
  {
482
107M
    FIXP_DBL *RESTRICT pDat_0 = &pDat[0];
483
107M
    FIXP_DBL *RESTRICT pDat_1 = &pDat[L - 2];
484
107M
    int i;
485
486
    /* 34 cycles on ARM926 */
487
1.31G
    for (i = 0; i < M - 1; i += 2, pDat_0 += 2, pDat_1 -= 2) {
488
1.20G
      FIXP_DBL accu1, accu2, accu3, accu4;
489
490
1.20G
      accu1 = pDat_1[1] >> 1;
491
1.20G
      accu2 = -(pDat_0[0] >> 1);
492
1.20G
      accu3 = pDat_0[1] >> 1;
493
1.20G
      accu4 = -(pDat_1[0] >> 1);
494
495
1.20G
      cplxMultDiv2(&accu1, &accu2, accu1, accu2, twiddle[i]);
496
1.20G
      cplxMultDiv2(&accu3, &accu4, accu4, accu3, twiddle[i + 1]);
497
498
1.20G
      pDat_0[0] = accu2;
499
1.20G
      pDat_0[1] = accu1;
500
1.20G
      pDat_1[0] = accu4;
501
1.20G
      pDat_1[1] = -accu3;
502
1.20G
    }
503
107M
    if (M & 1) {
504
0
      FIXP_DBL accu1, accu2;
505
506
0
      accu1 = pDat_1[1];
507
0
      accu2 = -pDat_0[0];
508
509
0
      cplxMultDiv2(&accu1, &accu2, accu1, accu2, twiddle[i]);
510
511
0
      pDat_0[0] = accu2 >> 1;
512
0
      pDat_0[1] = accu1 >> 1;
513
0
    }
514
107M
  }
515
516
107M
  fft(M, pDat, pDat_e);
517
518
107M
  {
519
107M
    FIXP_DBL *RESTRICT pDat_0;
520
107M
    FIXP_DBL *RESTRICT pDat_1;
521
107M
    FIXP_DBL accu1, accu2, accu3, accu4;
522
107M
    int idx, i;
523
524
107M
    pDat_0 = &pDat[0];
525
107M
    pDat_1 = &pDat[L - 2];
526
527
    /* Sin and Cos values are 0.0f and 1.0f */
528
107M
    accu1 = pDat_1[0];
529
107M
    accu2 = pDat_1[1];
530
531
107M
    pDat_1[1] = -pDat_0[0];
532
107M
    pDat_0[0] = pDat_0[1];
533
534
1.20G
    for (idx = sin_step, i = 1; i<(M + 1)>> 1; i++, idx += sin_step) {
535
1.10G
      FIXP_STP twd = sin_twiddle[idx];
536
537
1.10G
      cplxMult(&accu3, &accu4, accu1, accu2, twd);
538
1.10G
      pDat_1[0] = -accu3;
539
1.10G
      pDat_0[1] = -accu4;
540
541
1.10G
      pDat_0 += 2;
542
1.10G
      pDat_1 -= 2;
543
544
1.10G
      cplxMult(&accu3, &accu4, pDat_0[1], pDat_0[0], twd);
545
546
1.10G
      accu1 = pDat_1[0];
547
1.10G
      accu2 = pDat_1[1];
548
549
1.10G
      pDat_0[0] = accu3;
550
1.10G
      pDat_1[1] = -accu4;
551
1.10G
    }
552
553
107M
    if ((M & 1) == 0) {
554
      /* Last Sin and Cos value pair are the same */
555
107M
      accu1 = fMult(accu1, WTC(0x5a82799a));
556
107M
      accu2 = fMult(accu2, WTC(0x5a82799a));
557
558
107M
      pDat_0[1] = -accu1 - accu2;
559
107M
      pDat_1[0] = accu2 - accu1;
560
107M
    }
561
107M
  }
562
563
  /* Add twiddeling scale. */
564
107M
  *pDat_e += 2;
565
107M
}
566
#endif /* !defined(FUNCTION_dst_IV) */