136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/* 236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. 336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines * 436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines * Use of this source code is governed by a BSD-style license 536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines * that can be found in the LICENSE file in the root of the source 636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines * tree. An additional intellectual property rights grant can be found 736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines * in the file PATENTS. All contributing project authors may 836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines * be found in the AUTHORS file in the root of the source tree. 936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines * 1036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines * This is a modification of omxSP_FFTInit_R_S32.c to support float 1136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines * instead of S32. 1236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines */ 1336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 1436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include <stdint.h> 1536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 1636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "dl/api/omxtypes.h" 1736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "dl/sp/api/omxSP.h" 1836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "dl/sp/api/x86SP.h" 1936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 2036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/** 2136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines * Function: omxSP_FFTInit_R_F32 2236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines * 2336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines * Description: 2436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines * Initialize the real forward-FFT specification information struct. 2536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines * 2636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines * Remarks: 2736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines * This function is used to initialize the specification structures 28cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines * for functions |omxSP_FFTFwd_RToCCS_F32_Sfs| and 2936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines * |omxSP_FFTInv_CCSToR_F32_Sfs|. Memory for *pFFTSpec must be 3036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines * allocated prior to calling this function. The number of bytes 31cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines * required for *pFFTSpec can be determined using 32cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines * |omxSP_FFTGetBufSize_R_F32|. 3336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines * 34cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines * Parameters: 35cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines * [in] order base-2 logarithm of the desired block length; 3636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines * valid in the range [1,12]. ([1,15] if 37cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines * BIG_FFT_TABLE is defined.) 3836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines * [out] pFFTFwdSpec pointer to the initialized specification structure. 3936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines * 4036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines * Return Value: 41cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines * Standard omxError result. See enumeration for possible result codes. 42cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines * 43cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines */ 44cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 45cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen HinesOMXResult omxSP_FFTInit_R_F32(OMXFFTSpec_R_F32 *pFFTSpec, OMX_INT order) 46cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines{ 47cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines OMX_F32 *pTwiddle; 4836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines OMX_F32 *pBuf; 4936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines OMX_INT i; 5036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines OMX_INT j; 51cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines OMX_INT N; 52cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines OMX_INT NBy2; 53cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines OMX_INT NBy4; 54cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines OMX_INT diff; 5536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines OMX_U32 pTmp; 5636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines X86FFTSpec_R_FC32 *pFFTStruct = (X86FFTSpec_R_FC32 *) pFFTSpec; 5736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines OMX_F32 real; 5836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines OMX_F32 imag; 5936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 60 if (!pFFTSpec || (order < 1) || (order > TWIDDLE_TABLE_ORDER)) 61 return OMX_Sts_BadArgErr; 62 63 N = 1 << order; 64 NBy2 = N >> 1; 65 66 pTwiddle = (OMX_F32*) (sizeof(X86FFTSpec_R_FC32) + (OMX_S8*) pFFTSpec); 67 68 // Align to 32 byte boundary. 69 pTmp = ((uintptr_t)pTwiddle) & 31; 70 if (pTmp) 71 pTwiddle = (OMX_F32*) ((OMX_S8*)pTwiddle + (32 - pTmp)); 72 73 pBuf = (OMX_F32*) (sizeof(OMX_F32) * (N << 1) + (OMX_S8*) pTwiddle); 74 75 // Align to 32 byte boundary. 76 pTmp = ((uintptr_t)pBuf) & 31; 77 if (pTmp) 78 pBuf = (OMX_F32*) ((OMX_S8*)pBuf + (32 - pTmp)); 79 80 // Calculating Twiddle Factors. 81 diff = 1 << (TWIDDLE_TABLE_ORDER - order + 1); 82 83 // For SSE optimization, using twiddle with split format by which the real and 84 // imag data are stored into first and last halves of the buffer separately 85 // The negatives are moved when generating pTwiddle table. 86 if (order > 1) { 87 NBy4 = N >> 2; 88 for (i = 0, j = 0; i <= NBy4 >> 1; ++i, j += diff) { 89 real = armSP_FFT_F32TwiddleTable[j]; 90 imag = armSP_FFT_F32TwiddleTable[j + 1]; 91 92 pTwiddle[i] = -real; 93 pTwiddle[i + N] = -imag; 94 95 pTwiddle[NBy4 - i] = imag; 96 pTwiddle[NBy4 - i + N] = real; 97 98 pTwiddle[NBy4 + i] = -imag; 99 pTwiddle[NBy4 + i + N] = real; 100 101 pTwiddle[NBy2 - i] = real; 102 pTwiddle[NBy2 - i + N] = -imag; 103 104 pTwiddle[NBy2 + i] = real; 105 pTwiddle[NBy2 + i + N] = imag; 106 107 pTwiddle[NBy4 * 3 - i] = -imag; 108 pTwiddle[NBy4 * 3 - i + N] = -real; 109 110 pTwiddle[NBy4 * 3 + i] = imag; 111 pTwiddle[NBy4 * 3 + i + N] = -real; 112 113 pTwiddle[N - i - 1] = -real; 114 pTwiddle[(N << 1) - i - 1] = imag; 115 } 116 } else { 117 pTwiddle[0] = armSP_FFT_F32TwiddleTable[0]; 118 pTwiddle[2] = armSP_FFT_F32TwiddleTable[1]; 119 pTwiddle[1] = -pTwiddle[0]; 120 pTwiddle[3] = pTwiddle[2]; 121 } 122 pFFTStruct->N = N; 123 pFFTStruct->pTwiddle = pTwiddle; 124 pFFTStruct->pBuf1 = pBuf; 125 pFFTStruct->pBuf2 = pBuf + N + 4; 126 127 return OMX_Sts_NoErr; 128} 129