00001
00048
00049
00050
00051
00052
00053
00054
00055 #include <sent/stddefs.h>
00056 #include <sent/htk_param.h>
00057 #include <sent/mfcc.h>
00058
00060 #define IS_INVALID_FRAME_MFCC(A) ((A) < -30.0 || (A) > 30.0)
00061
00069 static int
00070 guess_abs_e_location(HTK_Param *param)
00071 {
00072 short qualtype;
00073 int basenum, abs_e_num;
00074 qualtype = param->header.samptype & ~(F_COMPRESS | F_CHECKSUM);
00075 qualtype &= ~(F_BASEMASK);
00076 basenum = guess_basenum(param, qualtype);
00077 if (qualtype & F_ENERGY) {
00078 if (qualtype & F_ZEROTH) {
00079 abs_e_num = basenum + 1;
00080 } else {
00081 abs_e_num = basenum;
00082 }
00083 } else {
00084
00085 jlog("Stat: strip_mfcc: absolute energy coef. not exist, stripping disabled\n");
00086 abs_e_num = -1;
00087 }
00088 return abs_e_num;
00089 }
00090
00098 boolean
00099 param_strip_zero(HTK_Param *param)
00100 {
00101 unsigned int src,dst;
00102 int eloc;
00103
00104
00105 eloc = guess_abs_e_location(param);
00106 if ((eloc = guess_abs_e_location(param)) < 0) return FALSE;
00107
00108
00109 dst = 0;
00110 for(src=0;src<param->samplenum;src++) {
00111 if (IS_INVALID_FRAME_MFCC(param->parvec[src][eloc])) {
00112 jlog("Warning: strip_mfcc: frame %d has invalid energy, stripped\n", src);
00113 continue;
00114 }
00115 if (src != dst) {
00116 memcpy(param->parvec[dst], param->parvec[src], sizeof(VECT) * param->veclen);
00117 }
00118 dst++;
00119 }
00120 if (dst != param->samplenum) {
00121 jlog("Warning: strip_mfcc: input shrinked from %d to %d frames\n", param->samplenum, dst);
00122 param->header.samplenum = param->samplenum = dst;
00123 }
00124
00125 return TRUE;
00126 }
00127