void ref_corr_d(vsip_bias bias, vsip_support_region sup, vsip_vview_d const *ref, vsip_vview_d const *in, vsip_vview_d const *out) { vsip_length M = vsip_vgetlength_d(ref); vsip_length N = vsip_vgetlength_d(in); vsip_length P = vsip_vgetlength_d(out); vsip_length expected_P = ref_corr_output_size(sup, M, N); vsip_stride shift = ref_expected_shift(sup, M); assert(expected_P == P); vsip_vview_d *sub = vsip_vcreate_d(M, VSIP_MEM_NONE); // compute correlation vsip_index i; for (i=0; i<P; ++i) { vsip_vfill_d(0, sub); vsip_stride pos = (vsip_stride)i + shift; double scale; if (pos < 0) { vsip_vview_d *subsub = vsip_vsubview_d(sub, -pos, M + pos); vsip_vview_d *insub = vsip_vsubview_d(in, 0, M + pos); vsip_vcopy_d_d(insub, subsub); vsip_vdestroy_d(subsub); vsip_vdestroy_d(insub); scale = M + pos; } else if (pos + M > N) { vsip_vview_d *subsub = vsip_vsubview_d(sub, 0, N - pos); vsip_vview_d *insub = vsip_vsubview_d(in, pos, N - pos); vsip_vcopy_d_d(insub, subsub); vsip_vdestroy_d(subsub); vsip_vdestroy_d(insub); scale = N - pos; } else { vsip_vview_d *insub = vsip_vsubview_d(in, pos, M); vsip_vcopy_d_d(insub, sub); vsip_vdestroy_d(insub); scale = M; } #if VSIP_IMPL_CORR_CORRECT_SAME_SUPPORT_SCALING #else if (sup == VSIP_SUPPORT_SAME) { if (i < (M/2)) scale = i + (M+1)/2; // i + ceil(M/2) else if (i < N - (M/2)) scale = M; // M else scale = N - 1 + (M+1)/2 - i; // N-1+ceil(M/2)-i } #endif double val = vsip_vdot_d(ref, sub); if (bias == VSIP_UNBIASED) val /= scale; vsip_vput_d(out, i, val); } }
int vsip_firflt_d( vsip_fir_d *fir, const vsip_vview_d *xc, const vsip_vview_d *yc) { vsip_length nout,k; vsip_vview_d xx = *xc, yy = *yc; vsip_vview_d H1 = *(fir->h), H2 = *(fir->h); vsip_vview_d *x=&xx,*y=&yy; vsip_vview_d *h1=&H1,*h2=&H2; vsip_offset oinc; oinc = (vsip_offset)((vsip_stride)fir->D * x->stride); /* calculate number of terms in y */ nout = (fir->N - fir->p); nout = ((nout % fir->D) == 0) ? (nout / fir->D ) : (nout / fir->D + 1); /* do overlap section */ k = 0; x->length = fir->p + 1; h1->length = fir->s->length; h2->length = x->length; h2->offset = h1->length; while(x->length < fir->M){ VI_VPUT_D(y,k++,vsip_vdot_d(h1,fir->s)+vsip_vdot_d(h2,x)); x->length += fir->D; fir->s->length -= fir->D; fir->s->offset += fir->D; h1->length = fir->s->length; h2->length = x->length; h2->offset = h1->length; } x->offset += (x->length - fir->M) * x->stride; x->length = fir->M; while(k < nout){ /* do the rest of the pieces */ VI_VPUT_D(y,k++,vsip_vdot_d(fir->h,x)); x->offset += oinc; } { /* Hacked Mod because In ANSI C it is a machine dependent mod for negative */ vsip_stride temp_p = (fir->p % fir->D) - (fir->N % fir->D); fir->p = ((temp_p < 0) ? (vsip_length)((vsip_stride)fir->D + temp_p) : (vsip_length)temp_p); } fir->s->offset = 0; fir->s->length = (fir->state == VSIP_STATE_SAVE) ? fir->M - 1 - fir->p : fir->M -1; x->length = fir->s->length; /* fix by JMA 31/01/2000, incorrect offset calculation */ /* x->offset = xc->length - fir->s->length; */ x->offset = xc->offset + (xc->length - fir->s->length) * xc->stride; if((fir->s->length > 0) && (fir->state == VSIP_STATE_SAVE)) VI_vcopy_d_d(x,fir->s); if(fir->state == VSIP_STATE_NO_SAVE){ VI_vfill_d(0,fir->s); fir->p = 0; } return (int)k; }