I've recently begun integrating with IPP. I'm really impressed with the performance of the single-rate IPPs filter, but I can't seem to make sense of the multi-rate complex filter
I am running the following test based on the example provided on https://software.intel.com/en-us/ipp-dev-reference-firmr
1) Run the exact code from the example for real input, real output, real taps
2) Run the code modified to run on complex input, complex output, real taps
It seems that in the 2nd case half of the outputs are set to 0
Example output from case 1 (seems correct):
1.000000 10.000000 30.000000 50.000000 70.000000 90.000000 110.000000 130.000000 150.000000 170.000000 190.000000 210.000000 230.000000 250.000000
Example output from case 2 (seems to have half of the outputs set to 0):
0.000000 0.000000 30.000000 50.000000 0.000000 0.000000 110.000000 130.000000 0.000000 0.000000 190.000000 210.000000 0.000000 0.000000
I can't figure out if I am misinterpreting an output pointer or if the filter itself isn't working correctly. With uprate > 1, the output appears correct. With uprate =1 and downrate > 4 the output seems correct, but if uprate =1 and downrate <= 4 there are zeroed out puts only on the complex version of the filter.
Attached is a cmake file and the source file to run both filter types. To evaluate things I manually change the upRate and downRate in each function.
As the CmakeLists.txt will suggest, I am using IPP 2020.0.166
Yes, we confirm the problem with the current version of IPP. the issue is escalated against the signal processing team. We will keep you informed of the status of this issue.
As a temporary workaround the problem, you may try to change the AVX specific code by calling the cpuFeatures(...). I see the problem is disappeared when this trick has been used.
ippSetCpuFeatures(ippCPUID_MMX | ippCPUID_SSE | ippCPUID_SSE2 | ippCPUID_SSE3 | ippCPUID_SSSE3 | ippCPUID_SSE41 | ippCPUID_SSE42 | ippCPUID_AES | ippCPUID_CLMUL | ippCPUID_SHA | ippCPUID_MOVBE);
That seems to work for now, thanks.