FE_misc_lib.cpp
上传用户:italyroyal
上传日期:2013-05-06
资源大小:473k
文件大小:3k
源码类别:

语音合成与识别

开发平台:

Visual C++

  1. ///////////////////////////////////////////////////////////////////////////////
  2. // This is a part of the Feature program.
  3. // Version: 1.0
  4. // Date: February 22, 2003
  5. // Programmer: Oh-Wook Kwon
  6. // Copyright(c) 2003 Oh-Wook Kwon. All rights reserved. owkwon@ucsd.edu
  7. ///////////////////////////////////////////////////////////////////////////////
  8. #include "StdAfx.h" #include <malloc.h>
  9. #include <ctime>
  10. #include "FE_feature.h"
  11. #ifdef _WIN32
  12. long Fe::lrand48()
  13. {
  14. return (long)rand();
  15. }
  16. void Fe::srand48(long seedvar)
  17. {
  18. srand((int)seedvar);
  19. }
  20. #endif
  21. /*************************  memory alloc and free *************************/ void *Fe::m_alloc(int size) { void  *temp; assert(size>0); if(( temp = (void *) malloc(size)) == NULL) err_quit("Memory insufficientn"); return(temp); }
  22. void *Fe::c_alloc(int num_of_elts, int size) { void *temp; assert(size>0); if(( temp = (void *) calloc(num_of_elts,size)) == NULL) err_quit("Memory insufficientn"); return(temp); }
  23. void *Fe::re_alloc(void *block, int size) { void  *temp; assert(size>0); if(( temp = (void *) realloc(block,size)) == NULL) err_quit("Memory insufficientn"); return(temp); }
  24. char **Fe::alloc2d(int dim1, int dim2, int size) { int i;
  25. assert(size>0); unsigned nelem = (unsigned) dim1 * dim2;
  26. assert(nelem>0); char *p = (char *) c_alloc(nelem, (unsigned) size);
  27. assert(p); char **pp = (char **) c_alloc((unsigned) dim1, (unsigned) sizeof(char *));
  28. assert(pp); for (i = 0; i < dim1; i++) pp[i] = p + (i * dim2 * size); return (pp); }
  29. char ***Fe::alloc3d(int dim1, int dim2, int dim3, int size)
  30. {
  31. int i;
  32. assert(size>0);
  33. unsigned nelem = (unsigned) dim1 * dim2 * dim3;
  34. assert(nelem>0);
  35. char *p = (char *) c_alloc(nelem, (unsigned) size);
  36. assert(p);
  37. char **pp = (char **) c_alloc((unsigned) dim1*dim2, (unsigned) sizeof(char *));
  38. assert(pp);
  39. char ***ppp = (char ***) c_alloc((unsigned) dim1, (unsigned) sizeof(char **));
  40. assert(ppp);
  41. for (i = 0; i < dim1; i++) ppp[i] = pp + (i * dim2 * sizeof(char*));
  42. for (i = 0; i < dim1*dim2; i++) pp[i] = p + (i * dim3 * size);
  43. return ppp;
  44. }
  45. void Fe::free2d(void **p) { if (p) { if(p[0]) free(p[0]); free(p); } return; }
  46. void Fe::free3d(void ***p)
  47. {
  48. if(p){
  49. if(p[0]) {
  50. if(p[0][0]) free(p[0][0]);
  51. free(p[0]);
  52. }
  53. free(p);
  54. }
  55. return;
  56. }
  57. /***********************************************  returns non-zero, if the h/w is little endian ***********************************************/ int Fe::little_endian() { char  b[4]; register long *l = (long *) b; *l = 1; return ((int) b[0]); }
  58. /*================== Supporting Routines =====================*/ float Fe::sum(int nstart, int nfinal, float *seq)       { int  i; float  total=0; for(i=nstart; i<=nfinal; i++) total += seq[i]; return(total); }
  59. float Fe::product (int nstart, int nfinal, float *seq )       { int  i; float  prod = 1; for(i=nstart-1; i<nfinal; i++) prod *= seq[i]; return(prod); }
  60. float Fe::power(float x, int n) { float  p; if(n>0) for(p=1; n>0; --n) p=p*x; else if(n<0) for(p=1; n<0; ++n) p=p/x; else p=1; return(p); }
  61. int Fe::ipower(int x, int n) { int p = 1; for( ; n > 0; --n) p *= x ; return p; }