⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 omxsp_fftinv_ctoc_sc32_sfs.c

📁 The OpenMAX DL (Development Layer) APIs contain a comprehensive set of audio, video, signal processi
💻 C
字号:
/** *  * File Name:  omxSP_FFTInv_CToC_SC32_Sfs.c * OpenMAX DL: v1.0.2 * Revision:   10586 * Date:       Wednesday, March 5, 2008 *  * (c) Copyright 2007-2008 ARM Limited. All Rights Reserved. *  *  * Description: * Compute an inverse FFT for a complex signal */#include "omxtypes.h"#include "armOMX.h"#include "omxSP.h"#include "armCOMM.h"#include "armSP.h"/** * Function:  omxSP_FFTInv_CToC_SC32_Sfs   (2.2.4.2.4) * * Description: * These functions compute an inverse FFT for a complex signal of length * of 2^order, where 0 <= order <= 12. Transform length is determined by the  * specification structure, which must be initialized prior to calling the FFT  * function using the appropriate helper, i.e., <FFTInit_C_sc32> or  * <FFTInit_C_SC16>. The relationship between the input and output sequences  * can be expressed in terms of the IDFT, i.e.:  * *     x[n] = (2^(-scalefactor)/N)  . SUM[k=0,...,N-1] X[k].e^(jnk.2.pi/N) *     n=0,1,2,...N-1 *     N=2^order. * * Input Arguments: *   pSrc - pointer to the complex-valued input signal, of length 2^order ;  *          must be aligned on a 32-byte boundary.  *   pFFTSpec - pointer to the preallocated and initialized specification  *            structure  *   scaleFactor - scale factor of the output. Valid range is [0,32].  * * Output Arguments: *   order  *   pDst - pointer to the complex-valued output signal, of length 2^order;  *          must be aligned on a 32-byte boundary.  * * Return Value: *     *    OMX_Sts_NoErr - no error  *    OMX_Sts_BadArgErr - returned if one or more of the following conditions  *              is true:  *    -   one or more of the following pointers is NULL: pSrc, pDst, or  *              pFFTSpec.  *    -   pSrc or pDst is not 32-byte aligned  *    -   scaleFactor<0 or scaleFactor>32 * */OMXResult omxSP_FFTInv_CToC_SC32_Sfs(     const OMX_SC32 *pSrc,     OMX_SC32 *pDst,     const OMXFFTSpec_C_SC32 *pFFTSpec,     OMX_INT scaleFactor ) {    OMX_INT     block, point;    OMX_INT     i, j, N, NBy2;    OMX_U16     *pRevIndex;    OMX_FC64     *out;    OMX_FC64    *pT1, *pT2, *pT, *pTw, T;    ARMsFFTSpec_FC64 *pFFTStruct;    /* Input parameter check */     armRetArgErrIf(pSrc == NULL, OMX_Sts_BadArgErr)    armRetArgErrIf(armNot32ByteAligned(pSrc), OMX_Sts_BadArgErr)    armRetArgErrIf(pDst == NULL, OMX_Sts_BadArgErr)    armRetArgErrIf(armNot32ByteAligned(pDst), OMX_Sts_BadArgErr)    armRetArgErrIf(pFFTSpec == NULL, OMX_Sts_BadArgErr)    armRetArgErrIf(scaleFactor < 0, OMX_Sts_BadArgErr)    armRetArgErrIf(scaleFactor > 32, OMX_Sts_BadArgErr)    /* Order range check */     pFFTStruct = (ARMsFFTSpec_FC64 *) pFFTSpec;        N = pFFTStruct->N;    armRetArgErrIf(N < 1, OMX_Sts_BadArgErr)    armRetArgErrIf(N > (1 << 12), OMX_Sts_BadArgErr)        /* Handle order zero case separate */    if (N == 1)    {        pDst [0].Re = armSatRoundLeftShift_S32 (pSrc[0].Re, -scaleFactor);        pDst [0].Im = armSatRoundLeftShift_S32 (pSrc[0].Im, -scaleFactor);        return OMX_Sts_NoErr;            }    /* Do fft in float */    out = pFFTStruct->pBuf;    /* bit reversal */        pRevIndex = pFFTStruct->pBitRev;    for (i = 0; i < N; i++)    {        out [pRevIndex [i]].Re = (OMX_F64) pSrc [i]. Re;        out [pRevIndex [i]].Im = (OMX_F64) -pSrc [i]. Im;    }        NBy2 = N >> 1;    pT = &T;    point = 2;    for (block = NBy2; block > 0; block >>= 1)    {        pTw = pFFTStruct->pTwiddle;        for (i = 0; i < point / 2; i++)        {            pT1 = out + i;            pT2 = pT1 + (point / 2);            for (j = 0; j < block; j++)            {                armSP_CPLX_MUL (pT, pTw, pT2);                armSP_CPLX_SUB (pT2, pT1, pT);                armSP_CPLX_ADD (pT1, pT1, pT);                pT1 += point;                pT2 += point;            }            pTw += block;        }        point <<= 1;    }        /* revert back from float */    for (i = 0; i < N; i++)    {        out [i].Re /= (OMX_F64)(1LL << scaleFactor);        out [i].Im /= (OMX_F64)(1LL << scaleFactor);        out [i].Re /= N;        out [i].Im /= N;        pDst [i]. Re = armSatRoundFloatToS32 (out [i].Re);        pDst [i]. Im = armSatRoundFloatToS32 (-out [i].Im);    }        return OMX_Sts_NoErr;}/***************************************************************************** *                              END OF FILE *****************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -