00001
00024
00025
00026
00027
00028
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
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
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
00083 sbuf = (float *)mymalloc(sizeof(float) * num);
00084
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
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
00117 fftN = 2; n = 1;
00118 while(para.framesize > fftN){
00119 fftN *= 2; n++;
00120 }
00121
00122 #ifdef MFCC_SINCOS_TABLE
00123
00124 make_costbl_hamming(para.framesize);
00125 make_fft_table(n);
00126 #endif
00127
00128
00129 spec = (float *)mymalloc((fftN + 1) * sizeof(float));
00130 bf = (float *)mymalloc((fftN + 1) * sizeof(float));
00131 Re = (float *)mymalloc((fftN + 1) * sizeof(float));
00132 Im = (float *)mymalloc((fftN + 1) * sizeof(float));
00133 for(i=0;i<fftN;i++) spec[i] = 0.0;
00134
00135
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 if (para.zmeanframe) {
00149 ZMeanFrame(bf, para.framesize);
00150 }
00151
00152
00153 PreEmphasise(bf, para);
00154
00155 Hamming(bf, para.framesize);
00156
00157 for (i = 1; i <= para.framesize; i++) {
00158 Re[i-1] = bf[i]; Im[i-1] = 0.0;
00159 }
00160 for (i = para.framesize + 1; i <= fftN; i++) {
00161 Re[i-1] = 0.0; Im[i-1] = 0.0;
00162 }
00163 FFT(Re, Im, n);
00164
00165 for(i = 1; i <= fftN; i++){
00166 x = Re[i - 1]; y = Im[i - 1];
00167 spec[i - 1] += sqrt(x * x + y * y);
00168 }
00169 }
00170
00171
00172 for(t=0;t<fftN;t++) {
00173 spec[t] /= (float)framenum;
00174 }
00175
00176
00177 free(Im);
00178 free(Re);
00179 free(bf);
00180 *slen = fftN;
00181 return(spec);
00182 }