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

📄 dtw.c

📁 speech signal process tools
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * This material contains unpublished, proprietary software of  * Entropic Research Laboratory, Inc. Any reproduction, distribution,  * or publication of this work must be authorized in writing by Entropic  * Research Laboratory, Inc., and must bear the notice:  * *    "Copyright (c) 1991-1996 Entropic Research Laboratory, Inc.  *                   All rights reserved" * * The copyright notice above does not evidence any actual or intended  * publication of this source code.      * * Written by:  Bill Byrne * Checked by: * Revised by: * * Brief description: * This program computes the dynamic time warping distance between two * sequences read from FEA files. */static char *sccs_id = "@(#)dtw.c	1.6	1/21/97	ERL";#include <stdio.h>#include <math.h>#include <esps/esps.h> #include <esps/fea.h>#include <esps/vq.h>#include <esps/spsassert.h>#include <esps/limits.h>#define PROG "dtw"#define VERSION "1.6"#define DATE "1/21/97"#define REQUIRE(test, text) {if (!(test)) { \  (void) fprintf(stderr, "%s: %s  Exiting.\n", PROG, text); \  exit(1);}}#define SYNTAX {\fprintf(stderr, "%s: dynamic time warp distance between two FEA files.\n", PROG); \fprintf(stderr,"usage: %s [options] reference test [results]\n", PROG);\fprintf(stderr, " -P parameter file (default: params)\n");\fprintf(stderr, " -f sequence_fieldname (default: spec_param)\n");\fprintf(stderr, " -b best_so_far (default: 0)\n"); \fprintf(stderr, " -d delta (default: 0)\n"); \fprintf(stderr, " -c cbk_fea_vq\n"); \fprintf(stderr, " -r cbk_recno\n"); \fprintf(stderr, " -t distance_table_fieldname \n"); \fprintf(stderr, " -x debug_level (default: 0) \n");\exit(1);}		    #define Fprintf (void)fprintf#define Sprintf (void)sprintf/* global declarations */int debug_level=0;main(argc, argv)int argc;char **argv;{    extern char      *optarg;    extern int       optind;    int              opt;    char             *param_file = NULL;    char             *fieldname=NULL;    char             *vfieldname = "spec_param";     char             *ifieldname = "spec_param_cwndx";     int              fieldname_flag=0;    int              debug_level_flag=0;    int              delta_flag=0;    long             delta=0;    double           best_so_far=DBL_MAX;    int              best_so_far_flag=0;    int              results_flag=0;    double           dist;    long             *mapping=NULL;    int              i, j, k;    long             dim;    float            *fptr;    long             *lptr;    double           *dptr;    double           *dist_ptr;    long             *map_ptr;    FILE             *tbl_fp;    char             *tbl_fname=NULL;    char             *tbl_fieldname = "distance_table";    int              tflag=0;    int              rflag=0;    int              cflag=0;	/* if set, expect sequences of integers */    long             tbl_recno = LONG_MAX;    struct header    *tbl_hd;    struct vqcbk     *tbl_rec;    double           **distances=NULL;    double           *fea_dist_ptr;    int              cbk_dim=0;    FILE             *ref_fp;    char             *ref_fname=NULL;    struct header    *ref_hd;    struct fea_data  *ref_rec;    float            **ref_seq_v;    long             *ref_seq_l;    long             ref_ndrec;    FILE             *test_fp;    char             *test_fname=NULL;    struct header    *test_hd;    struct fea_data  *test_rec;    float            **test_seq_v;    long             *test_seq_l;    long             test_ndrec;    FILE             *res_fp;    char             *res_fname;    struct header    *res_hd;    struct fea_data  *res_rec;    long	     n_rec();    double           dtw_l2();    double           dtw_tl();    double           euclidean_dist();    double           table_lookup();    double           atof();    int              atoi();    long             get_fea_siz();    char             *get_cmd_line();    char             *strcpy();    char             *get_fea_ptr();    struct fea_data  *allo_fea_rec();#if !defined(IBM_RS6000) && !defined(DEC_ALPHA)    char             *calloc();    int              fprintf();    void             exit();#endif    int              getopt();    double           **d_mat_alloc();    float            **f_mat_alloc();    void             free_fea_rec();    while ( (opt = getopt(argc, argv,"P:f:b:d:t:c:r:x:")) != EOF )      switch(opt) {      case 'P': param_file = optarg;	break;      case 'b': best_so_far = atof(optarg);	REQUIRE(best_so_far>=0.0, "best_so_far must be positive.");	best_so_far_flag++;	break;      case 'd': delta = atoi(optarg);	REQUIRE(delta>=0, "delta must be positive.");	delta_flag++;	break;      case 'f': fieldname = optarg;	fieldname_flag++;	break;      case 'c':         tbl_fname = optarg;        cflag++;        break;      case  'r':        tbl_recno  = atoi(optarg);        rflag++;        break;      case 't' :	tbl_fieldname = optarg;        tflag++;        break;      case 'x': debug_level=atoi(optarg);	debug_level_flag++;	break;    }    /* process parameters */    (void) read_params(param_file, SC_NOCOMMON, (char *)NULL);    if ( debug_level_flag == 0 && symtype("debug_level") != ST_UNDEF )      debug_level = getsym_i("debug_level");    if ( fieldname_flag == 0 && symtype("sequence_field") != ST_UNDEF ) {      fieldname = getsym_s("sequence_field");      fieldname_flag++;    }    if ( delta_flag == 0 && symtype("delta") != ST_UNDEF )      delta = getsym_i("delta");    if ( best_so_far_flag == 0 && symtype("best_so_far") != ST_UNDEF ) {      best_so_far = getsym_d("best_so_far");      best_so_far_flag++;    }    if ( tflag == 0 && symtype("distance_fieldname") != ST_UNDEF )      tbl_fieldname = getsym_s("distance_fieldname");    if ( rflag == 0 && symtype("distance_recno") != ST_UNDEF )      tbl_recno = getsym_i("distance_table_recno");    if ( cflag == 0 && symtype("distance_table_file") != ST_UNDEF ) {	tbl_fname = getsym_s("distance_table_file");	cflag++;    }    if ( !fieldname_flag ) {	if (cflag)	    fieldname = ifieldname;	else	    fieldname = vfieldname;    }    /* get distance table */    if (cflag)    {	if (debug_level)	    Fprintf(stderr, "%s: Getting distance table from file %s.\n",		    PROG, tbl_fname);	(void) eopen(PROG, tbl_fname, "r", FT_FEA, FEA_VQ, &tbl_hd, &tbl_fp);	tbl_rec = allo_vqfea_rec(tbl_hd);	if (tbl_recno == LONG_MAX && tbl_hd->common.ndrec != -1)	    tbl_recno = tbl_hd->common.ndrec;	if (tbl_recno != LONG_MAX)	{	    fea_skiprec(tbl_fp, tbl_recno - 1, tbl_hd);	    REQUIRE(get_vqfea_rec(tbl_rec, tbl_hd, tbl_fp) != EOF,		    "Premature end of file in FEA_VQ distortion file.");	}	else	/* Read records to find the last. */	{	    struct vqcbk	*next_rec, *tmp_rec;	    next_rec = allo_vqfea_rec(tbl_hd);		    REQUIRE(get_vqfea_rec(tbl_rec, tbl_hd, tbl_fp) != EOF,		    "EOF when trying to read first distortion record.");	    while (get_vqfea_rec(next_rec, tbl_hd, tbl_fp) != EOF)	    {		tmp_rec = tbl_rec;		tbl_rec = next_rec;		next_rec = tmp_rec;	    }	    free_fea_rec(tmp_rec->fea_rec);	}	fea_dist_ptr =	    (double *) get_fea_ptr(tbl_rec->fea_rec, tbl_fieldname, tbl_hd);	REQUIRE(fea_dist_ptr != NULL,		"can't get field distance_table from distance file.");		cbk_dim = *tbl_rec->current_size;	if (debug_level>1)	    Fprintf(stderr, "%s: codebook dimension %d.\n", PROG, cbk_dim);	distances = d_mat_alloc( (unsigned) cbk_dim, (unsigned) cbk_dim);	REQUIRE(distances != NULL, "can't allocate memory table.");	for (i = 0; i < cbk_dim; i++)	    for (j = 0; j < cbk_dim; j++)		distances[i][j] = fea_dist_ptr[i*cbk_dim + j];	fclose(tbl_fp);	free_fea_rec(tbl_rec->fea_rec);    }    /* open reference file */    if (optind < argc) {      REQUIRE(strcmp(argv[optind],"-")!=0, "standard input not allowed.");      ref_fname =	eopen(PROG, argv[optind++], "r", FT_FEA, NONE, &ref_hd, &ref_fp);    }    else {	Fprintf(stderr, "%s: no reference filename specified.\n", PROG);	SYNTAX;    }    if (debug_level)	Fprintf(stderr, "%s: reference file: %s\n", PROG, ref_fname);    /* open test file */    if (optind < argc) {      REQUIRE(strcmp(argv[optind],"-")!=0, "standard input not allowed.");            test_fname =	eopen(PROG, argv[optind++], "r", FT_FEA, NONE, &test_hd, &test_fp);    }    else {	Fprintf(stderr, "%s: no test filename specified.\n", PROG);	SYNTAX    }    if (debug_level)	Fprintf(stderr, "%s: test file: %s\n", PROG, test_fname);    if (optind < argc) {	results_flag++;	res_fname = argv[optind++];

⌨️ 快捷键说明

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