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

📄 placea.c

📁 10阶LPC编解码及源程序
💻 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 + -