12228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 22228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/* ----------------------------------------------------------------------------------------------------------- 32228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectSoftware License for The Fraunhofer FDK AAC Codec Library for Android 42228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 52228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project� Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur F�rderung der angewandten Forschung e.V. 62228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project All rights reserved. 72228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 82228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1. INTRODUCTION 92228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectThe Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements 102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectthe MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. 112228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectThis FDK AAC Codec software is intended to be used on a wide variety of Android devices. 122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 132228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual 142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectaudio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by 152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectindependent studies and is widely deployed. AAC has been standardized by ISO and IEC as part 162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectof the MPEG specifications. 172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 182228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectPatent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) 192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectmay be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners 202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectindividually for the purpose of encoding or decoding bit streams in products that are compliant with 212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectthe ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license 222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectthese patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec 232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectsoftware may already be covered under those patent licenses when it is used for those licensed purposes only. 242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 252228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectCommercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, 262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectare also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional 272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectapplications information and documentation. 282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project2. COPYRIGHT LICENSE 302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 312228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectRedistribution and use in source and binary forms, with or without modification, are permitted without 322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectpayment of copyright license fees provided that you satisfy the following conditions: 332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 342228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYou must retain the complete text of this software license in redistributions of the FDK AAC Codec or 352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectyour modifications thereto in source code form. 362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 372228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYou must retain the complete text of this software license in the documentation and/or other materials 382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectprovided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. 392228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYou must make available free of charge copies of the complete source code of the FDK AAC Codec and your 402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectmodifications thereto to recipients of copies in binary form. 412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 422228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectThe name of Fraunhofer may not be used to endorse or promote products derived from this library without 432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectprior written permission. 442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 452228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYou may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec 462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectsoftware or your modifications thereto. 472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 482228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYour modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software 492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectand the date of any change. For modified versions of the FDK AAC Codec, the term 502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project"Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term 512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project"Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project3. NO PATENT LICENSE 542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 552228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectNO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, 562228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with 572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectrespect to this software. 582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 592228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYou may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized 602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectby appropriate patent licenses. 612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project4. DISCLAIMER 632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 642228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectThis FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors 652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project"AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties 662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectof merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 672228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectCONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, 682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectincluding but not limited to procurement of substitute goods or services; loss of use, data, or profits, 692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projector business interruption, however caused and on any theory of liability, whether in contract, strict 702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectliability, or tort (including negligence), arising in any way out of the use of this software, even if 712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectadvised of the possibility of such damage. 722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project5. CONTACT INFORMATION 742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 752228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFraunhofer Institute for Integrated Circuits IIS 762228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAttention: Audio and Multimedia Departments - FDK AAC LL 772228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAm Wolfsmantel 33 782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project91058 Erlangen, Germany 792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectwww.iis.fraunhofer.de/amm 812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectamm-info@iis.fraunhofer.de 822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project----------------------------------------------------------------------------------------------------------- */ 832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*************************** Fraunhofer IIS FDK Tools ********************** 852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Author(s): Josef Hoepfl, DSP Solutions 872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Description: Fix point FFT 882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project******************************************************************************/ 902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "fft.h" 922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "fft_rad2.h" 942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "FDK_tools_rom.h" 952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define F3C(x) STC(x) 1012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define C31 (F3C(0x91261468)) /* FL2FXCONST_DBL(-0.86602540) */ 1032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/* Performs the FFT of length 3 according to the algorithm after winograd. 1052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project No scaling of the input vector because the scaling is already done in the rotation vector. */ 1062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic FORCEINLINE void fft3(FIXP_DBL *RESTRICT pDat) 1072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 1082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL r1,r2; 1092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL s1,s2; 1102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* real part */ 1112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project r1 = pDat[2] + pDat[4]; 1122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project r2 = fMult((pDat[2] - pDat[4]), C31); 1132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDat[0] = pDat[0] + r1; 1142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project r1 = pDat[0] - r1 - (r1>>1); 1152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* imaginary part */ 1172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project s1 = pDat[3] + pDat[5]; 1182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project s2 = fMult((pDat[3] - pDat[5]), C31); 1192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDat[1] = pDat[1] + s1; 1202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project s1 = pDat[1] - s1 - (s1>>1); 1212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* combination */ 1232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDat[2] = r1 - s2; 1242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDat[4] = r1 + s2; 1252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDat[3] = s1 + r2; 1262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDat[5] = s1 - r2; 1272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 1282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define F5C(x) STC(x) 1312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define C51 (F5C(0x79bc3854)) /* FL2FXCONST_DBL( 0.95105652) */ 1332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define C52 (F5C(0x9d839db0)) /* FL2FXCONST_DBL(-1.53884180/2) */ 1342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define C53 (F5C(0xd18053ce)) /* FL2FXCONST_DBL(-0.36327126) */ 1352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define C54 (F5C(0x478dde64)) /* FL2FXCONST_DBL( 0.55901699) */ 1362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define C55 (F5C(0xb0000001)) /* FL2FXCONST_DBL(-1.25/2) */ 1372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/* performs the FFT of length 5 according to the algorithm after winograd */ 1392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic FORCEINLINE void fft5(FIXP_DBL *RESTRICT pDat) 1402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 1412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL r1,r2,r3,r4; 1422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL s1,s2,s3,s4; 1432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL t; 1442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* real part */ 1462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project r1 = pDat[2] + pDat[8]; 1472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project r4 = pDat[2] - pDat[8]; 1482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project r3 = pDat[4] + pDat[6]; 1492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project r2 = pDat[4] - pDat[6]; 1502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project t = fMult((r1-r3), C54); 1512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project r1 = r1 + r3; 1522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDat[0] = pDat[0] + r1; 1532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Bit shift left because of the constant C55 which was scaled with the factor 0.5 because of the representation of 1542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project the values as fracts */ 1552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project r1 = pDat[0] + (fMultDiv2(r1, C55) <<(2)); 1562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project r3 = r1 - t; 1572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project r1 = r1 + t; 1582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project t = fMult((r4 + r2), C51); 1592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Bit shift left because of the constant C55 which was scaled with the factor 0.5 because of the representation of 1602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project the values as fracts */ 1612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project r4 = t + (fMultDiv2(r4, C52) <<(2)); 1622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project r2 = t + fMult(r2, C53); 1632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* imaginary part */ 1652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project s1 = pDat[3] + pDat[9]; 1662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project s4 = pDat[3] - pDat[9]; 1672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project s3 = pDat[5] + pDat[7]; 1682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project s2 = pDat[5] - pDat[7]; 1692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project t = fMult((s1 - s3), C54); 1702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project s1 = s1 + s3; 1712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDat[1] = pDat[1] + s1; 1722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Bit shift left because of the constant C55 which was scaled with the factor 0.5 because of the representation of 1732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project the values as fracts */ 1742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project s1 = pDat[1] + (fMultDiv2(s1, C55) <<(2)); 1752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project s3 = s1 - t; 1762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project s1 = s1 + t; 1772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project t = fMult((s4 + s2), C51); 1782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Bit shift left because of the constant C55 which was scaled with the factor 0.5 because of the representation of 1792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project the values as fracts */ 1802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project s4 = t + (fMultDiv2(s4, C52) <<(2)); 1812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project s2 = t + fMult(s2, C53); 1822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* combination */ 1842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDat[2] = r1 + s2; 1852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDat[8] = r1 - s2; 1862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDat[4] = r3 - s4; 1872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDat[6] = r3 + s4; 1882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDat[3] = s1 - r2; 1902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDat[9] = s1 + r2; 1912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDat[5] = s3 + r4; 1922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDat[7] = s3 - r4; 1932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 1942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define N3 3 1992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define N5 5 2002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define N6 6 2012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define N15 15 2022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/* Performs the FFT of length 15. It is split into FFTs of length 3 and length 5. */ 2042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic inline void fft15(FIXP_DBL *pInput) 2052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 2062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL aDst[2*N15]; 2072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL aDst1[2*N15]; 2082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int i,k,l; 2092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Sort input vector for fft's of length 3 2112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project input3(0:2) = [input(0) input(5) input(10)]; 2122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project input3(3:5) = [input(3) input(8) input(13)]; 2132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project input3(6:8) = [input(6) input(11) input(1)]; 2142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project input3(9:11) = [input(9) input(14) input(4)]; 2152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project input3(12:14) = [input(12) input(2) input(7)]; */ 2162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 2172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const FIXP_DBL *pSrc = pInput; 2182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL *RESTRICT pDst = aDst; 2192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Merge 3 loops into one, skip call of fft3 */ 2202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(i=0,l=0,k=0; i<N5; i++, k+=6) 2212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 2222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDst[k+0] = pSrc[l]; 2232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDst[k+1] = pSrc[l+1]; 2242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project l += 2*N5; 2252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (l >= (2*N15)) 2262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project l -= (2*N15); 2272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDst[k+2] = pSrc[l]; 2292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDst[k+3] = pSrc[l+1]; 2302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project l += 2*N5; 2312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (l >= (2*N15)) 2322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project l -= (2*N15); 2332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDst[k+4] = pSrc[l]; 2342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDst[k+5] = pSrc[l+1]; 2352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project l += (2*N5) + (2*N3); 2362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (l >= (2*N15)) 2372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project l -= (2*N15); 2382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* fft3 merged with shift right by 2 loop */ 2402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL r1,r2,r3; 2412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL s1,s2; 2422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* real part */ 2432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project r1 = pDst[k+2] + pDst[k+4]; 2442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project r2 = fMult((pDst[k+2] - pDst[k+4]), C31); 2452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project s1 = pDst[k+0]; 2462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDst[k+0] = (s1 + r1)>>2; 2472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project r1 = s1 - (r1>>1); 2482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* imaginary part */ 2502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project s1 = pDst[k+3] + pDst[k+5]; 2512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project s2 = fMult((pDst[k+3] - pDst[k+5]), C31); 2522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project r3 = pDst[k+1]; 2532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDst[k+1] = (r3 + s1)>>2; 2542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project s1 = r3 - (s1>>1); 2552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* combination */ 2572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDst[k+2] = (r1 - s2)>>2; 2582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDst[k+4] = (r1 + s2)>>2; 2592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDst[k+3] = (s1 + r2)>>2; 2602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDst[k+5] = (s1 - r2)>>2; 2612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Sort input vector for fft's of length 5 2642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project input5(0:4) = [output3(0) output3(3) output3(6) output3(9) output3(12)]; 2652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project input5(5:9) = [output3(1) output3(4) output3(7) output3(10) output3(13)]; 2662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project input5(10:14) = [output3(2) output3(5) output3(8) output3(11) output3(14)]; */ 2672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Merge 2 loops into one, brings about 10% */ 2682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 2692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const FIXP_DBL *pSrc = aDst; 2702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL *RESTRICT pDst = aDst1; 2712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(i=0,l=0,k=0; i<N3; i++, k+=10) 2722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 2732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project l = 2*i; 2742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDst[k+0] = pSrc[l+0]; 2752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDst[k+1] = pSrc[l+1]; 2762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDst[k+2] = pSrc[l+0+(2*N3)]; 2772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDst[k+3] = pSrc[l+1+(2*N3)]; 2782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDst[k+4] = pSrc[l+0+(4*N3)]; 2792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDst[k+5] = pSrc[l+1+(4*N3)]; 2802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDst[k+6] = pSrc[l+0+(6*N3)]; 2812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDst[k+7] = pSrc[l+1+(6*N3)]; 2822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDst[k+8] = pSrc[l+0+(8*N3)]; 2832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDst[k+9] = pSrc[l+1+(8*N3)]; 2842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project fft5(&pDst[k]); 2852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Sort output vector of length 15 2882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project output = [out5(0) out5(6) out5(12) out5(3) out5(9) 2892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project out5(10) out5(1) out5(7) out5(13) out5(4) 2902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project out5(5) out5(11) out5(2) out5(8) out5(14)]; */ 2912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* optimize clumsy loop, brings about 5% */ 2922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 2932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const FIXP_DBL *pSrc = aDst1; 2942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL *RESTRICT pDst = pInput; 2952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(i=0,l=0,k=0; i<N3; i++, k+=10) 2962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 2972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDst[k+0] = pSrc[l]; 2982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDst[k+1] = pSrc[l+1]; 2992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project l += (2*N6); 3002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (l >= (2*N15)) 3012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project l -= (2*N15); 3022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDst[k+2] = pSrc[l]; 3032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDst[k+3] = pSrc[l+1]; 3042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project l += (2*N6); 3052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (l >= (2*N15)) 3062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project l -= (2*N15); 3072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDst[k+4] = pSrc[l]; 3082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDst[k+5] = pSrc[l+1]; 3092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project l += (2*N6); 3102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (l >= (2*N15)) 3112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project l -= (2*N15); 3122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDst[k+6] = pSrc[l]; 3132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDst[k+7] = pSrc[l+1]; 3142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project l += (2*N6); 3152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (l >= (2*N15)) 3162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project l -= (2*N15); 3172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDst[k+8] = pSrc[l]; 3182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDst[k+9] = pSrc[l+1]; 3192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project l += 2; /* no modulo check needed, it cannot occur */ 3202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 3212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 3222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 3232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define W_PiFOURTH STC(0x5a82799a) 3252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#ifndef SUMDIFF_PIFOURTH 3262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define SUMDIFF_PIFOURTH(diff,sum,a,b) \ 3272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { \ 3282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL wa, wb;\ 3292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project wa = fMultDiv2(a, W_PiFOURTH);\ 3302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project wb = fMultDiv2(b, W_PiFOURTH);\ 3312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project diff = wb - wa;\ 3322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sum = wb + wa;\ 3332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 3342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#endif 3352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/* This version is more overflow save, but less cycle optimal. */ 3372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define SUMDIFF_EIGTH(x, y, ix, iy, vr, vi, ur, ui) \ 3382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project vr = (x[ 0 + ix]>>1) + (x[16 + ix]>>1); /* Re A + Re B */ \ 3392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project vi = (x[ 8 + ix]>>1) + (x[24 + ix]>>1); /* Re C + Re D */ \ 3402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur = (x[ 1 + ix]>>1) + (x[17 + ix]>>1); /* Im A + Im B */ \ 3412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = (x[ 9 + ix]>>1) + (x[25 + ix]>>1); /* Im C + Im D */ \ 3422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[ 0 + iy] = vr + vi; /* Re A' = ReA + ReB +ReC + ReD */ \ 3432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[ 4 + iy] = vr - vi; /* Re C' = -(ReC+ReD) + (ReA+ReB) */ \ 3442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[ 1 + iy] = ur + ui; /* Im A' = sum of imag values */ \ 3452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[ 5 + iy] = ur - ui; /* Im C' = -Im C -Im D +Im A +Im B */ \ 3462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project vr -= x[16 + ix]; /* Re A - Re B */ \ 3472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project vi = vi - x[24 + ix]; /* Re C - Re D */ \ 3482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur -= x[17 + ix]; /* Im A - Im B */ \ 3492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = ui - x[25 + ix]; /* Im C - Im D */ \ 3502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[ 2 + iy] = ui + vr; /* Re B' = Im C - Im D + Re A - Re B */ \ 3512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[ 6 + iy] = vr - ui; /* Re D' = -Im C + Im D + Re A - Re B */ \ 3522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[ 3 + iy] = ur - vi; /* Im B'= -Re C + Re D + Im A - Im B */ \ 3532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[ 7 + iy] = vi + ur; /* Im D'= Re C - Re D + Im A - Im B */ 3542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic const FIXP_STP fft16_w16[2] = { STCP(0x7641af3d, 0x30fbc54d), STCP(0x30fbc54d, 0x7641af3d) }; 3562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3572228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectLNK_SECTION_CODE_L1 3582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectinline void fft_16(FIXP_DBL *RESTRICT x) 3592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 3602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL vr, vi, ur, ui; 3612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL y[32]; 3622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project SUMDIFF_EIGTH(x, y, 0, 0, vr, vi, ur, ui); 3642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project SUMDIFF_EIGTH(x, y, 4, 8, vr, vi, ur, ui); 3652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project SUMDIFF_EIGTH(x, y, 2, 16, vr, vi, ur, ui); 3662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project SUMDIFF_EIGTH(x, y, 6, 24, vr, vi, ur, ui); 3672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project// xt1 = 0 3692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project// xt2 = 8 3702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project vr = y[ 8]; 3712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project vi = y[ 9]; 3722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur = y[ 0]>>1; 3732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = y[ 1]>>1; 3742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[ 0] = ur + (vr>>1); 3752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[ 1] = ui + (vi>>1); 3762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[ 8] = ur - (vr>>1); 3772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[ 9] = ui - (vi>>1); 3782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project// xt1 = 4 3802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project// xt2 = 12 3812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project vr = y[13]; 3822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project vi = y[12]; 3832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur = y[ 4]>>1; 3842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = y[ 5]>>1; 3852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[ 4] = ur + (vr>>1); 3862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[ 5] = ui - (vi>>1); 3872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[12] = ur - (vr>>1); 3882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[13] = ui + (vi>>1); 3892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project// xt1 = 16 3912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project// xt2 = 24 3922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project vr = y[24]; 3932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project vi = y[25]; 3942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur = y[16]>>1; 3952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = y[17]>>1; 3962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[16] = ur + (vr>>1); 3972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[17] = ui + (vi>>1); 3982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[24] = ur - (vr>>1); 3992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[25] = ui - (vi>>1); 4002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project// xt1 = 20 4022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project// xt2 = 28 4032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project vr = y[29]; 4042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project vi = y[28]; 4052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur = y[20]>>1; 4062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = y[21]>>1; 4072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[20] = ur + (vr>>1); 4082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[21] = ui - (vi>>1); 4092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[28] = ur - (vr>>1); 4102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[29] = ui + (vi>>1); 4112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project // xt1 = 2 4132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project// xt2 = 10 4142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project SUMDIFF_PIFOURTH(vi, vr, y[10], y[11]) 4152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project //vr = fMultDiv2((y[11] + y[10]),W_PiFOURTH); 4162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project //vi = fMultDiv2((y[11] - y[10]),W_PiFOURTH); 4172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur = y[ 2]; 4182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = y[ 3]; 4192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[ 2] = (ur>>1) + vr; 4202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[ 3] = (ui>>1) + vi; 4212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[10] = (ur>>1) - vr; 4222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[11] = (ui>>1) - vi; 4232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project// xt1 = 6 4252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project// xt2 = 14 4262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project SUMDIFF_PIFOURTH(vr, vi, y[14], y[15]) 4272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur = y[ 6]; 4282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = y[ 7]; 4292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[ 6] = (ur>>1) + vr; 4302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[ 7] = (ui>>1) - vi; 4312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[14] = (ur>>1) - vr; 4322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[15] = (ui>>1) + vi; 4332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project// xt1 = 18 4352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project// xt2 = 26 4362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project SUMDIFF_PIFOURTH(vi, vr, y[26], y[27]) 4372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur = y[18]; 4382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = y[19]; 4392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[18] = (ur>>1) + vr; 4402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[19] = (ui>>1) + vi; 4412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[26] = (ur>>1) - vr; 4422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[27] = (ui>>1) - vi; 4432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project// xt1 = 22 4452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project// xt2 = 30 4462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project SUMDIFF_PIFOURTH(vr, vi, y[30], y[31]) 4472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur = y[22]; 4482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = y[23]; 4492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[22] = (ur>>1) + vr; 4502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[23] = (ui>>1) - vi; 4512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[30] = (ur>>1) - vr; 4522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[31] = (ui>>1) + vi; 4532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project// xt1 = 0 4552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project// xt2 = 16 4562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project vr = x[16]; 4572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project vi = x[17]; 4582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur = x[ 0]>>1; 4592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = x[ 1]>>1; 4602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[ 0] = ur + (vr>>1); 4612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[ 1] = ui + (vi>>1); 4622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[16] = ur - (vr>>1); 4632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[17] = ui - (vi>>1); 4642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project// xt1 = 8 4662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project// xt2 = 24 4672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project vi = x[24]; 4682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project vr = x[25]; 4692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur = x[ 8]>>1; 4702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = x[ 9]>>1; 4712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[ 8] = ur + (vr>>1); 4722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[ 9] = ui - (vi>>1); 4732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[24] = ur - (vr>>1); 4742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[25] = ui + (vi>>1); 4752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project// xt1 = 2 4772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project// xt2 = 18 4782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cplxMultDiv2(&vi, &vr, x[19], x[18], fft16_w16[0]); 4792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur = x[ 2]; 4802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = x[ 3]; 4812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[ 2] = (ur>>1) + vr; 4822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[ 3] = (ui>>1) + vi; 4832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[18] = (ur>>1) - vr; 4842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[19] = (ui>>1) - vi; 4852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project// xt1 = 10 4872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project// xt2 = 26 4882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cplxMultDiv2(&vr, &vi, x[27], x[26], fft16_w16[0]); 4892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur = x[10]; 4902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = x[11]; 4912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[10] = (ur>>1) + vr; 4922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[11] = (ui>>1) - vi; 4932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[26] = (ur>>1) - vr; 4942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[27] = (ui>>1) + vi; 4952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project// xt1 = 4 4972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project// xt2 = 20 4982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project SUMDIFF_PIFOURTH(vi, vr, x[20], x[21]) 4992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur = x[ 4]; 5002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = x[ 5]; 5012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[ 4] = (ur>>1) + vr; 5022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[ 5] = (ui>>1) + vi; 5032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[20] = (ur>>1) - vr; 5042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[21] = (ui>>1) - vi; 5052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project// xt1 = 12 5072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project// xt2 = 28 5082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project SUMDIFF_PIFOURTH(vr, vi, x[28], x[29]) 5092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur = x[12]; 5102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = x[13]; 5112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[12] = (ur>>1) + vr; 5122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[13] = (ui>>1) - vi; 5132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[28] = (ur>>1) - vr; 5142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[29] = (ui>>1) + vi; 5152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project// xt1 = 6 5172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project// xt2 = 22 5182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cplxMultDiv2(&vi, &vr, x[23], x[22], fft16_w16[1]); 5192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur = x[ 6]; 5202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = x[ 7]; 5212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[ 6] = (ur>>1) + vr; 5222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[ 7] = (ui>>1) + vi; 5232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[22] = (ur>>1) - vr; 5242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[23] = (ui>>1) - vi; 5252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project// xt1 = 14 5272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project// xt2 = 30 5282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cplxMultDiv2(&vr, &vi, x[31], x[30], fft16_w16[1]); 5292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur = x[14]; 5302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = x[15]; 5312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[14] = (ur>>1) + vr; 5322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[15] = (ui>>1) - vi; 5332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[30] = (ur>>1) - vr; 5342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[31] = (ui>>1) + vi; 5352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 5362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#ifndef FUNCTION_fft_32 5382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic const FIXP_STP fft32_w32[6] = 5392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 5402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project STCP (0x7641af3d, 0x30fbc54d), STCP(0x30fbc54d, 0x7641af3d), STCP(0x7d8a5f40, 0x18f8b83c), 5412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project STCP (0x6a6d98a4, 0x471cece7), STCP(0x471cece7, 0x6a6d98a4), STCP(0x18f8b83c, 0x7d8a5f40) 5422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}; 5432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5442228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectLNK_SECTION_CODE_L1 5452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectinline void fft_32(FIXP_DBL *x) 5462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 5472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define W_PiFOURTH STC(0x5a82799a) 5492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL vr,vi,ur,ui; 5512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL y[64]; 5522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 5542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * 1+2 stage radix 4 5552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 5562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project///////////////////////////////////////////////////////////////////////////////////////// 5582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project // i = 0 5602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project vr = (x[ 0] + x[32])>>1; /* Re A + Re B */ 5612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project vi = (x[16] + x[48]); /* Re C + Re D */ 5622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur = (x[ 1] + x[33])>>1; /* Im A + Im B */ 5632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = (x[17] + x[49]); /* Im C + Im D */ 5642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[ 0] = vr + (vi>>1); /* Re A' = ReA + ReB +ReC + ReD */ 5662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[ 4] = vr - (vi>>1); /* Re C' = -(ReC+ReD) + (ReA+ReB) */ 5672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[ 1] = ur + (ui>>1); /* Im A' = sum of imag values */ 5682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[ 5] = ur - (ui>>1); /* Im C' = -Im C -Im D +Im A +Im B */ 5692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project vr -= x[32]; /* Re A - Re B */ 5712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project vi = (vi>>1) - x[48]; /* Re C - Re D */ 5722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur -= x[33]; /* Im A - Im B */ 5732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = (ui>>1) - x[49]; /* Im C - Im D */ 5742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[ 2] = ui + vr; /* Re B' = Im C - Im D + Re A - Re B */ 5762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[ 6] = vr - ui; /* Re D' = -Im C + Im D + Re A - Re B */ 5772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[ 3] = ur - vi; /* Im B'= -Re C + Re D + Im A - Im B */ 5782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[ 7] = vi + ur; /* Im D'= Re C - Re D + Im A - Im B */ 5792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project //i=8 5812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project vr = (x[ 8] + x[40])>>1; /* Re A + Re B */ 5822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project vi = (x[24] + x[56]); /* Re C + Re D */ 5832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur = (x[ 9] + x[41])>>1; /* Im A + Im B */ 5842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = (x[25] + x[57]); /* Im C + Im D */ 5852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[ 8] = vr + (vi>>1); /* Re A' = ReA + ReB +ReC + ReD */ 5872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[12] = vr - (vi>>1); /* Re C' = -(ReC+ReD) + (ReA+ReB) */ 5882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[ 9] = ur + (ui>>1); /* Im A' = sum of imag values */ 5892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[13] = ur - (ui>>1); /* Im C' = -Im C -Im D +Im A +Im B */ 5902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project vr -= x[40]; /* Re A - Re B */ 5922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project vi = (vi>>1) - x[56]; /* Re C - Re D */ 5932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur -= x[41]; /* Im A - Im B */ 5942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = (ui>>1) - x[57]; /* Im C - Im D */ 5952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[10] = ui + vr; /* Re B' = Im C - Im D + Re A - Re B */ 5972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[14] = vr - ui; /* Re D' = -Im C + Im D + Re A - Re B */ 5982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[11] = ur - vi; /* Im B'= -Re C + Re D + Im A - Im B */ 5992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[15] = vi + ur; /* Im D'= Re C - Re D + Im A - Im B */ 6002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project //i=16 6022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project vr = (x[ 4] + x[36])>>1; /* Re A + Re B */ 6032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project vi = (x[20] + x[52]); /* Re C + Re D */ 6042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur = (x[ 5] + x[37])>>1; /* Im A + Im B */ 6052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = (x[21] + x[53]); /* Im C + Im D */ 6062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[16] = vr + (vi>>1); /* Re A' = ReA + ReB +ReC + ReD */ 6082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[20] = vr - (vi>>1); /* Re C' = -(ReC+ReD) + (ReA+ReB) */ 6092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[17] = ur + (ui>>1); /* Im A' = sum of imag values */ 6102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[21] = ur - (ui>>1); /* Im C' = -Im C -Im D +Im A +Im B */ 6112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project vr -= x[36]; /* Re A - Re B */ 6132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project vi = (vi>>1) - x[52]; /* Re C - Re D */ 6142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur -= x[37]; /* Im A - Im B */ 6152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = (ui>>1) - x[53]; /* Im C - Im D */ 6162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[18] = ui + vr; /* Re B' = Im C - Im D + Re A - Re B */ 6182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[22] = vr - ui; /* Re D' = -Im C + Im D + Re A - Re B */ 6192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[19] = ur - vi; /* Im B'= -Re C + Re D + Im A - Im B */ 6202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[23] = vi + ur; /* Im D'= Re C - Re D + Im A - Im B */ 6212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project //i=24 6232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project vr = (x[12] + x[44])>>1; /* Re A + Re B */ 6242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project vi = (x[28] + x[60]); /* Re C + Re D */ 6252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur = (x[13] + x[45])>>1; /* Im A + Im B */ 6262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = (x[29] + x[61]); /* Im C + Im D */ 6272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[24] = vr + (vi>>1); /* Re A' = ReA + ReB +ReC + ReD */ 6292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[28] = vr - (vi>>1); /* Re C' = -(ReC+ReD) + (ReA+ReB) */ 6302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[25] = ur + (ui>>1); /* Im A' = sum of imag values */ 6312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[29] = ur - (ui>>1); /* Im C' = -Im C -Im D +Im A +Im B */ 6322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project vr -= x[44]; /* Re A - Re B */ 6342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project vi = (vi>>1) - x[60]; /* Re C - Re D */ 6352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur -= x[45]; /* Im A - Im B */ 6362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = (ui>>1) - x[61]; /* Im C - Im D */ 6372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[26] = ui + vr; /* Re B' = Im C - Im D + Re A - Re B */ 6392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[30] = vr - ui; /* Re D' = -Im C + Im D + Re A - Re B */ 6402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[27] = ur - vi; /* Im B'= -Re C + Re D + Im A - Im B */ 6412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[31] = vi + ur; /* Im D'= Re C - Re D + Im A - Im B */ 6422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project // i = 32 6442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project vr = (x[ 2] + x[34])>>1; /* Re A + Re B */ 6452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project vi = (x[18] + x[50]); /* Re C + Re D */ 6462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur = (x[ 3] + x[35])>>1; /* Im A + Im B */ 6472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = (x[19] + x[51]); /* Im C + Im D */ 6482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[32] = vr + (vi>>1); /* Re A' = ReA + ReB +ReC + ReD */ 6502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[36] = vr - (vi>>1); /* Re C' = -(ReC+ReD) + (ReA+ReB) */ 6512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[33] = ur + (ui>>1); /* Im A' = sum of imag values */ 6522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[37] = ur - (ui>>1); /* Im C' = -Im C -Im D +Im A +Im B */ 6532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project vr -= x[34]; /* Re A - Re B */ 6552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project vi = (vi>>1) - x[50]; /* Re C - Re D */ 6562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur -= x[35]; /* Im A - Im B */ 6572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = (ui>>1) - x[51]; /* Im C - Im D */ 6582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[34] = ui + vr; /* Re B' = Im C - Im D + Re A - Re B */ 6602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[38] = vr - ui; /* Re D' = -Im C + Im D + Re A - Re B */ 6612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[35] = ur - vi; /* Im B'= -Re C + Re D + Im A - Im B */ 6622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[39] = vi + ur; /* Im D'= Re C - Re D + Im A - Im B */ 6632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project //i=40 6652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project vr = (x[10] + x[42])>>1; /* Re A + Re B */ 6662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project vi = (x[26] + x[58]); /* Re C + Re D */ 6672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur = (x[11] + x[43])>>1; /* Im A + Im B */ 6682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = (x[27] + x[59]); /* Im C + Im D */ 6692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[40] = vr + (vi>>1); /* Re A' = ReA + ReB +ReC + ReD */ 6712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[44] = vr - (vi>>1); /* Re C' = -(ReC+ReD) + (ReA+ReB) */ 6722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[41] = ur + (ui>>1); /* Im A' = sum of imag values */ 6732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[45] = ur - (ui>>1); /* Im C' = -Im C -Im D +Im A +Im B */ 6742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project vr -= x[42]; /* Re A - Re B */ 6762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project vi = (vi>>1) - x[58]; /* Re C - Re D */ 6772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur -= x[43]; /* Im A - Im B */ 6782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = (ui>>1) - x[59]; /* Im C - Im D */ 6792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[42] = ui + vr; /* Re B' = Im C - Im D + Re A - Re B */ 6812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[46] = vr - ui; /* Re D' = -Im C + Im D + Re A - Re B */ 6822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[43] = ur - vi; /* Im B'= -Re C + Re D + Im A - Im B */ 6832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[47] = vi + ur; /* Im D'= Re C - Re D + Im A - Im B */ 6842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project //i=48 6862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project vr = (x[ 6] + x[38])>>1; /* Re A + Re B */ 6872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project vi = (x[22] + x[54]); /* Re C + Re D */ 6882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur = (x[ 7] + x[39])>>1; /* Im A + Im B */ 6892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = (x[23] + x[55]); /* Im C + Im D */ 6902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[48] = vr + (vi>>1); /* Re A' = ReA + ReB +ReC + ReD */ 6922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[52] = vr - (vi>>1); /* Re C' = -(ReC+ReD) + (ReA+ReB) */ 6932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[49] = ur + (ui>>1); /* Im A' = sum of imag values */ 6942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[53] = ur - (ui>>1); /* Im C' = -Im C -Im D +Im A +Im B */ 6952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project vr -= x[38]; /* Re A - Re B */ 6972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project vi = (vi>>1) - x[54]; /* Re C - Re D */ 6982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur -= x[39]; /* Im A - Im B */ 6992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = (ui>>1) - x[55]; /* Im C - Im D */ 7002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[50] = ui + vr; /* Re B' = Im C - Im D + Re A - Re B */ 7022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[54] = vr - ui; /* Re D' = -Im C + Im D + Re A - Re B */ 7032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[51] = ur - vi; /* Im B'= -Re C + Re D + Im A - Im B */ 7042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[55] = vi + ur; /* Im D'= Re C - Re D + Im A - Im B */ 7052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project //i=56 7072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project vr = (x[14] + x[46])>>1; /* Re A + Re B */ 7082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project vi = (x[30] + x[62]); /* Re C + Re D */ 7092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur = (x[15] + x[47])>>1; /* Im A + Im B */ 7102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = (x[31] + x[63]); /* Im C + Im D */ 7112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[56] = vr + (vi>>1); /* Re A' = ReA + ReB +ReC + ReD */ 7132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[60] = vr - (vi>>1); /* Re C' = -(ReC+ReD) + (ReA+ReB) */ 7142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[57] = ur + (ui>>1); /* Im A' = sum of imag values */ 7152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[61] = ur - (ui>>1); /* Im C' = -Im C -Im D +Im A +Im B */ 7162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project vr -= x[46]; /* Re A - Re B */ 7182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project vi = (vi>>1) - x[62]; /* Re C - Re D */ 7192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur -= x[47]; /* Im A - Im B */ 7202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = (ui>>1) - x[63]; /* Im C - Im D */ 7212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[58] = ui + vr; /* Re B' = Im C - Im D + Re A - Re B */ 7232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[62] = vr - ui; /* Re D' = -Im C + Im D + Re A - Re B */ 7242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[59] = ur - vi; /* Im B'= -Re C + Re D + Im A - Im B */ 7252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project y[63] = vi + ur; /* Im D'= Re C - Re D + Im A - Im B */ 7262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL *xt = &x[0]; 7292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL *yt = &y[0]; 7302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int j = 4; 7322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project do 7332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 7342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project vr = yt[8]; 7352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project vi = yt[9]; 7362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur = yt[0]>>1; 7372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = yt[1]>>1; 7382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project xt[ 0] = ur + (vr>>1); 7392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project xt[ 1] = ui + (vi>>1); 7402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project xt[ 8] = ur - (vr>>1); 7412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project xt[ 9] = ui - (vi>>1); 7422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project vr = yt[13]; 7442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project vi = yt[12]; 7452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur = yt[4]>>1; 7462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = yt[5]>>1; 7472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project xt[ 4] = ur + (vr>>1); 7482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project xt[ 5] = ui - (vi>>1); 7492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project xt[12] = ur - (vr>>1); 7502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project xt[13] = ui + (vi>>1); 7512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project SUMDIFF_PIFOURTH(vi, vr, yt[10], yt[11]) 7532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur = yt[2]; 7542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = yt[3]; 7552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project xt[ 2] = (ur>>1) + vr; 7562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project xt[ 3] = (ui>>1) + vi; 7572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project xt[10] = (ur>>1) - vr; 7582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project xt[11] = (ui>>1) - vi; 7592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project SUMDIFF_PIFOURTH(vr, vi, yt[14], yt[15]) 7612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur = yt[6]; 7622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = yt[7]; 7632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project xt[ 6] = (ur>>1) + vr; 7652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project xt[ 7] = (ui>>1) - vi; 7662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project xt[14] = (ur>>1) - vr; 7672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project xt[15] = (ui>>1) + vi; 7682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project xt += 16; 7692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project yt += 16; 7702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } while (--j != 0); 7712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project vr = x[16]; 7732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project vi = x[17]; 7742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur = x[ 0]>>1; 7752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = x[ 1]>>1; 7762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[ 0] = ur + (vr>>1); 7772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[ 1] = ui + (vi>>1); 7782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[16] = ur - (vr>>1); 7792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[17] = ui - (vi>>1); 7802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project vi = x[24]; 7822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project vr = x[25]; 7832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur = x[ 8]>>1; 7842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = x[ 9]>>1; 7852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[ 8] = ur + (vr>>1); 7862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[ 9] = ui - (vi>>1); 7872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[24] = ur - (vr>>1); 7882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[25] = ui + (vi>>1); 7892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project vr = x[48]; 7912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project vi = x[49]; 7922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur = x[32]>>1; 7932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = x[33]>>1; 7942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[32] = ur + (vr>>1); 7952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[33] = ui + (vi>>1); 7962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[48] = ur - (vr>>1); 7972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[49] = ui - (vi>>1); 7982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project vi = x[56]; 8002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project vr = x[57]; 8012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur = x[40]>>1; 8022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = x[41]>>1; 8032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[40] = ur + (vr>>1); 8042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[41] = ui - (vi>>1); 8052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[56] = ur - (vr>>1); 8062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[57] = ui + (vi>>1); 8072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cplxMultDiv2(&vi, &vr, x[19], x[18], fft32_w32[0]); 8092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur = x[ 2]; 8102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = x[ 3]; 8112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[ 2] = (ur>>1) + vr; 8122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[ 3] = (ui>>1) + vi; 8132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[18] = (ur>>1) - vr; 8142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[19] = (ui>>1) - vi; 8152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cplxMultDiv2(&vr, &vi, x[27], x[26], fft32_w32[0]); 8172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur = x[10]; 8182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = x[11]; 8192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[10] = (ur>>1) + vr; 8202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[11] = (ui>>1) - vi; 8212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[26] = (ur>>1) - vr; 8222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[27] = (ui>>1) + vi; 8232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cplxMultDiv2(&vi, &vr, x[51], x[50], fft32_w32[0]); 8252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur = x[34]; 8262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = x[35]; 8272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[34] = (ur>>1) + vr; 8282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[35] = (ui>>1) + vi; 8292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[50] = (ur>>1) - vr; 8302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[51] = (ui>>1) - vi; 8312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cplxMultDiv2(&vr, &vi, x[59], x[58], fft32_w32[0]); 8332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur = x[42]; 8342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = x[43]; 8352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[42] = (ur>>1) + vr; 8362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[43] = (ui>>1) - vi; 8372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[58] = (ur>>1) - vr; 8382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[59] = (ui>>1) + vi; 8392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project SUMDIFF_PIFOURTH(vi, vr, x[20], x[21]) 8412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur = x[ 4]; 8422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = x[ 5]; 8432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[ 4] = (ur>>1) + vr; 8442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[ 5] = (ui>>1) + vi; 8452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[20] = (ur>>1) - vr; 8462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[21] = (ui>>1) - vi; 8472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project SUMDIFF_PIFOURTH(vr, vi, x[28], x[29]) 8492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur = x[12]; 8502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = x[13]; 8512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[12] = (ur>>1) + vr; 8522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[13] = (ui>>1) - vi; 8532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[28] = (ur>>1) - vr; 8542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[29] = (ui>>1) + vi; 8552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project SUMDIFF_PIFOURTH(vi, vr, x[52], x[53]) 8572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur = x[36]; 8582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = x[37]; 8592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[36] = (ur>>1) + vr; 8602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[37] = (ui>>1) + vi; 8612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[52] = (ur>>1) - vr; 8622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[53] = (ui>>1) - vi; 8632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project SUMDIFF_PIFOURTH(vr, vi, x[60], x[61]) 8652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur = x[44]; 8662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = x[45]; 8672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[44] = (ur>>1) + vr; 8682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[45] = (ui>>1) - vi; 8692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[60] = (ur>>1) - vr; 8702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[61] = (ui>>1) + vi; 8712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cplxMultDiv2(&vi, &vr, x[23], x[22], fft32_w32[1]); 8742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur = x[ 6]; 8752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = x[ 7]; 8762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[ 6] = (ur>>1) + vr; 8772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[ 7] = (ui>>1) + vi; 8782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[22] = (ur>>1) - vr; 8792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[23] = (ui>>1) - vi; 8802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cplxMultDiv2(&vr, &vi, x[31], x[30], fft32_w32[1]); 8822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur = x[14]; 8832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = x[15]; 8842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[14] = (ur>>1) + vr; 8852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[15] = (ui>>1) - vi; 8862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[30] = (ur>>1) - vr; 8872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[31] = (ui>>1) + vi; 8882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cplxMultDiv2(&vi, &vr, x[55], x[54], fft32_w32[1]); 8902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur = x[38]; 8912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = x[39]; 8922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[38] = (ur>>1) + vr; 8932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[39] = (ui>>1) + vi; 8942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[54] = (ur>>1) - vr; 8952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[55] = (ui>>1) - vi; 8962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cplxMultDiv2(&vr, &vi, x[63], x[62], fft32_w32[1]); 8982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur = x[46]; 8992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = x[47]; 9002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[46] = (ur>>1) + vr; 9022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[47] = (ui>>1) - vi; 9032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[62] = (ur>>1) - vr; 9042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[63] = (ui>>1) + vi; 9052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project vr = x[32]; 9072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project vi = x[33]; 9082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur = x[ 0]>>1; 9092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = x[ 1]>>1; 9102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[ 0] = ur + (vr>>1); 9112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[ 1] = ui + (vi>>1); 9122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[32] = ur - (vr>>1); 9132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[33] = ui - (vi>>1); 9142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project vi = x[48]; 9162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project vr = x[49]; 9172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur = x[16]>>1; 9182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = x[17]>>1; 9192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[16] = ur + (vr>>1); 9202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[17] = ui - (vi>>1); 9212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[48] = ur - (vr>>1); 9222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[49] = ui + (vi>>1); 9232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cplxMultDiv2(&vi, &vr, x[35], x[34], fft32_w32[2]); 9252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur = x[ 2]; 9262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = x[ 3]; 9272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[ 2] = (ur>>1) + vr; 9282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[ 3] = (ui>>1) + vi; 9292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[34] = (ur>>1) - vr; 9302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[35] = (ui>>1) - vi; 9312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cplxMultDiv2(&vr, &vi, x[51], x[50], fft32_w32[2]); 9332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur = x[18]; 9342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = x[19]; 9352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[18] = (ur>>1) + vr; 9362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[19] = (ui>>1) - vi; 9372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[50] = (ur>>1) - vr; 9382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[51] = (ui>>1) + vi; 9392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cplxMultDiv2(&vi, &vr, x[37], x[36], fft32_w32[0]); 9412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur = x[ 4]; 9422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = x[ 5]; 9432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[ 4] = (ur>>1) + vr; 9442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[ 5] = (ui>>1) + vi; 9452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[36] = (ur>>1) - vr; 9462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[37] = (ui>>1) - vi; 9472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cplxMultDiv2(&vr, &vi, x[53], x[52], fft32_w32[0]); 9492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur = x[20]; 9502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = x[21]; 9512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[20] = (ur>>1) + vr; 9522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[21] = (ui>>1) - vi; 9532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[52] = (ur>>1) - vr; 9542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[53] = (ui>>1) + vi; 9552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cplxMultDiv2(&vi, &vr, x[39], x[38], fft32_w32[3]); 9572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur = x[ 6]; 9582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = x[ 7]; 9592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[ 6] = (ur>>1) + vr; 9602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[ 7] = (ui>>1) + vi; 9612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[38] = (ur>>1) - vr; 9622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[39] = (ui>>1) - vi; 9632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cplxMultDiv2(&vr, &vi, x[55], x[54], fft32_w32[3]); 9652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur = x[22]; 9662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = x[23]; 9672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[22] = (ur>>1) + vr; 9682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[23] = (ui>>1) - vi; 9692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[54] = (ur>>1) - vr; 9702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[55] = (ui>>1) + vi; 9712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project SUMDIFF_PIFOURTH(vi, vr, x[40], x[41]) 9732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur = x[ 8]; 9742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = x[ 9]; 9752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[ 8] = (ur>>1) + vr; 9762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[ 9] = (ui>>1) + vi; 9772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[40] = (ur>>1) - vr; 9782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[41] = (ui>>1) - vi; 9792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project SUMDIFF_PIFOURTH(vr, vi, x[56], x[57]) 9812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur = x[24]; 9822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = x[25]; 9832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[24] = (ur>>1) + vr; 9842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[25] = (ui>>1) - vi; 9852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[56] = (ur>>1) - vr; 9862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[57] = (ui>>1) + vi; 9872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cplxMultDiv2(&vi, &vr, x[43], x[42], fft32_w32[4]); 9892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur = x[10]; 9902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = x[11]; 9912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[10] = (ur>>1) + vr; 9932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[11] = (ui>>1) + vi; 9942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[42] = (ur>>1) - vr; 9952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[43] = (ui>>1) - vi; 9962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cplxMultDiv2(&vr, &vi, x[59], x[58], fft32_w32[4]); 9982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur = x[26]; 9992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = x[27]; 10002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[26] = (ur>>1) + vr; 10012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[27] = (ui>>1) - vi; 10022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[58] = (ur>>1) - vr; 10032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[59] = (ui>>1) + vi; 10042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cplxMultDiv2(&vi, &vr, x[45], x[44], fft32_w32[1]); 10062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur = x[12]; 10072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = x[13]; 10082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[12] = (ur>>1) + vr; 10092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[13] = (ui>>1) + vi; 10102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[44] = (ur>>1) - vr; 10112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[45] = (ui>>1) - vi; 10122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cplxMultDiv2(&vr, &vi, x[61], x[60], fft32_w32[1]); 10142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur = x[28]; 10152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = x[29]; 10162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[28] = (ur>>1) + vr; 10172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[29] = (ui>>1) - vi; 10182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[60] = (ur>>1) - vr; 10192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[61] = (ui>>1) + vi; 10202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cplxMultDiv2(&vi, &vr, x[47], x[46], fft32_w32[5]); 10222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur = x[14]; 10232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = x[15]; 10242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[14] = (ur>>1) + vr; 10252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[15] = (ui>>1) + vi; 10262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[46] = (ur>>1) - vr; 10272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[47] = (ui>>1) - vi; 10282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cplxMultDiv2(&vr, &vi, x[63], x[62], fft32_w32[5]); 10302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ur = x[30]; 10312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = x[31]; 10322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[30] = (ur>>1) + vr; 10332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[31] = (ui>>1) - vi; 10342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[62] = (ur>>1) - vr; 10352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project x[63] = (ui>>1) + vi; 10362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 10372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#endif /* #ifndef FUNCTION_fft_32 */ 10382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/** 10412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \brief Apply rotation vectors to a data buffer. 10422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \param cl length of each row of input data. 10432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \param l total length of input data. 10442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \param pVecRe real part of rotation ceofficient vector. 10452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * \param pVecIm imaginary part of rotation ceofficient vector. 10462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 10472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic inline void fft_apply_rot_vector(FIXP_DBL *RESTRICT pData, const int cl, const int l, const FIXP_STB *pVecRe, const FIXP_STB *pVecIm) 10482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 10492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL re, im; 10502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_STB vre, vim; 10512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int i, c; 10532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(i=0; i<cl; i++) { 10552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project re = pData[2*i]; 10562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project im = pData[2*i+1]; 10572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pData[2*i] = re>>2; /* * 0.25 */ 10592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pData[2*i+1] = im>>2; /* * 0.25 */ 10602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 10612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(; i<l; i+=cl) 10622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 10632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project re = pData[2*i]; 10642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project im = pData[2*i+1]; 10652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pData[2*i] = re>>2; /* * 0.25 */ 10672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pData[2*i+1] = im>>2; /* * 0.25 */ 10682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (c=i+1; c<i+cl; c++) 10702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 10712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project re = pData[2*c]>>1; 10722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project im = pData[2*c+1]>>1; 10732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project vre = *pVecRe++; 10742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project vim = *pVecIm++; 10752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project cplxMultDiv2(&pData[2*c+1], &pData[2*c], im, re, vre, vim); 10772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 10782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 10792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 10802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define FFT_TWO_STAGE_MACRO_ENABLE 10822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#ifdef FFT_TWO_STAGE_MACRO_ENABLE 10852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define fftN2(pInput, length, dim1, dim2, fft_func1, fft_func2, RotVectorReal, RotVectorImag) \ 10872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ \ 10882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int i, j; \ 10892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \ 10902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project C_ALLOC_SCRATCH_START(aDst, FIXP_DBL, length*2); \ 10912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project C_ALLOC_SCRATCH_START(aDst2, FIXP_DBL, dim2*2); \ 10922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \ 10932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDK_ASSERT(length == dim1*dim2); \ 10942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \ 10952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Perform dim2 times the fft of length dim1. The input samples are at the address of pSrc and the \ 10962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project output samples are at the address of pDst. The input vector for the fft of length dim1 is built \ 10972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project of the interleaved samples in pSrc, the output samples are stored consecutively. \ 10982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ \ 10992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { \ 11002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const FIXP_DBL* pSrc = pInput; \ 11012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL *RESTRICT pDst = aDst; \ 11022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \ 11032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(i=0; i<dim2; i++) \ 11042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { \ 11052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(j=0; j<dim1; j++) \ 11062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { \ 11072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDst[2*j] = pSrc[2*j*dim2]; \ 11082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDst[2*j+1] = pSrc[2*j*dim2+1]; \ 11092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } \ 11102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \ 11112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project fft_func1(pDst); \ 11122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pSrc += 2; \ 11132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDst = pDst + 2*dim1; \ 11142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } \ 11152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } \ 11162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \ 11172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Perform the modulation of the output of the fft of length dim1 */ \ 11182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project fft_apply_rot_vector(aDst, dim1, length, RotVectorReal, RotVectorImag); \ 11192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \ 11202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Perform dim1 times the fft of length dim2. The input samples are at the address of aDst and the \ 11212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project output samples are at the address of pInput. The input vector for the fft of length dim2 is built \ 11222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project of the interleaved samples in aDst, the output samples are stored consecutively at the address \ 11232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project of pInput. \ 11242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ \ 11252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { \ 11262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const FIXP_DBL* pSrc = aDst; \ 11272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL *RESTRICT pDst = aDst2; \ 11282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL *RESTRICT pDstOut = pInput; \ 11292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \ 11302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(i=0; i<dim1; i++) \ 11312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { \ 11322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(j=0; j<dim2; j++) \ 11332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { \ 11342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDst[2*j] = pSrc[2*j*dim1]; \ 11352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDst[2*j+1] = pSrc[2*j*dim1+1]; \ 11362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } \ 11372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \ 11382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project fft_func2(pDst); \ 11392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \ 11402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(j=0; j<dim2; j++) \ 11412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { \ 11422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDstOut[2*j*dim1] = pDst[2*j]; \ 11432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDstOut[2*j*dim1+1] = pDst[2*j+1]; \ 11442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } \ 11452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pSrc += 2; \ 11462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDstOut += 2; \ 11472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } \ 11482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } \ 11492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \ 11502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project C_ALLOC_SCRATCH_END(aDst2, FIXP_DBL, dim2*2); \ 11512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project C_ALLOC_SCRATCH_END(aDst, FIXP_DBL, length*2); \ 11522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} \ 11532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#else /* FFT_TWO_STAGE_MACRO_ENABLE */ 11552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/* select either switch case of function pointer. */ 11572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project//#define FFT_TWO_STAGE_SWITCH_CASE 11582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic inline void fftN2( 11602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL *pInput, 11612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const int length, 11622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const int dim1, 11632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const int dim2, 11642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project void (* const fft1)(FIXP_DBL *), 11652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project void (* const fft2)(FIXP_DBL *), 11662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const FIXP_STB *RotVectorReal, 11672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const FIXP_STB *RotVectorImag 11682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ) 11692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 11702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* The real part of the input samples are at the addresses with even indices and the imaginary 11712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project part of the input samples are at the addresses with odd indices. The output samples are stored 11722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project at the address of pInput 11732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 11742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL *pSrc, *pDst, *pDstOut; 11752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int i, j; 11762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project C_ALLOC_SCRATCH_START(aDst, FIXP_DBL, length*2); 11782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project C_ALLOC_SCRATCH_START(aDst2, FIXP_DBL, dim2*2); 11792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDK_ASSERT(length == dim1*dim2); 11812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Perform dim2 times the fft of length dim1. The input samples are at the address of pSrc and the 11832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project output samples are at the address of pDst. The input vector for the fft of length dim1 is built 11842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project of the interleaved samples in pSrc, the output samples are stored consecutively. 11852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 11862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pSrc = pInput; 11872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDst = aDst; 11882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(i=0; i<length/dim1; i++) 11892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 11902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(j=0; j<length/dim2; j++) 11912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 11922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDst[2*j] = pSrc[2*j*dim2]; 11932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDst[2*j+1] = pSrc[2*j*dim2+1]; 11942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 11952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* fft of size dim1 */ 11972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#ifndef FFT_TWO_STAGE_SWITCH_CASE 11982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project fft1(pDst); 11992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#else 12002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project switch (dim1) { 12012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 3: fft3(pDst); break; 12022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 4: fft_4(pDst); break; 12032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 5: fft5(pDst); break; 12042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 8: fft_8(pDst); break; 12052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 15: fft15(pDst); break; 12062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 16: fft_16(pDst); break; 12072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 32: fft_32(pDst); break; 12082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /*case 64: fft_64(pDst); break;*/ 12092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 128: fft_128(pDst); break; 12102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 12112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#endif 12122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pSrc += 2; 12132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDst = pDst + 2*length/dim2; 12142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 12152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Perform the modulation of the output of the fft of length dim1 */ 12172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pSrc=aDst; 12182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project fft_apply_rot_vector(pSrc, length/dim2, length, RotVectorReal, RotVectorImag); 12192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Perform dim1 times the fft of length dim2. The input samples are at the address of aDst and the 12212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project output samples are at the address of pInput. The input vector for the fft of length dim2 is built 12222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project of the interleaved samples in aDst, the output samples are stored consecutively at the address 12232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project of pInput. 12242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 12252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pSrc = aDst; 12262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDst = aDst2; 12272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDstOut = pInput; 12282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(i=0; i<length/dim2; i++) 12292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 12302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(j=0; j<length/dim1; j++) 12312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 12322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDst[2*j] = pSrc[2*j*dim1]; 12332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDst[2*j+1] = pSrc[2*j*dim1+1]; 12342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 12352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#ifndef FFT_TWO_STAGE_SWITCH_CASE 12372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project fft2(pDst); 12382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#else 12392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project switch (dim2) { 12402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 3: fft3(pDst); break; 12412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 4: fft_4(pDst); break; 12422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 5: fft5(pDst); break; 12432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 8: fft_8(pDst); break; 12442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 15: fft15(pDst); break; 12452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 16: fft_16(pDst); break; 12462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 32: fft_32(pDst); break; 12472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /*case 64: fft_64(pDst); break;*/ 12482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 128: fft_128(pDst); break; 12492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 12502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#endif 12512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(j=0; j<length/dim1; j++) 12532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 12542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDstOut[2*j*dim1] = pDst[2*j]; 12552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDstOut[2*j*dim1+1] = pDst[2*j+1]; 12562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 12572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pSrc += 2; 12582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDstOut += 2; 12592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 12602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project C_ALLOC_SCRATCH_END(aDst2, FIXP_DBL, dim2*2); 12622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project C_ALLOC_SCRATCH_END(aDst, FIXP_DBL, length*2); 12632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 12642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#endif /* FFT_TWO_STAGE_MACRO_ENABLE */ 12662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define SCALEFACTOR60 5 12792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/** 12802228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectThe function performs the fft of length 60. It is splittet into fft's of length 4 and fft's of 12812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectlength 15. Between the fft's a modolation is calculated. 12822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/ 12832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic inline void fft60(FIXP_DBL *pInput, INT *pScalefactor) 12842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 12852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project fftN2( 12862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pInput, 60, 4, 15, 12872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project fft_4, fft15, 12882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project RotVectorReal60, RotVectorImag60 12892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ); 12902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *pScalefactor += SCALEFACTOR60; 12912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 12922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/* Fallback implementation in case of no better implementation available. */ 12962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define SCALEFACTOR240 7 12982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/** 13002228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectThe function performs the fft of length 240. It is splittet into fft's of length 16 and fft's of 13012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectlength 15. Between the fft's a modulation is calculated. 13022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/ 13032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic inline void fft240(FIXP_DBL *pInput, INT *pScalefactor) 13042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 13052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project fftN2( 13062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pInput, 240, 16, 15, 13072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project fft_16, fft15, 13082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project RotVectorReal240, RotVectorImag240 13092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ); 13102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *pScalefactor += SCALEFACTOR240; 13112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 13122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define SCALEFACTOR480 8 13152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define N32 32 13162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define TABLE_SIZE_16 (32/2) 13172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/** 13192228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectThe function performs the fft of length 480. It is splittet into fft's of length 32 and fft's of 13202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectlength 15. Between the fft's a modulation is calculated. 13212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/ 13222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic inline void fft480(FIXP_DBL *pInput, INT *pScalefactor) 13232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 13242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project fftN2( 13252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pInput, 480, 32, 15, 13262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project fft_32, fft15, 13272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project RotVectorReal480, RotVectorImag480 13282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ); 13292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *pScalefactor += SCALEFACTOR480; 13302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 13312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid fft(int length, FIXP_DBL *pInput, INT *pScalefactor) 13332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 13342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (length == 32) 13352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 13362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project fft_32(pInput); 13372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *pScalefactor += SCALEFACTOR32; 13382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 13392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else 13402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 13412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project switch (length) { 13432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 16: 13442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project fft_16(pInput); 13452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *pScalefactor += SCALEFACTOR16; 13462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 13472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 8: 13482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project fft_8(pInput); 13492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *pScalefactor += SCALEFACTOR8; 13502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 13512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 3: 13522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project fft3(pInput); 13532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 13542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 4: 13552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project fft_4(pInput); 13562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *pScalefactor += SCALEFACTOR4; 13572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 13582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 5: 13592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project fft5(pInput); 13602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 13612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 15: 13622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project fft15(pInput); 13632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *pScalefactor += 2; 13642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 13652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 60: 13662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project fft60(pInput, pScalefactor); 13672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 13682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 64: 13692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project dit_fft(pInput, 6, SineTable512, 512); 13702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *pScalefactor += SCALEFACTOR64; 13712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 13722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 240: 13732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project fft240(pInput, pScalefactor); 13742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 13752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 256: 13762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project dit_fft(pInput, 8, SineTable512, 512); 13772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *pScalefactor += SCALEFACTOR256; 13782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 13792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 480: 13802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project fft480(pInput, pScalefactor); 13812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 13822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 512: 13832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project dit_fft(pInput, 9, SineTable512, 512); 13842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *pScalefactor += SCALEFACTOR512; 13852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 13862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project default: 13872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDK_ASSERT(0); /* FFT length not supported! */ 13882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 13892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 13902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 13912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 13922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid ifft(int length, FIXP_DBL *pInput, INT *scalefactor) 13952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 13962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project switch (length) { 13972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project default: 13982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDK_ASSERT(0); /* IFFT length not supported! */ 13992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 14002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 14012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 14022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 14032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1404