int main(){vsip_init((void*)0); { void VU_vfprintyg_d(char*,vsip_vview_d*,char*); void VU_vfreqswapIP_d(vsip_vview_d*); vsip_vview_d* Cw = vsip_vcreate_cheby_d(Nlength,ripple,0); vsip_fft_d *fft = vsip_ccfftip_create_d(Nlength,1.0,VSIP_FFT_FWD,0,0); vsip_cvview_d* FCW = vsip_cvcreate_d(Nlength,0); /*printf("CW = "); VU_vprintm_d("%6.8f ;\n",Cw); */ VU_vfprintyg_d("%6.8f\n",Cw,"Cheby_Window"); vsip_cvfill_d(vsip_cmplx_d(0,0),FCW); { vsip_vview_d *rv = vsip_vrealview_d(FCW); vsip_vcopy_d_d(Cw,rv); vsip_ccfftip_d(fft,FCW); vsip_vcmagsq_d(FCW,rv); { vsip_index ind; vsip_scalar_d max = vsip_vmaxval_d(rv,&ind); vsip_scalar_d min = max/(10e12); vsip_vclip_d(rv,min,max,min,max,rv); } vsip_vlog10_d(rv,rv); vsip_svmul_d(10,rv,rv); VU_vfreqswapIP_d(rv); VU_vfprintyg_d("%6.8f\n",rv,"Cheby_Window_Frequency_Response"); vsip_vdestroy_d(rv); } vsip_fft_destroy_d(fft); vsip_valldestroy_d(Cw); vsip_cvalldestroy_d(FCW); } vsip_finalize((void*)0); return 0; }
static vsip_cmview_d* VU_cI_d(vsip_length M) { vsip_cmview_d *I = vsip_cmcreate_d(M,M,VSIP_ROW,VSIP_MEM_NONE); if(I != NULL){ vsip_cvview_d *row = vsip_cmrowview_d(I,0); if(row != NULL){ vsip_cvputlength_d(row,(vsip_length)(M * M)); vsip_cvfill_d(vsip_cmplx_d(0.0,0.0),row); vsip_cvputlength_d(row,M); vsip_cvputstride_d(row,(vsip_stride) (M + 1)); vsip_cvfill_d(vsip_cmplx_d(1.0,0.0),row); vsip_cvdestroy_d(row); } else { vsip_cmdestroy_d(I); return (vsip_cmview_d*) NULL; } } else { return (vsip_cmview_d*) NULL; } return I; }
void test_ccorr_d(vsip_support_region support, vsip_bias bias, vsip_length ref_size, vsip_length input_size) { vsip_length const n_loop = 3; vsip_length const output_size = ref_corr_output_size(support, ref_size, input_size); vsip_ccorr1d_d *corr = vsip_ccorr1d_create_d(ref_size, input_size, support, 0, VSIP_ALG_SPACE); vsip_ccorr1d_attr attr; vsip_ccorr1d_getattr_d(corr, &attr); test_assert(attr.support == support); test_assert(attr.ref_len == ref_size); test_assert(attr.data_len == input_size); test_assert(attr.lag_len == output_size); vsip_randstate *rand = vsip_randcreate(0, 1, 1, VSIP_PRNG); vsip_cvview_d *ref = vsip_cvcreate_d(ref_size, VSIP_MEM_NONE); vsip_cvview_d *in = vsip_cvcreate_d(input_size, VSIP_MEM_NONE); vsip_cvview_d *out = vsip_cvcreate_d(output_size, VSIP_MEM_NONE); vsip_cvfill_d(vsip_cmplx_d(100,0), out); vsip_cvview_d *chk = vsip_cvcreate_d(output_size, VSIP_MEM_NONE); vsip_cvfill_d(vsip_cmplx_d(101,0), chk); vsip_index loop; for (loop=0; loop<n_loop; ++loop) { if (loop == 0) { vsip_cvfill_d(vsip_cmplx_d(1,0), ref); vsip_cvramp_d(vsip_cmplx_d(0,0), vsip_cmplx_d(1,0), in); } else if (loop == 1) { vsip_cvrandu_d(rand, ref); vsip_cvramp_d(vsip_cmplx_d(0,0), vsip_cmplx_d(1,0), in); } else { vsip_cvrandu_d(rand, ref); vsip_cvrandu_d(rand, in); } vsip_ccorrelate1d_d(corr, bias, ref, in, out); ref_ccorr_d(bias, support, ref, in, chk); double error = cverror_db_d(out, chk); #if VERBOSE if (error > -100) { vsip_index i; for (i=0; i<output_size; ++i) { vsip_cscalar_d out_value = vsip_cvget_d(out, i); vsip_cscalar_d chk_value = vsip_cvget_d(chk, i); printf("%d : out = (%f, %f), chk = (%f, %f)\n", i, out_value.r, out_value.i, chk_value.r, chk_value.i); } printf("error = %f\n", error); } #endif test_assert(error < -100); } }
void ref_ccorr_d(vsip_bias bias, vsip_support_region sup, vsip_cvview_d const *ref, vsip_cvview_d const *in, vsip_cvview_d const *out) { vsip_length M = vsip_cvgetlength_d(ref); vsip_length N = vsip_cvgetlength_d(in); vsip_length P = vsip_cvgetlength_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_cvview_d *sub = vsip_cvcreate_d(M, VSIP_MEM_NONE); // compute correlation vsip_index i; for (i=0; i<P; ++i) { vsip_cvfill_d(vsip_cmplx_d(0,0), sub); vsip_stride pos = (vsip_stride)i + shift; double scale; if (pos < 0) { vsip_cvview_d *subsub = vsip_cvsubview_d(sub, -pos, M + pos); vsip_cvview_d *insub = vsip_cvsubview_d(in, 0, M + pos); vsip_cvcopy_d_d(insub, subsub); vsip_cvdestroy_d(subsub); vsip_cvdestroy_d(insub); scale = M + pos; } else if (pos + M > N) { vsip_cvview_d *subsub = vsip_cvsubview_d(sub, 0, N - pos); vsip_cvview_d *insub = vsip_cvsubview_d(in, pos, N - pos); vsip_cvcopy_d_d(insub, subsub); vsip_cvdestroy_d(subsub); vsip_cvdestroy_d(insub); scale = N - pos; } else { vsip_cvview_d *insub = vsip_cvsubview_d(in, pos, M); vsip_cvcopy_d_d(insub, sub); vsip_cvdestroy_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 vsip_cscalar_d val = vsip_cvjdot_d(ref, sub); if (bias == VSIP_UNBIASED) { val.r /= scale; val.i /= scale; } vsip_cvput_d(out, i, val); } }