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

📄 write_binhmm.c

📁 julius version 4.12.about sound recognition.
💻 C
📖 第 1 页 / 共 2 页
字号:
/* write tmix data */static GCODEBOOK **tm_index; ///< Sorted data pointers for mapping from pointer to idstatic unsigned int tm_num;	///< Length of abovestatic unsigned int tm_idx;	///< Current index/**  * Traverse callback function to store pointers in @a tm_index. *  * @param p [in] pointer to the codebook data */static voidtmix_list_callback(void *p){  GCODEBOOK *tm;  tm = p;  tm_index[tm_idx++] = tm;}/**  * qsort callback function to sort density pointers by their * address for indexing. *  * @param tm1 [in] data 1 * @param tm2 [in] data 2 *  * @return value required for qsort. */static intqsort_tm_index(GCODEBOOK **tm1, GCODEBOOK **tm2){  if (*tm1 > *tm2) return 1;  else if (*tm1 < *tm2) return -1;  else return 0;}/**  * @brief  Write all codebook data. * * The pointers of all codebook densities are first gathered, * sorted by the address.  Then the densities are written * by the sorted order.  The pointers to the lower structure (mixture etc.) * in the data are written by the corresponding scholar id. * The pointer index of this data will be used later to convert any pointer * reference to a codebook into scholar id. *  * @param fp [in] file pointer * @param hmm [in] writing %HMM definition data  */static booleanwt_tmix(FILE *fp, HTK_HMM_INFO *hmm){  GCODEBOOK *tm;  unsigned int idx;  unsigned int did;  int i;  tm_num = hmm->codebooknum;  tm_index = (GCODEBOOK **)mymalloc(sizeof(GCODEBOOK *) * tm_num);  tm_idx = 0;  aptree_traverse_and_do(hmm->codebook_root, tmix_list_callback);  qsort(tm_index, tm_num, sizeof(GCODEBOOK *), (int (*)(const void *, const void *))qsort_tm_index);    wrt(fp, &tm_num, sizeof(unsigned int), 1);  for (idx = 0; idx < tm_num; idx++) {    tm = tm_index[idx];    wrt_str(fp, tm->name);    wrt(fp, &(tm->num), sizeof(int), 1);    for(i=0;i<tm->num;i++) {      if (tm->d[i] == NULL) {	did = dens_num;      } else {	did = search_did(tm->d[i]);	/* for debug */	if (tm->d[i] != dens_index[did]) {	  jlog("Error: write_binhmm: index not match!!!\n");	  return FALSE;	}      }      wrt(fp, &did, sizeof(unsigned int), 1);    }  }  jlog("Stat: write_binhmm: %d tied-mixture codebooks written\n", tm_num);  return TRUE;}/**  * Binary search function to convert codebook pointer to a scholar ID. *  * @param tm [in] pointer to a codebook *  * @return the corresponding scholar ID. */static unsigned intsearch_tmid(GCODEBOOK *tm){  unsigned int left = 0;  unsigned int right = tm_num - 1;  unsigned int mid;  while (left < right) {    mid = (left + right) / 2;    if (tm_index[mid] < tm) {      left = mid + 1;    } else {      right = mid;    }  }  return(left);}/* write mixture pdf data */static HTK_HMM_PDF **mpdf_index; ///< Sorted data pointers for mapping from pointer to idstatic unsigned int mpdf_num;	///< Length of above/**  * qsort callback function to sort mixture PDF pointers by their * address for indexing. *  * @param d1 [in] data 1 * @param d2 [in] data 2 *  * @return value required for qsort. */static intqsort_mpdf_index(HTK_HMM_PDF **d1, HTK_HMM_PDF **d2){  if (*d1 > *d2) return 1;  else if (*d1 < *d2) return -1;  else return 0;}/** * Write a mixture PDF. *  * @param fp [in] file pointer * @param hmm [in] writing %HMM definition data  * @param m [out] mixture PDF to be written *  * @return TRUE on success, FALSE on error. *  */static booleanwt_pdf_sub(FILE *fp, HTK_HMM_INFO *hmm, HTK_HMM_PDF *m){  unsigned int did;  int i;  short dummy;    if (hmm->is_tied_mixture) {    /* try tmix */    did = search_tmid((GCODEBOOK *)(m->b));    if ((GCODEBOOK *)m->b == tm_index[did]) {      /* tmix */      dummy = -1;      wrt(fp, &dummy, sizeof(short), 1);      wrt(fp, &did, sizeof(unsigned int), 1);    } else {      /* tmix failed -> normal mixture */      wrt(fp, &(m->mix_num), sizeof(short), 1);      for (i=0;i<m->mix_num;i++) {	if (m->b[i] == NULL) {	  did = dens_num;	} else {	  did = search_did(m->b[i]);	  if (m->b[i] != dens_index[did]) {	    jlog("Error: write_binhmm: index not match!!!\n");	    return FALSE;	  }	}	wrt(fp, &did, sizeof(unsigned int), 1);      }    }  } else {			/* not tied mixture */    wrt(fp, &(m->mix_num), sizeof(short), 1);    for (i=0;i<m->mix_num;i++) {      if (m->b[i] == NULL) {	did = dens_num;      } else {	did = search_did(m->b[i]);	if (m->b[i] != dens_index[did]) {	  jlog("Error: write_binhmm: index not match!!!\n");	  return FALSE;	}      }      wrt(fp, &did, sizeof(unsigned int), 1);    }  }  wrt(fp, m->bweight, sizeof(PROB), m->mix_num);  return TRUE;}/**  * @brief  Write all mixture pdf data. * * The pointers of all mixture pdfs are first gathered, * sorted by the address.  Then the mixture pdfs are written * by the sorted order.  The pointers to the lower structure (variance etc.) * in the data are written in a corresponding scholar id. * The pointer index of this data will be used later to convert any pointer * reference to a data into scholar id. *  * @param fp [in] file pointer * @param hmm [in] writing %HMM definition data  */static booleanwt_mpdf(FILE *fp, HTK_HMM_INFO *hmm){  HTK_HMM_PDF *m;  unsigned int idx;  mpdf_num = 0;  for(m=hmm->pdfstart;m;m=m->next) mpdf_num++;  mpdf_index = (HTK_HMM_PDF **)mymalloc(sizeof(HTK_HMM_PDF *) * mpdf_num);  idx = 0;  for(m=hmm->pdfstart;m;m=m->next) mpdf_index[idx++] = m;  qsort(mpdf_index, mpdf_num, sizeof(HTK_HMM_PDF *), (int (*)(const void *, const void *))qsort_mpdf_index);    wrt(fp, &mpdf_num, sizeof(unsigned int), 1);  for (idx = 0; idx < mpdf_num; idx++) {    m = mpdf_index[idx];    wrt_str(fp, m->name);    wrt(fp, &(m->stream_id), sizeof(short), 1);    if (wt_pdf_sub(fp, hmm, m) == FALSE) return FALSE;  }  jlog("Stat: write_binhmm: %d mixture PDF written\n", mpdf_num);  return TRUE;}/**  * Binary search function to convert mixture pdf pointer to a scholar ID. *  * @param m [in] pointer to a mixture pdf *  * @return the corresponding scholar ID. */static unsigned intsearch_mpdfid(HTK_HMM_PDF *m){  unsigned int left = 0;  unsigned int right = mpdf_num - 1;  unsigned int mid;  while (left < right) {    mid = (left + right) / 2;    if (mpdf_index[mid] < m) {      left = mid + 1;    } else {      right = mid;    }  }  return(left);}/* write state data */static HTK_HMM_State **st_index; ///< Sorted data pointers for mapping from pointer to idstatic unsigned int st_num;	///< Length of above/**  * qsort callback function to sort state pointers by their * address for indexing. *  * @param s1 [in] data 1 * @param s2 [in] data 2 *  * @return value required for qsort. */static intqsort_st_index(HTK_HMM_State **s1, HTK_HMM_State **s2){  if (*s1 > *s2) return 1;  else if (*s1 < *s2) return -1;  else return 0;}/**  * @brief  Write all state data. * * The pointers of all states are first gathered, * sorted by the address.  Then the state informations are written * by the sorted order.  The pointers to the lower structure (mixture etc.) * in the data are written in a corresponding scholar id. * The pointer index of this data will be used later to convert any pointer * reference to a state data into scholar id. *  * @param fp [in] file pointer * @param hmm [in] writing %HMM definition data * @param mpdf_macro [in] TRUE if mixture PDFs are already read as separated definitions */static booleanwt_state(FILE *fp, HTK_HMM_INFO *hmm, boolean mpdf_macro){  HTK_HMM_State *s;  unsigned int idx;  unsigned int mid;  unsigned int swid;  int m;  st_num = hmm->totalstatenum;  st_index = (HTK_HMM_State **)mymalloc(sizeof(HTK_HMM_State *) * st_num);  idx = 0;  for(s = hmm->ststart; s; s = s->next) st_index[idx++] = s;  qsort(st_index, st_num, sizeof(HTK_HMM_State *), (int (*)(const void *, const void *))qsort_st_index);    wrt(fp, &st_num, sizeof(unsigned int), 1);  for (idx = 0; idx < st_num; idx++) {    s = st_index[idx];    wrt_str(fp, s->name);    if (mpdf_macro) {      /* mpdf are already written, so write index */      for(m=0;m<s->nstream;m++) {	if (s->pdf[m] == NULL) {	  mid = mpdf_num;	} else {	  mid = search_mpdfid(s->pdf[m]);	  if (s->pdf[m] != mpdf_index[mid]) {	    jlog("Error: write_binhmm: index not match!!!\n");	    return FALSE;	  }	}	wrt(fp, &mid, sizeof(unsigned int), 1);      }    } else {      /* mpdf should be written here */      for(m=0;m<s->nstream;m++) {	/* stream_id will not be written */	if (wt_pdf_sub(fp, hmm, s->pdf[m]) == FALSE) return FALSE;      }    }    if (hmm->opt.stream_info.num > 1) {      /* write steam weight */      if (s->w == NULL) {	swid = streamweight_num;      } else {	swid = search_swid(s->w);	if (s->w != streamweight_index[swid]) {	  jlog("Error: write_binhmm: index not match!!!\n");	  return FALSE;	}      }      wrt(fp, &swid, sizeof(unsigned int), 1);    }  }  jlog("Stat: write_binhmm: %d states written\n", st_num);  return TRUE;}/**  * Binary search function to convert state pointer to a scholar ID. *  * @param s [in] pointer to a state *  * @return the corresponding scholar ID. */static unsigned intsearch_stid(HTK_HMM_State *s){  unsigned int left = 0;  unsigned int right = st_num - 1;  unsigned int mid;  while (left < right) {    mid = (left + right) / 2;    if (st_index[mid] < s) {      left = mid + 1;    } else {      right = mid;    }  }  return(left);}/**  * @brief  Write all model data. * * The data of all models are written.  The order is not important * at this top level, since there are no reference to this data. * The pointers to the lower structure (states, transitions, etc.) * in the data are written by the corresponding scholar id. *  * @param fp [in] file pointer * @param hmm [in] writing %HMM definition data  */static booleanwt_data(FILE *fp, HTK_HMM_INFO *hmm){  HTK_HMM_Data *d;  unsigned int md_num;  unsigned int sid, tid;  int i;  md_num = hmm->totalhmmnum;  wrt(fp, &(md_num), sizeof(unsigned int), 1);  for(d = hmm->start; d; d = d->next) {    wrt_str(fp, d->name);    wrt(fp, &(d->state_num), sizeof(short), 1);    for (i=0;i<d->state_num;i++) {      if (d->s[i] != NULL) {	sid = search_stid(d->s[i]);	/* for debug */	if (d->s[i] != st_index[sid]) {	  jlog("Error: write_binhmm: index not match!!!\n");	  return FALSE;	}      } else {	sid = hmm->totalstatenum + 1; /* error value */      }      wrt(fp, &sid, sizeof(unsigned int), 1);    }    tid = search_trid(d->tr);    /* for debug */    if (d->tr != tr_index[tid]) {      jlog("Error: write_binhmm: index not match!!!\n");      return FALSE;    }    wrt(fp, &tid, sizeof(unsigned int), 1);  }  jlog("Stat: write_binhmm: %d HMM model definition written\n", md_num);  return TRUE;}/**  * Top function to write %HMM definition data to a binary file. *  * @param fp [in] file pointer * @param hmm [in] %HMM definition structure to be written * @param para [in] acoustic analysis parameter, or NULL if not available *  * @return TRUE on success, FALSE on failure. */booleanwrite_binhmm(FILE *fp, HTK_HMM_INFO *hmm, Value *para){  boolean mpdf_macro;  if (hmm->pdf_root != NULL) {    /* "~p" macro definition exist */    /* save mixture pdf separatedly from state definition */    mpdf_macro = TRUE;    jlog("Stat: write_binhmm: mixture PDF macro \"~p\" used, use qualifier \'M\'\n");  } else {    mpdf_macro = FALSE;  }  /* write header */  if (wt_header(fp, (para ? TRUE : FALSE), hmm->variance_inversed, mpdf_macro) == FALSE) {    jlog("Error: write_binhmm: failed to write header\n");    return FALSE;  }  if (para) {    /* write acoustic analysis parameter info */    if (wt_para(fp, para) == FALSE) {      jlog("Error: write_binhmm: failed to write acoustic analysis parameters\n");      return FALSE;    }  }    /* write option data */  if (wt_opt(fp, &(hmm->opt)) == FALSE) {    jlog("Error: write_binhmm: failed to write option data\n");    return FALSE;  }  /* write type data */  if (wt_type(fp, hmm) == FALSE) {    jlog("Error: write_binhmm: failed to write HMM type data\n");    return FALSE;  }  /* write transition data */  if (wt_trans(fp, hmm) == FALSE) {    jlog("Error: write_binhmm: failed to write HMM transition data\n");    return FALSE;  }  /* write variance data */  if (wt_var(fp, hmm) == FALSE) {    jlog("Error: write_binhmm: failed to write HMM variance data\n");    return FALSE;  }  /* write density data */  if (wt_dens(fp, hmm) == FALSE) {    jlog("Error: write_binhmm: failed to write density data\n");    return FALSE;  }  /* write stream weight data */  if (hmm->opt.stream_info.num > 1) {    if (wt_streamweight(fp, hmm) == FALSE) {      jlog("Error: write_binhmm: failed to write stream weights data\n");      return FALSE;    }  }  /* write tmix data */  if (hmm->is_tied_mixture) {    if (wt_tmix(fp, hmm) == FALSE) {      jlog("Error: write_binhmm: failed to write tied-mixture codebook data\n");      return FALSE;    }  }  /* write mixture pdf data */  if (mpdf_macro) {    if (wt_mpdf(fp, hmm) == FALSE) {      jlog("Error: write_binhmm: failed to write mixture pdf data\n");      return FALSE;    }  }      /* write state data */  if (wt_state(fp, hmm, mpdf_macro) == FALSE) {    jlog("Error: write_binhmm: failed to write HMM state data\n");    return FALSE;  }  /* write model data */  if (wt_data(fp, hmm) == FALSE) {    jlog("Error: write_binhmm: failed to write HMM data\n");    return FALSE;  }  /* free pointer->index work area */  if (mpdf_macro) free(mpdf_index);  free(tr_index);  free(vr_index);  if (hmm->opt.stream_info.num > 1) free(streamweight_index);  free(dens_index);  if (hmm->is_tied_mixture) free(tm_index);  free(st_index);  return (TRUE);}

⌨️ 快捷键说明

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