示例#1
0
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);
  }
}
示例#2
0
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;
}