Showing results for 
Search instead for 
Did you mean: 

Ipp FIR Filtering issue

hello, I need to use the IPP package for audio data filtering purposes. In particular i need to use IIR and FIR filtering on 16s (short) data arrays.In my evaluation project the IIR filtering functions behaves correctly. The FIR functions instead do not produce the expected results, and in particular I wanted to ask:

- I need to continuously filter portions of sampled data (e.g., arrays of 1.000 samples), and need to preserve the filter's state. I'm using the: ippsFIRGenLowpass_64f, to compute filter coefficients (taps); ippsFIRSRGetSize, ippsFIRSRInit_32f, to initialize the filter state (firSpec), and the: ippsFIRSR_16s, to continuously (in cycle) filter portios of data (arrays of 1.000 saples per step).

The problem is that I obtain a filtered signal with a visible filter initialization effect (signal approaching much higher values) every time the filtering function is called. I wanted to know how it is possible to modulate (suppress) the effect of the filter initialization every time the filtering function is called, in order to obtain a continuously filtered signal. Is it necessary to del with the: *pDlyDst and *pDlySrc pointers to dest/source delay lines? and in which way it can be done? (at the moment i'm setting NULL values).

- The result of the FIR HighPass filter is not correctly behaving as expected: the resulting signal is not coherent with the input one, and generates a random behaving signal shape even for low cutoff frequencies. Is it necessary to set some other parameter or to use different functions for a correct initialization and filtering?

- Is it possible to have some complete example on FIR filtering functions usage on data arrays, while preserving the filter state for subsequent filtering function calls?

Thanx in advance,

0 Kudos
1 Reply

Hi Alex.

As  I understand you pass NULL pointer to ippsFIRSR? Actually to process continuous signal you should use next pseudoalgorithm

chunkLen =  totalLen / num of chunks;

delayLine = malloc(tapsLen)

ippsFIR(src, dst, chunkLen, spec, NULL, delayLine, workBuf)


   ippsFIR(src+chunk_offset, dst+chunk_offset, chunkLen, spec, delayLine, delayLine, workBuf)


NULL as input delay lines means that all values are "0" and you see incorrect result in you case.