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

📄 vparms.c

📁 10阶LPC编解码及源程序
💻 C
字号:
/*$Log: vparms.c,v $Revision 1.1.1.1  2001/11/19 19:50:17  smorlatFirst cvs.Revision 1.1.1.1  2001/08/08 21:29:08  simonFirst import * Revision 1.1  1996/08/19  22:30:04  jaf * Initial revision **/#ifdef P_R_O_T_O_T_Y_P_E_Sextern int vparms_(integer *vwin, real *inbuf, real *lpbuf, integer *buflim, integer *half, real *dither, integer *mintau, integer *zc, integer *lbe, integer *fbe, real *qs, real *rc1, real *ar_b__, real *ar_f__);#endif/*  -- translated by f2c (version 19951025).   You must link the resulting object file with the libraries:	-lf2c -lm   (in that order)*/#include "f2c.h"/* Table of constant values */static real c_b2 = 1.f;/* ********************************************************************* *//* 	VPARMS Version 50 *//* $Log: vparms.c,v $/* Revision 1.1.1.1  2001/11/19 19:50:17  smorlat/* First cvs./*/* Revision 1.1.1.1  2001/08/08 21:29:08  simon/* First import/* * Revision 1.1  1996/08/19  22:30:04  jaf * Initial revision * *//* Revision 1.6  1996/03/29  18:01:16  jaf *//* Added some more comments about the range of INBUF and LPBUF that can *//* be read.  Note that it is possible for index VWIN(2)+1 to be read from *//* INBUF, which might be outside of its defined range, although that will *//* require more careful checking. *//* Revision 1.5  1996/03/19  00:02:02  jaf *//* I just noticed that the argument DITHER is modified inside of this *//* subroutine.  Comments were added explaining the possible final values. *//* Revision 1.4  1996/03/18  22:22:59  jaf *//* Finishing the job I said I did with the last check-in comments. *//* Revision 1.3  1996/03/18  22:22:17  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  15:02:58  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:50:42  jaf *//* Initial revision *//* ********************************************************************* *//*  Calculate voicing parameters: *//* Input: *//*  VWIN   - Voicing window limits *//*           Indices 1 through 2 read. *//*  INBUF  - Input speech buffer *//*           Indices START-1 through STOP read, *//*          where START and STOP are defined in the code (only written once).*//*           Note that STOP can be as large as VWIN(2)+1 ! *//*  LPBUF  - Low pass filtered speech *//*           Indices START-MINTAU through STOP+MINTAU read, *//*          where START and STOP are defined in the code (only written once).*//*  BUFLIM - Array bounds for INBUF and LPBUF *//*           Indices 1 through 4 read. *//*  HALF   - Half frame (1 or 2) *//*  MINTAU - Lag corresponding to minimum AMDF value (pitch estimate) *//* Input/Output: *//*  DITHER - Zero crossing threshold *//*           The resulting value might be the negation of the input *//*           value.  It might always be the same as the input value, *//*           if the DO loop below always executes an even number of times. *//* Output: (all of them are written on every call) *//*  ZC     - Zero crossing rate *//*  LBE    - Low band energy (sum of magnitudes - SM) *//*  FBE    - Full band energy (SM) *//*  QS     - Ratio of 6 dB/oct preemphasized energy to full band energy *//*  RC1    - First reflection coefficient *//*  AR_B   - Product of the causal forward and reverse pitch *//*           prediction gains *//*  AR_F   - Product of the noncausal forward and reverse pitch *//*           prediction gains *//* Internal: *//*  OLDSGN - Previous sign of dithered signal *//*  VLEN   - Length of voicing window *//*  START  - Lower address of current half of voicing window *//*  STOP   - Upper address of current half of voicing window *//*  E_0    - Energy of LPF speech (sum of squares - SS) *//*  E_B    - Energy of LPF speech backward one pitch period (SS) *//*  E_F    - Energy of LPF speech forward one pitch period (SS) *//*  R_B    - Autocovariance of LPF speech backward one pitch period *//*  R_F    - Autocovariance of LPF speech forward one pitch period *//*  LP_RMS - Energy of LPF speech (sum of magnitudes - SM) *//*  AP_RMS - Energy of all-pass speech (SM) *//*  E_PRE  - Energy of 6dB preemphasized speech (SM) *//*  E0AP   - Energy of all-pass speech (SS) *//* This subroutine has no local state. *//* Subroutine */ int vparms_(integer *vwin, real *inbuf, real *lpbuf, integer 	*buflim, integer *half, real *dither, integer *mintau, integer *zc, 	integer *lbe, integer *fbe, real *qs, real *rc1, real *ar_b__, real *	ar_f__){    /* System generated locals */    integer inbuf_offset, lpbuf_offset, i__1;    real r__1, r__2;    /* Builtin functions */    double r_sign(real *, real *);    integer i_nint(real *);    /* Local variables */    integer vlen, stop, i__;    real e_pre__;    integer start;    real ap_rms__, e_0__, oldsgn, lp_rms__, e_b__, e_f__, r_b__, r_f__, e0ap;/*       Arguments *//*       Local variables that need not be saved *//*   Calculate zero crossings (ZC) and several energy and correlation *//*   measures on low band and full band speech.  Each measure is taken *//*   over either the first or the second half of the voicing window, *//*   depending on the variable HALF. */    /* Parameter adjustments */    --vwin;    --buflim;    lpbuf_offset = buflim[3];    lpbuf -= lpbuf_offset;    inbuf_offset = buflim[1];    inbuf -= inbuf_offset;    /* Function Body */    lp_rms__ = 0.f;    ap_rms__ = 0.f;    e_pre__ = 0.f;    e0ap = 0.f;    *rc1 = 0.f;    e_0__ = 0.f;    e_b__ = 0.f;    e_f__ = 0.f;    r_f__ = 0.f;    r_b__ = 0.f;    *zc = 0;    vlen = vwin[2] - vwin[1] + 1;    start = vwin[1] + (*half - 1) * vlen / 2 + 1;    stop = start + vlen / 2 - 1;/* I'll use the symbol HVL in the table below to represent the value *//* VLEN/2.  Note that if VLEN is odd, then HVL should be rounded down, *//* i.e., HVL = (VLEN-1)/2. *//* HALF  START          STOP *//* 1     VWIN(1)+1      VWIN(1)+HVL *//* 2     VWIN(1)+HVL+1  VWIN(1)+2*HVL *//* Note that if VLEN is even and HALF is 2, then STOP will be *//* VWIN(1)+VLEN = VWIN(2)+1.  That could be bad, if that index of INBUF *//* is undefined. */    r__1 = inbuf[start - 1] - *dither;    oldsgn = r_sign(&c_b2, &r__1);    i__1 = stop;    for (i__ = start; i__ <= i__1; ++i__) {	lp_rms__ += (r__1 = lpbuf[i__], abs(r__1));	ap_rms__ += (r__1 = inbuf[i__], abs(r__1));	e_pre__ += (r__1 = inbuf[i__] - inbuf[i__ - 1], abs(r__1));/* Computing 2nd power */	r__1 = inbuf[i__];	e0ap += r__1 * r__1;	*rc1 += inbuf[i__] * inbuf[i__ - 1];/* Computing 2nd power */	r__1 = lpbuf[i__];	e_0__ += r__1 * r__1;/* Computing 2nd power */	r__1 = lpbuf[i__ - *mintau];	e_b__ += r__1 * r__1;/* Computing 2nd power */	r__1 = lpbuf[i__ + *mintau];	e_f__ += r__1 * r__1;	r_f__ += lpbuf[i__] * lpbuf[i__ + *mintau];	r_b__ += lpbuf[i__] * lpbuf[i__ - *mintau];	r__1 = inbuf[i__] + *dither;	if (r_sign(&c_b2, &r__1) != oldsgn) {	    ++(*zc);	    oldsgn = -oldsgn;	}	*dither = -(*dither);    }/*   Normalized short-term autocovariance coefficient at unit sample delay */    *rc1 /= max(e0ap,1.f);/*  Ratio of the energy of the first difference signal (6 dB/oct preemphasis)*//*   to the energy of the full band signal *//* Computing MAX */    r__1 = ap_rms__ * 2.f;    *qs = e_pre__ / max(r__1,1.f);/*   aR_b is the product of the forward and reverse prediction gains, *//*   looking backward in time (the causal case). */    *ar_b__ = r_b__ / max(e_b__,1.f) * (r_b__ / max(e_0__,1.f));/*  aR_f is the same as aR_b, but looking forward in time (non causal case).*/    *ar_f__ = r_f__ / max(e_f__,1.f) * (r_f__ / max(e_0__,1.f));/*   Normalize ZC, LBE, and FBE to old fixed window length of 180. *//*   (The fraction 90/VLEN has a range of .58 to 1) */    r__2 = (real) (*zc << 1);    r__1 = r__2 * (90.f / vlen);    *zc = i_nint(&r__1);/* Computing MIN */    r__1 = lp_rms__ / 4 * (90.f / vlen);    i__1 = i_nint(&r__1);    *lbe = min(i__1,32767);/* Computing MIN */    r__1 = ap_rms__ / 4 * (90.f / vlen);    i__1 = i_nint(&r__1);    *fbe = min(i__1,32767);    return 0;} /* vparms_ */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -