14512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org/*
24512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org *  Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
34512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org *
44512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org *  Use of this source code is governed by a BSD-style license
54512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org *  that can be found in the LICENSE file in the root of the source
64512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org *  tree. An additional intellectual property rights grant can be found
74512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org *  in the file PATENTS.  All contributing project authors may
84512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
94512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org *
104512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org * Some code in this file was originally from file omxSP_FFTInit_R_S16S32.c
114512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org * which was licensed as follows.
124512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org * It has been relicensed with permission from the copyright holders.
134512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org */
144512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org
154512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org/*
164512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org * OpenMAX DL: v1.0.2
174512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org * Last Modified Revision:
184512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org * Last Modified Date:
194512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org *
204512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org * (c) Copyright 2007-2008 ARM Limited. All Rights Reserved.
214512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org */
224512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org
235537f70dff0bb4566ebb1ec645d2020974e93493turaj@webrtc.org#include <stdint.h>
245537f70dff0bb4566ebb1ec645d2020974e93493turaj@webrtc.org
25bdf981cb383b7ec472ee86d2fedb53937285f894rtoy@google.com#include "dl/api/arm/armOMX.h"
264512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org#include "dl/api/omxtypes.h"
274512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org#include "dl/sp/api/armSP.h"
284512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org#include "dl/sp/api/omxSP.h"
294512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org
304512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org/**
314512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org * Function: omxSP_FFTInit_R_S16
324512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org *
334512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org * Description:
344512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org * Initialize the real forward-FFT specification information struct.
354512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org *
364512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org * Remarks:
374512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org * This function is used to initialize the specification structures
384512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org * for functions <ippsFFTFwd_RToCCS_S16_Sfs> and
394512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org * <ippsFFTInv_CCSToR_S16_Sfs>. Memory for *pFFTSpec must be
404512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org * allocated prior to calling this function. The number of bytes
414512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org * required for *pFFTSpec can be determined using
424512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org * <FFTGetBufSize_R_S16>.
434512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org *
444512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org * Parameters:
454512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org * [in]  order       base-2 logarithm of the desired block length;
464512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org *			   valid in the range [1,12].
474512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org * [out] pFFTFwdSpec pointer to the initialized specification structure.
484512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org *
494512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org * Return Value:
504512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org * Standard omxError result. See enumeration for possible result codes.
514512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org *
524512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org */
534512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org
544512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.orgOMXResult omxSP_FFTInit_R_S16(OMXFFTSpec_R_S16* pFFTSpec, OMX_INT order) {
554512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org  OMX_INT i = 0, j = 0;
564512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org  OMX_SC16 *pTwiddle = NULL, *pTwiddle1 = NULL, *pTwiddle2 = NULL;
574512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org  OMX_SC16 *pTwiddle3 = NULL, *pTwiddle4 = NULL;
584512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org  OMX_S16 *pBuf = NULL;
594512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org  OMX_U16 *pBitRev = NULL;
604512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org  OMX_U32 pTmp = 0;
614512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org  OMX_INT Nby2 = 0, N = 0, M = 0, diff = 0, step = 0;
624512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org  OMX_S16 x = 0, y = 0, xNeg = 0;
634512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org  OMX_S32 xS32 = 0, yS32 = 0;
644512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org  ARMsFFTSpec_R_SC16 *pFFTStruct = NULL;
654512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org
664512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org  /* Order zero not allowed */
674512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org  if (order == 0) {
684512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org    return OMX_Sts_BadArgErr;
694512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org  }
704512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org
714512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org  /* Do the initializations */
724512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org  pFFTStruct = (ARMsFFTSpec_R_SC16*) pFFTSpec;
734512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org  Nby2 = 1 << (order - 1);
744512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org  N = Nby2 << 1;
754512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org  pBitRev = NULL ;  /* optimized implementations don't use bitreversal */
764512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org  pTwiddle = (OMX_SC16*) (sizeof(ARMsFFTSpec_R_SC16) + (OMX_S8*)pFFTSpec);
774512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org
784512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org  /* Align to 32 byte boundary */
795537f70dff0bb4566ebb1ec645d2020974e93493turaj@webrtc.org  pTmp = ((uintptr_t)pTwiddle)&31;  /* (uintptr_t)pTwiddle % 32 */
804512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org  if(pTmp != 0) {
814512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org    pTwiddle = (OMX_SC16*) ((OMX_S8*)pTwiddle + (32 - pTmp));
824512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org  }
834512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org
844512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org  pBuf = (OMX_S16*) (sizeof(OMX_SC16) * (5 * N / 8) + (OMX_S8*)pTwiddle);
854512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org
864512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org  /* Align to 32 byte boundary */
874512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org  pTmp = ((OMX_U32)pBuf)&31;                 /* (OMX_U32)pBuf % 32 */
884512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org  if(pTmp != 0) {
894512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org    pBuf = (OMX_S16*)((OMX_S8*)pBuf + (32 - pTmp));
904512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org  }
914512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org
924512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org  /*
934512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org   * Filling Twiddle factors : exp^(-j*2*PI*k/ (N/2) ) ; k=0,1,2,...,3/4(N/2).
944512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org   * N/2 point complex FFT is used to compute N point real FFT.
954512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org   * The original twiddle table "armSP_FFT_S32TwiddleTable" is of size
964512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org   * (MaxSize/8 + 1). Rest of the values i.e., up to MaxSize are calculated
974512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org   * using the symmetries of sin and cos.
984512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org   * The max size of the twiddle table needed is 3/4(N/2) for a radix-4 stage.
994512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org   *
1004512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org   * W = (-2 * PI) / N
1014512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org   * N = 1 << order
1024512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org   * W = -PI >> (order - 1)
1034512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org   *
1044512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org   * Note we use S32 twiddle factor table and round the values to 16 bits.
1054512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org   */
1064512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org
1074512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org  M = Nby2 >> 3;
1084512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org  diff = 12 - (order - 1);
1094512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org  step = 1 << diff;  /* Step into the twiddle table for the current order */
1104512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org
1114512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org  xS32 = armSP_FFT_S32TwiddleTable[0];
1124512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org  yS32 = armSP_FFT_S32TwiddleTable[1];
1134512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org  x = (xS32 + 0x8000) >> 16;
1144512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org  y = (yS32 + 0x8000) >> 16;
1154512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org  xNeg = 0x7FFF;
1164512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org
1174512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org  if((order-1) >= 3) {
1184512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org    /* i = 0 case */
1194512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org    pTwiddle[0].Re = x;
1204512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org    pTwiddle[0].Im = y;
1214512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org    pTwiddle[2 * M].Re = -y;
1224512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org    pTwiddle[2 * M].Im = xNeg;
1234512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org    pTwiddle[4 * M].Re = xNeg;
1244512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org    pTwiddle[4 * M].Im = y;
1254512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org
1264512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org    for (i=1; i<=M; i++){
1274512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org      OMX_S16 x_neg = 0, y_neg = 0;
1284512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org      j = i * step;
1294512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org
1304512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org      xS32 = armSP_FFT_S32TwiddleTable[2 * j];
1314512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org      yS32 = armSP_FFT_S32TwiddleTable[2 * j + 1];
1324512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org      x = (xS32 + 0x8000) >> 16;
1334512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org      y = (yS32 + 0x8000) >> 16;
1344512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org      /* |x_neg = -x| doesn't work when x is 0x8000. */
1354512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org      x_neg = (-(xS32 + 0x8000)) >> 16;
1364512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org      y_neg = (-(yS32 + 0x8000)) >> 16;
1374512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org
1384512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org      pTwiddle[i].Re = x;
1394512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org      pTwiddle[i].Im = y;
1404512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org      pTwiddle[2 * M - i].Re = y_neg;
1414512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org      pTwiddle[2 * M - i].Im = x_neg;
1424512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org      pTwiddle[2 * M + i].Re = y;
1434512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org      pTwiddle[2 * M + i].Im = x_neg;
1444512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org      pTwiddle[4 * M - i].Re = x_neg;
1454512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org      pTwiddle[4 * M - i].Im = y;
1464512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org      pTwiddle[4 * M + i].Re = x_neg;
1474512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org      pTwiddle[4 * M + i].Im = y_neg;
1484512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org      pTwiddle[6 * M - i].Re = y;
1494512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org      pTwiddle[6 * M - i].Im = x;
1504512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org    }
1514512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org  }
1524512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org  else {
1534512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org    if ((order - 1) == 2) {
1544512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org      pTwiddle[0].Re = x;
1554512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org      pTwiddle[0].Im = y;
1564512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org      pTwiddle[1].Re = -y;
1574512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org      pTwiddle[1].Im = xNeg;
1584512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org      pTwiddle[2].Re = xNeg;
1594512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org      pTwiddle[2].Im = y;
1604512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org    }
1614512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org    if ((order-1) == 1) {
1624512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org      pTwiddle[0].Re = x;
1634512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org      pTwiddle[0].Im = y;
1644512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org    }
1654512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org  }
1664512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org
1674512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org  /*
1684512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org   * Now fill the last N/4 values : exp^(-j*2*PI*k/N);  k=1,3,5,...,N/2-1.
1694512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org   * These are used for the final twiddle fix-up for converting complex to
1704512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org   * real FFT.
1714512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org   */
1724512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org
1734512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org  M = N >> 3;
1744512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org  diff = 12 - order;
1754512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org  step = 1 << diff;
1764512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org
1774512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org  pTwiddle1 = pTwiddle + 3 * N / 8;
1784512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org  pTwiddle4 = pTwiddle1 + (N / 4 - 1);
1794512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org  pTwiddle3 = pTwiddle1 + N / 8;
1804512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org  pTwiddle2 = pTwiddle1 + (N / 8 - 1);
1814512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org
1824512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org  xS32 = armSP_FFT_S32TwiddleTable[0];
1834512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org  yS32 = armSP_FFT_S32TwiddleTable[1];
1844512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org  x = (xS32 + 0x8000) >> 16;
1854512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org  y = (yS32 + 0x8000) >> 16;
1864512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org  xNeg = 0x7FFF;
1874512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org
1884512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org  if((order) >= 3) {
1894512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org    for (i = 1; i <= M; i += 2 ) {
1904512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org      OMX_S16 x_neg = 0, y_neg = 0;
1914512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org
1924512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org      j = i*step;
1934512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org
1944512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org      xS32 = armSP_FFT_S32TwiddleTable[2 * j];
1954512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org      yS32 = armSP_FFT_S32TwiddleTable[2 * j + 1];
1964512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org      x = (xS32 + 0x8000) >> 16;
1974512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org      y = (yS32 + 0x8000) >> 16;
1984512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org      /* |x_neg = -x| doesn't work when x is 0x8000. */
1994512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org      x_neg = (-(xS32 + 0x8000)) >> 16;
2004512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org      y_neg = (-(yS32 + 0x8000)) >> 16;
2014512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org
2024512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org      pTwiddle1[0].Re = x;
2034512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org      pTwiddle1[0].Im = y;
2044512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org      pTwiddle1 += 1;
2054512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org      pTwiddle2[0].Re = y_neg;
2064512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org      pTwiddle2[0].Im = x_neg;
2074512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org      pTwiddle2 -= 1;
2084512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org      pTwiddle3[0].Re = y;
2094512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org      pTwiddle3[0].Im = x_neg;
2104512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org      pTwiddle3 += 1;
2114512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org      pTwiddle4[0].Re = x_neg;
2124512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org      pTwiddle4[0].Im = y;
2134512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org      pTwiddle4 -= 1;
2144512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org    }
2154512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org  }
2164512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org  else {
2174512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org    if (order == 2) {
2184512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org      pTwiddle1[0].Re = -y;
2194512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org      pTwiddle1[0].Im = xNeg;
2204512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org    }
2214512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org  }
2224512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org
2234512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org  /* Update the structure */
2244512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org  pFFTStruct->N = N;
2254512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org  pFFTStruct->pTwiddle = pTwiddle;
2264512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org  pFFTStruct->pBitRev = pBitRev;
2274512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org  pFFTStruct->pBuf = pBuf;
2284512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org
2294512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org  return OMX_Sts_NoErr;
2304512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org}
2314512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org/*****************************************************************************
2324512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org *                              END OF FILE
2334512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org *****************************************************************************/
2344512d0eab7697423f5334ad79588f853c7bd80bbkma@webrtc.org
235