📄 placev.c
字号:
/********************************************************************* PLACEV Version 48********************************************************************/#include "lpcdefs.h"#include "config.ch"placev( osbuf, osptr, obound, vwin)int osbuf[], osptr, *obound, vwin[2][AF];{/* Arguments* OSBUF Buffer which holds sorted indexes of onsets* OSPTR Free pointer into OSBUF* VWIN Buffer of Voicing Window Positions (Modified)* OBOUND This variable is set by this procedure and used* in placing analysis windows (PLACEA). Bit 1* indicates whether an onset bounds the left side* of the voicing window, and bit 2 indicates whether* an onset bounds the right side of the voicing window.* Variables* LRANGE, HRANGE Range in which window is placed* OSPTR1 OSPTR excluding samaples in 3F*/int lrange, hrange, i;int q;int osptr1;short crit;/* Voicing Window Placement** __________________ __________________ ______________* | | |* | 1F | 2F | 3F ...* |__________________|__________________|______________** Previous |* Window |* ...________|** | |* ------>| This window's placement range |<------* | |** There are three cases. Note that these are different from those* given in the LPC-10e phase 1 report.** 1. If there are no onsets in this range, then the voicing window* is centered in the pitch window. If such a placement is not within* the window's placement range, then the window is placed in the left-* most portion of the placement range. Its length is always MAXWIN.** 2. If the first onset is in 2F and there is sufficient room to place* the window immediately before this onset, then the window is placed* there, and its length is set to the maximum possible under these* constraints.** "Critical Region Exception": If there is another onset in 2F* such that a window can be placed between the two onsets, the* window is placed there (ie, as in case 3).** 3. Otherwise, the window is placed immediately AFter the onset. The * window's length* is the longest length that can fit in the range under these constraints,* except that the window may be shortened even further to avoid overlapping* other onsets in the placement range. In any case, the window's length* is at least MINWIN.** Note that the values of MINWIN and LFRAME must be chosen such* that case 2 = false implies case 3 = true. This means that* MINWIN <= LFRAME/2. If this were not the case, then a fourth case* would have to be added for when the window cannot fit either before* or AFter the onset.** Note also that onsets which weren't in 2F last time may be in 1F this* time, due to the filter delays in computing onsets. The result is that* occasionally a voicing window will overlap that onset. The only way* to circumvent this problem is to add more delay in processing input* speech. In the trade-off between delay and window-placement, window* placement lost.*//* Compute the placement range */lrange = mmax(vwin[1][AF-2]+1, (AF-2)*LFRAME+1);hrange = AF*LFRAME;/* Compute OSPTR1, so the following code only looks at relevant onsets. */for (osptr1=osptr-1; osptr1>=1; osptr1--) { if (osbuf[osptr1-1] <= hrange) break;}osptr1++;/* Check for case 1 first (fast case): */if ((osptr1 <= 1) || (osbuf[osptr1-2] < lrange)) { vwin[0][AF-1] = mmax(vwin[1][AF-2]+1, DVWINL); vwin[1][AF-1] = vwin[0][AF-1] + MAXWIN - 1; *obound = 0;}else {/* Search backward in OSBUF for first onset in range.* This code relies on the above check being performed first. */ for(q=osptr1-1;q>=1;q--) { if (osbuf[q-1] < lrange) break; } q++;/* Check for case 2 (placement before onset):* Check for critical region exception: */ crit = 0; for(i=q+1;i<=osptr1-1;i++) { if (osbuf[i-1] - osbuf[q-1] >= MINWIN) { crit = 1; break; } } if (!crit && osbuf[q-1] > mmax((AF-1)*LFRAME, lrange+MINWIN-1)) { vwin[1][AF-1] = osbuf[q-1] - 1; vwin[0][AF-1] = mmax (lrange, vwin[1][AF-1]-MAXWIN+1); *obound = 2; }/* Case 3 (placement AFter onset) */ else { vwin[0][AF-1] = osbuf[q-1];L110: q++; if(q < osptr1) { if(osbuf[q-1] <= vwin[0][AF-1] + MAXWIN) { if (osbuf[q-1] < vwin[0][AF-1] + MINWIN) goto L110; vwin[1][AF-1] = osbuf[q-1] - 1; *obound = 3; } else { vwin[1][AF-1] = mmin(vwin[0][AF-1] + MAXWIN - 1, hrange); *obound = 1; } } else { vwin[1][AF-1] = mmin(vwin[0][AF-1] + MAXWIN - 1, hrange); *obound = 1; } }}}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -