14d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com/* 24d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. 34d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com * 44d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com * Use of this source code is governed by a BSD-style license 54d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com * that can be found in the LICENSE file in the root of the source 64d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com * tree. An additional intellectual property rights grant can be found 74d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com * in the file PATENTS. All contributing project authors may 84d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com * be found in the AUTHORS file in the root of the source tree. 94d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com */ 104d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com 114d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#include "dl/api/omxtypes.h" 124d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#include "dl/sp/api/armSP.h" 134d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com#include "dl/sp/api/omxSP.h" 144d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com 154d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.comextern void armSP_FFTFwd_CToC_FC32_Radix2_fs_OutOfPlace( 164d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com const OMX_FC32* pSrc, 174d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com OMX_FC32* pDst, 184d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com OMX_FC32* pTwiddle, 194d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com long* subFFTNum, 204d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com long* subFFTSize); 214d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com 224d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.comextern void armSP_FFTFwd_CToC_FC32_Radix2_ls_OutOfPlace( 234d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com const OMX_FC32* pSrc, 244d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com OMX_FC32* pDst, 254d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com OMX_FC32* pTwiddle, 264d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com long* subFFTNum, 274d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com long* subFFTSize); 284d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com 294d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.comextern void armSP_FFTFwd_CToC_FC32_Radix2_OutOfPlace( 304d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com const OMX_FC32* pSrc, 314d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com OMX_FC32* pDst, 324d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com OMX_FC32* pTwiddle, 334d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com long* subFFTNum, 344d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com long* subFFTSize); 354d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com 364d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.comextern void armSP_FFTFwd_CToC_FC32_Radix4_fs_OutOfPlace( 374d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com const OMX_FC32* pSrc, 384d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com OMX_FC32* pDst, 394d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com OMX_FC32* pTwiddle, 404d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com long* subFFTNum, 414d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com long* subFFTSize); 424d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com 434d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.comextern void armSP_FFTFwd_CToC_FC32_Radix4_OutOfPlace( 444d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com const OMX_FC32* pSrc, 454d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com OMX_FC32* pDst, 464d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com OMX_FC32* pTwiddle, 474d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com long* subFFTNum, 484d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com long* subFFTSize); 494d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com 504d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.comextern void armSP_FFTFwd_CToC_FC32_Radix4_ls_OutOfPlace( 514d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com const OMX_FC32* pSrc, 524d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com OMX_FC32* pDst, 534d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com OMX_FC32* pTwiddle, 544d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com long* subFFTNum, 554d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com long* subFFTSize); 564d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com 574d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.comextern void armSP_FFTFwd_CToC_FC32_Radix8_fs_OutOfPlace( 584d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com const OMX_FC32* pSrc, 594d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com OMX_FC32* pDst, 604d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com OMX_FC32* pTwiddle, 614d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com long* subFFTNum, 624d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com long* subFFTSize); 634d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com 644d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.comextern void ComplexToRealFixup(OMX_FC32* pSrc, 654d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com OMX_F32* pDst, 664d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com const OMX_FC32* pTwiddle, 674d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com OMX_F32* pBuf, 684d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com long N); 694d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com 704d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com/** 714d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com * Function: omxSP_FFTFwd_CToC_FC32_Sfs (2.2.4.2.2) 724d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com * 734d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com * Description: 744d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com * Compute an FFT for a complex signal of length of 2^order, 754d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com * where 0 <= order <= 15. 764d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com * Transform length is determined by the specification structure, which 774d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com * must be initialized prior to calling the FFT function using the appropriate 784d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com * helper, i.e., <FFTInit_C_sc32> or <FFTInit_C_SC16>. The relationship 794d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com * between the input and output sequences can be expressed in terms of the 804d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com * DFT, i.e., 814d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com * 824d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com * X[k] = SUM[n=0...N-1]x[n].e^(-jnk.2.pi/N) 834d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com * k = 0,1,2,..., N-1 844d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com * N = 2^order 854d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com * 864d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com * Input Arguments: 874d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com * pSrc - pointer to the input signal, a complex-valued vector of length 884d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com * 2^order; must be aligned on a 32 byte boundary. 894d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com * pFFTSpec - pointer to the preallocated and initialized specification 904d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com * structure 914d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com * 924d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com * Output Arguments: 934d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com * pDst - pointer to the complex-valued output vector, of length 2^order; 944d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com * must be aligned on an 32-byte boundary. 954d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com * 964d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com * Return Value: 974d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com * 984d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com * OMX_Sts_NoErr - no error 994d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com * OMX_Sts_BadArgErr - returned if one or more of the following conditions 1004d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com * is true: 1014d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com * - one or more of the following pointers is NULL: pSrc, pDst, or 1024d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com * pFFTSpec. 1034d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com * - pSrc or pDst is not 32-byte aligned 1044d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com * 1054d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com */ 1064d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com 1074d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.comOMXResult omxSP_FFTFwd_RToCCS_F32_Sfs(const OMX_F32* pSrc, 1084d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com OMX_F32* pDst, 1094d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com const OMXFFTSpec_R_F32* pFFTSpec) { 1104d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com ARMsFFTSpec_R_FC32* spec = (ARMsFFTSpec_R_FC32*)pFFTSpec; 1114d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com int order; 1124d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com long subFFTSize; 1134d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com long subFFTNum; 1144d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com OMX_FC32* pTwiddle; 1154d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com OMX_FC32* pOut; 1164d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com OMX_FC32* pComplexSrc = (OMX_FC32*) pSrc; 1174d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com OMX_FC32* pComplexDst = (OMX_FC32*) pDst; 1184d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com 1194d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com /* 1204d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com * Check args are not NULL and the source and destination pointers 1214d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com * are properly aligned. 1224d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com */ 1234d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com if (!validateParametersF32(pSrc, pDst, spec)) 1244d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com return OMX_Sts_BadArgErr; 1254d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com 1264d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com /* 1274d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com * Compute the RFFT using a complex FFT of one less order, so set 1284d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com * order to be the order of the complex FFT. 1294d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com */ 1304d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com order = fastlog2(spec->N) - 1; 1314d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com 1324d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com subFFTSize = 1; 1334d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com subFFTNum = spec->N >> 1; 1344d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com pTwiddle = spec->pTwiddle; 1354d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com pOut = (OMX_FC32*) spec->pBuf; 1364d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com 1374d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com if (order > 3) { 1384d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com OMX_FC32* argDst; 1394d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com OMX_FC32* pComplexDst = (OMX_FC32*) pDst; 1404d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com 1414d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com /* 1424d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com * Set up argDst and pOut appropriately so that pOut = pDst for 1434d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com * ComplexToRealFixup. 1444d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com */ 1454d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com if ((order & 2) != 0) { 1464d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com argDst = pOut; 1474d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com pOut = pComplexDst; 1484d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com } else { 1494d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com argDst = pComplexDst; 1504d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com } 1514d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com 1524d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com /* 1534d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com * Odd order uses a radix 8 first stage; even order, a radix 4 1544d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com * first stage. 1554d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com */ 1564d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com if (order & 1) { 1574d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com armSP_FFTFwd_CToC_FC32_Radix8_fs_OutOfPlace( 1584d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com pComplexSrc, argDst, pTwiddle, &subFFTNum, &subFFTSize); 1594d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com } else { 1604d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com armSP_FFTFwd_CToC_FC32_Radix4_fs_OutOfPlace( 1614d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com pComplexSrc, argDst, pTwiddle, &subFFTNum, &subFFTSize); 1624d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com } 1634d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com 1644d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com /* 1654d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com * Now use radix 4 stages to finish rest of the FFT 1664d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com */ 1674d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com if (subFFTNum >= 4) { 1684d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com while (subFFTNum > 4) { 1694d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com OMX_FC32* tmp; 1704d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com 1714d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com armSP_FFTFwd_CToC_FC32_Radix4_OutOfPlace( 1724d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com argDst, pOut, pTwiddle, &subFFTNum, &subFFTSize); 1734d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com /* 1744d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com * Swap argDst and pOut 1754d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com */ 1764d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com tmp = pOut; 1774d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com pOut = argDst; 1784d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com argDst = tmp; 1794d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com } 1804d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com 1814d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com armSP_FFTFwd_CToC_FC32_Radix4_ls_OutOfPlace( 1824d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com argDst, pOut, pTwiddle, &subFFTNum, &subFFTSize); 1834d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com } 1844d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com } else if (order == 3) { 1854d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com armSP_FFTFwd_CToC_FC32_Radix2_fs_OutOfPlace( 1864d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com pComplexSrc, pOut, pTwiddle, &subFFTNum, &subFFTSize); 1874d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com armSP_FFTFwd_CToC_FC32_Radix2_OutOfPlace( 1884d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com pOut, pComplexDst, pTwiddle, &subFFTNum, &subFFTSize); 1894d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com armSP_FFTFwd_CToC_FC32_Radix2_ls_OutOfPlace( 1904d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com pComplexDst, pOut, pTwiddle, &subFFTNum, &subFFTSize); 1914d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com } else if (order == 2) { 1924d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com armSP_FFTFwd_CToC_FC32_Radix2_fs_OutOfPlace( 1934d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com pComplexSrc, pComplexDst, pTwiddle, &subFFTNum, &subFFTSize); 1944d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com armSP_FFTFwd_CToC_FC32_Radix2_ls_OutOfPlace( 1954d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com pComplexDst, pOut, pTwiddle, &subFFTNum, &subFFTSize); 1964d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com } else if (order == 1) { 1974d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com armSP_FFTFwd_CToC_FC32_Radix2_fs_OutOfPlace( 1984d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com pComplexSrc, pOut, pTwiddle, &subFFTNum, &subFFTSize); 1994d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com } else { 2004d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com /* Handle complex order 0 specially */ 2014d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com pOut->Re = pSrc[0]; 2024d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com pOut->Im = pSrc[1]; 2034d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com } 2044d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com 2054d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com /* 2064d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com * Complex FFT done. Fix up the complex result to give the correct 2074d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com * RFFT. 2084d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com */ 2094d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com 2104d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com ComplexToRealFixup(pOut, pDst, pTwiddle, spec->pBuf, spec->N); 2114d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com 2124d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com return OMX_Sts_NoErr; 2134d09f5abfba45163d1296272ac7d2ddc2cd5f9fbrtoy@google.com} 214