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/**
155e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com *
1699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com * File Name:  omxSP_FFTInit_C_SC16.c
1799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com * OpenMAX DL: v1.0.2
1899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com * Last Modified Revision:   15322
1999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com * Last Modified Date:       Wed, 15 Oct 2008
205e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com *
2199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com * (c) Copyright 2007-2008 ARM Limited. All Rights Reserved.
225e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com *
235e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com *
2499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com * Description:
2599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com * Initializes the specification structures required
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_C_SC16
3799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com *
3899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com * Description:
3999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com * These functions initialize the specification structures required for the
4099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com * complex FFT and IFFT functions.
4199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com *
4299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com * Remarks:
4399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com * Desired block length is specified as an input. The function is used to
4499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com * initialize the specification structures for functions <FFTFwd_CToC_SC16_Sfs>
4599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com * and <FFTInv_CToC_SC16_Sfs>. Memory for the specification structure *pFFTSpec
4699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com * must be allocated prior to calling this function. The space required for
4799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com * *pFFTSpec, in bytes, can be determined using <FFTGetBufSize_C_SC16>.
4899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com *
4999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com * Parameters:
505e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com * [in]  order          base-2 logarithm of the desired block length;
515e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com *                              valid in the range [0,12].
525e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com * [out] pFFTSpec               pointer to 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_C_SC16(
6099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com     OMXFFTSpec_C_SC16* pFFTSpec,
6199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com     OMX_INT order
6299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com )
6399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com {
6499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    OMX_INT     i,j;
6599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    OMX_SC16    *pTwiddle, *pBuf;
6699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    OMX_U16     *pBitRev;
6799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    OMX_INT     Nby2,N,M,diff,step;
6899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    OMX_U32             pTmp;
6999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    ARMsFFTSpec_SC16 *pFFTStruct = 0;
7099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    OMX_S16     x,y,xNeg;
7199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    OMX_S32     xS32,yS32;
725e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com
735e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com
7499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    pFFTStruct = (ARMsFFTSpec_SC16 *) 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        return OMX_Sts_NoErr;
8199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    }
8299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
8399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    /* Do the initializations */
8499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    Nby2 = 1 << (order - 1);
8599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    N = Nby2 << 1;
8699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    M = N>>3;
875e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com
885e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com    pBitRev = NULL ;
895e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com
905e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com    pTwiddle = (OMX_SC16 *)
9199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        (sizeof(ARMsFFTSpec_SC16) + (OMX_S8*) pFFTSpec);
925e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com
9399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    /* Align to 32 byte boundary */
945537f70dff0bb4566ebb1ec645d2020974e93493turaj@webrtc.org    pTmp = ((uintptr_t)pTwiddle)&31;              /* (uintptr_t)pTwiddle % 32 */
9599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    if(pTmp != 0)
965e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com        pTwiddle = (OMX_SC16*) ((OMX_S8*)pTwiddle + (32-pTmp));
975e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com
985e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com    pBuf = (OMX_SC16 *)
9999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        (sizeof(OMX_SC16) * (3*N/4) + (OMX_S8*) pTwiddle);
1005e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com
10199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    /* Align to 32 byte boundary */
1025537f70dff0bb4566ebb1ec645d2020974e93493turaj@webrtc.org    pTmp = ((uintptr_t)pBuf)&31;                 /* (uintptr_t)pBuf % 32 */
10399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    if(pTmp != 0)
1045e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com        pBuf = (OMX_SC16*) ((OMX_S8*)pBuf + (32-pTmp));
1055e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com
10699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
10799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
1085e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com    /*
1095e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com     * Filling Twiddle factors :
11099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com     * The original twiddle table "armSP_FFT_S16TwiddleTable" is of size (MaxSize/8 + 1)
11199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com     * Rest of the values i.e., upto MaxSize are calculated using the symmetries of sin and cos
11299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com     * The max size of the twiddle table needed is 3N/4 for a radix-4 stage
11399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com     *
1145e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com     * W = (-2 * PI) / N
11599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com     * N = 1 << order
11699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com     * W = -PI >> (order - 1)
11799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com     */
1185e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com
1195e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com
1205e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com
12199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    diff = 12 - order;
12299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    step = 1<<diff;             /* step into the twiddle table for the current order */
1235e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com
12499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    xS32 = armSP_FFT_S32TwiddleTable[0];
12599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    yS32 = armSP_FFT_S32TwiddleTable[1];
12699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    x = (xS32+0x8000)>>16;
12799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    y = (yS32+0x8000)>>16;
12899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
12999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    xNeg = 0x7FFF;
1305e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com
1315e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com    if(order >=3)
13299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    {
13399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            /* i = 0 case */
13499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            pTwiddle[0].Re = x;
13599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            pTwiddle[0].Im = y;
13699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            pTwiddle[2*M].Re = -y;
13799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            pTwiddle[2*M].Im = xNeg;
13899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            pTwiddle[4*M].Re = xNeg;
13999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            pTwiddle[4*M].Im = y;
1405e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com
1415e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com
14299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        for (i=1; i<=M; i++)
14399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com          {
14499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            j = i*step;
1455e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com
14699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            xS32 = armSP_FFT_S32TwiddleTable[2*j];
14799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            yS32 = armSP_FFT_S32TwiddleTable[2*j+1];
14899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            x = (xS32+0x8000)>>16;
14999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            y = (yS32+0x8000)>>16;
1505e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com
15199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            pTwiddle[i].Re = x;
15299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            pTwiddle[i].Im = y;
15399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            pTwiddle[2*M-i].Re = -y;
15499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            pTwiddle[2*M-i].Im = -x;
15599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            pTwiddle[2*M+i].Re = y;
15699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            pTwiddle[2*M+i].Im = -x;
15799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            pTwiddle[4*M-i].Re = -x;
15899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            pTwiddle[4*M-i].Im = y;
15999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            pTwiddle[4*M+i].Re = -x;
16099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            pTwiddle[4*M+i].Im = -y;
16199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            pTwiddle[6*M-i].Re = y;
16299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            pTwiddle[6*M-i].Im = x;
16399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        }
1645e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com
1655e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com
16699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    }
16799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    else
16899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    {
16999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        if (order == 2)
17099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        {
17199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            pTwiddle[0].Re = x;
17299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            pTwiddle[0].Im = y;
17399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            pTwiddle[1].Re = -y;
17499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            pTwiddle[1].Im = xNeg;
17599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            pTwiddle[2].Re = xNeg;
17699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            pTwiddle[2].Im = y;
1775e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com
17899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        }
17999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        if (order == 1)
18099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com        {
18199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            pTwiddle[0].Re = x;
18299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com            pTwiddle[0].Im = y;
1835e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com
1845e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com        }
1855e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com
1865e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com
18799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    }
1885e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com
1895e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com
19099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    /* Update the structure */
19199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    pFFTStruct->N = N;
19299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    pFFTStruct->pTwiddle = pTwiddle;
19399b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    pFFTStruct->pBitRev = pBitRev;
19499b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    pFFTStruct->pBuf = pBuf;
19599b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
19699b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com    return OMX_Sts_NoErr;
19799b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com}
19899b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
19999b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com/*****************************************************************************
20099b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com *                              END OF FILE
20199b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com *****************************************************************************/
20299b31ea5d0f4629ceddf4852f96757c9c73654artoy@google.com
203