예제 #1
0
파일: jpc_util.c 프로젝트: Adrien81/XCSoar
jas_seq_t *jpc_seq_conv(jas_seq_t *x, jas_seq_t *y)
{
	int i;
	int j;
	int k;
	jas_seq_t *z;
	jpc_fix_t s;
	jpc_fix_t v;

	z = jas_seq_create(jas_seq_start(x) + jas_seq_start(y),
	  jas_seq_end(x) + jas_seq_end(y) - 1);
	assert(z);
	for (i = jas_seq_start(z); i < jas_seq_end(z); i++) {
		s = jpc_inttofix(0);
		for (j = jas_seq_start(y); j < jas_seq_end(y); j++) {
			k = i - j;
			if (k < jas_seq_start(x) || k >= jas_seq_end(x)) {
				v = JPC_FIX_ZERO;
			} else {
				v = jas_seq_get(x, k);
			}
			s = jpc_fix_add(s, jpc_fix_mul(jas_seq_get(y, j), v));
		}
		*jas_seq_getref(z, i) = s;
	}

	return z;
}
예제 #2
0
파일: jpc_util.c 프로젝트: Adrien81/XCSoar
jas_seq_t *jpc_seq_upsample(jas_seq_t *x, int m)
{
	jas_seq_t *z;
	int i;

	if (!(z = jas_seq_create(jas_seq_start(x) * m, (jas_seq_end(x) - 1) * m + 1)))
		return 0;
	for (i = jas_seq_start(z); i < jas_seq_end(z); i++) {
		*jas_seq_getref(z, i) = (!JAS_MOD(i, m)) ? jas_seq_get(x, i / m) :
		  jpc_inttofix(0);
	}

	return z;
}
예제 #3
0
파일: jpc_tsfb.c 프로젝트: soho737/NGribCS
static int jpc_tsfbnode_getequivfilters(jpc_tsfbnode_t *tsfbnode, int cldind,
                                        int width, int height, jas_seq_t **hfilter, jas_seq_t **vfilter)
{
    jas_seq_t *hseq;
    jas_seq_t *vseq;
    jpc_tsfbnode_t *node;
    jas_seq2d_t *hfilters[JPC_QMFB1D_MAXCHANS];
    jas_seq2d_t *vfilters[JPC_QMFB1D_MAXCHANS];
    int numhchans;
    int numvchans;
    jas_seq_t *tmpseq;

    hseq = 0;
    vseq = 0;

    if (!(hseq = jas_seq_create(0, 1))) {
        goto error;
    }
    jas_seq_set(hseq, 0, jpc_inttofix(1));
    if (!(vseq = jas_seq_create(0, 1))) {
        goto error;
    }
    jas_seq_set(vseq, 0, jpc_inttofix(1));

    node = tsfbnode;
    while (node) {
        if (node->hqmfb) {
            numhchans = jpc_qmfb1d_getnumchans(node->hqmfb);
            if (jpc_qmfb1d_getsynfilters(node->hqmfb, width, hfilters)) {
                goto error;
            }
            if (!(tmpseq = jpc_seq_upsample(hseq, numhchans))) {
                goto error;
            }
            jas_seq_destroy(hseq);
            hseq = tmpseq;
            if (!(tmpseq = jpc_seq_conv(hseq, hfilters[bandnotohind(node, cldind)]))) {
                goto error;
            }
            jas_seq_destroy(hfilters[0]);
            jas_seq_destroy(hfilters[1]);
            jas_seq_destroy(hseq);
            hseq = tmpseq;
        }
        if (node->vqmfb) {
            numvchans = jpc_qmfb1d_getnumchans(node->vqmfb);
            if (jpc_qmfb1d_getsynfilters(node->vqmfb, height, vfilters)) {
                abort();
            }
            if (!(tmpseq = jpc_seq_upsample(vseq, numvchans))) {
                goto error;
            }
            jas_seq_destroy(vseq);
            vseq = tmpseq;
            if (!(tmpseq = jpc_seq_conv(vseq, vfilters[bandnotovind(node, cldind)]))) {
                goto error;
            }
            jas_seq_destroy(vfilters[0]);
            jas_seq_destroy(vfilters[1]);
            jas_seq_destroy(vseq);
            vseq = tmpseq;
        }
        if (node->parent) {
            cldind = jpc_tsfbnode_findchild(node->parent, node);
        }
        node = node->parent;
    }

    *hfilter = hseq;
    *vfilter = vseq;

    return 0;

error:
    if (hseq) {
        jas_seq_destroy(hseq);
    }
    if (vseq) {
        jas_seq_destroy(vseq);
    }
    return -1;

}