Intel® Integrated Performance Primitives
Deliberate problems developing high-performance vision, signal, security, and storage applications.

ippsResamplePolyphase_16s output

Slava_D_
Beginner
1,176 Views

I played around with ippsResamplePolyphase_16s function and came across its kind of strange behavior. First of all, let me define a lowpass filter with a window size of 5 and discretization step for filter coefficients of 3. After I initialize the structure for polyphase resampling, I assign the resampling factor to 3 and the resampling start time to 1 (i.e. the second input item). For simplicity, I take the first 5 input items to resample. As an output, I get the resampling start time of 6.33 and the number of calculated output items of 16. It means that the next time I will call the ippsResamplePolyphase function, there will be a shift of 0.33 in the input data portion yielding the shift of the output data. It looks weird, because I assigned the resampling factor to the integer value and expected to receive all the resampled data uniformly distributed. I also noticed that the shift doesn’t arise when I process input data with a chunks size equal to 3 or 9. What can be the reason for such an odd thing?

The code is attached

	//size of the ideal lowpass filter window
	Ipp32f window = 5;
	//discretization step for filter coefficients
	int nStep = 3;
	//size of the polyphase resampling structure
	int size;
	//suggests using specific code (must be equal to ippAlgHintFast)
	IppHintAlgorithm hint = ippAlgHintAccurate;

	//get the size of the polyphase resampling structure
	ippsResamplePolyphaseGetSize_16s(window, nStep, &size, hint);

	//roll-off frequency of the filter
	Ipp32f rollf = 0.95;
	//parameter of the Kaiser window
	Ipp32f alpha = 9;
	//pointer to the resampling state structure
	IppsResamplingPolyphase_16s* state = (IppsResamplingPolyphase_16s*)(new Ipp8u[size]);

	//initialize the structure for polyphase resampling with calculating the filter coefficients
	//values of the ideal lowpass filtering function are calculated for all i values such that |i/nStep| <= window
	ippsResamplePolyphaseInit_16s(window, nStep, rollf, alpha, state, hint);

	//resampling factor
	Ipp64f factor = float(46) / 29; // accum ff / num of pSrc
	//history
	int history = (0.5 * window * IPP_MAX(1.0, 1.0 / factor)) + 1;
	//number of input vector elements to resample
	int lenSrc = 29 + 2 * history;
	//pointer to the input vector
	Ipp16s pSrc[] = {
		105, 115, 105, -55, -100, -120, -115, -120, -75, 85, 125, 125,
		105, -60, -115, -125, -125, -105, -65, 20, 85, 105, 135, 105, -85, -105, -105, -100, -80,
		-80, -80, -80
		};
	//array of sample rates
	Ipp16s ff[] = {
		3, 1, 4, 1, 1, 1, 1, 1, 5, 1, 1, 1, 4, 1, 1, 1, 1, 1, 2, 1, 1, 2, 2, 4, 1, 1, 1, 1, 1};
	//number of calculated output vector elements
	int lenDst = (int)((lenSrc - history) * factor + 2);
	//pointer to the output vector
	Ipp16s* pDst = new Ipp16s[lenDst];
	//norm factor for output samples that are multiplied by norm * min (1, factor) before saturation
	Ipp32f norm = 0.98;
	//start time of resampling (in input vector elements)
	//keeps the input sample number and the phase for the first output sample from the next input data portion
	Ipp64f time = 1.0;

	//temporary vector
	vector<Ipp32f> temp;

	//resample input data using polyphase filters
	factor = ff[0];
	ippsResamplePolyphase_16s(pSrc, 1, pDst, factor, norm, &time, &lenDst, state);
	for (size_t i = 0; i < lenDst; i++) {
		temp.push_back(pDst);
	}

Sincerely,
Slava

0 Kudos
5 Replies
Jing_Xu
Employee
1,176 Views

ippsResamplePolyphase_16s(pSrc, 1, pDst, factor, norm, &time, &lenDst, state);

Why the second parameter is 1 in your function call? As refered to the description of this api function shown below (https://software.intel.com/en-us/node/502289), the second parameter should be The number of input vector elements to resample.

IppStatus ippsResamplePolyphase_16s(const Ipp16s* pSrc, int len, Ipp16s* pDst, Ipp64ffactor, Ipp32f norm, Ipp64f* pTime, int* pOutlen, const IppsResamplingPolyphase_16s* pSpec);

Parameters

pSrc

The pointer to the input vector.

pDst

The pointer to the output vector.

len

The number of input vector elements to resample.

norm

The norm factor for output samples.

factor

The resampling factor.

pTime

The pointer to the start time of resampling (in input vector elements). Keeps the input sample number and the phase for the first output sample from the next input data portion.

pOutlen

The number of calculated output vector elements.

pSpec

The pointer to the resampling state structure.

0 Kudos
Slava_D_
Beginner
1,176 Views

Hi Jing,

It’s a mistyping. Sure, it should be 5 in the case test.

0 Kudos
Slava_D_
Beginner
1,176 Views

The problem is still not solved. Looks like there is a BUG in the implementation of the polyphase resampling algorithm in IPP.

0 Kudos
Jing_Xu
Employee
1,176 Views

We are working on it, we will get back to you soon.

0 Kudos
Slava_D_
Beginner
1,176 Views

Looking forward to your response.

0 Kudos
Reply