aboutsummaryrefslogtreecommitdiffstats
path: root/trunk/codecs/lpc10/placev.c
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/codecs/lpc10/placev.c')
-rw-r--r--trunk/codecs/lpc10/placev.c275
1 files changed, 275 insertions, 0 deletions
diff --git a/trunk/codecs/lpc10/placev.c b/trunk/codecs/lpc10/placev.c
new file mode 100644
index 000000000..56e72c4b8
--- /dev/null
+++ b/trunk/codecs/lpc10/placev.c
@@ -0,0 +1,275 @@
+/*
+
+$Log$
+Revision 1.15 2004/06/26 03:50:14 markster
+Merge source cleanups (bug #1911)
+
+Revision 1.14 2003/02/12 13:59:15 matteo
+mer feb 12 14:56:57 CET 2003
+
+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:02 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 placev_(integer *osbuf, integer *osptr, integer *oslen, integer *obound, integer *vwin, integer *af, integer *lframe, integer *minwin, integer *maxwin, integer *dvwinl, integer *dvwinh);
+#endif
+
+/* ****************************************************************** */
+
+/* PLACEV Version 48 */
+
+/* $Log$
+ * Revision 1.15 2004/06/26 03:50:14 markster
+ * Merge source cleanups (bug #1911)
+ *
+ * Revision 1.14 2003/02/12 13:59:15 matteo
+ * mer feb 12 14:56:57 CET 2003
+ *
+ * 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:02 jaf
+ * Initial revision
+ * */
+/* Revision 1.6 1996/03/19 20:42:19 jaf */
+/* Added some conditions satisfied by the output values in VWIN. */
+
+/* Revision 1.5 1996/03/19 18:37:56 jaf */
+/* Strengthened the specification of which indices of VWIN are read and */
+/* written. */
+
+/* Revision 1.4 1996/03/15 16:38:33 jaf */
+/* One tiny comment added. */
+
+/* Revision 1.3 1996/03/15 16:36:13 jaf */
+/* Added comments giving In/Out status of arguments. */
+
+/* Revision 1.2 1996/03/12 23:56:01 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:39 jaf */
+/* Initial revision */
+
+
+/* ****************************************************************** */
+
+/* Input: */
+/* OSBUF Buffer which holds sorted indexes of onsets */
+/* I believe that only indices 1 through OSPTR-1 can be read. */
+/* OSLEN */
+/* OSPTR Free pointer into OSBUF */
+/* AF */
+/* LFRAME */
+/* MINWIN */
+/* MAXWIN */
+/* DVWINL */
+/* DVWINH (This argument is never used. Should it be?) */
+/* Input/Output: */
+/* VWIN Buffer of Voicing Window Positions (Modified) */
+/* Index (2,AF-1) is read. */
+/* Indices (1,AF) and (2,AF) are written, */
+/* and then possibly read. */
+/* All other indices are unused. */
+/* In all cases, the final values will satsify the condition:*/
+/* VWIN(2,AF)-VWIN(1,AF)+1 .LE. MAXWIN */
+/* I'm not certain yet, but they may also satisfy: */
+/* MINWIN .LE. VWIN(2,AF)-VWIN(1,AF)+1 */
+/* Output: */
+/* 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. */
+
+/* This subroutine has no local state. */
+
+/* Subroutine */ int placev_(integer *osbuf, integer *osptr, integer *oslen,
+ integer *obound, integer *vwin, integer *af, integer *lframe, integer
+ *minwin, integer *maxwin, integer *dvwinl, integer *dvwinh)
+{
+ /* System generated locals */
+ integer i__1, i__2;
+
+ /* Local variables */
+ logical crit;
+ integer i__, q, osptr1, hrange, lrange;
+
+/* Arguments */
+/* Local variables that need not be saved */
+/* Variables */
+/* LRANGE, HRANGE Range in which window is placed */
+/* OSPTR1 OSPTR excluding samples in 3F */
+/* Local state */
+/* None */
+/* 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 constraint
+s,*/
+/* except that the window may be shortened even further to avoid overlapp
+ing*/
+/* 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 tha
+t*/
+/* 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 */
+ /* Parameter adjustments */
+ --osbuf;
+ vwin -= 3;
+
+ /* Function Body */
+/* Computing MAX */
+ i__1 = vwin[((*af - 1) << 1) + 2] + 1, i__2 = (*af - 2) * *lframe + 1;
+ lrange = max(i__1,i__2);
+ hrange = *af * *lframe;
+/* Compute OSPTR1, so the following code only looks at relevant onsets. */
+ for (osptr1 = *osptr - 1; osptr1 >= 1; --osptr1) {
+ if (osbuf[osptr1] <= hrange) {
+ goto L90;
+ }
+ }
+L90:
+ ++osptr1;
+/* Check for case 1 first (fast case): */
+ if (osptr1 <= 1 || osbuf[osptr1 - 1] < lrange) {
+/* Computing MAX */
+ i__1 = vwin[((*af - 1) << 1) + 2] + 1;
+ vwin[(*af << 1) + 1] = max(i__1,*dvwinl);
+ vwin[(*af << 1) + 2] = vwin[(*af << 1) + 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] < lrange) {
+ goto L100;
+ }
+ }
+L100:
+ ++q;
+/* Check for case 2 (placement before onset): */
+/* Check for critical region exception: */
+ i__1 = osptr1 - 1;
+ for (i__ = q + 1; i__ <= i__1; ++i__) {
+ if (osbuf[i__] - osbuf[q] >= *minwin) {
+ crit = TRUE_;
+ goto L105;
+ }
+ }
+ crit = FALSE_;
+L105:
+/* Computing MAX */
+ i__1 = (*af - 1) * *lframe, i__2 = lrange + *minwin - 1;
+ if (! crit && osbuf[q] > max(i__1,i__2)) {
+ vwin[(*af << 1) + 2] = osbuf[q] - 1;
+/* Computing MAX */
+ i__1 = lrange, i__2 = vwin[(*af << 1) + 2] - *maxwin + 1;
+ vwin[(*af << 1) + 1] = max(i__1,i__2);
+ *obound = 2;
+/* Case 3 (placement after onset) */
+ } else {
+ vwin[(*af << 1) + 1] = osbuf[q];
+L110:
+ ++q;
+ if (q >= osptr1) {
+ goto L120;
+ }
+ if (osbuf[q] > vwin[(*af << 1) + 1] + *maxwin) {
+ goto L120;
+ }
+ if (osbuf[q] < vwin[(*af << 1) + 1] + *minwin) {
+ goto L110;
+ }
+ vwin[(*af << 1) + 2] = osbuf[q] - 1;
+ *obound = 3;
+ return 0;
+L120:
+/* Computing MIN */
+ i__1 = vwin[(*af << 1) + 1] + *maxwin - 1;
+ vwin[(*af << 1) + 2] = min(i__1,hrange);
+ *obound = 1;
+ }
+ }
+ return 0;
+} /* placev_ */
+