0

mkl.lib DCT function を使用して ipp.lib DCT 関数を置き換えようとしています。次の Ipp ベースの API を使用して DCT を実行しました。

ippsDCTFwdInitAlloc_32f
ippsDCTFwd_32f
ippsDCTFwdFree_32f

PFB 私の mkl ベースの DCT サンプル コード:

#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;

}

しかし、正しい出力が得られません。私の実装が正しいかどうか、私は混乱しています。

私のファイルinput.txtを添付する方法がわからないので、ここにファイルの内容を入れます。そのために残念 :(

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
4

1 に答える 1

0

これらの関数の dpar パラメータについて話していると思います。実際には、計算結果には使用されません。これらは、TT 計算で使用される中間の sin/cos データを格納するためにのみ使用されます。

計算関数の場合: d_forward_trig_transform(double f[], DFTI_DESCRIPTOR_HANDLE *handle, MKL_INT ipar[], double dpar[], MKL_INT *stat);

入力と出力はどちらも同じサイズの F[] です。詳細については、以下のリンクを参照できます : リンクはこちら

于 2014-12-24T06:19:30.333 に答える