typedef struct { long nSamples; /* Structure for HTK header */ long sampPeriod; short sampSize; short sampKind; } HTK_Header; #define swap4(a) {int t=((char*)&a)[0]; ((char*)&a)[0]=((char*)&a)[3]; ((char*)&a)[3]=t;\ t=((char*)&a)[1]; ((char*)&a)[1]=((char*)&a)[2]; ((char*)&a)[2]=t;} #define swap2(a) {int t=((char*)&a)[0]; ((char*)&a)[0]=((char*)&a)[1]; ((char*)&a)[1]=t;} int ReadHTKFeature(FILE * fp_in, float *in, size_t fea_len, int swap) { size_t i; if(fread(in, sizeof (float), fea_len, fp_in) != fea_len) { return -1; } if(swap) for(i = 0; i < fea_len; i++) swap4(in[i]); return 0; } int ReadHTKHeader (FILE * fp_in, HTK_Header * header, int Swap) { if(!fread(&header->nSamples, sizeof (long), 1, fp_in)) return 0; if(!fread(&header->sampPeriod, sizeof (long), 1, fp_in)) return 0; if(!fread(&header->sampSize, sizeof (short), 1, fp_in)) return 0; if(!fread(&header->sampKind, sizeof (short), 1, fp_in)) return 0; if(Swap) { swap4(header->nSamples); swap4(header->sampPeriod); swap2(header->sampSize); swap2(header->sampKind); } if(header->sampPeriod < 0 || header->sampPeriod > 100000 || header->nSamples < 0 || header->sampSize < 0) { return -1; } return 0; } #define SQR(a) ((a)*(a)) #ifndef M_PI #define M_PI 3.1415926535897932384626433832795 #endif float LogGaussPDF(float *observation, float *means, float *variances, int size) { float gconst, cov_det = 1, logPdf = 0; int i; for(i = 0; i < size; i++) { cov_det *= variances[i]; logPdf += SQR(observation[i] - means[i]) / variances[i]; } logPdf += log(cov_det * pow(2 * M_PI, size)); return - 0.5 * logPdf; }