vector.h

来自「CMU大名鼎鼎的SPHINX-3大词汇量连续语音识别系统」· C头文件 代码 · 共 382 行

H
382
字号
/* ==================================================================== * Copyright (c) 1999-2004 Carnegie Mellon University.  All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer.  * * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in *    the documentation and/or other materials provided with the *    distribution. * * This work was supported in part by funding from the Defense Advanced  * Research Projects Agency and the National Science Foundation of the  * United States of America, and the CMU Sphinx Speech Consortium. * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND  * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * *//* * vector.h -- vector routines. *  * ********************************************** * CMU ARPA Speech Project * * Copyright (c) 1997 Carnegie Mellon University. * ALL RIGHTS RESERVED. * ********************************************** *  * HISTORY *  * 10-Mar-1999	M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University. * 		Added vector_accum(), vector_vqlabel(), and vector_vqgen(). *  * 09-Mar-1999	M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University. * 		Added vector_is_zero(), vector_cmp(), and vector_dist_eucl(). * 		Changed the name vector_dist_eval to vector_dist_maha. *  * 30-Dec-95	M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University. * 		Created from Eric Thayer's version. */#ifndef _S3_VECTOR_H_#define _S3_VECTOR_H_/** \file vector.h    \brief operation on Vector */#include <s3types.h>#include <stdio.h>#ifdef __cplusplusextern "C" {#endiftypedef float32 *vector_t;/* Why do these belong here?? */typedef struct {    int32 r;		/* #rows, */    int32 c;		/* #cols in an array */} arraysize_t;typedef struct {    int32 x;		/* x-coordinate, */    int32 y;		/* y-coordinate of a point */} point_t;typedef struct {    float32 x;		/* x-coordinate, */    float32 y;		/* y-coordinate of a point */} fpoint_t;		/* Like point_t, but with float32 values */  /** * The reason for some of the "trivial" routines below is that they could be OPTIMIZED for SPEED * at some point. */  /** Floor all elements of v[0..dim-1] to min value of f */void vector_floor(vector_t v, int32 dim, float64 f);  /** Floor all non-0 elements of v[0..dim-1] to min value of f */void vector_nz_floor(vector_t v, int32 dim, float64 f);  /** Normalize the vector. */int32 vector_normalize(vector_t v, uint32 dim);  /** * Normalize the elements of the given vector so that they sum to 1.0.  If the sum is 0.0 * to begin with, the vector is left untouched.  Return value: The normalization factor. */float64 vector_sum_norm(vector_t v, int32 dim);  /** Print vector in one line, in %11.4e format, terminated by newline */void vector_print(FILE *fp, vector_t v, int32 dim);  /** Return TRUE iff given vector is all 0.0 */int32 vector_is_zero (float32 *vec,	/** In: Vector to be checked */		      int32 len);	/** In: Length of above vector */  /** * Search for the max or min valued component in the given vector.  The vector length must be * strictly > 0 (val[] must have at least one valid value).  If more than one component * qualifies, the first one is chosen. * Return value: the INDEX of the selected val[] component (not the value itself). */int32 vector_maxcomp_int32 (int32 *val, int32 len);int32 vector_mincomp_int32 (int32 *val, int32 len);int32 vector_maxcomp_float32 (float32 *val, int32 len);int32 vector_mincomp_float32 (float32 *val, int32 len);  /** Accumulate src into dst */void vector_accum (float32 *dst,	/** In/Out: dst[i] += src[i] */		   float32 *src,	/** In: See above */		   int32 len);		/** In: Length of above vectors */  /** * Compare the two given vectors.  Return -1, 0, or +1 depending on v1 <, =, or > v2 (as * determined by the earliest unequal component). */int32 vector_cmp (float32 *v1, float32 *v2,	/** In: Vectors to be compared */		  int32 len);		/** In: Length of each vector */  /** * Compute the mean vector from the given set of vector data. * Return value: 0 if successful, -1 if any error (there shouldn't be any error). */int32 vector_mean (float32 *mean,	/** Out: Computed mean; caller should allocate					   this memory */		   float32 **data,	/** In: Set of data over which mean is computed */		   int32 n_vec,		/** In: #Vectors in data */		   int32 n_dim);	/** In: Dimensionality of each vector (and mean) */  /** * Return the Euclidean distance (actually, distance^2) between the two given vectors. */float64 vector_dist_eucl (float32 *v1, float32 *v2,	/** In: The two input vectors */			  int32 len);	/** In: Length of each vector */  /** * Given a Gaussian density with mean vector m and diagonal variance vector v, and some * input vector x, all of length n, the Mahalanobis distance of x from the Gaussian mean m * is given by: *     {1/sqrt((2pi)^n * det(v))} * exp{-Sum((x[i] - m[i])^2 / (2v[i]))} * To speed up this evaluation, the first sub-expression ({1/sqrt...}) can be precomputed at * initialization, and so can 1/2v[i] in the second sub-expression.  Secondly, recognition * systems work with log-likelihood values, so these distances or likelihood values are * computed in log-domain. *  * Carry out the above precomputations on the given variance vector; update var with 1/2var IN * PLACE, and return the value of the first sub-expression as a log value.  (The variance values * are assumed to be strictly > 0.0. */float64vector_maha_precomp (float32 *var,	/** In/Out: Variance vector, modified to 1/2var */		     int32 len);	/** In: Length of the above vector */  /** * Mahalanobis distance, using some precomputed portions of variance and determinant. * (Actually not "distance" at all, but Gaussian density value.) * Computed in log domain. * Return value: logbase-e(likelihood value). */float64vector_dist_maha (float32 *vec,		/** In: Vector for which distance from mean					   being computed */		  float32 *mean,	/** In: Mean vector */		  float32 *varinv,	/** In: Variance vector, modified according to					   vector_maha_precomp() */		  float64 norm,		/** In: Normalization factor computed by					   vector_maha_precomp() */		  int32 len);		/** In: Length of each vector involved */  /** * Generate a vector quantized table for the input data, using the K-means algorithm, and the * Euclidean distance measure. * Return value: The squared quantization error of the final result. */float64 vector_vqgen (float32 **data,	/** In: Input Data to be quantized */		      int32 rows,	/** In: #Rows in input data */		      int32 cols,	/** In: #Cols in input data (and output VQ table) */		      int32 vqrows,	/** In: #Rows in vector quantized result */		      float64 epsilon,	/** In: Convergence limit; stop k-means iterations when					   the relative reduction in total squared error in					   successive iterations ((sqerr[t]-sqerr[t+1])/sqerr[t])					   is below this value. */		      int32 maxiter,	/** In: Max #iterations, regardless of convlimit */		      float32 **mean,	/** Out: Vector quantized array of centroids.  Caller					   must allocate this array */		      int32 *map,       /** Out: data->mean mapping; mean[map[i]] is the closest					   quantized vector corresponding to the input vector					   data[i].  Caller must allocate this array */		      int32 seed);      /** In : The seed for a random generator					   if it is smaller than 0, use the internal					   mechanism to generate seed. 					   else use the seed to seed the random					   generator.					 */  /** * Find the entry (row) of mean that is closest (according to Euclidean distance) to vec. * Return value: index of the selected row. */int32 vector_vqlabel (float32 *vec,	/** In: Vector to be compared against VQ table */		      float32 **mean,	/** In: Table of centroids */		      int32 rows,	/** In: #Rows in mean */		      int32 cols,	/** In: #Cols in mean (and vec) */		      float64 *sqerr);	/** Out: Squared error (distance) between vec and the					   selected codeword.  May be NULL if not needed. */  /** * Treat the given vector as a PDF and compute its entropy (-sum(p * log2(p))).  (The PDF values * must be >= 0.0, of course.)  The zero elements of the PDF are skipped. */float64 vector_pdf_entropy (float32 *p,	/** In: Vector (PDF) whose entropy is to be computed */			    int32 len);	/** In: Length of p[] */  /** * Return cross-entropy of two PDFs; like vector_entropy, but (-sum(p1 * log2(p2))).  (The PDF * values must be >= 0.0, of course.)  The zero elements of p2 are skipped. */float64 vector_pdf_cross_entropy (float32 *p1,				  float32 *p2,	/** In: Zero elements of p2 are skipped */				  int32 len);  /** * Generic table of individual Gaussian vectors, with diagonal co-variance matrices (i.e., * only the diagonal is maintained, as a vector). */typedef struct {    int32 n_gau;	/** #Gaussians in table */    int32 veclen;	/** Vector length */    float32 **mean;	/** n_cw x veclen mean values */    float32 **var;	/** n_cw x veclen corresponding (diagonal) variance values */    float32 *lrd;	/** Log(Reciprocal(Determinant(Co-var. matrix))) */    float64 distfloor;	/** When Mahalanobis distance values are converted to logs3 domain, the			   int32 result can underflow.  To avoid this, floor before conversion */} vector_gautbl_t;  /** * The obvious allocation and free routines for vector_gautbl_t.{mean,var,lrd}.  Also sets * gautbl->{n_mgau, veclen, distfloor}; the last to the equivalent of S3_LOGPROB_ZERO. */void vector_gautbl_alloc (vector_gautbl_t *gautbl,			  int32 n_gau, int32 veclen);void vector_gautbl_free (vector_gautbl_t *gautbl);  /** * Floor all the variance values in the given Gaussians table. */void vector_gautbl_var_floor (vector_gautbl_t *gautbl,	/** In/Out: Table to be updated */			      float64 floor);		/** In: Floor value */  /** * Carry out the vector_maha_precomp, above, over all the Gaussians in the given table, updating * gau->lrd[] as a result.  The needed memory must have been already allocated by the caller. */void vector_gautbl_maha_precomp (vector_gautbl_t *gau);  /** * Compare the input vector to the given range of subvector codewords in the given codebook, * Enter the computed Mahalanobis distances, converted into logs3 values, into the given score * array.  (Why bother with the {offset,count} range??  For "blocking" such computation so that * cache behaviour is improved.) */voidvector_gautbl_eval_logs3 (vector_gautbl_t *gau,	/** In: Table of Gaussians */			  int32 offset,	/** In: First VQ codeword in the range to be evaluated */			  int32 count,	/** In: #Codewords to be evaluated (range size) */			  float32 *x,	/** In: Input vector being compared to codewords */			  int32 *scr);	/** Out: Mahalanobis distance scores (logs3 values).					   Caller must allocate this array.  Note that only					   score[offset..offset+count-1] are updated. */#ifdef __cplusplus}#endif#endif /* VECTOR_H */ /* * Log record.  Maintained by RCS. * * $Log: vector.h,v $ * Revision 1.11  2004/12/06 10:52:01  arthchan2003 * Enable doxygen documentation in libs3decoder * * Revision 1.10  2004/12/05 12:01:31  arthchan2003 * 1, move libutil/libutil.h to s3types.h, seems to me not very nice to have it in every files. 2, Remove warning messages of main_align.c 3, Remove warning messages in chgCase.c * * Revision 1.9  2004/11/16 05:13:18  arthchan2003 * 1, s3cipid_t is upgraded to int16 because we need that, I already check that there are no magic code using 8-bit s3cipid_t * 2, Refactor the ep code and put a lot of stuffs into fe.c (should be renamed to something else. * 3, Check-in codes of wave2feat and cepview. (cepview will not dump core but Evandro will kill me) * 4, Make the same command line frontends for decode, align, dag, astar, allphone, decode_anytopo and ep . Allow the use a file to configure the application. * 5, Make changes in test such that test-allphone becomes a repeatability test. * 6, cepview, wave2feat and decode_anytopo will not be installed in 3.5 RCIII * (Known bugs after this commit) * 1, decode_anytopo has strange bugs in some situations that it cannot find the end of the lattice. This is urgent. * 2, default argument file's mechanism is not yet supported, we need to fix it. * 3, the bug discovered by SonicFoundry is still not fixed. * * Revision 1.8  2004/11/13 21:25:19  arthchan2003 * commit of 1, absolute CI-GMMS , 2, fast CI senone computation using svq, 3, Decrease the number of static variables, 4, fixing the random generator problem of vector_vqgen, 5, move all unused files to NOTUSED * * Revision 1.7  2004/09/13 08:13:26  arthchan2003 * update copyright notice from 200x to 2004 * * Revision 1.6  2004/07/27 21:53:05  yitao * * weird.  i only changed kb.c to fix a small bug.  why so many changes? * * Revision 1.5  2004/07/21 06:12:47  arthchan2003 * add precompiler directive __cplusplus to all header files * * Revision 1.2  2004/07/21 05:11:46  archan * all sphinx 3.4 files with proper extern C headers * * Revision 1.1  2004/07/15 08:21:19  archan * All header files for sphinx3.4 * * Revision 1.4  2004/05/27 22:47:43  arthchan2003 * Sphinx 3.4 code commit * * Revision 1.3  2004/03/11 21:47:57  archan * Check-in code for dynamic LM and fixes in Gaussian Selection. Temporarily cover J's change. Waiting for more stable code * * Revision 1.3  2001/12/11 04:40:56  lenzo * License cleanup. * * Revision 1.2  2001/12/04 02:57:47  egouvea * Merged memory leak fixes from RAH  (egouvea@cs.cmu.edu) * * Revision 1.1.1.1  2001/01/17 05:17:15  ricky * Initial Import of the s3.3 decoder, has working decodeaudiofile, s3.3_live * * Revision 1.1.1.1  2000/02/28 18:05:54  rkm * Imported Sources * * Revision 1.1.1.1  1999/11/23 20:24:18  rkm * imported sources * * Revision 1.2  1995/10/09  20:55:35  eht * Changes for prim_type.h * * Revision 1.1  1995/08/15  13:44:14  eht * Initial revision * * */

⌨️ 快捷键说明

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