int vsip_cfirflt_d( vsip_cfir_d *fir, const vsip_cvview_d *xc, const vsip_cvview_d *yc) { vsip_length nout,k; vsip_cvview_d xx = *(xc), yy = *(yc); vsip_cvview_d H1 = *(fir->h), H2 = *(fir->h); vsip_cvview_d *x=&xx,*y=&yy; vsip_cvview_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){ vsip_cscalar_d a = vsip_cvdot_d(h1,fir->s); vsip_cscalar_d b = vsip_cvdot_d(h2,x); vsip_cvput_d(y,k++,vsip_cmplx_d(a.r + b.r,a.i + b.i)); 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 */ vsip_cvput_d(y,k++,vsip_cvdot_d(fir->h,x)); x->offset += oinc; } { 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_cvcopy_d_d(x,fir->s); if(fir->state == VSIP_STATE_NO_SAVE) { VI_cvfill_d(vsip_cmplx_d((vsip_scalar_d)0,(vsip_scalar_d)0),fir->s); fir->p = 0; } return k; }
void vsip_ccorrelate1d_d( const vsip_ccorr1d_d *cor, vsip_bias bias, const vsip_cvview_d *h, const vsip_cvview_d *x, const vsip_cvview_d *y) { vsip_cvview_d xx = *cor->x, hh = *cor->h; vsip_cvview_d *xt = &xx, *ht = &hh; xt->length = cor->x->length - x->length; VI_cvfill_d(vsip_cmplx_d((vsip_scalar_d)0,(vsip_scalar_d)0),xt); xt->offset = xt->length; xt->length = x->length; VI_cvcopy_d_d(x,xt); xt->length = cor->x->length; xt->offset = 0; ht->length = cor->h->length - h->length; ht->offset = h->length; VI_cvfill_d(vsip_cmplx_d((vsip_scalar_d)0,(vsip_scalar_d)0),ht); ht->offset = 0; ht->length = h->length; VI_cvcopy_d_d(h,ht); vsip_ccfftip_d(cor->fft,cor->h); vsip_ccfftip_d(cor->fft,cor->x); vsip_cvjmul_d(cor->x,cor->h,cor->x); vsip_cvconj_d(cor->x,cor->x); vsip_rscvmul_d(1/(vsip_scalar_d)cor->N,cor->x,cor->x); vsip_ccfftip_d(cor->fft,cor->x); /* vsip_cvconj_d(cor->x,cor->x); */ switch(cor->support){ case VSIP_SUPPORT_FULL: xt->offset = xt->length - cor->mn; xt->length = y->length; if(bias == VSIP_UNBIASED){ VI_cvunbiasfull_d(cor,xt,y); } else { VI_cvcopy_d_d(xt,y); } break; case VSIP_SUPPORT_SAME: xt->offset = xt->length - cor->mn + (cor->m-1)/2; xt->length = y->length; if(bias == VSIP_UNBIASED){ VI_cvunbiassame_d(cor,xt,y); } else { VI_cvcopy_d_d(xt,y); } break; case VSIP_SUPPORT_MIN: xt->offset = xt->length - cor->mn + cor->m - 1; xt->length = y->length; if(bias == VSIP_UNBIASED){ vsip_rscvmul_d(1.0/(vsip_scalar_d)cor->m,xt,y); } else { VI_cvcopy_d_d(xt,y); } break; } return; }
vsip_cfir_d *vsip_cfir_create_d( const vsip_cvview_d *kernel, vsip_symmetry symm, vsip_length N, vsip_length D, vsip_obj_state state, unsigned int ntimes, vsip_alg_hint hint) { vsip_length klength = 0; vsip_cfir_d *fir = (vsip_cfir_d*)malloc(sizeof(vsip_cfir_d)); if(fir == NULL){ return (vsip_cfir_d*) NULL; } else { switch(symm){ case 0: klength = kernel->length; break; case 1: klength = 2 * kernel->length - 1; break; case 2: klength = 2 * kernel->length; break; } fir->h = vsip_cvcreate_d(klength,VSIP_MEM_NONE); fir->s = vsip_cvcreate_d(klength-1,VSIP_MEM_NONE); } if((fir->h == NULL) | (fir->s == NULL)){ vsip_cfir_destroy_d(fir); return (vsip_cfir_d*) NULL; } else { fir->N = N; fir->M = klength; fir->D = D; fir->p = 0; fir->ntimes = ntimes; fir->symm = symm; fir->hint = hint; switch(symm){ case 0:{ fir->h->offset = fir->h->length - 1; fir->h->stride = -1; VI_cvcopy_d_d(kernel,fir->h); } break; case 1: { fir->h->length = kernel->length; vsip_cvconj_d(kernel,fir->h); fir->h->offset = klength - 1; fir->h->stride = -1; VI_cvcopy_d_d(kernel,fir->h); fir->h->length = klength; } break; case 2: { fir->h->length = kernel->length; vsip_cvconj_d(kernel,fir->h); fir->h->offset = klength - 1; fir->h->stride = -1; VI_cvcopy_d_d(kernel,fir->h); fir->h->length = klength; } break; } fir->state = state; fir->h->offset = 0; fir->h->stride = 1; VI_cvfill_d(vsip_cmplx_d((vsip_scalar_d)0,(vsip_scalar_d)0),fir->s); return fir; } }