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

📄 omxsp_fftfwd_ctoc_sc16_sfs.c

📁 The OpenMAX DL (Development Layer) APIs contain a comprehensive set of audio, video, signal processi
💻 C
字号:
/** *  * File Name:  omxSP_FFTFwd_CToC_SC16_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 a forward FFT for a complex signal */#include "omxtypes.h"#include "armOMX.h"#include "omxSP.h"#include "armCOMM.h"#include "armSP.h"/** * Function:  omxSP_FFTFwd_CToC_SC16_Sfs   (2.2.4.2.2) * * Description: * Compute an 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  * DFT, i.e.,  * *      X[k] = 2^(-scaleFactor) . SUM[n=0...N-1]x[n].e^(-jnk.2.pi/N) *      k = 0,1,2,..., N-1 *      N = 2^order * * Input Arguments: *   pSrc - pointer to the input signal, a complex-valued vector of length 2^order;  *            must be aligned on a 32 byte boundary.  *   pFFTSpec - pointer to the preallocated and initialized specification  *            structure  *   scaleFactor - output scale factor; the range for is [0,16]  * * Output Arguments: *   pDst - pointer to the complex-valued output vector, of length 2^order;  *          must be aligned on an 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>16 * */OMXResult omxSP_FFTFwd_CToC_SC16_Sfs(     const OMX_SC16 *pSrc,     OMX_SC16 *pDst,     const OMXFFTSpec_C_SC16 *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 > 16, 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 = armSatRoundRightShift_S32_S16 (pSrc[0].Re, scaleFactor);        pDst [0].Im = armSatRoundRightShift_S32_S16 (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)(1L << scaleFactor);        out [i].Im /= (OMX_F64)(1L << scaleFactor);        pDst [i]. Re = armSatRoundFloatToS16 (out [i].Re);        pDst [i]. Im = armSatRoundFloatToS16 (out [i].Im);    }        return OMX_Sts_NoErr;}/***************************************************************************** *                              END OF FILE *****************************************************************************/

⌨️ 快捷键说明

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