mirror of
https://github.com/signalwire/freeswitch.git
synced 2025-08-13 09:36:46 +00:00
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@125 d0543943-73ff-0310-b7d9-9358b9ac24b2
This commit is contained in:
242
libs/codec/lpc10/placea.c
Normal file
242
libs/codec/lpc10/placea.c
Normal file
@@ -0,0 +1,242 @@
|
||||
/*
|
||||
|
||||
$Log$
|
||||
Revision 1.16 2004/06/26 03:50:14 markster
|
||||
Merge source cleanups (bug #1911)
|
||||
|
||||
Revision 1.15 2003/09/19 01:20:22 markster
|
||||
Code cleanups (bug #66)
|
||||
|
||||
Revision 1.2 2003/09/19 01:20:22 markster
|
||||
Code cleanups (bug #66)
|
||||
|
||||
Revision 1.1.1.1 2003/02/12 13:59:15 matteo
|
||||
mer feb 12 14:56:57 CET 2003
|
||||
|
||||
Revision 1.3 2001/04/12 21:27:53 markh
|
||||
app_record now supports wildcards of sort so your output file is not overwritten every time it's run. File.h got a documentation update on the ast_fileexists to include the return call. Watch out for the placea.c placev.c code, it's updates have not been tested yet. Just a few parenthesis to make it compile nicer on newer gcc versions with all the -W flags set.
|
||||
|
||||
Revision 1.2 2000/01/05 08:20:39 markster
|
||||
Some OSS fixes and a few lpc changes to make it actually work
|
||||
|
||||
* Revision 1.1 1996/08/19 22:31:07 jaf
|
||||
* Initial revision
|
||||
*
|
||||
|
||||
*/
|
||||
|
||||
/* -- translated by f2c (version 19951025).
|
||||
You must link the resulting object file with the libraries:
|
||||
-lf2c -lm (in that order)
|
||||
*/
|
||||
|
||||
#include "f2c.h"
|
||||
|
||||
#ifdef P_R_O_T_O_T_Y_P_E_S
|
||||
extern int placea_(integer *ipitch, integer *voibuf, integer *obound, integer *af, integer *vwin, integer *awin, integer *ewin, integer *lframe, integer *maxwin);
|
||||
#endif
|
||||
|
||||
/* *********************************************************************** */
|
||||
|
||||
/* PLACEA Version 48 */
|
||||
|
||||
/* $Log$
|
||||
* Revision 1.16 2004/06/26 03:50:14 markster
|
||||
* Merge source cleanups (bug #1911)
|
||||
*
|
||||
/* Revision 1.15 2003/09/19 01:20:22 markster
|
||||
/* Code cleanups (bug #66)
|
||||
/*
|
||||
/* Revision 1.2 2003/09/19 01:20:22 markster
|
||||
/* Code cleanups (bug #66)
|
||||
/*
|
||||
/* Revision 1.1.1.1 2003/02/12 13:59:15 matteo
|
||||
/* mer feb 12 14:56:57 CET 2003
|
||||
/*
|
||||
/* Revision 1.3 2001/04/12 21:27:53 markh
|
||||
/* app_record now supports wildcards of sort so your output file is not overwritten every time it's run. File.h got a documentation update on the ast_fileexists to include the return call. Watch out for the placea.c placev.c code, it's updates have not been tested yet. Just a few parenthesis to make it compile nicer on newer gcc versions with all the -W flags set.
|
||||
/*
|
||||
/* Revision 1.2 2000/01/05 08:20:39 markster
|
||||
/* Some OSS fixes and a few lpc changes to make it actually work
|
||||
/*
|
||||
* 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 star
|
||||
t. */
|
||||
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 t
|
||||
he */
|
||||
/* analysis window overlaps that, then move the analysis window backwa
|
||||
rd */
|
||||
/* 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 clos
|
||||
e*/
|
||||
/* 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_ */
|
||||
|
Reference in New Issue
Block a user