1c55a96383497a772a307b346368133960b02ad03Eric Laurent/*
2c55a96383497a772a307b346368133960b02ad03Eric Laurent *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
3c55a96383497a772a307b346368133960b02ad03Eric Laurent *
4c55a96383497a772a307b346368133960b02ad03Eric Laurent *  Use of this source code is governed by a BSD-style license
5c55a96383497a772a307b346368133960b02ad03Eric Laurent *  that can be found in the LICENSE file in the root of the source
6c55a96383497a772a307b346368133960b02ad03Eric Laurent *  tree. An additional intellectual property rights grant can be found
7c55a96383497a772a307b346368133960b02ad03Eric Laurent *  in the file PATENTS.  All contributing project authors may
8c55a96383497a772a307b346368133960b02ad03Eric Laurent *  be found in the AUTHORS file in the root of the source tree.
9c55a96383497a772a307b346368133960b02ad03Eric Laurent */
10c55a96383497a772a307b346368133960b02ad03Eric Laurent
11c55a96383497a772a307b346368133960b02ad03Eric Laurent
12c55a96383497a772a307b346368133960b02ad03Eric Laurent/*
13c55a96383497a772a307b346368133960b02ad03Eric Laurent * This file contains the function WebRtcSpl_ComplexFFT().
14c55a96383497a772a307b346368133960b02ad03Eric Laurent * The description header can be found in signal_processing_library.h
15c55a96383497a772a307b346368133960b02ad03Eric Laurent *
16c55a96383497a772a307b346368133960b02ad03Eric Laurent */
17c55a96383497a772a307b346368133960b02ad03Eric Laurent
18c55a96383497a772a307b346368133960b02ad03Eric Laurent#include "signal_processing_library.h"
19c55a96383497a772a307b346368133960b02ad03Eric Laurent
20c55a96383497a772a307b346368133960b02ad03Eric Laurent#define CFFTSFT 14
21c55a96383497a772a307b346368133960b02ad03Eric Laurent#define CFFTRND 1
22c55a96383497a772a307b346368133960b02ad03Eric Laurent#define CFFTRND2 16384
23c55a96383497a772a307b346368133960b02ad03Eric Laurent
24c55a96383497a772a307b346368133960b02ad03Eric Laurent#define CIFFTSFT 14
25c55a96383497a772a307b346368133960b02ad03Eric Laurent#define CIFFTRND 1
26c55a96383497a772a307b346368133960b02ad03Eric Laurent
27c55a96383497a772a307b346368133960b02ad03Eric Laurentstatic const WebRtc_Word16 kSinTable1024[] = {
28c55a96383497a772a307b346368133960b02ad03Eric Laurent      0,    201,    402,    603,    804,   1005,   1206,   1406,
29c55a96383497a772a307b346368133960b02ad03Eric Laurent   1607,   1808,   2009,   2209,   2410,   2610,   2811,   3011,
30c55a96383497a772a307b346368133960b02ad03Eric Laurent   3211,   3411,   3611,   3811,   4011,   4210,   4409,   4608,
31c55a96383497a772a307b346368133960b02ad03Eric Laurent   4807,   5006,   5205,   5403,   5601,   5799,   5997,   6195,
32c55a96383497a772a307b346368133960b02ad03Eric Laurent   6392,   6589,   6786,   6982,   7179,   7375,   7571,   7766,
33c55a96383497a772a307b346368133960b02ad03Eric Laurent   7961,   8156,   8351,   8545,   8739,   8932,   9126,   9319,
34c55a96383497a772a307b346368133960b02ad03Eric Laurent   9511,   9703,   9895,  10087,  10278,  10469,  10659,  10849,
35c55a96383497a772a307b346368133960b02ad03Eric Laurent  11038,  11227,  11416,  11604,  11792,  11980,  12166,  12353,
36c55a96383497a772a307b346368133960b02ad03Eric Laurent  12539,  12724,  12909,  13094,  13278,  13462,  13645,  13827,
37c55a96383497a772a307b346368133960b02ad03Eric Laurent  14009,  14191,  14372,  14552,  14732,  14911,  15090,  15268,
38c55a96383497a772a307b346368133960b02ad03Eric Laurent  15446,  15623,  15799,  15975,  16150,  16325,  16499,  16672,
39c55a96383497a772a307b346368133960b02ad03Eric Laurent  16845,  17017,  17189,  17360,  17530,  17699,  17868,  18036,
40c55a96383497a772a307b346368133960b02ad03Eric Laurent  18204,  18371,  18537,  18702,  18867,  19031,  19194,  19357,
41c55a96383497a772a307b346368133960b02ad03Eric Laurent  19519,  19680,  19840,  20000,  20159,  20317,  20474,  20631,
42c55a96383497a772a307b346368133960b02ad03Eric Laurent  20787,  20942,  21096,  21249,  21402,  21554,  21705,  21855,
43c55a96383497a772a307b346368133960b02ad03Eric Laurent  22004,  22153,  22301,  22448,  22594,  22739,  22883,  23027,
44c55a96383497a772a307b346368133960b02ad03Eric Laurent  23169,  23311,  23452,  23592,  23731,  23869,  24006,  24143,
45c55a96383497a772a307b346368133960b02ad03Eric Laurent  24278,  24413,  24546,  24679,  24811,  24942,  25072,  25201,
46c55a96383497a772a307b346368133960b02ad03Eric Laurent  25329,  25456,  25582,  25707,  25831,  25954,  26077,  26198,
47c55a96383497a772a307b346368133960b02ad03Eric Laurent  26318,  26437,  26556,  26673,  26789,  26905,  27019,  27132,
48c55a96383497a772a307b346368133960b02ad03Eric Laurent  27244,  27355,  27466,  27575,  27683,  27790,  27896,  28001,
49c55a96383497a772a307b346368133960b02ad03Eric Laurent  28105,  28208,  28309,  28410,  28510,  28608,  28706,  28802,
50c55a96383497a772a307b346368133960b02ad03Eric Laurent  28897,  28992,  29085,  29177,  29268,  29358,  29446,  29534,
51c55a96383497a772a307b346368133960b02ad03Eric Laurent  29621,  29706,  29790,  29873,  29955,  30036,  30116,  30195,
52c55a96383497a772a307b346368133960b02ad03Eric Laurent  30272,  30349,  30424,  30498,  30571,  30643,  30713,  30783,
53c55a96383497a772a307b346368133960b02ad03Eric Laurent  30851,  30918,  30984,  31049,
54c55a96383497a772a307b346368133960b02ad03Eric Laurent  31113,  31175,  31236,  31297,
55c55a96383497a772a307b346368133960b02ad03Eric Laurent  31356,  31413,  31470,  31525,  31580,  31633,  31684,  31735,
56c55a96383497a772a307b346368133960b02ad03Eric Laurent  31785,  31833,  31880,  31926,  31970,  32014,  32056,  32097,
57c55a96383497a772a307b346368133960b02ad03Eric Laurent  32137,  32176,  32213,  32249,  32284,  32318,  32350,  32382,
58c55a96383497a772a307b346368133960b02ad03Eric Laurent  32412,  32441,  32468,  32495,  32520,  32544,  32567,  32588,
59c55a96383497a772a307b346368133960b02ad03Eric Laurent  32609,  32628,  32646,  32662,  32678,  32692,  32705,  32717,
60c55a96383497a772a307b346368133960b02ad03Eric Laurent  32727,  32736,  32744,  32751,  32757,  32761,  32764,  32766,
61c55a96383497a772a307b346368133960b02ad03Eric Laurent  32767,  32766,  32764,  32761,  32757,  32751,  32744,  32736,
62c55a96383497a772a307b346368133960b02ad03Eric Laurent  32727,  32717,  32705,  32692,  32678,  32662,  32646,  32628,
63c55a96383497a772a307b346368133960b02ad03Eric Laurent  32609,  32588,  32567,  32544,  32520,  32495,  32468,  32441,
64c55a96383497a772a307b346368133960b02ad03Eric Laurent  32412,  32382,  32350,  32318,  32284,  32249,  32213,  32176,
65c55a96383497a772a307b346368133960b02ad03Eric Laurent  32137,  32097,  32056,  32014,  31970,  31926,  31880,  31833,
66c55a96383497a772a307b346368133960b02ad03Eric Laurent  31785,  31735,  31684,  31633,  31580,  31525,  31470,  31413,
67c55a96383497a772a307b346368133960b02ad03Eric Laurent  31356,  31297,  31236,  31175,  31113,  31049,  30984,  30918,
68c55a96383497a772a307b346368133960b02ad03Eric Laurent  30851,  30783,  30713,  30643,  30571,  30498,  30424,  30349,
69c55a96383497a772a307b346368133960b02ad03Eric Laurent  30272,  30195,  30116,  30036,  29955,  29873,  29790,  29706,
70c55a96383497a772a307b346368133960b02ad03Eric Laurent  29621,  29534,  29446,  29358,  29268,  29177,  29085,  28992,
71c55a96383497a772a307b346368133960b02ad03Eric Laurent  28897,  28802,  28706,  28608,  28510,  28410,  28309,  28208,
72c55a96383497a772a307b346368133960b02ad03Eric Laurent  28105,  28001,  27896,  27790,  27683,  27575,  27466,  27355,
73c55a96383497a772a307b346368133960b02ad03Eric Laurent  27244,  27132,  27019,  26905,  26789,  26673,  26556,  26437,
74c55a96383497a772a307b346368133960b02ad03Eric Laurent  26318,  26198,  26077,  25954,  25831,  25707,  25582,  25456,
75c55a96383497a772a307b346368133960b02ad03Eric Laurent  25329,  25201,  25072,  24942,  24811,  24679,  24546,  24413,
76c55a96383497a772a307b346368133960b02ad03Eric Laurent  24278,  24143,  24006,  23869,  23731,  23592,  23452,  23311,
77c55a96383497a772a307b346368133960b02ad03Eric Laurent  23169,  23027,  22883,  22739,  22594,  22448,  22301,  22153,
78c55a96383497a772a307b346368133960b02ad03Eric Laurent  22004,  21855,  21705,  21554,  21402,  21249,  21096,  20942,
79c55a96383497a772a307b346368133960b02ad03Eric Laurent  20787,  20631,  20474,  20317,  20159,  20000,  19840,  19680,
80c55a96383497a772a307b346368133960b02ad03Eric Laurent  19519,  19357,  19194,  19031,  18867,  18702,  18537,  18371,
81c55a96383497a772a307b346368133960b02ad03Eric Laurent  18204,  18036,  17868,  17699,  17530,  17360,  17189,  17017,
82c55a96383497a772a307b346368133960b02ad03Eric Laurent  16845,  16672,  16499,  16325,  16150,  15975,  15799,  15623,
83c55a96383497a772a307b346368133960b02ad03Eric Laurent  15446,  15268,  15090,  14911,  14732,  14552,  14372,  14191,
84c55a96383497a772a307b346368133960b02ad03Eric Laurent  14009,  13827,  13645,  13462,  13278,  13094,  12909,  12724,
85c55a96383497a772a307b346368133960b02ad03Eric Laurent  12539,  12353,  12166,  11980,  11792,  11604,  11416,  11227,
86c55a96383497a772a307b346368133960b02ad03Eric Laurent  11038,  10849,  10659,  10469,  10278,  10087,   9895,   9703,
87c55a96383497a772a307b346368133960b02ad03Eric Laurent   9511,   9319,   9126,   8932,   8739,   8545,   8351,   8156,
88c55a96383497a772a307b346368133960b02ad03Eric Laurent   7961,   7766,   7571,   7375,   7179,   6982,   6786,   6589,
89c55a96383497a772a307b346368133960b02ad03Eric Laurent   6392,   6195,   5997,   5799,   5601,   5403,   5205,   5006,
90c55a96383497a772a307b346368133960b02ad03Eric Laurent   4807,   4608,   4409,   4210,   4011,   3811,   3611,   3411,
91c55a96383497a772a307b346368133960b02ad03Eric Laurent   3211,   3011,   2811,   2610,   2410,   2209,   2009,   1808,
92c55a96383497a772a307b346368133960b02ad03Eric Laurent   1607,   1406,   1206,   1005,    804,    603,    402,    201,
93c55a96383497a772a307b346368133960b02ad03Eric Laurent      0,   -201,   -402,   -603,   -804,  -1005,  -1206,  -1406,
94c55a96383497a772a307b346368133960b02ad03Eric Laurent  -1607,  -1808,  -2009,  -2209,  -2410,  -2610,  -2811,  -3011,
95c55a96383497a772a307b346368133960b02ad03Eric Laurent  -3211,  -3411,  -3611,  -3811,  -4011,  -4210,  -4409,  -4608,
96c55a96383497a772a307b346368133960b02ad03Eric Laurent  -4807,  -5006,  -5205,  -5403,  -5601,  -5799,  -5997,  -6195,
97c55a96383497a772a307b346368133960b02ad03Eric Laurent  -6392,  -6589,  -6786,  -6982,  -7179,  -7375,  -7571,  -7766,
98c55a96383497a772a307b346368133960b02ad03Eric Laurent  -7961,  -8156,  -8351,  -8545,  -8739,  -8932,  -9126,  -9319,
99c55a96383497a772a307b346368133960b02ad03Eric Laurent  -9511,  -9703,  -9895, -10087, -10278, -10469, -10659, -10849,
100c55a96383497a772a307b346368133960b02ad03Eric Laurent -11038, -11227, -11416, -11604, -11792, -11980, -12166, -12353,
101c55a96383497a772a307b346368133960b02ad03Eric Laurent -12539, -12724, -12909, -13094, -13278, -13462, -13645, -13827,
102c55a96383497a772a307b346368133960b02ad03Eric Laurent -14009, -14191, -14372, -14552, -14732, -14911, -15090, -15268,
103c55a96383497a772a307b346368133960b02ad03Eric Laurent -15446, -15623, -15799, -15975, -16150, -16325, -16499, -16672,
104c55a96383497a772a307b346368133960b02ad03Eric Laurent -16845, -17017, -17189, -17360, -17530, -17699, -17868, -18036,
105c55a96383497a772a307b346368133960b02ad03Eric Laurent -18204, -18371, -18537, -18702, -18867, -19031, -19194, -19357,
106c55a96383497a772a307b346368133960b02ad03Eric Laurent -19519, -19680, -19840, -20000, -20159, -20317, -20474, -20631,
107c55a96383497a772a307b346368133960b02ad03Eric Laurent -20787, -20942, -21096, -21249, -21402, -21554, -21705, -21855,
108c55a96383497a772a307b346368133960b02ad03Eric Laurent -22004, -22153, -22301, -22448, -22594, -22739, -22883, -23027,
109c55a96383497a772a307b346368133960b02ad03Eric Laurent -23169, -23311, -23452, -23592, -23731, -23869, -24006, -24143,
110c55a96383497a772a307b346368133960b02ad03Eric Laurent -24278, -24413, -24546, -24679, -24811, -24942, -25072, -25201,
111c55a96383497a772a307b346368133960b02ad03Eric Laurent -25329, -25456, -25582, -25707, -25831, -25954, -26077, -26198,
112c55a96383497a772a307b346368133960b02ad03Eric Laurent -26318, -26437, -26556, -26673, -26789, -26905, -27019, -27132,
113c55a96383497a772a307b346368133960b02ad03Eric Laurent -27244, -27355, -27466, -27575, -27683, -27790, -27896, -28001,
114c55a96383497a772a307b346368133960b02ad03Eric Laurent -28105, -28208, -28309, -28410, -28510, -28608, -28706, -28802,
115c55a96383497a772a307b346368133960b02ad03Eric Laurent -28897, -28992, -29085, -29177, -29268, -29358, -29446, -29534,
116c55a96383497a772a307b346368133960b02ad03Eric Laurent -29621, -29706, -29790, -29873, -29955, -30036, -30116, -30195,
117c55a96383497a772a307b346368133960b02ad03Eric Laurent -30272, -30349, -30424, -30498, -30571, -30643, -30713, -30783,
118c55a96383497a772a307b346368133960b02ad03Eric Laurent -30851, -30918, -30984, -31049, -31113, -31175, -31236, -31297,
119c55a96383497a772a307b346368133960b02ad03Eric Laurent -31356, -31413, -31470, -31525, -31580, -31633, -31684, -31735,
120c55a96383497a772a307b346368133960b02ad03Eric Laurent -31785, -31833, -31880, -31926, -31970, -32014, -32056, -32097,
121c55a96383497a772a307b346368133960b02ad03Eric Laurent -32137, -32176, -32213, -32249, -32284, -32318, -32350, -32382,
122c55a96383497a772a307b346368133960b02ad03Eric Laurent -32412, -32441, -32468, -32495, -32520, -32544, -32567, -32588,
123c55a96383497a772a307b346368133960b02ad03Eric Laurent -32609, -32628, -32646, -32662, -32678, -32692, -32705, -32717,
124c55a96383497a772a307b346368133960b02ad03Eric Laurent -32727, -32736, -32744, -32751, -32757, -32761, -32764, -32766,
125c55a96383497a772a307b346368133960b02ad03Eric Laurent -32767, -32766, -32764, -32761, -32757, -32751, -32744, -32736,
126c55a96383497a772a307b346368133960b02ad03Eric Laurent -32727, -32717, -32705, -32692, -32678, -32662, -32646, -32628,
127c55a96383497a772a307b346368133960b02ad03Eric Laurent -32609, -32588, -32567, -32544, -32520, -32495, -32468, -32441,
128c55a96383497a772a307b346368133960b02ad03Eric Laurent -32412, -32382, -32350, -32318, -32284, -32249, -32213, -32176,
129c55a96383497a772a307b346368133960b02ad03Eric Laurent -32137, -32097, -32056, -32014, -31970, -31926, -31880, -31833,
130c55a96383497a772a307b346368133960b02ad03Eric Laurent -31785, -31735, -31684, -31633, -31580, -31525, -31470, -31413,
131c55a96383497a772a307b346368133960b02ad03Eric Laurent -31356, -31297, -31236, -31175, -31113, -31049, -30984, -30918,
132c55a96383497a772a307b346368133960b02ad03Eric Laurent -30851, -30783, -30713, -30643, -30571, -30498, -30424, -30349,
133c55a96383497a772a307b346368133960b02ad03Eric Laurent -30272, -30195, -30116, -30036, -29955, -29873, -29790, -29706,
134c55a96383497a772a307b346368133960b02ad03Eric Laurent -29621, -29534, -29446, -29358, -29268, -29177, -29085, -28992,
135c55a96383497a772a307b346368133960b02ad03Eric Laurent -28897, -28802, -28706, -28608, -28510, -28410, -28309, -28208,
136c55a96383497a772a307b346368133960b02ad03Eric Laurent -28105, -28001, -27896, -27790, -27683, -27575, -27466, -27355,
137c55a96383497a772a307b346368133960b02ad03Eric Laurent -27244, -27132, -27019, -26905, -26789, -26673, -26556, -26437,
138c55a96383497a772a307b346368133960b02ad03Eric Laurent -26318, -26198, -26077, -25954, -25831, -25707, -25582, -25456,
139c55a96383497a772a307b346368133960b02ad03Eric Laurent -25329, -25201, -25072, -24942, -24811, -24679, -24546, -24413,
140c55a96383497a772a307b346368133960b02ad03Eric Laurent -24278, -24143, -24006, -23869, -23731, -23592, -23452, -23311,
141c55a96383497a772a307b346368133960b02ad03Eric Laurent -23169, -23027, -22883, -22739, -22594, -22448, -22301, -22153,
142c55a96383497a772a307b346368133960b02ad03Eric Laurent -22004, -21855, -21705, -21554, -21402, -21249, -21096, -20942,
143c55a96383497a772a307b346368133960b02ad03Eric Laurent -20787, -20631, -20474, -20317, -20159, -20000, -19840, -19680,
144c55a96383497a772a307b346368133960b02ad03Eric Laurent -19519, -19357, -19194, -19031, -18867, -18702, -18537, -18371,
145c55a96383497a772a307b346368133960b02ad03Eric Laurent -18204, -18036, -17868, -17699, -17530, -17360, -17189, -17017,
146c55a96383497a772a307b346368133960b02ad03Eric Laurent -16845, -16672, -16499, -16325, -16150, -15975, -15799, -15623,
147c55a96383497a772a307b346368133960b02ad03Eric Laurent -15446, -15268, -15090, -14911, -14732, -14552, -14372, -14191,
148c55a96383497a772a307b346368133960b02ad03Eric Laurent -14009, -13827, -13645, -13462, -13278, -13094, -12909, -12724,
149c55a96383497a772a307b346368133960b02ad03Eric Laurent -12539, -12353, -12166, -11980, -11792, -11604, -11416, -11227,
150c55a96383497a772a307b346368133960b02ad03Eric Laurent -11038, -10849, -10659, -10469, -10278, -10087,  -9895,  -9703,
151c55a96383497a772a307b346368133960b02ad03Eric Laurent  -9511,  -9319,  -9126,  -8932,  -8739,  -8545,  -8351,  -8156,
152c55a96383497a772a307b346368133960b02ad03Eric Laurent  -7961,  -7766,  -7571,  -7375,  -7179,  -6982,  -6786,  -6589,
153c55a96383497a772a307b346368133960b02ad03Eric Laurent  -6392,  -6195,  -5997,  -5799,  -5601,  -5403,  -5205,  -5006,
154c55a96383497a772a307b346368133960b02ad03Eric Laurent  -4807,  -4608,  -4409,  -4210,  -4011,  -3811,  -3611,  -3411,
155c55a96383497a772a307b346368133960b02ad03Eric Laurent  -3211,  -3011,  -2811,  -2610,  -2410,  -2209,  -2009,  -1808,
156c55a96383497a772a307b346368133960b02ad03Eric Laurent  -1607,  -1406,  -1206,  -1005,   -804,   -603,   -402,   -201
157c55a96383497a772a307b346368133960b02ad03Eric Laurent};
158c55a96383497a772a307b346368133960b02ad03Eric Laurent
159c55a96383497a772a307b346368133960b02ad03Eric Laurentint WebRtcSpl_ComplexFFT(WebRtc_Word16 frfi[], int stages, int mode)
160c55a96383497a772a307b346368133960b02ad03Eric Laurent{
161c55a96383497a772a307b346368133960b02ad03Eric Laurent    int i, j, l, k, istep, n, m;
162c55a96383497a772a307b346368133960b02ad03Eric Laurent    WebRtc_Word16 wr, wi;
163c55a96383497a772a307b346368133960b02ad03Eric Laurent    WebRtc_Word32 tr32, ti32, qr32, qi32;
164c55a96383497a772a307b346368133960b02ad03Eric Laurent
165c55a96383497a772a307b346368133960b02ad03Eric Laurent    /* The 1024-value is a constant given from the size of kSinTable1024[],
166c55a96383497a772a307b346368133960b02ad03Eric Laurent     * and should not be changed depending on the input parameter 'stages'
167c55a96383497a772a307b346368133960b02ad03Eric Laurent     */
168c55a96383497a772a307b346368133960b02ad03Eric Laurent    n = 1 << stages;
169c55a96383497a772a307b346368133960b02ad03Eric Laurent    if (n > 1024)
170c55a96383497a772a307b346368133960b02ad03Eric Laurent        return -1;
171c55a96383497a772a307b346368133960b02ad03Eric Laurent
172c55a96383497a772a307b346368133960b02ad03Eric Laurent    l = 1;
173c55a96383497a772a307b346368133960b02ad03Eric Laurent    k = 10 - 1; /* Constant for given kSinTable1024[]. Do not change
174c55a96383497a772a307b346368133960b02ad03Eric Laurent         depending on the input parameter 'stages' */
175c55a96383497a772a307b346368133960b02ad03Eric Laurent
176c55a96383497a772a307b346368133960b02ad03Eric Laurent    if (mode == 0)
177c55a96383497a772a307b346368133960b02ad03Eric Laurent    {
178c55a96383497a772a307b346368133960b02ad03Eric Laurent        // mode==0: Low-complexity and Low-accuracy mode
179c55a96383497a772a307b346368133960b02ad03Eric Laurent        while (l < n)
180c55a96383497a772a307b346368133960b02ad03Eric Laurent        {
181c55a96383497a772a307b346368133960b02ad03Eric Laurent            istep = l << 1;
182c55a96383497a772a307b346368133960b02ad03Eric Laurent
183c55a96383497a772a307b346368133960b02ad03Eric Laurent            for (m = 0; m < l; ++m)
184c55a96383497a772a307b346368133960b02ad03Eric Laurent            {
185c55a96383497a772a307b346368133960b02ad03Eric Laurent                j = m << k;
186c55a96383497a772a307b346368133960b02ad03Eric Laurent
187c55a96383497a772a307b346368133960b02ad03Eric Laurent                /* The 256-value is a constant given as 1/4 of the size of
188c55a96383497a772a307b346368133960b02ad03Eric Laurent                 * kSinTable1024[], and should not be changed depending on the input
189c55a96383497a772a307b346368133960b02ad03Eric Laurent                 * parameter 'stages'. It will result in 0 <= j < N_SINE_WAVE/2
190c55a96383497a772a307b346368133960b02ad03Eric Laurent                 */
191c55a96383497a772a307b346368133960b02ad03Eric Laurent                wr = kSinTable1024[j + 256];
192c55a96383497a772a307b346368133960b02ad03Eric Laurent                wi = -kSinTable1024[j];
193c55a96383497a772a307b346368133960b02ad03Eric Laurent
194c55a96383497a772a307b346368133960b02ad03Eric Laurent                for (i = m; i < n; i += istep)
195c55a96383497a772a307b346368133960b02ad03Eric Laurent                {
196c55a96383497a772a307b346368133960b02ad03Eric Laurent                    j = i + l;
197c55a96383497a772a307b346368133960b02ad03Eric Laurent
198c55a96383497a772a307b346368133960b02ad03Eric Laurent                    tr32 = WEBRTC_SPL_RSHIFT_W32((WEBRTC_SPL_MUL_16_16(wr, frfi[2 * j])
199c55a96383497a772a307b346368133960b02ad03Eric Laurent                            - WEBRTC_SPL_MUL_16_16(wi, frfi[2 * j + 1])), 15);
200c55a96383497a772a307b346368133960b02ad03Eric Laurent
201c55a96383497a772a307b346368133960b02ad03Eric Laurent                    ti32 = WEBRTC_SPL_RSHIFT_W32((WEBRTC_SPL_MUL_16_16(wr, frfi[2 * j + 1])
202c55a96383497a772a307b346368133960b02ad03Eric Laurent                            + WEBRTC_SPL_MUL_16_16(wi, frfi[2 * j])), 15);
203c55a96383497a772a307b346368133960b02ad03Eric Laurent
204c55a96383497a772a307b346368133960b02ad03Eric Laurent                    qr32 = (WebRtc_Word32)frfi[2 * i];
205c55a96383497a772a307b346368133960b02ad03Eric Laurent                    qi32 = (WebRtc_Word32)frfi[2 * i + 1];
206c55a96383497a772a307b346368133960b02ad03Eric Laurent                    frfi[2 * j] = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(qr32 - tr32, 1);
207c55a96383497a772a307b346368133960b02ad03Eric Laurent                    frfi[2 * j + 1] = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(qi32 - ti32, 1);
208c55a96383497a772a307b346368133960b02ad03Eric Laurent                    frfi[2 * i] = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(qr32 + tr32, 1);
209c55a96383497a772a307b346368133960b02ad03Eric Laurent                    frfi[2 * i + 1] = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(qi32 + ti32, 1);
210c55a96383497a772a307b346368133960b02ad03Eric Laurent                }
211c55a96383497a772a307b346368133960b02ad03Eric Laurent            }
212c55a96383497a772a307b346368133960b02ad03Eric Laurent
213c55a96383497a772a307b346368133960b02ad03Eric Laurent            --k;
214c55a96383497a772a307b346368133960b02ad03Eric Laurent            l = istep;
215c55a96383497a772a307b346368133960b02ad03Eric Laurent
216c55a96383497a772a307b346368133960b02ad03Eric Laurent        }
217c55a96383497a772a307b346368133960b02ad03Eric Laurent
218c55a96383497a772a307b346368133960b02ad03Eric Laurent    } else
219c55a96383497a772a307b346368133960b02ad03Eric Laurent    {
220c55a96383497a772a307b346368133960b02ad03Eric Laurent        // mode==1: High-complexity and High-accuracy mode
221c55a96383497a772a307b346368133960b02ad03Eric Laurent        while (l < n)
222c55a96383497a772a307b346368133960b02ad03Eric Laurent        {
223c55a96383497a772a307b346368133960b02ad03Eric Laurent            istep = l << 1;
224c55a96383497a772a307b346368133960b02ad03Eric Laurent
225c55a96383497a772a307b346368133960b02ad03Eric Laurent            for (m = 0; m < l; ++m)
226c55a96383497a772a307b346368133960b02ad03Eric Laurent            {
227c55a96383497a772a307b346368133960b02ad03Eric Laurent                j = m << k;
228c55a96383497a772a307b346368133960b02ad03Eric Laurent
229c55a96383497a772a307b346368133960b02ad03Eric Laurent                /* The 256-value is a constant given as 1/4 of the size of
230c55a96383497a772a307b346368133960b02ad03Eric Laurent                 * kSinTable1024[], and should not be changed depending on the input
231c55a96383497a772a307b346368133960b02ad03Eric Laurent                 * parameter 'stages'. It will result in 0 <= j < N_SINE_WAVE/2
232c55a96383497a772a307b346368133960b02ad03Eric Laurent                 */
233c55a96383497a772a307b346368133960b02ad03Eric Laurent                wr = kSinTable1024[j + 256];
234c55a96383497a772a307b346368133960b02ad03Eric Laurent                wi = -kSinTable1024[j];
235c55a96383497a772a307b346368133960b02ad03Eric Laurent
236c55a96383497a772a307b346368133960b02ad03Eric Laurent#ifdef WEBRTC_ARCH_ARM_V7A
237c55a96383497a772a307b346368133960b02ad03Eric Laurent                WebRtc_Word32 wri;
238c55a96383497a772a307b346368133960b02ad03Eric Laurent                WebRtc_Word32 frfi_r;
239c55a96383497a772a307b346368133960b02ad03Eric Laurent                __asm__("pkhbt %0, %1, %2, lsl #16" : "=r"(wri) :
240c55a96383497a772a307b346368133960b02ad03Eric Laurent                    "r"((WebRtc_Word32)wr), "r"((WebRtc_Word32)wi));
241c55a96383497a772a307b346368133960b02ad03Eric Laurent#endif
242c55a96383497a772a307b346368133960b02ad03Eric Laurent
243c55a96383497a772a307b346368133960b02ad03Eric Laurent                for (i = m; i < n; i += istep)
244c55a96383497a772a307b346368133960b02ad03Eric Laurent                {
245c55a96383497a772a307b346368133960b02ad03Eric Laurent                    j = i + l;
246c55a96383497a772a307b346368133960b02ad03Eric Laurent
247c55a96383497a772a307b346368133960b02ad03Eric Laurent#ifdef WEBRTC_ARCH_ARM_V7A
248c55a96383497a772a307b346368133960b02ad03Eric Laurent                    __asm__("pkhbt %0, %1, %2, lsl #16" : "=r"(frfi_r) :
249c55a96383497a772a307b346368133960b02ad03Eric Laurent                        "r"((WebRtc_Word32)frfi[2*j]), "r"((WebRtc_Word32)frfi[2*j +1]));
250c55a96383497a772a307b346368133960b02ad03Eric Laurent                    __asm__("smlsd %0, %1, %2, %3" : "=r"(tr32) :
251c55a96383497a772a307b346368133960b02ad03Eric Laurent                        "r"(wri), "r"(frfi_r), "r"(CFFTRND));
252c55a96383497a772a307b346368133960b02ad03Eric Laurent                    __asm__("smladx %0, %1, %2, %3" : "=r"(ti32) :
253c55a96383497a772a307b346368133960b02ad03Eric Laurent                        "r"(wri), "r"(frfi_r), "r"(CFFTRND));
254c55a96383497a772a307b346368133960b02ad03Eric Laurent
255c55a96383497a772a307b346368133960b02ad03Eric Laurent#else
256c55a96383497a772a307b346368133960b02ad03Eric Laurent                    tr32 = WEBRTC_SPL_MUL_16_16(wr, frfi[2 * j])
257c55a96383497a772a307b346368133960b02ad03Eric Laurent                            - WEBRTC_SPL_MUL_16_16(wi, frfi[2 * j + 1]) + CFFTRND;
258c55a96383497a772a307b346368133960b02ad03Eric Laurent
259c55a96383497a772a307b346368133960b02ad03Eric Laurent                    ti32 = WEBRTC_SPL_MUL_16_16(wr, frfi[2 * j + 1])
260c55a96383497a772a307b346368133960b02ad03Eric Laurent                            + WEBRTC_SPL_MUL_16_16(wi, frfi[2 * j]) + CFFTRND;
261c55a96383497a772a307b346368133960b02ad03Eric Laurent#endif
262c55a96383497a772a307b346368133960b02ad03Eric Laurent
263c55a96383497a772a307b346368133960b02ad03Eric Laurent                    tr32 = WEBRTC_SPL_RSHIFT_W32(tr32, 15 - CFFTSFT);
264c55a96383497a772a307b346368133960b02ad03Eric Laurent                    ti32 = WEBRTC_SPL_RSHIFT_W32(ti32, 15 - CFFTSFT);
265c55a96383497a772a307b346368133960b02ad03Eric Laurent
266c55a96383497a772a307b346368133960b02ad03Eric Laurent                    qr32 = ((WebRtc_Word32)frfi[2 * i]) << CFFTSFT;
267c55a96383497a772a307b346368133960b02ad03Eric Laurent                    qi32 = ((WebRtc_Word32)frfi[2 * i + 1]) << CFFTSFT;
268c55a96383497a772a307b346368133960b02ad03Eric Laurent
269c55a96383497a772a307b346368133960b02ad03Eric Laurent                    frfi[2 * j] = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(
270c55a96383497a772a307b346368133960b02ad03Eric Laurent                            (qr32 - tr32 + CFFTRND2), 1 + CFFTSFT);
271c55a96383497a772a307b346368133960b02ad03Eric Laurent                    frfi[2 * j + 1] = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(
272c55a96383497a772a307b346368133960b02ad03Eric Laurent                            (qi32 - ti32 + CFFTRND2), 1 + CFFTSFT);
273c55a96383497a772a307b346368133960b02ad03Eric Laurent                    frfi[2 * i] = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(
274c55a96383497a772a307b346368133960b02ad03Eric Laurent                            (qr32 + tr32 + CFFTRND2), 1 + CFFTSFT);
275c55a96383497a772a307b346368133960b02ad03Eric Laurent                    frfi[2 * i + 1] = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(
276c55a96383497a772a307b346368133960b02ad03Eric Laurent                            (qi32 + ti32 + CFFTRND2), 1 + CFFTSFT);
277c55a96383497a772a307b346368133960b02ad03Eric Laurent                }
278c55a96383497a772a307b346368133960b02ad03Eric Laurent            }
279c55a96383497a772a307b346368133960b02ad03Eric Laurent
280c55a96383497a772a307b346368133960b02ad03Eric Laurent            --k;
281c55a96383497a772a307b346368133960b02ad03Eric Laurent            l = istep;
282c55a96383497a772a307b346368133960b02ad03Eric Laurent        }
283c55a96383497a772a307b346368133960b02ad03Eric Laurent    }
284c55a96383497a772a307b346368133960b02ad03Eric Laurent    return 0;
285c55a96383497a772a307b346368133960b02ad03Eric Laurent}
286c55a96383497a772a307b346368133960b02ad03Eric Laurent
287c55a96383497a772a307b346368133960b02ad03Eric Laurentint WebRtcSpl_ComplexIFFT(WebRtc_Word16 frfi[], int stages, int mode)
288c55a96383497a772a307b346368133960b02ad03Eric Laurent{
289c55a96383497a772a307b346368133960b02ad03Eric Laurent    int i, j, l, k, istep, n, m, scale, shift;
290c55a96383497a772a307b346368133960b02ad03Eric Laurent    WebRtc_Word16 wr, wi;
291c55a96383497a772a307b346368133960b02ad03Eric Laurent    WebRtc_Word32 tr32, ti32, qr32, qi32;
292c55a96383497a772a307b346368133960b02ad03Eric Laurent    WebRtc_Word32 tmp32, round2;
293c55a96383497a772a307b346368133960b02ad03Eric Laurent
294c55a96383497a772a307b346368133960b02ad03Eric Laurent    /* The 1024-value is a constant given from the size of kSinTable1024[],
295c55a96383497a772a307b346368133960b02ad03Eric Laurent     * and should not be changed depending on the input parameter 'stages'
296c55a96383497a772a307b346368133960b02ad03Eric Laurent     */
297c55a96383497a772a307b346368133960b02ad03Eric Laurent    n = 1 << stages;
298c55a96383497a772a307b346368133960b02ad03Eric Laurent    if (n > 1024)
299c55a96383497a772a307b346368133960b02ad03Eric Laurent        return -1;
300c55a96383497a772a307b346368133960b02ad03Eric Laurent
301c55a96383497a772a307b346368133960b02ad03Eric Laurent    scale = 0;
302c55a96383497a772a307b346368133960b02ad03Eric Laurent
303c55a96383497a772a307b346368133960b02ad03Eric Laurent    l = 1;
304c55a96383497a772a307b346368133960b02ad03Eric Laurent    k = 10 - 1; /* Constant for given kSinTable1024[]. Do not change
305c55a96383497a772a307b346368133960b02ad03Eric Laurent         depending on the input parameter 'stages' */
306c55a96383497a772a307b346368133960b02ad03Eric Laurent
307c55a96383497a772a307b346368133960b02ad03Eric Laurent    while (l < n)
308c55a96383497a772a307b346368133960b02ad03Eric Laurent    {
309c55a96383497a772a307b346368133960b02ad03Eric Laurent        // variable scaling, depending upon data
310c55a96383497a772a307b346368133960b02ad03Eric Laurent        shift = 0;
311c55a96383497a772a307b346368133960b02ad03Eric Laurent        round2 = 8192;
312c55a96383497a772a307b346368133960b02ad03Eric Laurent
313c55a96383497a772a307b346368133960b02ad03Eric Laurent        tmp32 = (WebRtc_Word32)WebRtcSpl_MaxAbsValueW16(frfi, 2 * n);
314c55a96383497a772a307b346368133960b02ad03Eric Laurent        if (tmp32 > 13573)
315c55a96383497a772a307b346368133960b02ad03Eric Laurent        {
316c55a96383497a772a307b346368133960b02ad03Eric Laurent            shift++;
317c55a96383497a772a307b346368133960b02ad03Eric Laurent            scale++;
318c55a96383497a772a307b346368133960b02ad03Eric Laurent            round2 <<= 1;
319c55a96383497a772a307b346368133960b02ad03Eric Laurent        }
320c55a96383497a772a307b346368133960b02ad03Eric Laurent        if (tmp32 > 27146)
321c55a96383497a772a307b346368133960b02ad03Eric Laurent        {
322c55a96383497a772a307b346368133960b02ad03Eric Laurent            shift++;
323c55a96383497a772a307b346368133960b02ad03Eric Laurent            scale++;
324c55a96383497a772a307b346368133960b02ad03Eric Laurent            round2 <<= 1;
325c55a96383497a772a307b346368133960b02ad03Eric Laurent        }
326c55a96383497a772a307b346368133960b02ad03Eric Laurent
327c55a96383497a772a307b346368133960b02ad03Eric Laurent        istep = l << 1;
328c55a96383497a772a307b346368133960b02ad03Eric Laurent
329c55a96383497a772a307b346368133960b02ad03Eric Laurent        if (mode == 0)
330c55a96383497a772a307b346368133960b02ad03Eric Laurent        {
331c55a96383497a772a307b346368133960b02ad03Eric Laurent            // mode==0: Low-complexity and Low-accuracy mode
332c55a96383497a772a307b346368133960b02ad03Eric Laurent            for (m = 0; m < l; ++m)
333c55a96383497a772a307b346368133960b02ad03Eric Laurent            {
334c55a96383497a772a307b346368133960b02ad03Eric Laurent                j = m << k;
335c55a96383497a772a307b346368133960b02ad03Eric Laurent
336c55a96383497a772a307b346368133960b02ad03Eric Laurent                /* The 256-value is a constant given as 1/4 of the size of
337c55a96383497a772a307b346368133960b02ad03Eric Laurent                 * kSinTable1024[], and should not be changed depending on the input
338c55a96383497a772a307b346368133960b02ad03Eric Laurent                 * parameter 'stages'. It will result in 0 <= j < N_SINE_WAVE/2
339c55a96383497a772a307b346368133960b02ad03Eric Laurent                 */
340c55a96383497a772a307b346368133960b02ad03Eric Laurent                wr = kSinTable1024[j + 256];
341c55a96383497a772a307b346368133960b02ad03Eric Laurent                wi = kSinTable1024[j];
342c55a96383497a772a307b346368133960b02ad03Eric Laurent
343c55a96383497a772a307b346368133960b02ad03Eric Laurent                for (i = m; i < n; i += istep)
344c55a96383497a772a307b346368133960b02ad03Eric Laurent                {
345c55a96383497a772a307b346368133960b02ad03Eric Laurent                    j = i + l;
346c55a96383497a772a307b346368133960b02ad03Eric Laurent
347c55a96383497a772a307b346368133960b02ad03Eric Laurent                    tr32 = WEBRTC_SPL_RSHIFT_W32((WEBRTC_SPL_MUL_16_16_RSFT(wr, frfi[2 * j], 0)
348c55a96383497a772a307b346368133960b02ad03Eric Laurent                            - WEBRTC_SPL_MUL_16_16_RSFT(wi, frfi[2 * j + 1], 0)), 15);
349c55a96383497a772a307b346368133960b02ad03Eric Laurent
350c55a96383497a772a307b346368133960b02ad03Eric Laurent                    ti32 = WEBRTC_SPL_RSHIFT_W32(
351c55a96383497a772a307b346368133960b02ad03Eric Laurent                            (WEBRTC_SPL_MUL_16_16_RSFT(wr, frfi[2 * j + 1], 0)
352c55a96383497a772a307b346368133960b02ad03Eric Laurent                                    + WEBRTC_SPL_MUL_16_16_RSFT(wi,frfi[2*j],0)), 15);
353c55a96383497a772a307b346368133960b02ad03Eric Laurent
354c55a96383497a772a307b346368133960b02ad03Eric Laurent                    qr32 = (WebRtc_Word32)frfi[2 * i];
355c55a96383497a772a307b346368133960b02ad03Eric Laurent                    qi32 = (WebRtc_Word32)frfi[2 * i + 1];
356c55a96383497a772a307b346368133960b02ad03Eric Laurent                    frfi[2 * j] = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(qr32 - tr32, shift);
357c55a96383497a772a307b346368133960b02ad03Eric Laurent                    frfi[2 * j + 1] = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(qi32 - ti32, shift);
358c55a96383497a772a307b346368133960b02ad03Eric Laurent                    frfi[2 * i] = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(qr32 + tr32, shift);
359c55a96383497a772a307b346368133960b02ad03Eric Laurent                    frfi[2 * i + 1] = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(qi32 + ti32, shift);
360c55a96383497a772a307b346368133960b02ad03Eric Laurent                }
361c55a96383497a772a307b346368133960b02ad03Eric Laurent            }
362c55a96383497a772a307b346368133960b02ad03Eric Laurent        } else
363c55a96383497a772a307b346368133960b02ad03Eric Laurent        {
364c55a96383497a772a307b346368133960b02ad03Eric Laurent            // mode==1: High-complexity and High-accuracy mode
365c55a96383497a772a307b346368133960b02ad03Eric Laurent
366c55a96383497a772a307b346368133960b02ad03Eric Laurent            for (m = 0; m < l; ++m)
367c55a96383497a772a307b346368133960b02ad03Eric Laurent            {
368c55a96383497a772a307b346368133960b02ad03Eric Laurent                j = m << k;
369c55a96383497a772a307b346368133960b02ad03Eric Laurent
370c55a96383497a772a307b346368133960b02ad03Eric Laurent                /* The 256-value is a constant given as 1/4 of the size of
371c55a96383497a772a307b346368133960b02ad03Eric Laurent                 * kSinTable1024[], and should not be changed depending on the input
372c55a96383497a772a307b346368133960b02ad03Eric Laurent                 * parameter 'stages'. It will result in 0 <= j < N_SINE_WAVE/2
373c55a96383497a772a307b346368133960b02ad03Eric Laurent                 */
374c55a96383497a772a307b346368133960b02ad03Eric Laurent                wr = kSinTable1024[j + 256];
375c55a96383497a772a307b346368133960b02ad03Eric Laurent                wi = kSinTable1024[j];
376c55a96383497a772a307b346368133960b02ad03Eric Laurent
377c55a96383497a772a307b346368133960b02ad03Eric Laurent#ifdef WEBRTC_ARCH_ARM_V7A
378c55a96383497a772a307b346368133960b02ad03Eric Laurent                WebRtc_Word32 wri;
379c55a96383497a772a307b346368133960b02ad03Eric Laurent                WebRtc_Word32 frfi_r;
380c55a96383497a772a307b346368133960b02ad03Eric Laurent                __asm__("pkhbt %0, %1, %2, lsl #16" : "=r"(wri) :
381c55a96383497a772a307b346368133960b02ad03Eric Laurent                    "r"((WebRtc_Word32)wr), "r"((WebRtc_Word32)wi));
382c55a96383497a772a307b346368133960b02ad03Eric Laurent#endif
383c55a96383497a772a307b346368133960b02ad03Eric Laurent
384c55a96383497a772a307b346368133960b02ad03Eric Laurent                for (i = m; i < n; i += istep)
385c55a96383497a772a307b346368133960b02ad03Eric Laurent                {
386c55a96383497a772a307b346368133960b02ad03Eric Laurent                    j = i + l;
387c55a96383497a772a307b346368133960b02ad03Eric Laurent
388c55a96383497a772a307b346368133960b02ad03Eric Laurent#ifdef WEBRTC_ARCH_ARM_V7A
389c55a96383497a772a307b346368133960b02ad03Eric Laurent                    __asm__("pkhbt %0, %1, %2, lsl #16" : "=r"(frfi_r) :
390c55a96383497a772a307b346368133960b02ad03Eric Laurent                        "r"((WebRtc_Word32)frfi[2*j]), "r"((WebRtc_Word32)frfi[2*j +1]));
391c55a96383497a772a307b346368133960b02ad03Eric Laurent                    __asm__("smlsd %0, %1, %2, %3" : "=r"(tr32) :
392c55a96383497a772a307b346368133960b02ad03Eric Laurent                        "r"(wri), "r"(frfi_r), "r"(CIFFTRND));
393c55a96383497a772a307b346368133960b02ad03Eric Laurent                    __asm__("smladx %0, %1, %2, %3" : "=r"(ti32) :
394c55a96383497a772a307b346368133960b02ad03Eric Laurent                        "r"(wri), "r"(frfi_r), "r"(CIFFTRND));
395c55a96383497a772a307b346368133960b02ad03Eric Laurent#else
396c55a96383497a772a307b346368133960b02ad03Eric Laurent
397c55a96383497a772a307b346368133960b02ad03Eric Laurent                    tr32 = WEBRTC_SPL_MUL_16_16(wr, frfi[2 * j])
398c55a96383497a772a307b346368133960b02ad03Eric Laurent                            - WEBRTC_SPL_MUL_16_16(wi, frfi[2 * j + 1]) + CIFFTRND;
399c55a96383497a772a307b346368133960b02ad03Eric Laurent
400c55a96383497a772a307b346368133960b02ad03Eric Laurent                    ti32 = WEBRTC_SPL_MUL_16_16(wr, frfi[2 * j + 1])
401c55a96383497a772a307b346368133960b02ad03Eric Laurent                            + WEBRTC_SPL_MUL_16_16(wi, frfi[2 * j]) + CIFFTRND;
402c55a96383497a772a307b346368133960b02ad03Eric Laurent#endif
403c55a96383497a772a307b346368133960b02ad03Eric Laurent                    tr32 = WEBRTC_SPL_RSHIFT_W32(tr32, 15 - CIFFTSFT);
404c55a96383497a772a307b346368133960b02ad03Eric Laurent                    ti32 = WEBRTC_SPL_RSHIFT_W32(ti32, 15 - CIFFTSFT);
405c55a96383497a772a307b346368133960b02ad03Eric Laurent
406c55a96383497a772a307b346368133960b02ad03Eric Laurent                    qr32 = ((WebRtc_Word32)frfi[2 * i]) << CIFFTSFT;
407c55a96383497a772a307b346368133960b02ad03Eric Laurent                    qi32 = ((WebRtc_Word32)frfi[2 * i + 1]) << CIFFTSFT;
408c55a96383497a772a307b346368133960b02ad03Eric Laurent
409c55a96383497a772a307b346368133960b02ad03Eric Laurent                    frfi[2 * j] = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32((qr32 - tr32+round2),
410c55a96383497a772a307b346368133960b02ad03Eric Laurent                                                                       shift+CIFFTSFT);
411c55a96383497a772a307b346368133960b02ad03Eric Laurent                    frfi[2 * j + 1] = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(
412c55a96383497a772a307b346368133960b02ad03Eric Laurent                            (qi32 - ti32 + round2), shift + CIFFTSFT);
413c55a96383497a772a307b346368133960b02ad03Eric Laurent                    frfi[2 * i] = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32((qr32 + tr32 + round2),
414c55a96383497a772a307b346368133960b02ad03Eric Laurent                                                                       shift + CIFFTSFT);
415c55a96383497a772a307b346368133960b02ad03Eric Laurent                    frfi[2 * i + 1] = (WebRtc_Word16)WEBRTC_SPL_RSHIFT_W32(
416c55a96383497a772a307b346368133960b02ad03Eric Laurent                            (qi32 + ti32 + round2), shift + CIFFTSFT);
417c55a96383497a772a307b346368133960b02ad03Eric Laurent                }
418c55a96383497a772a307b346368133960b02ad03Eric Laurent            }
419c55a96383497a772a307b346368133960b02ad03Eric Laurent
420c55a96383497a772a307b346368133960b02ad03Eric Laurent        }
421c55a96383497a772a307b346368133960b02ad03Eric Laurent        --k;
422c55a96383497a772a307b346368133960b02ad03Eric Laurent        l = istep;
423c55a96383497a772a307b346368133960b02ad03Eric Laurent    }
424c55a96383497a772a307b346368133960b02ad03Eric Laurent    return scale;
425c55a96383497a772a307b346368133960b02ad03Eric Laurent}
426