2016-07-05 1 views
0

配列のすべての要素に問題があります。私は2つの異なる配列(x[]と​​)を持っています、それぞれ40000要素を持っています。私はブロック間の相互相関(x[]の5つの要素と​​の5つの要素)を計算するために、スライディングウィンドウを使用して各要素から5つの要素をスイープしました。コンピューティングの後、それは第2のWindow ..およびアレイの終わりまで連続的にスイープする。相関関係の結果を取得して新しい配列に格納するにはどうすればよいですか。入力はgc_us_dist_datagc_us_prox_dataです。相関関係を計算する際には、一連の結果を受け取りたいと思います。みんなから助けを受けることを願っています。配列のすべての要素を別の配列に保存して処理する

const int16_t gc_us_dist_data[SAMPLES] //4000 SAMPLES 
    const int16_t gc_us_prox_data[SAMPLES] //4000 SAMPLES 
    /* This function is real implementation of the sliding window algorithm */ 
     int slide_window_01(int buffer1[], int N, int buffer_len){ 

     int i = 0, j = 0, s; 
     int16_t dist[SAMPLES]; 

     for(j=0 ; j + N < buffer_len; j++){ 
      /* Window starts at index 0 and is of size N */ 
      // printf("\nCurrent window :"); 
      for(s =j; s<j+N; s++){ 
       dist[SAMPLES] = buffer1[s]; 
      } 
     } 
    } 

     int slide_window_02(int buffer2[], int N, int buffer_len){ 

      int i = 0, j = 0, s; 
      int16_t prox[SAMPLES]; 

      for(j=0 ; j + N < buffer_len; j++){ 
       /* Window starts at index 0 and is of size N */ 
       // printf("\nCurrent window :"); 
       for(s =j; s<j+N; s++){ 
        prox[SAMPLES] = buffer2[s]; 
       } 
      } 
     } 
    /*------------- Cross Correlation between two signals ----------------------- 
     ---------------------------------------------------------------------------*/ 
    // x = gc_us_dist_data, y = gc_us_prox_data 

    int correlation(int dist[], int prox[]){ 

     int xy[SAMPLES], xsquare[SAMPLES], ysquare[SAMPLES]; 
     int i, xsum, ysum, xysum, xsqr_sum, ysqr_sum; 
     float coeff[SAMPLES], num, deno; 

     xsum = ysum = xysum = xsqr_sum = ysqr_sum = 0; 

     /* find the needed data to manipulate correlation coeff */ 
     for (i = 0; i < SAMPLES; i++) 
     { 
      xy[i] = dist[i] * prox[i]; 
      xsquare[i] = dist[i] * dist[i]; 
      ysquare[i] = prox[i] * prox[i]; 
      xsum = xsum + dist[i]; 
      ysum = ysum + prox[i]; 
      xysum = xysum + xy[i]; 
      xsqr_sum = xsqr_sum + xsquare[i]; 
      ysqr_sum = ysqr_sum + ysquare[i]; 
     } 

     num = 1.0 * ((SAMPLES * xysum) - (xsum * ysum)); 
     deno = 1.0 * ((SAMPLES * xsqr_sum - xsum * xsum)* (SAMPLES * ysqr_sum - ysum * ysum)); 

     /* calculate correlation coefficient */ 
     for(int i=0; i < SAMPLES; i++) 
     { 
      coeff[i] = num/sqrt(deno); 
     } 

    } 

int main(void) 
{ 
int16_t buffer1[SAMPLES], dist[SAMPLES]; 
    int16_t buffer2[SAMPLES], prox[SAMPLES]; 
    memcpy(&buffer1, &gc_us_dist_data, sizeof buffer1); //copy all elements to buffer 
    memcpy(&buffer2, &gc_us_prox_data, sizeof buffer2); //copy all elements to buffer 
    const int N = 5; 
    int size1 = sizeof(buffer1)/ sizeof(buffer1[0]); 
    int size2 = sizeof(buffer2)/ sizeof(buffer2[0]); 
    slide_window_01(buffer1,N,size1); 
    slide_window_02(buffer2,N,size2); 

    correlation(dist, prox); 
} 
+1

あなたはどのような問題に直面していますか? – Rohan

+1

「コードは機能していません」ということを詳しく教えていただけますか? *どのように動作していないのですか?それは構築されませんか?それはクラッシュしますか?予期しない結果が出ますか? [良い質問をする方法を読む](http://stackoverflow.com/help/how-to-ask) –

+0

私は関数Correlation()の結果を得ることができません。各ブロック(x []とy [])のスライディングウィンドウを計算した後、相関関係の結果を受け取って欲しいです) –

答えて

0

slide_window_01slide_window_02関数呼び出しの後に表示されて何もしません。

関数が返されるとすぐに失われるローカル配列(たとえばint16_t dist[SAMPLES];)に値を入力するだけです。

関数内のローカル配列int16_t dist[SAMPLES];は、メインのdist[SAMPLES]とは関係ありません。つまり、関数の呼び出し時に、メインの変数がでなく、に変更されます。

これは、初期化されていない配列でcorrelationを呼び出すこと、つまり意味のない結果が得られないことを意味します(実際には未定義の動作があります)。

有効なインデックスがどちらかは何も返さない correlation 0 ... SAMPLES-1

関数であるとして、これは違法である

dist[SAMPLES] = buffer1[s]; 

を持っている機能で

。すべての結果はローカルに格納されるため、関数が返っても結果は失われます。

配列を変更する関数が必要な場合は、ポインタとして配列を渡すだけです。

簡単な例:

#include <stdio.h> 

void incrementArray(int* dst, int* src, int size) 
{ 
    int i; 
    for (i=0; i < size; ++i) 
    { 
     dst[i] = src[i] + 1; 
    } 
} 

int main(void) 
{ 
    int i; 
    int x[5] = {1, 2, 3, 4, 5}; 
    int result[5]; 

    // Print start values for x 
    for (i=0; i<5; ++i) 
    { 
     printf("%d ", x[i]); 
    } 
    printf("\n"); 

    // Call function 
    incrementArray(result, x, 5); 

    // Print result 
    for (i=0; i<5; ++i) 
    { 
     printf("%d ", result[i]); 
    } 
    printf("\n"); 

    return 0; 
} 

出力:

1 2 3 4 5 
2 3 4 5 6 
+0

私はslide_window_01とslide_window_02を使ってそれぞれから要素を取得し、これらの要素を2つの関数(slide_window_01、slide_window_01)から計算との相関関数にプッシュします。しかし、何も起こりません。 –

+0

私は 'slide_window_01'と' slide_window_02'でデータを取得し、それらを '相関'関数にプッシュして値を計算したいと思います。その後、結果を新しい配列に格納できます。しかし、機能は機能していないようです。 –

+0

@HuỳnhNgọcTân - 関数はローカル変数に書き込むだけでは機能しません。 – 4386427

関連する問題