1 #ifdef HAVE_CONFIG_H
2 #include <config.h>
3 #endif
4 
5 #include <stdio.h>
6 #include <string.h>
7 #include <math.h>
8 
9 #include "feat.h"
10 #include "test_macros.h"
11 #include "ckd_alloc.h"
12 
13 const mfcc_t data[6][13] = {
14 	{ FLOAT2MFCC(15.114), FLOAT2MFCC(-1.424), FLOAT2MFCC(-0.953),
15 	  FLOAT2MFCC(0.186), FLOAT2MFCC(-0.656), FLOAT2MFCC(-0.226),
16 	  FLOAT2MFCC(-0.105), FLOAT2MFCC(-0.412), FLOAT2MFCC(-0.024),
17 	  FLOAT2MFCC(-0.091), FLOAT2MFCC(-0.124), FLOAT2MFCC(-0.158), FLOAT2MFCC(-0.197)},
18 	{ FLOAT2MFCC(14.729), FLOAT2MFCC(-1.313), FLOAT2MFCC(-0.892),
19 	  FLOAT2MFCC(0.140), FLOAT2MFCC(-0.676), FLOAT2MFCC(-0.089),
20 	  FLOAT2MFCC(-0.313), FLOAT2MFCC(-0.422), FLOAT2MFCC(-0.058),
21 	  FLOAT2MFCC(-0.101), FLOAT2MFCC(-0.100), FLOAT2MFCC(-0.128), FLOAT2MFCC(-0.123)},
22 	{ FLOAT2MFCC(14.502), FLOAT2MFCC(-1.351), FLOAT2MFCC(-1.028),
23 	  FLOAT2MFCC(-0.189), FLOAT2MFCC(-0.718), FLOAT2MFCC(-0.139),
24 	  FLOAT2MFCC(-0.121), FLOAT2MFCC(-0.365), FLOAT2MFCC(-0.139),
25 	  FLOAT2MFCC(-0.154), FLOAT2MFCC(0.041), FLOAT2MFCC(0.009), FLOAT2MFCC(-0.073)},
26 	{ FLOAT2MFCC(14.557), FLOAT2MFCC(-1.676), FLOAT2MFCC(-0.864),
27 	  FLOAT2MFCC(0.118), FLOAT2MFCC(-0.445), FLOAT2MFCC(-0.168),
28 	  FLOAT2MFCC(-0.069), FLOAT2MFCC(-0.503), FLOAT2MFCC(-0.013),
29 	  FLOAT2MFCC(0.007), FLOAT2MFCC(-0.056), FLOAT2MFCC(-0.075), FLOAT2MFCC(-0.237)},
30 	{ FLOAT2MFCC(14.665), FLOAT2MFCC(-1.498), FLOAT2MFCC(-0.582),
31 	  FLOAT2MFCC(0.209), FLOAT2MFCC(-0.487), FLOAT2MFCC(-0.247),
32 	  FLOAT2MFCC(-0.142), FLOAT2MFCC(-0.439), FLOAT2MFCC(0.059),
33 	  FLOAT2MFCC(-0.058), FLOAT2MFCC(-0.265), FLOAT2MFCC(-0.109), FLOAT2MFCC(-0.196)},
34 	{ FLOAT2MFCC(15.025), FLOAT2MFCC(-1.199), FLOAT2MFCC(-0.607),
35 	  FLOAT2MFCC(0.235), FLOAT2MFCC(-0.499), FLOAT2MFCC(-0.080),
36 	  FLOAT2MFCC(-0.062), FLOAT2MFCC(-0.554), FLOAT2MFCC(-0.209),
37 	  FLOAT2MFCC(-0.124), FLOAT2MFCC(-0.445), FLOAT2MFCC(-0.352), FLOAT2MFCC(-0.400)},
38 };
39 
40 int
main(int argc,char * argv[])41 main(int argc, char *argv[])
42 {
43 	static char const svspec[] = "1-12/14-25/0,13,26/27-38";
44 	int32 **subvecs, i, j, k, ncep;
45 	mfcc_t **in_feats, ***out_feats;
46 	feat_t *fcb;
47 
48 	/* Test parsing of a subvector spec. */
49 	subvecs = parse_subvecs(svspec);
50 	TEST_ASSERT(subvecs);
51 	for (i = 0; i < 12; ++i) {
52 		TEST_EQUAL(subvecs[0][i], i+1);
53 	}
54 	for (i = 0; i < 12; ++i) {
55 		TEST_EQUAL(subvecs[1][i], i+14);
56 	}
57 	TEST_EQUAL(subvecs[2][0], 0);
58 	TEST_EQUAL(subvecs[2][1], 13);
59 	TEST_EQUAL(subvecs[2][2], 26);
60 	for (i = 0; i < 12; ++i) {
61 		TEST_EQUAL(subvecs[3][i], i+27);
62 	}
63 
64 	/* Create a 1s_c_d_dd feature stream and split it into subvectors. */
65 	fcb = feat_init("1s_c_d_dd", CMN_NONE, 0, AGC_NONE, 1, 13);
66 	TEST_ASSERT(fcb);
67 	feat_set_subvecs(fcb, subvecs);
68 
69 	in_feats = (mfcc_t **)ckd_alloc_2d_ptr(6, 13, data, sizeof(mfcc_t));
70 	out_feats = feat_array_alloc(fcb, 6);
71 	TEST_ASSERT(out_feats);
72 
73 	ncep = 6;
74 	feat_s2mfc2feat_live(fcb, in_feats, &ncep, 1, 1, out_feats);
75 
76 	for (i = 0; i < 6; ++i) {
77 		for (j = 0; j < feat_dimension1(fcb); ++j) {
78 			for (k = 0; k < feat_dimension2(fcb, j); ++k) {
79 				printf("%.3f ", MFCC2FLOAT(out_feats[i][j][k]));
80 			}
81 			printf("\n");
82 		}
83 		printf("\n");
84 	}
85 
86 	feat_array_free(out_feats);
87 	ckd_free(in_feats);
88 	feat_free(fcb);
89 
90 	return 0;
91 }
92