2011-07-14 11 views
1

数週間前から、私はこのcやその他のc関数をJava言語に変換しようとしていました(私はそれを初心者です)。 「IND」は、ポインタが「IND」になり、負の位置(例えば-220)を有している。例えばANSI CのJavaへのポインタ

q = fdata + ind; 
datend = fdata + buff_size; 

: 私の最初の問題は、のようなライン上ポインタ、Javaコードに変換する方法、ですpositionを "fdata"値の前に置くと、datend varでも同じことが起こります。

私は、ポインターがどこにあるのかを知るために各ポインターのためのインデックスvarを作成することによって、孤立した方法で解決できることを理解しました。私の本当の問題は、その後、「fdata」配列のフレームの終わりを越えて走り出そうとしていないときに、数行になります。

経験が豊富な身体は私を助けてくれますか? ありがとうございます。

static Stat *stat = NULL; 
static float *mem = NULL; 

static Stat* 
get_stationarity(fdata, freq, buff_size, nframes, frame_step, first_time) 
float *fdata; 
double freq; 
int buff_size, nframes, frame_step, first_time; 
{ 
    static int nframes_old = 0, memsize; 
    float preemp = 0.4f, stab = 30.0f; 
    float *p, *q, *r, *datend; 
    int ind, i, j, m, size, order, agap, w_type = 3; 

    agap = (int) (STAT_AINT * freq); 
    size = (int) (STAT_WSIZE * freq); 
    ind = (agap - size)/2; 

    if (nframes_old < nframes || !stat || first_time) { 
     /* move this to init_dp_f0() later */ 
     nframes_old = nframes; 
     if (stat) { 
      ckfree((char *) stat->stat); 
      ckfree((char *) stat->rms); 
      ckfree((char *) stat->rms_ratio); 
      ckfree((char *) stat); 
     } 
     if (mem) ckfree((void *) mem); 
     stat = (Stat *) ckalloc(sizeof (Stat)); 
     stat->stat = (float*) ckalloc(sizeof (float) *nframes); 
     stat->rms = (float*) ckalloc(sizeof (float) *nframes); 
     stat->rms_ratio = (float*) ckalloc(sizeof (float) *nframes); 
     memsize = (int) (STAT_WSIZE * freq) + (int) (STAT_AINT * freq); 
     mem = (float *) ckalloc(sizeof (float) * memsize); 
     for (j = 0; j < memsize; j++) mem[j] = 0; 
    } 

    if (nframes == 0) return (stat); 

    q = fdata + ind; 
    datend = fdata + buff_size; 

    if ((order = (int) (2.0 + (freq/1000.0))) > BIGSORD) { 
     fprintf(stderr, 
       "exceeds that allowable (%d); reduce Fs\n", BIGSORD); 
     order = BIGSORD; 
    } 

    /* prepare for the first frame */ 
    for (j = memsize/2, i = 0; j < memsize; j++, i++) mem[j] = fdata[i]; 

    /* do not run over end of frame */ 

    for (j = 0, p = q - agap; j < nframes; j++, p += frame_step, q += frame_step) { 
     if ((p >= fdata) && (q >= fdata) && (q + size <= datend)) 
      stat->stat[j] = get_similarity(order, size, p, q, 
       &(stat->rms[j]), 
       &(stat->rms_ratio[j]), preemp, 
       stab, w_type, 0); 
     else { 
      if (first_time) { 
       if ((p < fdata) && (q >= fdata) && (q + size <= datend)) 
        stat->stat[j] = get_similarity(order, size, NULL, q, 
         &(stat->rms[j]), 
         &(stat->rms_ratio[j]), 
         preemp, stab, w_type, 1); 
       else { 
        stat->rms[j] = 0.0; 
        stat->stat[j] = 0.01f * 0.2f; /* a big transition */ 
        stat->rms_ratio[j] = 1.0; /* no amplitude change */ 
       } 
      } else { 
       if ((p < fdata) && (q + size <= datend)) { 
        stat->stat[j] = get_similarity(order, size, mem, 
          mem + (memsize/2) + ind, 
          &(stat->rms[j]), 
          &(stat->rms_ratio[j]), 
          preemp, stab, w_type, 0); 
        /* prepare for the next frame_step if needed */ 
        if (p + frame_step < fdata) { 
         for (m = 0; m < (memsize - frame_step); m++) 
          mem[m] = mem[m + frame_step]; 
         r = q + size; 
         for (m = 0; m < frame_step; m++) 
          mem[memsize - frame_step + m] = *r++; 
        } 
       } 
      } 
     } 
    } 

    /* last frame, prepare for next call */ 
    for (j = (memsize/2) - 1, p = fdata + (nframes * frame_step) - 1; j >= 0 && p >= fdata; j--) 
     mem[j] = *p--; 
    return (stat); 
} 
+0

このポインタマジックを読むのは本当に難しいですが、あなたが持っているものをjavaに投稿し、どこに問題があるのか​​をよく書きます。 –

答えて

2

このコードは移植されたものよりも簡単に書き換えられます。その理由は、多数のポインタ算術とキャストを使用しているからです。

このコードでは、スライディングウィンドウと平均化関数をデータに組み合わせているようです。 Javaで簡単に行うことができます。各時系列を配列に配置し、ポインタの代わりにインデックスを使用して配列のエントリをポイントします。 Cコードがポインタを使用し、次に第2のポインタとして(おそらく負の)オフセットを使用する場合、ちょうど2つのインデックスを時系列配列に使用します。

このコードが計算してjavaに変換するはずの数式(数式表記、スライドウィンドウプラス平均化機能)を持っている場合は、これを行う方が簡単です。

+0

ありがとうございます。 はい、実際には、プロセスを定義する式があります。 問題は、Javaで「私は初心者です」ということです。私はこのすべてのポインタをJava配列に変換する方法に疑問を抱いています。 あなたの説明で私はできると思います。 – user844178

+0

これは良いことです。 Java配列で式を表現する際に問題が発生した場合は、教えてください。 –

関連する問題