Main Page | Modules | Data Structures | Directories | File List | Data Fields | Globals | Related Pages

wav2mfcc.c

Go to the documentation of this file.
00001 
00045 /*
00046  * Copyright (c) 1991-2006 Kawahara Lab., Kyoto University
00047  * Copyright (c) 2000-2005 Shikano Lab., Nara Institute of Science and Technology
00048  * Copyright (c) 2005-2006 Julius project team, Nagoya Institute of Technology, Nagoya Institute of Technology
00049  * All rights reserved
00050  */
00051 
00052 #include <julius.h>
00053 
00054 #include <sys/stat.h>
00055 
00056 /* make MFCC_E_D_N_Z from speech[0..speechlen-1] and returns
00057    newly malloced param */
00058 
00071 void
00072 init_para(Value *para)
00073 {
00074   para->smp_period = smpPeriod;
00075   para->framesize  = fsize;
00076   para->frameshift = fshift;
00077   para->preEmph    = preemph;
00078   para->mfcc_dim   = model_mfcc_dim;
00079   para->lifter     = ceplifter;
00080   para->delWin     = delwin;
00081   para->accWin     = accwin;
00082   para->hipass     = hipass;
00083   para->lopass     = lopass;
00084   para->c0         = c0_required;
00085   para->fbank_num  = fbank_num;
00086   para->ss_alpha   = ssalpha;
00087   para->ss_floor   = ssfloor;
00088   para->cmn        = cmn_required;
00089   para->raw_e      = rawe_required;
00090   para->zmeanframe = zmean_frame;
00091   para->enormal    = enormal_required;
00092   /* para->escale     = DEF_ESCALE; */
00093   para->escale     = enormal_escale;
00094   para->silFloor   = enormal_silfloor;
00095 
00096   para->delta = delta_required;
00097   para->acc   = acc_required;
00098   para->energy = energy_required;
00099   para->absesup = abs_energy_suppress;
00100 
00101   /* determine base size */
00102   para->baselen = para->mfcc_dim + (para->c0 ? 1 : 0) + (para->energy ? 1 : 0);
00103   /* determine maximim size of parameter vector for temporal buffer */
00104   para->vecbuflen = para->baselen * (1 + (para->delta ? 1 : 0) + (para->acc ? 1 : 0));
00105   /* determine final size of parameter vector */
00106   para->veclen = para->vecbuflen - (para->absesup ? 1 : 0);
00107 }
00108 
00129 HTK_Param *new_wav2mfcc(SP16 speech[], int speechlen)
00130 {
00131   HTK_Param *param;
00132   Value para;                   /* parameters for Wav2MFCC */
00133   int framenum;
00134   int i;
00135   int len;
00136 
00137   /* set parameters */
00138   init_para(&para);
00139 
00140   if (ssload_filename && ssbuf == NULL) {
00141     /* load noise spectrum for spectral subtraction from file (once) */
00142     if ((ssbuf = new_SS_load_from_file(ssload_filename, &sslen)) == NULL) {
00143       j_error("Error: failed to read \"%s\"\n", ssload_filename);
00144     }
00145   }
00146 
00147   if (sscalc) {
00148     /* compute noise spectrum from head silence for each input */
00149     len = sscalc_len * smpFreq / 1000;
00150     if (len > speechlen) len = speechlen;
00151 #ifdef SSDEBUG
00152     printf("[%d]\n", len);
00153 #endif
00154     ssbuf = new_SS_calculate(speech, len, para, &sslen);
00155   }
00156 #ifdef SSDEBUG
00157   {
00158     int i;
00159     for(i=0;i<sslen;i++) {
00160       printf("%d: %f\n", i, ssbuf[i]);
00161     }
00162   }
00163 #endif
00164   
00165   /* calculate frame length from speech length, frame size and frame shift */
00166   framenum = (int)((speechlen - para.framesize) / para.frameshift) + 1;
00167   if (framenum < 1) {
00168     j_printerr("input too short (%d samples), ignored\n", speechlen);
00169     return NULL;
00170   }
00171   
00172   /* malloc new param */
00173   param = new_param();
00174   param->parvec = (VECT **)mymalloc(sizeof(VECT *) * framenum);
00175   for(i=0;i<framenum;i++) {
00176     param->parvec[i] = (VECT *)mymalloc(sizeof(VECT) * para.veclen);
00177   }
00178 
00179   /* make MFCC from speech data */
00180   Wav2MFCC(speech, param->parvec, para, speechlen, ssbuf, sslen);
00181 
00182   /* set miscellaneous parameters */
00183   param->header.samplenum = framenum;
00184   param->header.wshift = para.smp_period * para.frameshift;
00185   param->header.sampsize = para.veclen * sizeof(VECT); /* not compressed */
00186   param->header.samptype = F_MFCC;
00187   if (para.delta) param->header.samptype |= F_DELTA;
00188   if (para.acc) param->header.samptype |= F_ACCL;
00189   if (para.energy) param->header.samptype |= F_ENERGY;
00190   if (para.c0) param->header.samptype |= F_ZEROTH;
00191   if (para.absesup) param->header.samptype |= F_ENERGY_SUP;
00192   if (para.cmn) param->header.samptype |= F_CEPNORM;
00193   param->veclen = para.veclen;
00194   param->samplenum = framenum;
00195 
00196   return param;
00197 }
00198 

Generated on Tue Mar 28 16:01:39 2006 for Julius by  doxygen 1.4.2