Developer Reference

  • 2020
  • 10/21/2020
  • Public Content
Contents

IIRIIR

Filters a source vector through an IIRIIR filter.

Syntax

Case 1: Not-in-place operation
IppStatus ippsIIRIIR_32f(const Ipp32f*
pSrc
, Ipp32f*
pDst
, int
len
, IppsIIRState_32f*
pState
);
IppStatus ippsIIRIIR_64f(const Ipp64f*
pSrc
, Ipp64f*
pDst
, int
len
, IppsIIRState_64f*
pState
);
IppStatus ippsIIRIIR64f_32f(const Ipp32f*
pSrc
, Ipp32f*
pDst
, int
len
, IppsIIRState64f_32f*
pState
);
Case 2: In-place operation
IppStatus ippsIIRIIR_32f_I(Ipp32f*
pSrcDst
, int
len
, IppsIIRState_32f*
pState
);
IppStatus ippsIIRIIR_64f_I(Ipp64f*
pSrcDst
, int
len
, IppsIIRState_64f*
pState
);
IppStatus ippsIIRIIR64f_32f_I(Ipp32f*
pSrcDst
, int
len
, IppsIIRState64f_32f*
pState
);
Include Files
ipps.h
Domain Dependencies
Headers:
ippcore.h
,
ippvm.h
Libraries:
ippcore.lib
,
ippvm.lib
Parameters
pState
Pointer to the IIRIIR filter state structure.
pSrc
Pointer to the source vector.
pDst
Pointer to the destination vector.
pSrcDst
Pointer to the source and destination vector for the in-place operations.
len
Number of elements of the vector to be filtered.
Description
This function filters
len
elements of the source vector
pSrc
or
pSrcDst
through an IIRIIR filter, and stores the results in
pDst
or
pSrcDst
, respectively. The filter parameters are specified in
pState
.
Before calling the
ippsIIRIIR
function, initialize the filter state structure by using the
IIRIIRInit
function and specify the number of taps
tapsLen
, the tap values in
pTaps
, the delay line values in
pDlyLine
, and the
order
value.
Return Values
ippStsNoErr
Indicates no error.
ippStsNullPtrErr
Indicates an error when one of the specified pointers is
NULL
.
ippStsLengthErr
Indicates an error when
length of the vectors < 3*(IIR order).
ippStsContextMatchErr
Indicates an error when the state identifier is incorrect.

Example

/******************************************************************************* * Copyright 2015-2020 Intel Corporation. * * This software and the related documents are Intel copyrighted materials, and * your use of them is governed by the express license under which they were * provided to you (License). Unless the License provides otherwise, you may not * use, modify, copy, publish, distribute, disclose or transmit this software or * the related documents without Intel's prior written permission. * * This software and the related documents are provided as is, with no express * or implied warranties, other than those that are expressly stated in the * License. *******************************************************************************/ #include <stdio.h> #include "ipps.h" #define SMP_RATE 1000.f #define F1 50.f #define F2 120.f #define AMPL 10 #define CUT_OFF 0.3 #define LEN 256 #define ORDER 3 int main( ){ Ipp32f *x, *y, *f1, *f2; Ipp32f phase; int i, bufferSizeGen, bufferSizeIIRIIR; Ipp64f *pTaps; Ipp8u *pBufIIRIIR; IppsIIRState64f_32f *pStateIIRIIR; IppStatus st; /* generate test input signal - sum of 2 sinusoids with 50 & 120 Hz */ f1 = ippsMalloc_32f( LEN ); f2 = ippsMalloc_32f( LEN ); x = ippsMalloc_32f( LEN ); phase = 3 * (Ipp32f)IPP_PI2; /* ippsTone generates cos, we want sin */ st = ippsTone_32f( f1, LEN, AMPL, F1/SMP_RATE, &phase, ippAlgHintAccurate ); /* generate 50 Hz sin */ phase = 3 * (Ipp32f)IPP_PI2; /* restore phase*/ st |= ippsTone_32f( f2, LEN, AMPL, F2/SMP_RATE, &phase, ippAlgHintAccurate ); /* generate 120 Hz sin */ st |= ippsAdd_32f( f1, f2, x, LEN ); /* add 50 & 120 Hz sin to form input signal */ st |= ippsAbs_32f_I( x, LEN ); /* make positive, x contains input signal to be filtered with IIRIIR */ ippsFree( f1 ); ippsFree( f2 ); /* get size of mem buffers for IIR and IIRGen functions */ st |= ippsIIRIIRGetStateSize64f_32f( ORDER, &bufferSizeIIRIIR ); st |= ippsIIRGenGetBufferSize ( ORDER, &bufferSizeGen ); /* we can allocate MAX size from two - operations are sequential and therefore buffer can be reused */ pBufIIRIIR = ippsMalloc_8u( IPP_MAX( bufferSizeGen, bufferSizeIIRIIR )); pTaps = ippsMalloc_64f( 2 * ( ORDER + 1 )); /* gen LowPass filter coefficients */ st |= ippsIIRGenLowpass_64f( CUT_OFF/2, 0.0, ORDER, pTaps, ippButterworth, pBufIIRIIR ); /* init state structure for IIRIIR */ st |= ippsIIRIIRInit64f_32f( &pStateIIRIIR, pTaps, ORDER, NULL, pBufIIRIIR ); y = ippsMalloc_32f( LEN ); /* output vector */ st |=ippsIIRIIR64f_32f( x, y, LEN, pStateIIRIIR ); printf("idx,\tinput,\toutput\n"); for( i = 0; i < LEN; i++ ){ printf("%d,\t%f,\t%f\n", i, (double)x[i], (double)y[i] ); } if( ippStsNoErr != st ) printf("\nCertain problems in Intel(R) Integrated Primitives (Intel(R) IPP) !\n"); ippsFree( y ); ippsFree( pTaps ); ippsFree( pBufIIRIIR ); ippsFree( x ); return 0; }
The figure below shows the result of the example, where the
X
-axis is index of the input/output vector/signal to see that there is no phase distortion,
Y
-axis - amplitude of input/output signals.

Product and Performance Information

1

Performance varies by use, configuration and other factors. Learn more at www.Intel.com/PerformanceIndex.