00001
00025
00026
00027
00028
00029
00030
00031
00032 #include <sent/stddefs.h>
00033 #include <sent/mfcc.h>
00034
00035
00044 static boolean
00045 myread(void *buf, size_t unitbyte, int unitnum, FILE *fp)
00046 {
00047 size_t tmp;
00048 if ((tmp = myfread(buf, unitbyte, unitnum, fp)) < (size_t)unitnum) {
00049 return(FALSE);
00050 }
00051 #ifndef WORDS_BIGENDIAN
00052 swap_bytes(buf, unitbyte, unitnum);
00053 #endif
00054 return(TRUE);
00055 }
00056
00065 float *
00066 new_SS_load_from_file(char *filename, int *slen)
00067 {
00068 FILE *fp;
00069 int num;
00070 float *sbuf;
00071
00072
00073 jlog("Stat: ss: reading Noise Spectrum for SS\n");
00074 if ((fp = fopen_readfile(filename)) == NULL) {
00075 jlog("Error: ss: failed to open \"%s\"\n", filename);
00076 return(NULL);
00077 }
00078
00079 if (myread(&num, sizeof(int), 1, fp) == FALSE) {
00080 jlog("Error: ss: failed to read \"%s\"\n", filename);
00081 return(NULL);
00082 }
00083
00084 sbuf = (float *)mymalloc(sizeof(float) * num);
00085
00086 if (myread(sbuf, sizeof(float), num, fp) == FALSE) {
00087 jlog("Error: ss: failed to read \"%s\"\n", filename);
00088 return(NULL);
00089 }
00090
00091 fclose_readfile(fp);
00092
00093 *slen = num;
00094 jlog("Stat: ss: done\n");
00095 return(sbuf);
00096 }
00097
00110 float *
00111 new_SS_calculate(SP16 *wave, int wavelen, int *slen, MFCCWork *w, Value *para)
00112 {
00113 float *spec;
00114 int t, framenum, start, end, k, i;
00115 double x, y;
00116
00117
00118 spec = (float *)mymalloc((w->fb.fftN + 1) * sizeof(float));
00119 for(i=0;i<w->fb.fftN;i++) spec[i] = 0.0;
00120
00121
00122 framenum = (int)((wavelen - para->framesize) / para->frameshift) + 1;
00123 start = 1;
00124 end = 0;
00125 for (t = 0; t < framenum; t++) {
00126 if (end != 0) start = end - (para->framesize - para->frameshift) - 1;
00127 k = 1;
00128 for (i = start; i <= start + para->framesize; i++) {
00129 w->bf[k] = (float)wave[i-1];
00130 k++;
00131 }
00132 end = i;
00133
00134 if (para->zmeanframe) {
00135 ZMeanFrame(w->bf, para->framesize);
00136 }
00137
00138
00139 PreEmphasise(w->bf, para->framesize, para->preEmph);
00140
00141 Hamming(w->bf, para->framesize, w);
00142
00143 for (i = 1; i <= para->framesize; i++) {
00144 w->fb.Re[i-1] = w->bf[i]; w->fb.Im[i-1] = 0.0;
00145 }
00146 for (i = para->framesize + 1; i <= w->fb.fftN; i++) {
00147 w->fb.Re[i-1] = 0.0; w->fb.Im[i-1] = 0.0;
00148 }
00149 FFT(w->fb.Re, w->fb.Im, w->fb.n, w);
00150
00151 for(i = 1; i <= w->fb.fftN; i++){
00152 x = w->fb.Re[i - 1]; y = w->fb.Im[i - 1];
00153 spec[i - 1] += sqrt(x * x + y * y);
00154 }
00155 }
00156
00157
00158 for(t=0;t<w->fb.fftN;t++) {
00159 spec[t] /= (float)framenum;
00160 }
00161
00162
00163 *slen = w->fb.fftN;
00164 return(spec);
00165 }