📄 placea.c
字号:
/*$Log: placea.c,v $Revision 1.1.1.1 2001/11/19 19:50:16 smorlatFirst cvs.Revision 1.1.1.1 2001/08/08 21:29:08 simonFirst import * Revision 1.1 1996/08/19 22:31:07 jaf * Initial revision **/#ifdef P_R_O_T_O_T_Y_P_E_Sextern int placea_(integer *ipitch, integer *voibuf, integer *obound, integer *af, integer *vwin, integer *awin, integer *ewin, integer *lframe, integer *maxwin);#endif/* -- translated by f2c (version 19951025). You must link the resulting object file with the libraries: -lf2c -lm (in that order)*/#include "f2c.h"/* *********************************************************************** *//* PLACEA Version 48 *//* $Log: placea.c,v $/* Revision 1.1.1.1 2001/11/19 19:50:16 smorlat/* First cvs./*/* Revision 1.1.1.1 2001/08/08 21:29:08 simon/* First import/* * Revision 1.1 1996/08/19 22:31:07 jaf * Initial revision * *//* Revision 1.5 1996/03/19 20:41:55 jaf *//* Added some conditions satisfied by the output values in EWIN. *//* Revision 1.4 1996/03/19 20:24:17 jaf *//* Added some conditions satisfied by the output values in AWIN. *//* Revision 1.3 1996/03/18 21:40:04 jaf *//* Just added a few comments about which array indices of the arguments *//* are used, and mentioning that this subroutine has no local state. *//* Revision 1.2 1996/03/13 16:43:09 jaf *//* Comments added explaining that none of the local variables of this *//* subroutine need to be saved from one invocation to the next. *//* Revision 1.1 1996/02/07 14:48:31 jaf *//* Initial revision *//* *********************************************************************** *//* Input: *//* IPITCH *//* VOIBUF *//* Indices (2,AF-2), (1,AF-1), (2,AF-1), (1,AF), and (2,AF) read.*//* All other indices untouched. *//* OBOUND *//* AF *//* VWIN *//* Indices (1,AF) and (2,AF) read. *//* All other indices untouched. *//* LFRAME *//* MAXWIN *//* Input/Output: *//* AWIN *//* Index (1,AF-1) read. *//* Indices (1,AF) and (2,AF) written, and then read. *//* All other indices untouched. *//* In all cases (except possibly one), the final values will *//* satisfy the condition: AWIN(2,AF)-AWIN(1,AF)+1 = MAXWIN. *//* In that other case, *//* AWIN(1,AF)=VWIN(1,AF) and AWIN(2,AF)=VWIN(2,AF). *//* Output: *//* EWIN *//* Indices (1,AF) and (2,AF) written. *//* All other indices untouched. *//* In all cases, the final values will satisfy the condition: *//* AWIN(1,AF) .LE. EWIN(1,AF) .LE. EWIN(2,AF) .LE. AWIN(2,AF) *//* In other words, the energy window is a sub-window of *//* the analysis window. *//* This subroutine has no local state. *//* Subroutine */ int placea_(integer *ipitch, integer *voibuf, integer * obound, integer *af, integer *vwin, integer *awin, integer *ewin, integer *lframe, integer *maxwin){ /* System generated locals */ real r__1; /* Builtin functions */ integer i_nint(real *); /* Local variables */ logical allv, winv; integer i__, j, k, l, hrange; logical ephase; integer lrange;/* Arguments *//* Local variables that need not be saved */ /* Parameter adjustments */ ewin -= 3; awin -= 3; vwin -= 3; --voibuf; /* Function Body */ lrange = (*af - 2) * *lframe + 1; hrange = *af * *lframe;/* Place the Analysis window based on the voicing window *//* placement, onsets, tentative voicing decision, and pitch. *//* Case 1: Sustained Voiced Speech *//* If the five most recent voicing decisions are *//* voiced, then the window is placed phase-synchronously with the *//* previous window, as close to the present voicing window if possible. *//* If onsets bound the voicing window, then preference is given to *//* a phase-synchronous placement which does not overlap these onsets. *//* Case 2: Voiced Transition *//* If at least one voicing decision in AF is voicied, and there are no *//* onsets, then the window is placed as in case 1. *//* Case 3: Unvoiced Speech or Onsets *//* If both voicing decisions in AF are unvoiced, or there are onsets, *//* then the window is placed coincident with the voicing window. *//* Note: During phase-synchronous placement of windows, the length *//* is not altered from MAXWIN, since this would defeat the purpose *//* of phase-synchronous placement. *//* Check for case 1 and case 2 */ allv = voibuf[(*af - 2 << 1) + 2] == 1; allv = allv && voibuf[(*af - 1 << 1) + 1] == 1; allv = allv && voibuf[(*af - 1 << 1) + 2] == 1; allv = allv && voibuf[(*af << 1) + 1] == 1; allv = allv && voibuf[(*af << 1) + 2] == 1; winv = voibuf[(*af << 1) + 1] == 1 || voibuf[(*af << 1) + 2] == 1; if (allv || winv && *obound == 0) {/* APHASE: Phase synchronous window placement. *//* Get minimum lower index of the window. */ i__ = (lrange + *ipitch - 1 - awin[(*af - 1 << 1) + 1]) / *ipitch; i__ *= *ipitch; i__ += awin[(*af - 1 << 1) + 1];/* L = the actual length of this frame's analysis window. */ l = *maxwin;/* Calculate the location where a perfectly centered window would start. */ k = (vwin[(*af << 1) + 1] + vwin[(*af << 1) + 2] + 1 - l) / 2;/* Choose the actual location to be the pitch multiple closest to this. */ r__1 = (real) (k - i__) / *ipitch; awin[(*af << 1) + 1] = i__ + i_nint(&r__1) * *ipitch; awin[(*af << 1) + 2] = awin[(*af << 1) + 1] + l - 1;/* If there is an onset bounding the right of the voicing window and the *//* analysis window overlaps that, then move the analysis window backward *//* to avoid this onset. */ if (*obound >= 2 && awin[(*af << 1) + 2] > vwin[(*af << 1) + 2]) { awin[(*af << 1) + 1] -= *ipitch; awin[(*af << 1) + 2] -= *ipitch; }/* Similarly for the left of the voicing window. */ if ((*obound == 1 || *obound == 3) && awin[(*af << 1) + 1] < vwin[(* af << 1) + 1]) { awin[(*af << 1) + 1] += *ipitch; awin[(*af << 1) + 2] += *ipitch; }/* If this placement puts the analysis window above HRANGE, then *//* move it backward an integer number of pitch periods. */ while(awin[(*af << 1) + 2] > hrange) { awin[(*af << 1) + 1] -= *ipitch; awin[(*af << 1) + 2] -= *ipitch; }/* Similarly if the placement puts the analysis window below LRANGE. */ while(awin[(*af << 1) + 1] < lrange) { awin[(*af << 1) + 1] += *ipitch; awin[(*af << 1) + 2] += *ipitch; }/* Make Energy window be phase-synchronous. */ ephase = TRUE_;/* Case 3 */ } else { awin[(*af << 1) + 1] = vwin[(*af << 1) + 1]; awin[(*af << 1) + 2] = vwin[(*af << 1) + 2]; ephase = FALSE_; }/* RMS is computed over an integer number of pitch periods in the analysis *//*window. When it is not placed phase-synchronously, it is placed as close*//* as possible to onsets. */ j = (awin[(*af << 1) + 2] - awin[(*af << 1) + 1] + 1) / *ipitch * *ipitch; if (j == 0 || ! winv) { ewin[(*af << 1) + 1] = vwin[(*af << 1) + 1]; ewin[(*af << 1) + 2] = vwin[(*af << 1) + 2]; } else if (! ephase && *obound == 2) { ewin[(*af << 1) + 1] = awin[(*af << 1) + 2] - j + 1; ewin[(*af << 1) + 2] = awin[(*af << 1) + 2]; } else { ewin[(*af << 1) + 1] = awin[(*af << 1) + 1]; ewin[(*af << 1) + 2] = awin[(*af << 1) + 1] + j - 1; } return 0;} /* placea_ */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -