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

ss.c

Go to the documentation of this file.
00001 
00024 /*
00025  * Copyright (c) 1991-2006 Kawahara Lab., Kyoto University
00026  * Copyright (c) 2000-2005 Shikano Lab., Nara Institute of Science and Technology
00027  * Copyright (c) 2005-2006 Julius project team, Nagoya Institute of Technology, Nagoya Institute of Technology
00028  * All rights reserved
00029  */
00030 
00031 #include <sent/stddefs.h>
00032 #include <sent/mfcc.h>
00033 
00034 
00043 static boolean
00044 myread(void *buf, size_t unitbyte, int unitnum, FILE *fp)
00045 {
00046   size_t tmp;
00047   if ((tmp = myfread(buf, unitbyte, unitnum, fp)) < (size_t)unitnum) {
00048     return(FALSE);
00049   }
00050 #ifndef WORDS_BIGENDIAN
00051   swap_bytes(buf, unitbyte, unitnum);
00052 #endif
00053   return(TRUE);
00054 }
00055 
00064 float *
00065 new_SS_load_from_file(char *filename, int *slen)
00066 {
00067   FILE *fp;
00068   int num;
00069   float *sbuf;
00070 
00071   /* open file */
00072   j_printerr("Reading Noise Spectrum for SS...");
00073   if ((fp = fopen_readfile(filename)) == NULL) {
00074     j_printerr("Error: SS_load_from_file: cannot open \"%s\"\n", filename);
00075     return(NULL);
00076   }
00077   /* read length */
00078   if (myread(&num, sizeof(int), 1, fp) == FALSE) {
00079     j_printerr("Error: SS_load_from_file: cannot read \"%s\"\n", filename);
00080     return(NULL);
00081   }
00082   /* allocate */
00083   sbuf = (float *)mymalloc(sizeof(float) * num);
00084   /* read data */
00085   if (myread(sbuf, sizeof(float), num, fp) == FALSE) {
00086     j_printerr("Error: SS_load_from_file: cannot read \"%s\"\n", filename);
00087     return(NULL);
00088   }
00089   /* close file */
00090   fclose_readfile(fp);
00091 
00092   *slen = num;
00093   j_printerr("done\n");
00094   return(sbuf);
00095 }
00096 
00108 float *
00109 new_SS_calculate(SP16 *wave, int wavelen, Value para, int *slen)
00110 {
00111   int fftN, n;
00112   float *bf, *Re, *Im, *spec;
00113   int t, framenum, start, end, k, i;
00114   double x, y;
00115   
00116   /* Calculate FFT size */
00117   fftN = 2;  n = 1;
00118   while(para.framesize > fftN){
00119     fftN *= 2; n++;
00120   }
00121 
00122 #ifdef MFCC_SINCOS_TABLE
00123   /* generate tables */
00124   make_costbl_hamming(para.framesize);
00125   make_fft_table(n);
00126 #endif
00127   
00128   /* allocate work area */
00129   bf = (float *)mymalloc((fftN + 1) * sizeof(float));
00130   Re = (float *)mymalloc((fftN + 1) * sizeof(float));
00131   Im = (float *)mymalloc((fftN + 1) * sizeof(float));
00132   spec = (float *)mymalloc((fftN + 1) * sizeof(float));
00133   for(i=0;i<fftN;i++) spec[i] = 0.0;
00134   
00135   /* Caluculate Sum of Noise Power Spectral */
00136   framenum = (int)((wavelen - para.framesize) / para.frameshift) + 1;
00137   start = 1;
00138   end = 0;
00139   for (t = 0; t < framenum; t++) {
00140     if (end != 0) start = end - (para.framesize - para.frameshift) - 1;
00141     k = 1;
00142     for (i = start; i <= start + para.framesize; i++) {
00143       bf[k] = (float)wave[i-1];
00144       k++;
00145     }
00146     end = i;
00147 
00148     /* Pre-emphasis */
00149     PreEmphasise(bf, para);
00150     /* Hamming Window */
00151     Hamming(bf, para.framesize);
00152     /* FFT Spectrum */
00153     for (i = 1; i <= para.framesize; i++) {
00154       Re[i-1] = bf[i]; Im[i-1] = 0.0;
00155     }
00156     for (i = para.framesize + 1; i <= fftN; i++) {
00157       Re[i-1] = 0.0;   Im[i-1] = 0.0;
00158     }
00159     FFT(Re, Im, n);
00160     /* Sum noise spectrum */
00161     for(i = 1; i <= fftN; i++){
00162       x = Re[i - 1];  y = Im[i - 1];
00163       spec[i - 1] += sqrt(x * x + y * y);
00164     }
00165   }
00166 
00167   /* Calculate average noise spectrum */
00168   for(t=0;t<fftN;t++) {
00169     spec[t] /= (float)framenum;
00170   }
00171 
00172   /* return the new spec[] */
00173   free(Im);
00174   free(Re);
00175   free(bf);
00176   *slen = fftN;
00177   return(spec);
00178 }

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