📄 pitsyn.c
字号:
rci[j + i__ * rci_dim1] = rc[j]; } ivuv[i__] = ivoice; ipiti[i__] = *pitch; rmsi[i__] = *rms; } *first = FALSE_; } else { vflag = 0; lsamp = *lframe + *jsamp; slope = (*pitch - *ipito) / (real) lsamp; *nout = 0; jused = 0; istart = 1; if (voice[1] == *ivoico && voice[2] == voice[1]) { if (voice[2] == 0) {/* SSUV - - 0 , 0 , 0 */ *pitch = *lframe / 4; *ipito = *pitch; if (*ratio > 8.f) { *rmso = *rms; } }/* SSVC - - 1 , 1 , 1 */ slope = (*pitch - *ipito) / (real) lsamp; ivoice = voice[2]; } else { if (*ivoico != 1) { if (*ivoico == voice[1]) {/* UV2VC2 - - 0 , 0 , 1 */ nl = lsamp - *lframe / 4; } else {/* UV2VC1 - - 0 , 1 , 1 */ nl = lsamp - *lframe * 3 / 4; } ipiti[1] = nl / 2; ipiti[2] = nl - ipiti[1]; ivuv[1] = 0; ivuv[2] = 0; rmsi[1] = *rmso; rmsi[2] = *rmso; i__1 = *order; for (i__ = 1; i__ <= i__1; ++i__) { rci[i__ + rci_dim1] = rco[i__ - 1]; rci[i__ + (rci_dim1 << 1)] = rco[i__ - 1]; rco[i__ - 1] = rc[i__]; } slope = 0.f; *nout = 2; *ipito = *pitch; jused = nl; istart = nl + 1; ivoice = 1; } else { if (*ivoico != voice[1]) {/* VC2UV1 - - 1 , 0 , 0 */ lsamp = *lframe / 4 + *jsamp; } else {/* VC2UV2 - - 1 , 1 , 0 */ lsamp = *lframe * 3 / 4 + *jsamp; } i__1 = *order; for (i__ = 1; i__ <= i__1; ++i__) { yarc[i__ - 1] = rc[i__]; rc[i__] = rco[i__ - 1]; } ivoice = 1; slope = 0.f; vflag = 1; } }/* Here is the value of most variables that are used below, depending on *//* the values of IVOICO, VOICE(1), and VOICE(2). VOICE(1) and VOICE(2) *//* are input arguments, and IVOICO is the value of VOICE(2) on the *//* previous call (see notes for the IF (NOUT .NE. 0) statement near the *//* end). Each of these three values is either 0 or 1. These three *//* values below are given as 3-bit long strings, in the order IVOICO, *//* VOICE(1), and VOICE(2). It appears that the code above assumes that *//* the bit sequences 010 and 101 never occur, but I wonder whether a *//* large enough number of bit errors in the channel could cause such a *//* thing to happen, and if so, could that cause NOUT to ever go over 11? *//* Note that all of the 180 values in the table are really LFRAME, but *//* 180 has fewer characters, and it makes the table a little more *//* concrete. If LFRAME is ever changed, keep this in mind. Similarly, *//* 135's are 3*LFRAME/4, and 45's are LFRAME/4. If LFRAME is not a *//* multiple of 4, then the 135 for NL-JSAMP is actually LFRAME-LFRAME/4, *//* and the 45 for NL-JSAMP is actually LFRAME-3*LFRAME/4. *//* Note that LSAMP-JSAMP is given as the variable. This was just for *//* brevity, to avoid adding "+JSAMP" to all of the column entries. *//* Similarly for NL-JSAMP. *//* Variable | 000 001 011,010 111 110 100,101 *//* ------------+-------------------------------------------------- *//* ISTART | 1 NL+1 NL+1 1 1 1 *//* LSAMP-JSAMP | 180 180 180 180 135 45 *//* IPITO | 45 PITCH PITCH oldPITCH oldPITCH oldPITCH *//* SLOPE | 0 0 0 seebelow 0 0 *//* JUSED | 0 NL NL 0 0 0 *//* PITCH | 45 PITCH PITCH PITCH PITCH PITCH *//* NL-JSAMP | -- 135 45 -- -- -- *//* VFLAG | 0 0 0 0 1 1 *//* NOUT | 0 2 2 0 0 0 *//* IVOICE | 0 1 1 1 1 1 *//* while_loop | once once once once twice twice *//* ISTART | -- -- -- -- JUSED+1 JUSED+1 *//* LSAMP-JSAMP | -- -- -- -- 180 180 *//* IPITO | -- -- -- -- oldPITCH oldPITCH *//* SLOPE | -- -- -- -- 0 0 *//* JUSED | -- -- -- -- ?? ?? *//* PITCH | -- -- -- -- PITCH PITCH *//* NL-JSAMP | -- -- -- -- -- -- *//* VFLAG | -- -- -- -- 0 0 *//* NOUT | -- -- -- -- ?? ?? *//* IVOICE | -- -- -- -- 0 0 *//* UVPIT is always 0.0 on the first pass through the DO WHILE (.TRUE.) *//* loop below. *//* The only possible non-0 value of SLOPE (in column 111) is *//* (PITCH-IPITO)/FLOAT(LSAMP) *//* Column 101 is identical to 100. Any good properties we can prove *//* for 100 will also hold for 101. Similarly for 010 and 011. *//* SYNTHS calls this subroutine with PITCH restricted to the range 20 to *//* 156. IPITO is similarly restricted to this range, after the first *//* call. IP below is also restricted to this range, given the *//* definitions of IPITO, SLOPE, UVPIT, and that I is in the range ISTART *//* to LSAMP. */ while(TRUE_) {/* JUSED is the total length of all pitch periods currently *//* in the output arrays, in samples. *//* An invariant of the DO I = ISTART,LSAMP loop below, under *//* the condition that IP is always in the range 1 through *//* MAXPIT, is: *//* (I - MAXPIT) .LE. JUSED .LE. (I-1) *//* Note that the final value of I is LSAMP+1, so that after *//* the DO loop is complete, we know: *//* (LSAMP - MAXPIT + 1) .LE. JUSED .LE. LSAMP */ i__1 = lsamp; for (i__ = istart; i__ <= i__1; ++i__) { r__1 = *ipito + slope * i__; ip = (integer)(r__1 + .5f); if (uvpit != 0.f) { ip = (integer)uvpit; } if (ip <= i__ - jused) { ++(*nout);/* The following check is no longer necessary, now that *//* we can prove that NOUT will never go over 16. *//* IF (NOUT .GT. 16) STOP 'PITSYN: too many epochs' */ ipiti[*nout] = ip; *pitch = ip; ivuv[*nout] = ivoice; jused += ip; prop = (jused - ip / 2) / (real) lsamp; i__2 = *order; for (j = 1; j <= i__2; ++j) { alro = (real)log((rco[j - 1] + 1) / (1 - rco[j - 1])); alrn = (real)log((rc[j] + 1) / (1 - rc[j])); xxy = alro + prop * (alrn - alro); xxy = (real)exp(xxy); rci[j + *nout * rci_dim1] = (xxy - 1) / (xxy + 1); } rmsi[*nout] = (real)(log(*rmso) + prop * (log(*rms) - log(*rmso))); rmsi[*nout] = (real)exp(rmsi[*nout]); } } if (vflag != 1) { goto L100; }/* I want to prove what range UVPIT must lie in after the *//* assignments to it below. To do this, I must determine *//* what range (LSAMP-ISTART) must lie in, after the *//* assignments to ISTART and LSAMP below. *//* Let oldLSAMP be the value of LSAMP at this point in the *//* execution. This is 135+JSAMP in state 110, or 45+JSAMP in *//* states 100 or 101. *//* Given the loop invariant on JUSED above, we know that: *//* (oldLSAMP - MAXPIT + 1) .LE. JUSED .LE. oldLSAMP *//* ISTART is one more than this. *//* Let newLSAMP be the value assigned to LSAMP below. This *//* is 180+JSAMP. Thus (newLSAMP-oldLSAMP) is either 45 or *//* 135, depending on the state. *//* Thus, the range of newLSAMP-ISTART is: *//* (newLSAMP-(oldLSAMP+1)) .LE. newLSAMP-ISTART *//* .LE. (newLSAMP-(oldLSAMP - MAXPIT + 2)) *//* or: *//* 46 .LE. newLSAMP-ISTART .LE. 133+MAXPIT .EQ. 289 *//* Therefore, UVPIT is in the range 23 to 144 after the first *//* assignment to UVPIT below, and after the conditional *//* assignment, it is in the range 23 to 90. *//* The important thing is that it is in the range 20 to 156, *//* so that in the loop above, IP is always in this range. */ vflag = 0; istart = jused + 1; lsamp = *lframe + *jsamp; slope = 0.f; ivoice = 0; uvpit = (real) ((lsamp - istart) / 2); if (uvpit > 90.f) { uvpit /= 2; } *rmso = *rms; i__1 = *order; for (i__ = 1; i__ <= i__1; ++i__) { rc[i__] = yarc[i__ - 1]; rco[i__ - 1] = yarc[i__ - 1]; } }L100: *jsamp = lsamp - jused; }/* Given that the maximum pitch period MAXPIT .LT. LFRAME (this is *//* currently true on every call, since SYNTHS always sets *//* LFRAME=180), NOUT will always be .GE. 1 at this point. */ if (*nout != 0) { *ivoico = voice[2]; *ipito = *pitch; *rmso = *rms; i__1 = *order; for (i__ = 1; i__ <= i__1; ++i__) { rco[i__ - 1] = rc[i__]; } } return 0;} /* pitsyn_ */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -