📄 omxsp_iirone_biquaddirect_s16.c
字号:
/** * * File Name: omxSP_IIROne_BiQuadDirect_S16.c * OpenMAX DL: v1.0.2 * Revision: 10586 * Date: Wednesday, March 5, 2008 * * (c) Copyright 2007-2008 ARM Limited. All Rights Reserved. * * * * Description: * This file contains module for single sample biuad IIR filtering * */#include "omxtypes.h"#include "armOMX.h"#include "omxSP.h"#include "armCOMM.h"#include "armSP.h"/** * Function: omxSP_IIROne_BiQuadDirect_S16 (2.2.3.3.2) * * Description: * Single-sample biquad IIR filtering for 16-bit data type. This function * applies the direct form II biquad IIR cascade defined by the coefficient * vector pTaps to a single sample of input data. The internal accumulator * width must be at least 32 bits, and the result is saturated if the * operation produces a value outside the range of a signed 16-bit integer, * i.e., the output will saturate to 0x8000 (-32768) for a negative overflow * or 0x7fff (32767) for a positive overflow. The result is undefined if any * of the partially accumulated values exceeds the range of a signed 32-bit * integer. * * Input Arguments: * * val - the single input sample to which the filter is * applied. * pTaps - pointer to the 6P-element vector that contains the combined * numerator and denominator filter coefficients from the biquad * cascade. Coefficient scaling and coefficient vector organization * should follow the conventions described above. The value of the * coefficient scalefactor exponent must be non-negative: (sfp>=0). * numBiquad - the number of biquads contained in the IIR filter cascade: * (P) * pDelayLine - pointer to the 2p-element filter memory buffer (state). The * user is responsible for allocation, initialization, and * deallocation. The filter memory elements are initialized to zero * in most applications. * * Output Arguments: * * pResult - pointer to the filtered output sample * * Return Value: * * OMX_Sts_NoErr - no error * OMX_Sts_BadArgErr - bad arguments; returned if one or more of the * following is true: * - one or more of the following pointers is NULL: pResult, * pValResult, pTaps, or pDelayLine. * - numBiquad < 1 * - pTaps[3+n*6] < 0, for 0 <= n < numBiquad (negative scaling) * */OMXResult omxSP_IIROne_BiQuadDirect_S16( OMX_S16 val, OMX_S16 * pResult, const OMX_S16 * pTaps, OMX_INT numBiquad, OMX_S32 * pDelayLine ){ OMX_S16 InOut; OMX_S32 Temp1,Temp2; OMX_S32 Mac; /* Argument Check */ armRetArgErrIf( pResult == NULL, OMX_Sts_BadArgErr); armRetArgErrIf( pDelayLine == NULL, OMX_Sts_BadArgErr); armRetArgErrIf( pTaps == NULL, OMX_Sts_BadArgErr); armRetArgErrIf( numBiquad <= 0 , OMX_Sts_BadArgErr); /* Processing */ InOut = val; while(numBiquad != 0) { /* Argument Check */ armRetArgErrIf( pTaps[3] < 0 , OMX_Sts_BadArgErr); Temp1 = pDelayLine[0]; Temp2 = pDelayLine[1]; /* Accumulate Am's */ Mac = armSatMac_S16S32_S32(0 , Temp1 , pTaps[4]); Mac = armSatMac_S16S32_S32(Mac, Temp2 , pTaps[5]); Mac = armSatSub_S32( armSatRoundLeftShift_S32(InOut, pTaps[3]) , Mac); Mac = armSatRoundLeftShift_S32(Mac,-pTaps[3]); /* Shift The DelayLine */ pDelayLine[0] = Mac; pDelayLine[1] = Temp1; /* Accumulate Bk's */ Mac = armSatMac_S16S32_S32(0 , Mac, pTaps[0] ); Mac = armSatMac_S16S32_S32(Mac, Temp1, pTaps[1] ); Mac = armSatMac_S16S32_S32(Mac, Temp2, pTaps[2] ); /* Output */ InOut = armSatRoundRightShift_S32_S16(Mac, pTaps[3]); numBiquad--; pTaps += 6; pDelayLine += 2; }/*end while(numBiquad != 0)*/ *pResult = InOut; return OMX_Sts_NoErr;} /* End of File */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -