ANSI C указывает на Java - PullRequest
1 голос
/ 14 июля 2011

С тех пор, как несколько недель назад я пытался преобразовать эту функцию c и другие c в язык Java (я новичок в этом).Моя первая проблема заключается в том, как конвертировать в код Java, указатели на строки, такие как:

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

Например, когда "ind" имеет отрицательную позицию (например, -220), указатель будет на "ind"Позиция перед значениями" fdata ", то же самое происходит и с датой 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);
}

1 Ответ

2 голосов
/ 14 июля 2011

Этот код легче переписать, чем перенести. Причина в том, что он использует большое количество указателей-арифметик и приведений.

Мне кажется, что этот код объединяет скользящее окно и функции усреднения по данным. Вы можете легко сделать это в Java, просто поместив каждый временной ряд в массив, используя индекс (вместо указателя), чтобы указывать на элементы массива. В случае, когда C-код использует указатель, а затем (возможно, отрицательное) смещение в качестве второго указателя, просто используйте два индекса в массиве временных рядов.

Это проще сделать, если у вас есть формула (математическая запись. Скользящее окно плюс функции усреднения), которую этот код должен вычислять и преобразовывать формулу в java.

...