199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com/*
299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com *  Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com *
499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com *  Use of this source code is governed by a BSD-style license
599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com *  that can be found in the LICENSE file in the root of the source
699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com *  tree. An additional intellectual property rights grant can be found
799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com *  in the file PATENTS.  All contributing project authors may
899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com *  be found in the AUTHORS file in the root of the source tree.
999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com *
1099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com *  This file was originally licensed as follows. It has been
1199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com *  relicensed with permission from the copyright holders.
1299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com */
1399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
1499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com/**
1599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com *
1699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com * File Name:  omxSP_FFTInit_R_S16S32.c
1799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com * OpenMAX DL: v1.0.2
1899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com * Last Modified Revision:   7777
1999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com * Last Modified Date:       Thu, 27 Sep 2007
2099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com *
2199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com * (c) Copyright 2007-2008 ARM Limited. All Rights Reserved.
2299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com *
2399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com *
2499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com * Description:
2599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com * Initialize the real forward-FFT specification information struct.
2699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com */
2799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
285537f70dff0bb4566ebb1ec645d2020974e93493turaj@webrtc.org#include <stdint.h>
295537f70dff0bb4566ebb1ec645d2020974e93493turaj@webrtc.org
30bdf981cb383b7ec472ee86d2fedb53937285f894rtoy@google.com#include "dl/api/arm/armOMX.h"
31048e632be7693f6198bfdd54130a0220a2ccb5abrtoy@google.com#include "dl/api/omxtypes.h"
32048e632be7693f6198bfdd54130a0220a2ccb5abrtoy@google.com#include "dl/sp/api/armSP.h"
33048e632be7693f6198bfdd54130a0220a2ccb5abrtoy@google.com#include "dl/sp/api/omxSP.h"
3499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
3599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com/**
3699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com * Function: omxSP_FFTInit_R_S16_S32
3799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com *
3899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com * Description:
3999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com * Initialize the real forward-FFT specification information struct.
4099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com *
4199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com * Remarks:
4299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com * This function is used to initialize the specification structures
4399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com * for functions <ippsFFTFwd_RToCCS_S16_S32_Sfs> and
4499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com * <ippsFFTInv_CCSToR_S32_S16_Sfs>. Memory for *pFFTSpec must be
4599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com * allocated prior to calling this function. The number of bytes
4699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com * required for *pFFTSpec can be determined using
4799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com * <FFTGetBufSize_R_S16_S32>.
4899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com *
4999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com * Parameters:
5099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com * [in]  order       base-2 logarithm of the desired block length;
5199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com *			   valid in the range [0,12].
5299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com * [out] pFFTFwdSpec pointer to the initialized specification structure.
5399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com *
5499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com * Return Value:
5599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com * Standard omxError result. See enumeration for possible result codes.
5699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com *
5799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com */
5899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
5999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.comOMXResult omxSP_FFTInit_R_S16S32(
6099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com     OMXFFTSpec_R_S16S32* pFFTSpec,
6199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com     OMX_INT order
6299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com)
6399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com{
6499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    OMX_INT     i,j;
6599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    OMX_SC32    *pTwiddle,*pTwiddle1,*pTwiddle2,*pTwiddle3,*pTwiddle4;
6699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    OMX_S32     *pBuf;
6799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    OMX_U16     *pBitRev;
6899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    OMX_U32     pTmp;
6999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    OMX_INT     Nby2,N,M,diff, step;
7099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    OMX_S32     x,y,xNeg;
7199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    ARMsFFTSpec_R_SC32 *pFFTStruct = 0;
7299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
7399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
7499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    pFFTStruct = (ARMsFFTSpec_R_SC32 *) pFFTSpec;
7599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
7699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    /* if order zero no init is needed */
7799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    if (order == 0)
7899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    {
7999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        pFFTStruct->N = 1;
8099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        pFFTStruct->pTwiddle = NULL;
8199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        pFFTStruct->pBuf = (OMX_S32 *)
8299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com               (sizeof(ARMsFFTSpec_R_SC32) + (OMX_S8*) pFFTSpec);
8399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
8499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        return OMX_Sts_NoErr;
8599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    }
8699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
8799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    /* Do the initializations */
8899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    Nby2 = 1 << (order - 1);
8999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    N = Nby2 << 1;
9099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
9199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
9299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
9399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    pBitRev = NULL ;                /* optimized implementations don't use bitreversal */
9499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
9599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    pTwiddle = (OMX_SC32 *)
9699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        (sizeof(ARMsFFTSpec_R_SC32) + (OMX_S8*) pFFTSpec);
9799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
9899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    /* Align to 32 byte boundary */
995537f70dff0bb4566ebb1ec645d2020974e93493turaj@webrtc.org    pTmp = ((uintptr_t)pTwiddle)&31;              /* (OMX_U32)pTwiddle % 32 */
10099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    if(pTmp != 0)
10199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        pTwiddle = (OMX_SC32*) ((OMX_S8*)pTwiddle + (32-pTmp));
10299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
10399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
10499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    pBuf = (OMX_S32*)
10599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        (sizeof(OMX_SC32) * (5*N/8) + (OMX_S8*) pTwiddle);
10699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
10799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    /* Align to 32 byte boundary */
1085537f70dff0bb4566ebb1ec645d2020974e93493turaj@webrtc.org    pTmp = ((uintptr_t)pBuf)&31;                 /* (OMX_U32)pBuf % 32 */
10999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    if(pTmp != 0)
11099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        pBuf = (OMX_S32*) ((OMX_S8*)pBuf + (32-pTmp));
11199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
11299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
11399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
11499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
11599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    /*
11699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com     * Filling Twiddle factors : exp^(-j*2*PI*k/ (N/2) ) ; k=0,1,2,...,3/4(N/2)
11799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com     * N/2 point complex FFT is used to compute N point real FFT
11899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com     * The original twiddle table "armSP_FFT_S32TwiddleTable" is of size (MaxSize/8 + 1)
11999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com     * Rest of the values i.e., upto MaxSize are calculated using the symmetries of sin and cos
12099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com     * The max size of the twiddle table needed is 3/4(N/2) for a radix-4 stage
12199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com     *
12299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com     * W = (-2 * PI) / N
12399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com     * N = 1 << order
12499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com     * W = -PI >> (order - 1)
12599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com     */
12699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
12799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    M = Nby2>>3;
12899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    diff = 12 - (order-1);
12999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    step = 1<<diff;             /* step into the twiddle table for the current order */
13099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
13199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    x = armSP_FFT_S32TwiddleTable[0];
13299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    y = armSP_FFT_S32TwiddleTable[1];
13399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    xNeg = 0x7FFFFFFF;
13499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
13599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    if((order-1) >=3)
13699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    {
13799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            /* i = 0 case */
13899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            pTwiddle[0].Re = x;
13999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            pTwiddle[0].Im = y;
14099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            pTwiddle[2*M].Re = -y;
14199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            pTwiddle[2*M].Im = xNeg;
14299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            pTwiddle[4*M].Re = xNeg;
14399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            pTwiddle[4*M].Im = y;
14499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
14599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
14699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        for (i=1; i<=M; i++)
14799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com          {
14899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            j = i*step;
14999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
15099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            x = armSP_FFT_S32TwiddleTable[2*j];
15199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            y = armSP_FFT_S32TwiddleTable[2*j+1];
15299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
15399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            pTwiddle[i].Re = x;
15499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            pTwiddle[i].Im = y;
15599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            pTwiddle[2*M-i].Re = -y;
15699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            pTwiddle[2*M-i].Im = -x;
15799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            pTwiddle[2*M+i].Re = y;
15899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            pTwiddle[2*M+i].Im = -x;
15999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            pTwiddle[4*M-i].Re = -x;
16099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            pTwiddle[4*M-i].Im = y;
16199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            pTwiddle[4*M+i].Re = -x;
16299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            pTwiddle[4*M+i].Im = -y;
16399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            pTwiddle[6*M-i].Re = y;
16499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            pTwiddle[6*M-i].Im = x;
16599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        }
16699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
16799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
16899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    }
16999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    else
17099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    {
17199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        if ((order-1) == 2)
17299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        {
17399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            pTwiddle[0].Re = x;
17499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            pTwiddle[0].Im = y;
17599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            pTwiddle[1].Re = -y;
17699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            pTwiddle[1].Im = xNeg;
17799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            pTwiddle[2].Re = xNeg;
17899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            pTwiddle[2].Im = y;
17999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
18099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        }
18199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        if ((order-1) == 1)
18299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        {
18399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            pTwiddle[0].Re = x;
18499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            pTwiddle[0].Im = y;
18599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
18699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        }
18799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
18899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
18999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    }
19099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
19199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
19299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    /*
19399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com     * Now fill the last N/4 values : exp^(-j*2*PI*k/N) ;  k=1,3,5,...,N/2-1
19499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com     * These are used for the final twiddle fix-up for converting complex to real FFT
19599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com     */
19699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
19799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    M = N>>3;
19899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    diff = 12 - order;
19999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    step = 1<<diff;
20099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
20199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    pTwiddle1 = pTwiddle + 3*N/8;
20299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    pTwiddle4 = pTwiddle1 + (N/4-1);
20399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    pTwiddle3 = pTwiddle1 + N/8;
20499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    pTwiddle2 = pTwiddle1 + (N/8-1);
20599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
20699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    x = armSP_FFT_S32TwiddleTable[0];
20799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    y = armSP_FFT_S32TwiddleTable[1];
20899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    xNeg = 0x7FFFFFFF;
20999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
21099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    if((order) >=3)
21199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    {
21299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
21399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
21499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        for (i=1; i<=M; i+=2 )
21599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com          {
21699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            j = i*step;
21799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
21899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            x = armSP_FFT_S32TwiddleTable[2*j];
21999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            y = armSP_FFT_S32TwiddleTable[2*j+1];
22099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
22199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            pTwiddle1[0].Re = x;
22299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            pTwiddle1[0].Im = y;
22399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            pTwiddle1 += 1;
22499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            pTwiddle2[0].Re = -y;
22599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            pTwiddle2[0].Im = -x;
22699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            pTwiddle2 -= 1;
22799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            pTwiddle3[0].Re = y;
22899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            pTwiddle3[0].Im = -x;
22999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            pTwiddle3 += 1;
23099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            pTwiddle4[0].Re = -x;
23199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            pTwiddle4[0].Im = y;
23299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            pTwiddle4 -= 1;
23399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
23499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        }
23599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
23699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
23799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    }
23899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    else
23999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    {
24099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        if (order == 2)
24199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        {
24299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
24399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            pTwiddle1[0].Re = -y;
24499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            pTwiddle1[0].Im = xNeg;
24599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
24699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        }
24799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
24899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
24999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    }
25099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
25199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
25299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    /* Update the structure */
25399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    pFFTStruct->N = N;
25499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    pFFTStruct->pTwiddle = pTwiddle;
25599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    pFFTStruct->pBitRev = pBitRev;
25699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    pFFTStruct->pBuf = pBuf;
25799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
25899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    return OMX_Sts_NoErr;
25999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com}
26099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com/*****************************************************************************
26199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com *                              END OF FILE
26299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com *****************************************************************************/
26399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
264