I am trying to replace ipp.lib DCT function by using mkl.lib DCT function . I used following Ipp based API to do DCT:
ippsDCTFwdInitAlloc_32f
ippsDCTFwd_32f
ippsDCTFwdFree_32f
PFB my mkl based DCT sample code :
#include <time.h>
#include <stdlib.h>
#include "mkl.h"
int main(int argc, char* argv[]){
float *dpar;
float *out;
MKL_INT *ipar;
MKL_INT tt_type,stat,n_1,nn;
FILE *fp,*fw,*fonce;
fp = fopen( "D:\\dump\\fileinput.txt","r" );
if(fp == NULL){
cout<<"file not created properly"<<endl;
}
DFTI_DESCRIPTOR_HANDLE handle = 0;
int n = 150; /*Hardcoded to run for my code TODO: going to change after integrating into my main codebase.As I can't attach my full fileinput.txt .So just taken n value = 150 */
nn = (MKL_INT)n;
tt_type = MKL_STAGGERED_COSINE_TRANSFORM;
n_1 = nn + 1 ;
out = (float*)malloc((n+1)*sizeof(float));
dpar= (float*)malloc((5*n_1/2+2)*sizeof(float));
ipar= (MKL_INT*)malloc((128)*sizeof(int));
s_init_trig_transform(&n_1,&tt_type,ipar,dpar,&stat);
for (int srcSize =0 ;srcSize< n ; srcSize++)
{
fscanf(fp,"%f\n",&out[srcSize]);
}
fclose(fp);
if (stat != 0)
{
printf("\n============================================================================\n");
printf("FFTW2MKL FATAL ERROR: MKL TT initialization has failed with status=%d\n",(MKL_INT)stat);
printf("Please refer to the Trigonometric Transform Routines Section of MKL Manual\n");
printf("to find what went wrong...\n");
printf("============================================================================\n");
return NULL;
}
ipar[10] = 1; //nx, that is, the number of intervals along the x-axis, in the Cartesian case.
ipar[14] = n_1; //specifies the internal partitioning of the dpar array.
ipar[15] = 1; //value of ipar[14]+1,Specifies the internal partitioning of the dpar array.
s_commit_trig_transform(out,&handle,ipar,dpar,&stat);
if (stat != 0)
{
printf("\n============================================================================\n");
printf("FFTW2MKL FATAL ERROR: MKL TT commit step has failed with status=%d\n",(MKL_INT)stat);
printf("Please refer to the Trigonometric Transform Routines Section of MKL Manual\n");
printf("to find what went wrong...\n");
printf("============================================================================\n");
return NULL;
}
s_forward_trig_transform(out,&handle,ipar,dpar,&stat);
if (stat != 0)
{
printf("\n============================================================================\n");
printf("FFTW2MKL FATAL ERROR: MKL TT commit step has failed with status=%d\n",(MKL_INT)stat);
printf("Please refer to the Trigonometric Transform Routines Section of MKL Manual\n");
printf("to find what went wrong...\n");
printf("============================================================================\n");
return NULL;
}
free_trig_transform(&handle,ipar,&stat);
printf("\n===== DCT GOT OVER ======== \n");
return 0;
}
But I am not getting the correct output . I am getting confused that whether my implementation is correct or not .
As I don't know How to attach my fileinput.txt,So I put the file content here. Sorry for that :(
129.000000 128.000000 145.000000 140.000000 102.000000 93.000000 100.000000 97.000000 94.000000 88.000000 58.000000 67.000000
79.000000 62.000000 62.000000 64.000000 63.000000 63.000000 70.000000 80.000000 61.000000 62.000000 63.000000 64.000000
62.000000 78.000000 66.000000 65.000000 68.000000 74.000000 78.000000 66.000000 67.000000 76.000000 67.000000 65.000000
76.000000 83.000000 66.000000 66.000000 65.000000 66.000000 72.000000 80.000000 65.000000 66.000000 69.000000 80.000000
75.000000 66.000000 71.000000 80.000000 69.000000 80.000000 85.000000 70.000000 77.000000 68.000000 67.000000 80.000000
83.000000 69.000000 71.000000 73.000000 69.000000 70.000000 71.000000 71.000000 70.000000 71.000000 88.000000 86.000000
78.000000 78.000000 70.000000 73.000000 81.000000 83.000000 76.000000 75.000000 72.000000 72.000000 73.000000 75.000000
79.000000 76.000000 80.000000 87.000000 84.000000 79.000000 73.000000 72.000000 72.000000 72.000000 73.000000 79.000000
76.000000 74.000000 76.000000 78.000000 76.000000 74.000000 73.000000 76.000000 78.000000 78.000000 73.000000 74.000000
73.000000 72.000000 72.000000 73.000000 75.000000 77.000000 76.000000 75.000000 74.000000 74.000000 75.000000 78.000000
81.000000 78.000000 75.000000 74.000000 74.000000 74.000000 75.000000 77.000000 79.000000 80.000000 81.000000 78.000000
76.000000 75.000000 74.000000 74.000000 74.000000 75.000000 76.000000 76.000000 75.000000 77.000000 78.000000 79.000000
80.000000 79.000000 79.000000 79.000000 78.000000 76.000000 76.000000 76.000000 76.000000 77.000000 77.000000 77.000000
78.000000 80.000000 80.000000 80.000000 80.000000 80.000000 78.000000 78.000000 78.000000 78.000000 78.000000 80.000000
I think you are talking the dpar parameter for these functions. Actually, they are not used for the computed result. They are just used for store the intermediate sin/cos data that are used in the TT computation.
For the computation function: d_forward_trig_transform(double f[], DFTI_DESCRIPTOR_HANDLE *handle, MKL_INT ipar[], double dpar[], MKL_INT *stat);
Both the input and output is F[], which is the same size. for more information You can refer below link : link here