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