00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043 #include <assert.h>
00044 #include <string.h>
00045 #ifdef HAVE_CONFIG_H
00046 #include <config.h>
00047 #endif
00048
00049 #ifdef _MSC_VER
00050 #pragma warning (disable: 4018)
00051 #endif
00052
00053 #include "feat.h"
00054 #include "ckd_alloc.h"
00055 #include "bio.h"
00056 #include "err.h"
00057
00058 #define MATRIX_FILE_VERSION "0.1"
00059
00060 int32
00061 feat_read_lda(feat_t *feat, const char *ldafile, int32 dim)
00062 {
00063 FILE *fh;
00064 int32 byteswap, chksum_present;
00065 uint32 chksum, i, m, n;
00066 char **argname, **argval;
00067
00068 assert(feat);
00069 if (feat->n_stream != 1) {
00070 E_ERROR("LDA incompatible with multi-stream features (n_stream = %d)\n",
00071 feat->n_stream);
00072 return -1;
00073 }
00074
00075 if ((fh = fopen(ldafile, "rb")) == NULL) {
00076 E_ERROR_SYSTEM("fopen(%s, rb) failed", ldafile);
00077 return -1;
00078 }
00079
00080 if (bio_readhdr(fh, &argname, &argval, &byteswap) < 0) {
00081 E_ERROR("bio_readhdr(%s) failed\n", ldafile);
00082 fclose(fh);
00083 return -1;
00084 }
00085
00086 chksum_present = 0;
00087 for (i = 0; argname[i]; i++) {
00088 if (strcmp(argname[i], "version") == 0) {
00089 if (strcmp(argval[i], MATRIX_FILE_VERSION) != 0)
00090 E_WARN("%s: Version mismatch: %s, expecting %s\n",
00091 ldafile, argval[i], MATRIX_FILE_VERSION);
00092 }
00093 else if (strcmp(argname[i], "chksum0") == 0) {
00094 chksum_present = 1;
00095 }
00096 }
00097
00098 bio_hdrarg_free(argname, argval);
00099 argname = argval = NULL;
00100
00101 chksum = 0;
00102
00103 if (feat->lda)
00104 ckd_free_3d((void ***)feat->lda);
00105
00106 {
00107
00108 void ***outlda;
00109
00110 if (bio_fread_3d(&outlda, sizeof(float32),
00111 &feat->n_lda, &m, &n,
00112 fh, byteswap, &chksum) < 0) {
00113 E_ERROR_SYSTEM("%s: bio_fread_3d(lda) failed\n", ldafile);
00114 fclose(fh);
00115 return -1;
00116 }
00117 feat->lda = (void *)outlda;
00118 }
00119 #ifdef FIXED_POINT
00120
00121
00122 for (i = 0; i < feat->n_lda * m * n; ++i) {
00123 feat->lda[0][0][i] = FLOAT2MFCC(((float *)feat->lda[0][0])[i]);
00124 }
00125 #endif
00126
00127
00128 assert(n == feat->stream_len[0]);
00129
00130 if (dim > m || dim <= 0) {
00131 dim = m;
00132 }
00133 feat->out_dim = dim;
00134
00135 return 0;
00136 }
00137
00138 void
00139 feat_lda_transform(feat_t *fcb, mfcc_t ***inout_feat, uint32 nfr)
00140 {
00141 mfcc_t *tmp;
00142 uint32 i, j, k;
00143
00144 tmp = ckd_calloc(fcb->stream_len[0], sizeof(mfcc_t));
00145 for (i = 0; i < nfr; ++i) {
00146
00147
00148
00149 memset(tmp, 0, sizeof(mfcc_t) * fcb->stream_len[0]);
00150 for (j = 0; j < feat_dimension(fcb); ++j) {
00151 for (k = 0; k < fcb->stream_len[0]; ++k) {
00152 tmp[j] += MFCCMUL(inout_feat[i][0][k], fcb->lda[0][j][k]);
00153 }
00154 }
00155 memcpy(inout_feat[i][0], tmp, fcb->stream_len[0] * sizeof(mfcc_t));
00156 }
00157 ckd_free(tmp);
00158 }