do you think the following sequence is correct:
according to the IPP manual (Volume 1, Signal Processing) you'll get wrong magnitude:
Arrangement of Forward Fourier Transform Results in Packed Formats - Even Length
Index 0 1 2 3 . . . N-2 N-1 N N+1
Pack R0 R1 I1 R2 . . . I(N-1)/2 RN/2
So I guess you should perform a shift for pDstC & pDst to 1 point and calculate the first and last points in a special way (considering 0 for image part). Or the most correct way is to use "ppStatus ippsConjPack_32fc_I(Ipp32fc* pSrcDst, int lenDst);" function that expands Pack format to Complex.
Regarding multithreading - IPP FFT is threaded for the very limited number of cases: you CPU must have 2 cores only (with disabled HT) and share cache - for example core-duo. 32f FFT is threaded for orders 13-19, 64f - for 12-18. All other configurations are not supported by multi-threaded version due to several reasons, the main of them is that we can't guarantee better performance in other possible cases. If you use rather big FFT orders and really need multithreded solution - it is better for you to take a look at MKL library that provides threading above IPP FFTs for big FFT orders (MKL provides its own API, but for FFTs uses IPP kernels internally).
- status = ippsFFTFwd_RToPack_32f(pSrc.get(), pDst.get(), pFFTSpec, pBuffer.get());
if(status != ippStsNoErr) throw std::runtime_error(ippGetStatusString(status));
Ipp32fc *pDstC = (Ipp32fc*)(pDst.get());
Ipp32s realSz = fftSz/2; // Exclude zero part.
Ipp32s magSz = realSz/2; // Convert length to complex length.
// Extract magniutde from input signal.
status = ippsMagnitude_32fc(pDstC, pDst.get(), realSz)
Igor Astakhov (Intel) wrote:
sorry, forum editor reformatted message after submitting, your code example should start from the 3rd line of message...