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