⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pwl.alg

📁 Audacity是一款用於錄音和編輯聲音的、免費的開放源碼軟體。它可以執行於Mac OS X、Microsoft Windows、GNU/Linux和其它作業系統
💻 ALG
字号:
(PWL-ALG  (NAME "pwl")  (ARGUMENTS ("time_type" "t0") ("rate_type" "sr") ("LVAL" "lis"))  (SUPPORT-FUNCTIONS "/* IMPLEMENTATION NOTE: * The lis argument is a list of alternating sample numbers and values * which are taken in pairs, with an implicit (0, 0) starting point.  The * last point  is a sample number only, the value being implicitly 0. * The bpt_ptr points to the next sample number in the list. * The incr is set to the increment per sample, and lvl is the next * sample value. * * The list is assumed to be well-formed, so it should be checked by * the caller (users should not call this directly). *//* compute_lvl -- setup the susp with level, advance bpt_ptr *//* * returns true if it is time to terminate * * Note: compute_lvl gets called in the outer loop to skip over * a breakpoint pair before starting the compute_incr loop, which * searches for a breakpoint that is some number of samples in the * future.  This code is not embedded in compute_incr because it is * NOT called from the initialization, where it would be wrong to * skip over the first breakpoint. */boolean compute_lvl(pwl_susp_type susp){    if (!cdr(susp->bpt_ptr)) return true;    susp->lvl = getflonum(car(cdr(susp->bpt_ptr)));    susp->bpt_ptr = cdr(cdr(susp->bpt_ptr));    return !susp->bpt_ptr;}/* compute_incr -- setup the susp with level and increment *//* * returns true if it is time to terminate */boolean compute_incr(pwl_susp_type susp, long *n, long cur){    double target;    while (*n == 0) {        *n = getfixnum(car(susp->bpt_ptr)) - cur;        /* if there is a 2nd element of the pair, get the target */        if (cdr(susp->bpt_ptr))            target = getflonum(car(cdr(susp->bpt_ptr)));        else target = 0.0;        if (*n > 0) susp->incr = (target - susp->lvl) / *n;        else if (compute_lvl(susp)) return true;    }    return false;}") (SAMPLE-RATE "sr")  (STATE         ("LVAL" "bpt_ptr" "lis")        ("double" "incr" "0.0")        ("double" "lvl" "0.0;          { long temp = 0; compute_incr(susp, &temp, 0); }"))    (OUTER-LOOP "        if (susp->bpt_ptr == NULL) {out:	    togo = 0;	/* indicate termination */            break;	/* we're done */        }        { long cur = susp->susp.current + cnt;          long nn = getfixnum(car(susp->bpt_ptr)) - cur;          if (nn == 0) {              if (compute_lvl(susp) || compute_incr(susp, &nn, cur)) goto out;          }          togo = MIN(nn, togo);        }")  (INNER-LOOP "output = (sample_type) lvl; lvl += incr;")  (MAINTAIN ("lvl" "susp->lvl += susp->incr * togo"))  (CONSTANT "incr")  (TERMINATE COMPUTED))

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -