/*------------------------------page_push----------------------------------*/ long page_push (PFUNC_VAR) { static int hTest = ID_NULL; switch (message) { case YOPEN: hTest = *((int*)YGet("wlong1")); case YDRAW: YDrawRectF (0,0,WND->w,WND->h, YColor("lime") ); YBeginGroup ("PUSH", 30,40, 120,90, YColor("white")); YWnd (Ph(), PUSH, "Push1", 30,20, 65,20, 0,0,0,0, YColor("red")); YWnd (Ph(), PUSH, "Push2", 30,50, 65,20, 0,0,0,0, YColor("gray")); YEndGroup (); break; case YCLOSE: YWndClean (id); break; default: YSend (hTest, message, mes1,mes2,mes3,mes4); } RETURN_TRUE; }
static void add_format_to_parser(Char *c, int len, int ivnr, Char mode, int tabbing, int pmode, int prec, int shortop) { int i,j,n=1,llp; char *str=NULL; Char *tmp; j=0; for (i=0;i<len;i++) if (IsPh(c[i])) n++; n=n*2; tmp = (Char*) malloc(n*sizeof(Char)); tex_set_string(&str); if (tabbing) out_latex_char(TabOpen); out_latex_char(mode); llp=tex_current_pos(); if (shortop) tex_code(SOpOpen); n=0; for (i=0; i<len; i++) { if (IsPh(c[i])) { switch (Ph(c[i])) { case MP_Expr: tex_code(ExprOpen); break; case MP_Op: tex_code(LOpOpen); break; case MP_Id: tex_code(SIdOpen); break; case MP_Var: tex_code(VarOpen); break; case MP_Text: tex_code(TextOpen); break; default: break; } out_latex_char(' '); j=tex_current_pos()-1; if (j!=llp && str[j]==' ') { str[j]='\0'; if (aig(tmp[n]=lex_add_string(str+llp, 0))) n++; str[j]=' '; } llp=j+1; switch (Ph(c[i])) { case MP_Expr: tex_code(ExprClose); break; case MP_Op: tex_code(LOpClose); break; case MP_Id: tex_code(SIdClose); break; case MP_Var: tex_code(VarClose); break; case MP_Text: tex_code(TextClose); break; default: break; } tmp[n++]=c[i]; } out_latex_char(c[i]); } if (shortop) tex_code(SOpClose); if (llp!=tex_current_pos()) tmp[n++]=lex_add_string(str+llp,0); tmp[n]=0; tex_unset(); if (!str) free(tmp); else if (!parse_add_rule(pmode, tmp, n, ivnr, prec)) free(tmp); }
Operator &ParNonlinearForm::GetGradient(const Vector &x) const { ParFiniteElementSpace *pfes = ParFESpace(); pGrad.Clear(); NonlinearForm::GetGradient(x); // (re)assemble Grad, no b.c. OperatorHandle dA(pGrad.Type()), Ph(pGrad.Type()); if (fnfi.Size() == 0) { dA.MakeSquareBlockDiag(pfes->GetComm(), pfes->GlobalVSize(), pfes->GetDofOffsets(), Grad); } else { MFEM_ABORT("TODO: assemble contributions from shared face terms"); } // TODO - construct Dof_TrueDof_Matrix directly in the pGrad format Ph.ConvertFrom(pfes->Dof_TrueDof_Matrix()); pGrad.MakePtAP(dA, Ph); // Impose b.c. on pGrad OperatorHandle pGrad_e; pGrad_e.EliminateRowsCols(pGrad, ess_tdof_list); return *pGrad.Ptr(); }
/*------------------------------page2_proc----------------------------------*/ long page2_proc (PFUNC_VAR) { static int hEdit1, hEdit2, hCheck1, hCheck2; static int hList1, hList2, hDec1, hDec2; static int hTest = ID_NULL; static char *list1[]= { "string_01", "string_02", "string_03", "string_04", "string_05", "string_06", "string_07", "string_08", "string_09", "string_10", "string_11", "string_12", NULL}; static char *list2[]={ "listitem1", "listitem2", "listitem3", "listitem4", "listitem5", "listitem6", "listitem7", "listitem8", "listitem9", NULL}; switch (message) { case YOPEN: hTest = *((int*)YGet("wlong1")); case YDRAW: YDrawRectF (0,0,WND->w,WND->h, YColor("teal")); YBeginGroup ("LIST", 30,40, 240,110, YColor("navy")); YWnd (&hList1, LIST, NULL, 15,20, 100,70, (long)list1, 3,0,0, YColor("yellow")); YWnd (&hList2, LIST, NULL, 125,20, 100,70, (long)list2, 2,0,0, YColor("lime")); YEndGroup (); YBeginGroup ("CHECK", 300,40, 130,110, YColor("fuchsia")); YWndGroupBegin (); YWnd (&hCheck1, CHECK, "Check1", 25,10, 20,20, TRUE,0,0,0, YColor("white")); YWnd (&hCheck2, CHECK, "Check2", 25,40, 20,20, FALSE,0,0,0, YColor("white")); YWndGroupEnd (); YWnd (Ph(), CHECK, "Check3", 25,75, 20,20, FALSE,0,0,0, CLR_DEF); YEndGroup (); YBeginGroup ("EDIT", 60,195, 170,70, YColor("fuchsia")); YWnd (&hEdit1, EDIT, "Edit1 ", 65,10, 90,20, (long)"string1",0,0,0, YColor("white")); YWnd (&hEdit2, EDIT, "Edit2 ", 65,40, 90,20, (long)"string2",0,0,0, YColor("white")); YEndGroup (); YBeginGroup ("DECIMAL", 300,195, 130,70, YColor("fuchsia")); YWnd (&hDec1, DECIMAL, "Dec1 ", 60,10, 40,20, 4,0,10,0, YColor("white")); YWnd (&hDec2, DECIMAL, "Dec2 ", 60,40, 40,20, 2,0,15,0, YColor("white")); YEndGroup (); break; case YCLOSE: YWndClean (id); break; default: YSend (hTest, message, mes1,mes2,mes3,mes4); } RETURN_TRUE; }
/*-----------------------------dial_proc-------------------------------------*/ long dial_proc (PFUNC_VAR) { switch (message) { case YOPEN: case YDRAW: YPaintRectFB (0, 0, WND->w, WND->h, YColor("lime"), YColor("black")); test_picture (); YWnd (Ph(), push_proc, "O'Key", 90, 160, 80,30, 0,0,0,0, YColor("yellow")); break; case MYPUSH_UP: YDlgEnd (0); break; case YLMOUSEDOWN: printf ("dial_proc_YLMOUSEDOWN: %d %d \n", mes1, mes2); break; case YCLOSE: YWndClean (id); break; default: ;;;; } RETURN_TRUE; }
AFComplexVector<fftw_complex, double>& AFComplexVector<fftw_complex, double>::ToPolar() { assert(!m_bIsPolar); /* * It overwrites the input vector U with its own polar * complex coordinates. * Here the fftwf_complex type is reinterpretated from Re,Im, to Mag,Phase */ fftw_complex cpxTmp; for(AFSampleCount i = 1; i < (m_smpcLength-1); i++) { Mag(cpxTmp) = Magnitude(m_pcpxUf[i]); Ph(cpxTmp) = -Phase(m_pcpxUf[i]); Mag(m_pcpxUf[i]) = Mag(cpxTmp); Ph(m_pcpxUf[i]) = Ph(cpxTmp); } m_bIsPolar = true; return *this; }
/*------------------------------dial2_proc--------------------------------*/ long dial2_proc (PFUNC_VAR) { static int hExit, hTest = ID_NULL; static YT_BOOK pages[] = { {"MORE", impr_proc, LP(hTest)}, {"Page_1", page1_proc, LP(hTest)}, {"Page_2", page2_proc, LP(hTest)}, {"Page_3", page3_proc, LP(hTest)}, {"Page_4", page4_proc, LP(hTest)}, {"", NULL, 0} }; enum local_keys { DRAW_MESS = YKEY_LOCALS }; switch (message) { case YOPEN: case YDRAW: YDrawRectF (0,0, WND->w,WND->h, YColor("yellow")); YBeginGroup ("MESSAGES", 30,375, 420,55, YColor("")); YWnd (&hTest, TESTMSG, "", 15,15, 385,30, 0,0,0,0, CLR_DEF); /* YWnd (&hTest, testmsg_proc, "", 15,15, 385,30, 0,0,0,0, CLR_DEF); */ YEndGroup (); YWnd (&hExit, PUSH, "Exit", 455,380, 65,40, 0,0,0,0, YColor("lime")); YWnd (Ph(), BOOK, "", 30,20, WND->w-60,340, (long)pages,75,30,YUP, CLR_DEF); break; case YCLOSE: YWndClean (id); break; case YPUSH: if (mes1 == hExit) exit(0); default: return (YSend (hTest, message, mes1,mes2,mes3,mes4)); } RETURN_TRUE; }
/*------------------------------page_clock----------------------------------*/ long page_clock (PFUNC_VAR) { static int hTest = ID_NULL; switch (message) { case YOPEN: hTest = *((int*)YGet("wlong1")); case YDRAW: YDrawRectF (0,0,WND->w,WND->h, YColor("lime") ); YWnd (Ph(), CLOCK, "This is Clock", 30,30, WND->w-60,WND->h-60, 0,0,0,0, YColor("green")); break; case YCLOSE: YWndClean (id); break; default: YSend (hTest, message, mes1,mes2,mes3,mes4); } RETURN_TRUE; }
AFComplexVector<fftwf_complex, float>& AFComplexVector<fftwf_complex, float>::ToRectangular() { assert(m_bIsPolar); /* * It overwrites the complex 'polar' input vector U with its own rectangular * complex coordinates. * Here the fftwf_complex type is reinterpretated from Re,Im, to Mag,Phase */ // Devo verificare se la fase della componente DC o Fnyq è pi greca, // o multiplo intero se la fase non è un multiplo intero di 2pi allora // la assumo negativa. //a freq. zero ho solo componente reale Im(m_pcpxUf[0]) = 0.0; if( (fmodf(Ph(m_pcpxUf[0]), M_PI) > 1.0) && (fmodf(Ph(m_pcpxUf[0]), M_PI) < 3.0) ) Re(m_pcpxUf[0]) = -Mag(m_pcpxUf[0]); //cioe' se il resto e' non zero, else Re(m_pcpxUf[0]) = Mag(m_pcpxUf[0]); //alla freq. di Nyquist, ho solo valore reale, la Fnyq e' il secondo elemento di h e l'ultimo di hpm Im(m_pcpxUf[m_smpcLength-1]) = 0.0; if( (fmodf(Ph(m_pcpxUf[m_smpcLength-1]), M_PI) > 1.0) && (fmodf(Ph(m_pcpxUf[m_smpcLength-1]), M_PI) < 3.0) ) Re(m_pcpxUf[m_smpcLength-1]) = -Mag(m_pcpxUf[m_smpcLength-1]); //cioe' se il resto non e' zero, else Re(m_pcpxUf[m_smpcLength-1]) = Mag(m_pcpxUf[m_smpcLength-1]); fftwf_complex cpxTmp; for(AFSampleCount i = 1; i < (m_smpcLength-1); i++) // altre frequenze, conto fino ad L2 { Re(cpxTmp) = Mag(m_pcpxUf[i]) * cosf(Ph(m_pcpxUf[i])); Im(cpxTmp) = Mag(m_pcpxUf[i]) * sinf(Ph(m_pcpxUf[i])); Re(m_pcpxUf[i]) = Re(cpxTmp); Im(m_pcpxUf[i]) = Im(cpxTmp); } m_bIsPolar = false; return *this; }
BlockOperator & ParBlockNonlinearForm::GetGradient(const Vector &x) const { if (pBlockGrad == NULL) { pBlockGrad = new BlockOperator(block_trueOffsets); } Array<const ParFiniteElementSpace *> pfes(fes.Size()); for (int s1=0; s1<fes.Size(); ++s1) { pfes[s1] = ParFESpace(s1); for (int s2=0; s2<fes.Size(); ++s2) { phBlockGrad(s1,s2)->Clear(); } } GetLocalGradient(x); // gradients are stored in 'Grads' if (fnfi.Size() > 0) { MFEM_ABORT("TODO: assemble contributions from shared face terms"); } for (int s1=0; s1<fes.Size(); ++s1) { for (int s2=0; s2<fes.Size(); ++s2) { OperatorHandle dA(phBlockGrad(s1,s2)->Type()), Ph(phBlockGrad(s1,s2)->Type()), Rh(phBlockGrad(s1,s2)->Type()); if (s1 == s2) { dA.MakeSquareBlockDiag(pfes[s1]->GetComm(), pfes[s1]->GlobalVSize(), pfes[s1]->GetDofOffsets(), Grads(s1,s1)); Ph.ConvertFrom(pfes[s1]->Dof_TrueDof_Matrix()); phBlockGrad(s1,s1)->MakePtAP(dA, Ph); } else { dA.MakeRectangularBlockDiag(pfes[s1]->GetComm(), pfes[s1]->GlobalVSize(), pfes[s2]->GlobalVSize(), pfes[s1]->GetDofOffsets(), pfes[s2]->GetDofOffsets(), Grads(s1,s2)); Rh.ConvertFrom(pfes[s1]->Dof_TrueDof_Matrix()); Ph.ConvertFrom(pfes[s2]->Dof_TrueDof_Matrix()); phBlockGrad(s1,s2)->MakeRAP(Rh, dA, Ph); } pBlockGrad->SetBlock(s1, s2, phBlockGrad(s1,s2)->Ptr()); } } return *pBlockGrad; }
void BKE_init_ocean(struct Ocean *o, int M, int N, float Lx, float Lz, float V, float l, float A, float w, float damp, float alignment, float depth, float time, short do_height_field, short do_chop, short do_normals, short do_jacobian, int seed) { int i, j, ii; BLI_rw_mutex_lock(&o->oceanmutex, THREAD_LOCK_WRITE); o->_M = M; o->_N = N; o->_V = V; o->_l = l; o->_A = A; o->_w = w; o->_damp_reflections = 1.0f - damp; o->_wind_alignment = alignment; o->_depth = depth; o->_Lx = Lx; o->_Lz = Lz; o->_wx = cos(w); o->_wz = -sin(w); /* wave direction */ o->_L = V * V / GRAVITY; /* largest wave for a given velocity V */ o->time = time; o->_do_disp_y = do_height_field; o->_do_normals = do_normals; o->_do_chop = do_chop; o->_do_jacobian = do_jacobian; o->_k = (float *) MEM_mallocN(M * (1 + N / 2) * sizeof(float), "ocean_k"); o->_h0 = (fftw_complex *) MEM_mallocN(M * N * sizeof(fftw_complex), "ocean_h0"); o->_h0_minus = (fftw_complex *) MEM_mallocN(M * N * sizeof(fftw_complex), "ocean_h0_minus"); o->_kx = (float *) MEM_mallocN(o->_M * sizeof(float), "ocean_kx"); o->_kz = (float *) MEM_mallocN(o->_N * sizeof(float), "ocean_kz"); /* make this robust in the face of erroneous usage */ if (o->_Lx == 0.0f) o->_Lx = 0.001f; if (o->_Lz == 0.0f) o->_Lz = 0.001f; /* the +ve components and DC */ for (i = 0; i <= o->_M / 2; ++i) o->_kx[i] = 2.0f * (float)M_PI * i / o->_Lx; /* the -ve components */ for (i = o->_M - 1, ii = 0; i > o->_M / 2; --i, ++ii) o->_kx[i] = -2.0f * (float)M_PI * ii / o->_Lx; /* the +ve components and DC */ for (i = 0; i <= o->_N / 2; ++i) o->_kz[i] = 2.0f * (float)M_PI * i / o->_Lz; /* the -ve components */ for (i = o->_N - 1, ii = 0; i > o->_N / 2; --i, ++ii) o->_kz[i] = -2.0f * (float)M_PI * ii / o->_Lz; /* pre-calculate the k matrix */ for (i = 0; i < o->_M; ++i) for (j = 0; j <= o->_N / 2; ++j) o->_k[i * (1 + o->_N / 2) + j] = sqrt(o->_kx[i] * o->_kx[i] + o->_kz[j] * o->_kz[j]); /*srand(seed);*/ BLI_srand(seed); for (i = 0; i < o->_M; ++i) { for (j = 0; j < o->_N; ++j) { float r1 = gaussRand(); float r2 = gaussRand(); fftw_complex r1r2; init_complex(r1r2, r1, r2); mul_complex_f(o->_h0[i * o->_N + j], r1r2, (float)(sqrt(Ph(o, o->_kx[i], o->_kz[j]) / 2.0f))); mul_complex_f(o->_h0_minus[i * o->_N + j], r1r2, (float)(sqrt(Ph(o, -o->_kx[i], -o->_kz[j]) / 2.0f))); } } o->_fft_in = (fftw_complex *)MEM_mallocN(o->_M * (1 + o->_N / 2) * sizeof(fftw_complex), "ocean_fft_in"); o->_htilda = (fftw_complex *)MEM_mallocN(o->_M * (1 + o->_N / 2) * sizeof(fftw_complex), "ocean_htilda"); if (o->_do_disp_y) { o->_disp_y = (double *)MEM_mallocN(o->_M * o->_N * sizeof(double), "ocean_disp_y"); o->_disp_y_plan = fftw_plan_dft_c2r_2d(o->_M, o->_N, o->_fft_in, o->_disp_y, FFTW_ESTIMATE); } if (o->_do_normals) { o->_fft_in_nx = (fftw_complex *) MEM_mallocN(o->_M * (1 + o->_N / 2) * sizeof(fftw_complex), "ocean_fft_in_nx"); o->_fft_in_nz = (fftw_complex *) MEM_mallocN(o->_M * (1 + o->_N / 2) * sizeof(fftw_complex), "ocean_fft_in_nz"); o->_N_x = (double *)MEM_mallocN(o->_M * o->_N * sizeof(double), "ocean_N_x"); /* o->_N_y = (float *) fftwf_malloc(o->_M * o->_N * sizeof(float)); (MEM01) */ o->_N_z = (double *)MEM_mallocN(o->_M * o->_N * sizeof(double), "ocean_N_z"); o->_N_x_plan = fftw_plan_dft_c2r_2d(o->_M, o->_N, o->_fft_in_nx, o->_N_x, FFTW_ESTIMATE); o->_N_z_plan = fftw_plan_dft_c2r_2d(o->_M, o->_N, o->_fft_in_nz, o->_N_z, FFTW_ESTIMATE); } if (o->_do_chop) { o->_fft_in_x = (fftw_complex *)MEM_mallocN(o->_M * (1 + o->_N / 2) * sizeof(fftw_complex), "ocean_fft_in_x"); o->_fft_in_z = (fftw_complex *)MEM_mallocN(o->_M * (1 + o->_N / 2) * sizeof(fftw_complex), "ocean_fft_in_z"); o->_disp_x = (double *)MEM_mallocN(o->_M * o->_N * sizeof(double), "ocean_disp_x"); o->_disp_z = (double *)MEM_mallocN(o->_M * o->_N * sizeof(double), "ocean_disp_z"); o->_disp_x_plan = fftw_plan_dft_c2r_2d(o->_M, o->_N, o->_fft_in_x, o->_disp_x, FFTW_ESTIMATE); o->_disp_z_plan = fftw_plan_dft_c2r_2d(o->_M, o->_N, o->_fft_in_z, o->_disp_z, FFTW_ESTIMATE); } if (o->_do_jacobian) { o->_fft_in_jxx = (fftw_complex *)MEM_mallocN(o->_M * (1 + o->_N / 2) * sizeof(fftw_complex), "ocean_fft_in_jxx"); o->_fft_in_jzz = (fftw_complex *)MEM_mallocN(o->_M * (1 + o->_N / 2) * sizeof(fftw_complex), "ocean_fft_in_jzz"); o->_fft_in_jxz = (fftw_complex *)MEM_mallocN(o->_M * (1 + o->_N / 2) * sizeof(fftw_complex), "ocean_fft_in_jxz"); o->_Jxx = (double *)MEM_mallocN(o->_M * o->_N * sizeof(double), "ocean_Jxx"); o->_Jzz = (double *)MEM_mallocN(o->_M * o->_N * sizeof(double), "ocean_Jzz"); o->_Jxz = (double *)MEM_mallocN(o->_M * o->_N * sizeof(double), "ocean_Jxz"); o->_Jxx_plan = fftw_plan_dft_c2r_2d(o->_M, o->_N, o->_fft_in_jxx, o->_Jxx, FFTW_ESTIMATE); o->_Jzz_plan = fftw_plan_dft_c2r_2d(o->_M, o->_N, o->_fft_in_jzz, o->_Jzz, FFTW_ESTIMATE); o->_Jxz_plan = fftw_plan_dft_c2r_2d(o->_M, o->_N, o->_fft_in_jxz, o->_Jxz, FFTW_ESTIMATE); } BLI_rw_mutex_unlock(&o->oceanmutex); set_height_normalize_factor(o); }
/*------------------------------page1_proc----------------------------------*/ long page1_proc (PFUNC_VAR) { enum ywords { MY_TESTWORK = YKEY_LOCALS + 1 }; static int hTest = ID_NULL; static YT_BOOK pages[] = { {"CLOCK", page_clock, LP(hTest)}, {"PUSH", page_push, LP(hTest)}, {"DITTO", DITTO, 0}, {"", NULL, 0} }; static int hMess, hOpen, hWait, hAbout, hHelp; static YT_COLOR colors; long ret_file; switch (message) { case YOPEN: hTest = *((int*)YGet("wlong1")); colors = YColor("yellow"); case YDRAW: YDrawRectF (0,0,WND->w,WND->h, YColor("blue")); YBeginGroup ("BOOK", 30,40, 275,210, YColor("")); YWnd (Ph(), BOOK, "", 15,15, 250,180, (long)pages,70,25,YRIGHT, CLR_DEF); YEndGroup(); YBeginGroup ("Dialogs", 325,20, 130,200, YColor("")); YWnd (&hWait, PUSH, "Wait", 30, 15, 65,25, 0,0,0,0, CLR_DEF); YWnd (&hMess, PUSH, "Message", 30, 50, 65,25, 0,0,0,0, CLR_DEF); YWnd (&hOpen, PUSH, "F-Files", 30, 85, 65,25, 0,0,0,0, CLR_DEF); YWnd (&hAbout, PUSH, "About", 30,120, 65,25, 0,0,0,0, CLR_DEF); YWnd (&hHelp, PUSH, "Help", 30,155, 65,25, 0,0,0,0, CLR_DEF); YEndGroup(); YBeginGroup ("Colors", 325,235, 130,50, YColor("")); YWnd (Ph(), COLORS, "", 30,15, 65,25, LP(colors),0,0,0, CLR_DEF); YEndGroup(); break; case MY_TESTWORK: if (YWaitSend (TRUE)) break; case YTIMER: YWaitEnd (); YKillTimer (); YKillProcess (); break; case YPUSH: if (FALSE) YBeep(); else if (mes1 == hWait) { YWaitBegin (WAIT, 20000, "Test work !"); YSetTimer (id, 1000); YSetProcess (id, MY_TESTWORK); } else if (mes1 == hOpen) { if (ret_file = YFindFile ()) /* OUTS ((char*)ret_file); */ YSend (hTest, YSTRING, 0,0,ret_file,0); } else if (mes1 == hMess) YMessageBox ("Do you like beer?", "Yes_No"); else if (mes1 == hAbout) YDlg (ABOUT, "About", 0,0,0,0, 0,0,0,0, CLR_DEF, TRUE); else if (mes1 == hHelp) YHelpPages(); break; case YCLOSE: YWndClean (id); break; default: YSend (hTest, message, mes1,mes2,mes3,mes4); } RETURN_TRUE; }
/*----------------------------------main_proc---------------------------------*/ long main_proc (PFUNC_VAR) { switch (message) { case YOPEN: case YDRAW: printf("YOPEN : %d %d %d %d \n", 0,0, WND->w,WND->h); YPaintRectF (30,30, WND->w-60,WND->h-60, YColor("blue")); YPaintLine (30,30, WND->w-60,WND->h-60, YColor("white")); YWnd (Ph(), PUSH, "PUSH", 70,10, 70,30, 0,0,0,0, YColor("yellow")); YWnd (Ph(), F_PUSH, "лопрлб", 150,10, 70,30, 0,0,0,0, YColor("yellow")); YWnd (Ph(), CHECK, "CHECK", 70, 60, 30,30, 0,0,0,0, YColor("yellow")); YWnd (Ph(), F_CHECK, "F_CHECK", 70,100, 30,30, 0,0,0,0, YColor("yellow")); YWnd (Ph(), SCROLL, "", 70,140, 30,140, 100,40,10, 0, YColor("yellow")); YWnd (Ph(), F_SCROLL, "", 120,140, 30,140, 100,40,10, YVERT, YColor("yellow")); YWnd (Ph(), EDIT, "Edit:", 220,140, 100,30, (long)"string1",0,0,0, YColor("yellow")); YWnd (Ph(), F_EDIT, "Edit:", 220,180, 100,30, (long)"string2",0,0,0, YColor("yellow")); YWnd (Ph(), F_EDIT, "Edit:", 220,220, 100,30, (long)"string3",0,0,0, YColor("yellow")); YWnd (Ph(), F_CLOCK, "Edit:", 220,260, 100,100, 0,0,0,0, YColor("yellow")); break; case YPUSH: printf("YPUSH \n"); break; case YCHECK: printf("YCHECK \n"); break; case YSCROLL: printf("YSCROLL %d \n", mes1); break; case YLMOUSEDOWN: printf("YLMOUSEDOWN (%d %d) \n", mes1, mes2); YFindFile (); break; case YLMOUSEUP: printf("YLMOUSEUP (%d %d) \n", mes1, mes2); YWnd (Ph(), PUSH, "PUSH", mes1,mes2, 70,30, 0,0,0,0, YColor("yellow")); break; case YRMOUSEDOWN: printf("YRMOUSEDOWN (%d %d) \n", mes1, mes2); break; case YRMOUSEUP: printf("YRMOUSEUP (%d %d) \n", mes1, mes2); YWnd (Ph(), F_PUSH, "F_PUSH", mes1,mes2, 70,30, 0,0,0,0, YColor("yellow")); break; case YKEYBOARD: printf("YKEYBOARD \n"); break; case YCLOSE: /* YWndClean (id); */ break; default: ;;;; } RETURN_TRUE; }
Mm AdcDynTest(Mm ADout, Mm fclk, Mm numbit, Mm NFFT, Mm V, Mm code, i_o_t, Mm& SNR__o, Mm& SINAD__o, Mm& SFDR__o, \ Mm& ENOB__o, Mm& y__o) { begin_scope ADout.setname("ADout"); fclk.setname("fclk"); numbit.setname("numbit"); NFFT.setname("NFFT"); V.setname("V"); \ code.setname("code"); dMm(SNR); dMm(SINAD); dMm(SFDR); dMm(ENOB); dMm(y); dMm(ad_len_N); dMm(maxADout); dMm(AmpMax); dMm(t1); dMm(AmpMin) \ ; dMm(t2); dMm(Vpp); dMm(ADout_w); dMm(AA); dMm(ad_len); dMm(ADout_spect); dMm(ADout_dB); dMm(maxdB); dMm(fin_v) \ ; dMm(fin); dMm(freq_fin); dMm(data_ref); dMm(n); dMm(n_AdcDynTest_v0); dMm(data_ref_w); dMm(data_ref_spect); \ dMm(data_ref_dB); dMm(ref_dB); dMm(span); dMm(spanh_har); dMm(span_s); dMm(spectP); dMm(Pdc); dMm(Pdc_dB); dMm( \ l); dMm(u); dMm(Ps); dMm(Ps_dB); dMm(Fh); dMm(Ph); dMm(Harbin); dMm(Ph_dB); dMm(har_num); dMm(har_num_AdcDynTest_v1) \ ; dMm(tone); dMm(har_peak); dMm(har_bin); dMm(spectP_temp); dMm(i_); dMm(i_AdcDynTest_v2); dMm(disturb_len); \ dMm(spectP_disturb); dMm(Harbin_disturb); dMm(findSpac); dMm(findSpan); dMm(findStart); dMm(i_AdcDynTest_v3); \ dMm(spectP_disturb_peak); dMm(num); dMm(array_flag); dMm(jj); dMm(jj_AdcDynTest_v4); dMm(k); dMm(k_AdcDynTest_v5) \ ; dMm(spectP_disturb_temp); dMm(Harbin_disturb_temp); dMm(Ph_disturb); dMm(Ph_disturb_dB); dMm(Fn_disturb); dMm( \ i_AdcDynTest_v6); dMm(Pd_disturb); dMm(Pd_disturb_dB); dMm(Pd); dMm(Pd_dB); dMm(Pn); dMm(Pn_dB); dMm(Vin); dMm( \ THD); dMm(HD); dMm(SNRFS); dMm(ENOBFS); call_stack_begin; // nargin, nargout entry code double old_nargin=nargin_val; if (!nargin_set) nargin_val=6.0; nargin_set=0; double old_nargout=nargout_val; if (!nargout_set) nargout_val=5.0; nargout_set=0; // translated code // function [SNR, SFDR, SNRFS, SINAD, y, THD, HD, ENOB, ENOBFS, Pn_dB] = AdcDynTest( ADout, fclk, numbit, NFFT, V, code ) // Pn_dB为底噪声,fclk为采样频率,numbit为采样精度,NFFT为FFT的深度,V为峰峰值,TPY和TPX分别为时域图的Y和X轴,code // 为1:补码,2:偏移码,3:格雷码。 //例子:若采样时钟80MHZ,精度16为,峰峰值2v,时域图显示Y轴+-1V和X轴0-0.01ms,码源为补码 //[SNR, SFDR, SNRFS, SINAD, THD, HD, ENOB, ENOBFS, Pn_dB] = calc_dynam_params( 80e6, 16, 32768, 2, 1, 0.01, 1 ) if (istrue(code==1.0)) { if (istrue(numbit<16.0)) { ADout = fix(ADout/mpower(2.0,(16.0-numbit))); } ADout = ADout/mpower(2.0,(numbit-1.0)); } else if (istrue(code==2.0)) { if (istrue(numbit<16.0)) { ADout = fix(ADout/mpower(2.0,(16.0-numbit))); } ADout = ADout/mpower(2.0,(numbit-1.0))-1.0; } else { if (istrue(numbit<16.0)) { ADout = fix(ADout/mpower(2.0,(16.0-numbit))); } } ADout = V/2.0*ADout; ad_len_N = length(ADout); maxADout = max(abs(ADout)); /*[AmpMax,t1] = */max(ADout,i_o,AmpMax,t1); /*[AmpMin,t2] = */min(ADout,i_o,AmpMin,t2); Vpp = AmpMax-AmpMin; ADout_w = times(ADout,chebwin(ad_len_N,200.0)); AA = zeros(NFFT-ad_len_N,1.0); ADout_w = (BR(ADout_w),semi, AA); ad_len = length(ADout_w); ADout_spect = fft(ADout_w,NFFT); ADout_dB = 20.0*log10(abs(ADout_spect)); maxdB = max(ADout_dB(colon(1.0,1.0,ad_len/2.0))); fin_v = find(ADout_dB(colon(1.0,1.0,ad_len/2.0))==maxdB); fin = fin_v(1.0); freq_fin = (fin*fclk/ad_len); data_ref = zeros(ad_len_N,1.0); n_AdcDynTest_v0 = colon(1.0,1.0,ad_len_N); int n_AdcDynTest_i0; for (n_AdcDynTest_i0=0;n_AdcDynTest_i0<n_AdcDynTest_v0.cols();n_AdcDynTest_i0++) { forelem(n,n_AdcDynTest_v0,n_AdcDynTest_i0); data_ref(n) = V/2.0*sin((n-1.0)*(freq_fin)/fclk*2.0*pi); } data_ref_w = times(data_ref,chebwin(ad_len_N,200.0)); data_ref_w = (BR(data_ref_w),semi, AA); data_ref_spect = fft(data_ref_w,NFFT); data_ref_dB = 20.0*log10(abs(data_ref_spect)); ref_dB = max(data_ref_dB(colon(1.0,1.0,ad_len/2.0))); // $$$ figure( 1 ) // $$$ plot( [0:round( ad_len / 2 ) - 1].*fclk / ad_len, - 20, ' - k' ); // $$$ hold on; // $$$ plot( [0:50:round( ad_len / 2 ) - 1].*fclk / ad_len, - 40, ' - - k' ); // $$$ hold on; // $$$ plot( [0:round( ad_len / 2 ) - 1].*fclk / ad_len, - 60, ' - k' ); // $$$ hold on; // $$$ plot( [0:50:round( ad_len / 2 ) - 1].*fclk / ad_len, - 80, ' - - k' ); // $$$ hold on; // $$$ plot( [0:round( ad_len / 2 ) - 1].*fclk / ad_len, - 100, ' - k' ); // $$$ hold on; // $$$ plot( [0:50:round( ad_len / 2 ) - 1].*fclk / ad_len, - 120, ' - - k' ); // $$$ hold on; // $$$ plot( [0:round( ad_len / 2 ) - 1].*fclk / ad_len, ADout_dB( 1:round( ad_len / 2 ) ) - ref_dB ); // $$$ // $$$ // $$$ title( 'FFT PLOT' ); // $$$ xlabel( 'ANALOG INPUT FREQUENCY ( MHz )' ); // $$$ ylabel( 'AMPLITUDE ( dBFs )' ); // $$$ a1 = axis; axis( [a1( 1 ) a1( 2 ) - 140 0] ); //Calculate SNR, SINAD, THD and SFDR values //Find the signal bin number, DC = bin 1 //Span of the DC on each side span = max(11.0); //Searching span for peak harmonics amp on each side spanh_har = 4.0; //Span of the signal on each side span_s = 19.0; //8 //Determine power spectrum spectP = times((abs(ADout_spect)),(abs(ADout_spect))); //Find DC offset power Pdc = sum(spectP(colon(1.0,1.0,span))); Pdc_dB = sum(ADout_dB(colon(1.0,1.0,span))); //Extract overall signal power l = max(fin-span_s,1.0); u = min(fin+span_s,ad_len/2.0); Ps = sum(spectP(colon(l,1.0,u))); Ps_dB = sum(ADout_dB(colon(l,1.0,u))); //Vector / matrix to store both frequency and power of signal and harmonics Fh = nop_M; //The 1st element in the vector / matrix represents the signal, the next element represents //the 2nd harmonic, etc. Ph = nop_M; Harbin = nop_M; Ph_dB = nop_M; har_num_AdcDynTest_v1 = colon(1.0,1.0,11.0); int har_num_AdcDynTest_i1; for (har_num_AdcDynTest_i1=0;har_num_AdcDynTest_i1<har_num_AdcDynTest_v1.cols();har_num_AdcDynTest_i1++) { forelem(har_num,har_num_AdcDynTest_v1,har_num_AdcDynTest_i1); tone = rem((har_num*(fin-1.0)+1.0)/ad_len,1.0); if (istrue(tone>0.5)) { tone = 1.0-tone; } Fh = (BR(Fh),tone); l = max(1.0,round(tone*ad_len)-spanh_har); u = min(ad_len/2.0,round(tone*ad_len)+spanh_har); har_peak = max(spectP(colon(l,1.0,u))); har_bin = find(spectP(colon(l,1.0,u))==har_peak); har_bin = har_bin+round(tone*ad_len)-spanh_har-1.0; l = max(1.0,har_bin-spanh_har); u = min(ad_len/2.0,har_bin+spanh_har); Ph = (BR(Ph),sum(spectP(colon(l,1.0,u)))); Ph_dB = (BR(Ph_dB),sum(ADout_dB(colon(l,1.0,u)))); Harbin = (BR(Harbin),har_bin); } spectP_temp = spectP; i_AdcDynTest_v2 = colon(2.0,1.0,10.0); int i_AdcDynTest_i2; for (i_AdcDynTest_i2=0;i_AdcDynTest_i2<i_AdcDynTest_v2.cols();i_AdcDynTest_i2++) { forelem(i_,i_AdcDynTest_v2,i_AdcDynTest_i2); l = max(1.0,Harbin(i_)-spanh_har); u = min(ad_len/2.0,Harbin(i_)+spanh_har); spectP_temp(colon(l,1.0,u)) = 0.0; } l = max(1.0,fin-span_s); u = min(ad_len/2.0,fin+span_s); spectP_temp(colon(l,1.0,u)) = 0.0; spectP_temp(colon(1.0,1.0,span)) = 0.0; disturb_len = 19.0; spectP_disturb = zeros(1.0,disturb_len); Harbin_disturb = zeros(1.0,disturb_len); findSpac = 30.0; findSpan = (findSpac-1.0)/2.0; findStart = findSpan+1.0; i_AdcDynTest_v3 = colon(findStart,findSpac,ad_len/2.0); int i_AdcDynTest_i3; for (i_AdcDynTest_i3=0;i_AdcDynTest_i3<i_AdcDynTest_v3.cols();i_AdcDynTest_i3++) { forelem(i_,i_AdcDynTest_v3,i_AdcDynTest_i3); l = max(1.0,i_-findSpan); u = min(ad_len/2.0,i_+findSpan); /*[spectP_disturb_peak,num] = */max(spectP_temp(colon(l,1.0,u)),i_o,spectP_disturb_peak,num); if (istrue(spectP_disturb_peak>spectP_disturb(1.0))) { spectP_disturb(1.0) = spectP_disturb_peak; Harbin_disturb(1.0) = i_-findStart+num; array_flag = 1.0; } else { array_flag = 0.0; } if (istrue(array_flag==1.0)) { jj_AdcDynTest_v4 = colon(1.0,1.0,disturb_len-2.0); int jj_AdcDynTest_i4; for (jj_AdcDynTest_i4=0;jj_AdcDynTest_i4<jj_AdcDynTest_v4.cols();jj_AdcDynTest_i4++) { forelem(jj,jj_AdcDynTest_v4,jj_AdcDynTest_i4); k_AdcDynTest_v5 = colon(1.0,1.0,(disturb_len-jj)); int k_AdcDynTest_i5; for (k_AdcDynTest_i5=0;k_AdcDynTest_i5<k_AdcDynTest_v5.cols();k_AdcDynTest_i5++) { forelem(k,k_AdcDynTest_v5,k_AdcDynTest_i5); if (istrue(spectP_disturb(k)>spectP_disturb(k+1.0))) { spectP_disturb_temp = spectP_disturb(k); spectP_disturb(k) = spectP_disturb(k+1.0); spectP_disturb(k+1.0) = spectP_disturb_temp; Harbin_disturb_temp = Harbin_disturb(k); Harbin_disturb(k) = Harbin_disturb(k+1.0); Harbin_disturb(k+1.0) = Harbin_disturb_temp; } } } } } Ph_disturb = nop_M; Ph_disturb_dB = nop_M; Fn_disturb = Harbin_disturb/(ad_len); i_AdcDynTest_v6 = colon(1.0,1.0,disturb_len); int i_AdcDynTest_i6; for (i_AdcDynTest_i6=0;i_AdcDynTest_i6<i_AdcDynTest_v6.cols();i_AdcDynTest_i6++) { forelem(i_,i_AdcDynTest_v6,i_AdcDynTest_i6); l = max(1.0,Harbin_disturb(i_)-spanh_har); u = min(ad_len/2.0,Harbin_disturb(i_)+spanh_har); Ph_disturb = (BR(Ph_disturb),sum(spectP(colon(l,1.0,u)))); Ph_disturb_dB = (BR(Ph_disturb_dB),sum(ADout_dB(colon(l,1.0,u)))); } Pd_disturb = sum(Ph_disturb(colon(1.0,1.0,disturb_len))); Pd_disturb_dB = sum(Ph_disturb_dB(colon(1.0,1.0,disturb_len))); Pd = sum(Ph(colon(2.0,1.0,10.0))); Pd_dB = sum(Ph_dB(colon(2.0,1.0,10.0))); Pn = (sum(spectP(colon(1.0,1.0,ad_len/2.0)))-Pdc-Ps-Pd); Pn_dB = (sum(ADout_dB(colon(1.0,1.0,ad_len/2.0)))-Pdc_dB-Ps_dB-Pd_dB-Pd_disturb_dB)*2.0/ad_len-ref_dB; // Vin = 20*log10( Vpp / 2 ); Vin = maxdB-ref_dB; SINAD = 10.0*log10(Ps/(Pn+Pd)); SNR = 10.0*log10(Ps/Pn); // $$$ disp( 'THD is calculated from 2nd through 5th order harmonics' ); THD = 10.0*log10(Pd/Ph(1.0)); SFDR = 10.0*log10(Ph(1.0)/max(max(Ph(colon(2.0,1.0,10.0)),max(Ph_disturb(colon(1.0,1.0,disturb_len)))))); // $$$ disp( 'Signal & Harmonic Power Components:' ); HD = 10.0*log10(Ph(colon(1.0,1.0,10.0))/Ph(1.0)); // $$$ hold on; // $$$ // $$$ plot( Fh( 2 )*fclk, ADout_dB( Harbin( 2 ) ) - ref_dB, 'rv', Fh( 3 )*fclk, ADout_dB( Harbin( 3 ) ) - ref_dB, 'rv', Fh( 4 )*fclk, ADout_dB( Harbin( 4 ) ) - ref_dB, 'rv', Fh( 5 )*fclk, ADout_dB( Harbin( 5 ) ) - ref_dB, 'rv', Fh( 6 )*fclk, ADout_dB( Harbin( 6 ) ) - ref_dB, 'rv', Fh( 7 )*fclk, ADout_dB( Harbin( 7 ) ) - ref_dB, 'rv', Fh( 8 )*fclk, ADout_dB( Harbin( 8 ) ) - ref_dB, 'rv', Fh( 9 )*fclk, ADout_dB( Harbin( 9 ) ) - ref_dB, 'rv', Fh( 10 )*fclk, ADout_dB( Harbin( 10 ) ) - ref_dB, 'rv' ); // $$$ hold on; // $$$ plot( [0:round( ad_len / 2 ) - 1].*fclk / ad_len, Pn_dB, 'm - ' ); // $$$ switch ( NFFT ) // $$$ case 16384 // $$$ NFFT_txt = '16K'; // $$$ case 32768 // $$$ NFFT_txt = '32K'; // $$$ case 65536 // $$$ NFFT_txt = '64K'; // $$$ end // $$$ FRQ_txt = num2str( freq_fin / 1e6, '%2.1f' ); // $$$ FRQ_txt = strcat( FRQ_txt, 'MHz' ); // $$$ FFT_txt = strcat( NFFT_txt, ' FFT' ); // $$$ FREQ_txt = strcat( num2str( fclk / 1e6, '%2d' ), 'MSPS' ); // $$$ DBFS_txt = strcat( FRQ_txt, '@', num2str( maxdB - ref_dB, '%2.1f' ), 'dBFs' ); // $$$ SNR_txt = strcat( 'SNR =', num2str( SNR, '% 2.3f' ), ' dBc' ); // $$$ SFDR_txt = strcat( 'SFDR = ', num2str( SFDR, '% 2.3f' ), ' dBc' ); // $$$ text( fclk*5.6 / 16, - 5, FFT_txt, 'HorizontalAlignment', 'left', 'Color', 'r' ); // $$$ text( fclk*5.6 / 16, - 13, FREQ_txt, 'HorizontalAlignment', 'left', 'Color', 'r' ); // $$$ text( fclk*5.6 / 16, - 21, DBFS_txt, 'HorizontalAlignment', 'left', 'Color', 'r' ); // $$$ text( fclk*5.6 / 16, - 29, SNR_txt, 'HorizontalAlignment', 'left', 'Color', 'r' ); // $$$ text( fclk*5.6 / 16, - 37, SFDR_txt, 'HorizontalAlignment', 'left', 'Color', 'r' ); // $$$ text( Fh( 2 )*fclk, ADout_dB( Harbin( 2 ) ) - ref_dB + 2, '2', 'VerticalAlignmen', 'bottom', 'Color', 'r' ); // $$$ text( Fh( 3 )*fclk, ADout_dB( Harbin( 3 ) ) - ref_dB + 2, '3', 'VerticalAlignmen', 'bottom', 'Color', 'r' ); // $$$ text( Fh( 4 )*fclk, ADout_dB( Harbin( 4 ) ) - ref_dB + 2, '4', 'VerticalAlignmen', 'bottom', 'Color', 'r' ); // $$$ text( Fh( 5 )*fclk, ADout_dB( Harbin( 5 ) ) - ref_dB + 2, '5', 'VerticalAlignmen', 'bottom', 'Color', 'r' ); // $$$ text( Fh( 6 )*fclk, ADout_dB( Harbin( 6 ) ) - ref_dB + 2, '6', 'VerticalAlignmen', 'bottom', 'Color', 'r' ); // $$$ text( Fh( 7 )*fclk, ADout_dB( Harbin( 7 ) ) - ref_dB + 2, '7', 'VerticalAlignmen', 'bottom', 'Color', 'r' ); // $$$ text( Fh( 8 )*fclk, ADout_dB( Harbin( 8 ) ) - ref_dB + 2, '8', 'VerticalAlignmen', 'bottom', 'Color', 'r' ); // $$$ text( Fh( 9 )*fclk, ADout_dB( Harbin( 9 ) ) - ref_dB + 2, '9', 'VerticalAlignmen', 'bottom', 'Color', 'r' ); // $$$ text( Fh( 10 )*fclk, ADout_dB( Harbin( 10 ) ) - ref_dB + 2, '10', 'VerticalAlignmen', 'bottom', 'Color', 'r' ); // $$$ hold on; // $$$ for i = 0:disturb_len / 2 // $$$ hold on; // $$$ plot( Fn_disturb( disturb_len - i )*fclk, ADout_dB( Harbin_disturb( disturb_len - i ) ) - ref_dB, 'g*' ); // $$$ end // $$$ hold off; // $$$ // $$$ // $$$ VPP_txt = strcat( num2str( Vpp, '%2.3f' ), ' Vpp' ); // $$$ figure( 2 ) // $$$ // $$$ plot( [1:ad_len_N].*1e3 / fclk, ADout( 1:ad_len_N ) ); // $$$ title( 'Time PLOT' ); // $$$ xlabel( 'TIME ( ms )' ); // $$$ ylabel( 'AMPLITUDE ( V )' ); // $$$ hold on SNRFS = SNR+abs(maxdB-ref_dB); ENOB = (SINAD-1.76)/6.02; ENOBFS = ENOB+abs(maxdB-ref_dB)/6.02; HD = (BR(ADout_dB(max(Harbin(2.0),1.0))-ref_dB),ADout_dB(max(Harbin(2.0),1.0))-ref_dB,ADout_dB(max(Harbin(3.0) \ ,1.0))-ref_dB,ADout_dB(max(Harbin(4.0),1.0))-ref_dB,ADout_dB(max(Harbin(5.0),1.0))-ref_dB,ADout_dB(max(Harbin( \ 6.0),1.0))-ref_dB,ADout_dB(max(Harbin(7.0),1.0))-ref_dB,ADout_dB(max(Harbin(8.0),1.0))-ref_dB,ADout_dB(max(Harbin( \ 9.0),1.0))-ref_dB,ADout_dB(max(Harbin(10.0),1.0))-ref_dB); y = ADout_dB-ref_dB; call_stack_end; // nargin, nargout exit code nargin_val=old_nargin; nargout_val=old_nargout; // function exit code ADout.setname(NULL); fclk.setname(NULL); numbit.setname(NULL); NFFT.setname(NULL); V.setname(NULL); code.setname( \ NULL); SNR__o=SNR; SINAD__o=SINAD; SFDR__o=SFDR; ENOB__o=ENOB; y__o=y; return x_M; end_scope }