Dawn@4
|
1 function mdata = func_buildMData(matfile, smoothwin)
|
Dawn@4
|
2 % mdata = func_buildMData(matfile, smoothwin)
|
Dawn@4
|
3 % Input: mat filename
|
Dawn@4
|
4 % smoothing window size (0 denotes no smoothing)
|
Dawn@4
|
5 % Output: mat data structure
|
Dawn@4
|
6 % Notes: Function tries to construct as many parameters as possible based
|
Dawn@4
|
7 % on the parameters currently in the mat file. Some parameters will have a
|
Dawn@4
|
8 % different variable name to what is originally stored in the mat file:
|
Dawn@4
|
9 % e.g. H1 is actually the uncorrected harmonic (H1u), it is stored this way
|
Dawn@4
|
10 % for compatability reasons.
|
Dawn@4
|
11 %
|
Dawn@4
|
12 % Author: Yen-Liang Shue, Speech Processing and Auditory Perception Laboratory, UCLA
|
Dawn@4
|
13 % Copyright UCLA SPAPL 2009
|
Dawn@4
|
14
|
Dawn@4
|
15 mdata = load(matfile);
|
Dawn@4
|
16
|
Dawn@4
|
17 % these are for compatibility with VS0 matfiles
|
Dawn@4
|
18 if (~isfield(mdata, 'HF0algorithm'))
|
Dawn@4
|
19 mdata.HF0algorithm = 'F0 (Straight)';
|
Dawn@4
|
20 end
|
Dawn@4
|
21
|
Dawn@4
|
22 if (~isfield(mdata, 'AFMTalgorithm'))
|
Dawn@4
|
23 mdata.AFMTalgorithm = 'F1, F2, F3, F4 (Snack)';
|
Dawn@4
|
24 end
|
Dawn@4
|
25
|
Dawn@4
|
26 if (~isfield(mdata, 'Fs'))
|
Dawn@4
|
27 mdata.Fs = 16000;
|
Dawn@4
|
28 end
|
Dawn@4
|
29
|
Dawn@4
|
30 % get the right F0
|
Dawn@4
|
31 F0 = func_parseF0(mdata, mdata.HF0algorithm);
|
Dawn@4
|
32 [F1, F2, F3] = func_parseFMT(mdata, mdata.AFMTalgorithm);
|
Dawn@4
|
33
|
Dawn@4
|
34 % can't do much without F0 or FMTs
|
Dawn@4
|
35 if (isempty(F0) || isempty(F1))
|
Dawn@4
|
36 return;
|
Dawn@4
|
37 end
|
Dawn@4
|
38
|
Dawn@4
|
39 % get bandwidth mapping
|
Dawn@4
|
40 B1 = func_getBWfromFMT(F1, F0, 'hm');
|
Dawn@4
|
41 B2 = func_getBWfromFMT(F2, F0, 'hm');
|
Dawn@4
|
42 B3 = func_getBWfromFMT(F3, F0, 'hm');
|
Dawn@4
|
43
|
Dawn@4
|
44 % Hx
|
Dawn@4
|
45 if (isfield(mdata, 'H1'))
|
Dawn@4
|
46 mdata.H1u = mdata.H1; % H1 is actually the uncorrected harmonic
|
Dawn@4
|
47 mdata.H1c = mdata.H1u - func_correct_iseli_z(F0, F1, B1, mdata.Fs); % correct for F1
|
Dawn@4
|
48 mdata.H1c = mdata.H1c - func_correct_iseli_z(F0, F2, B2, mdata.Fs); % correct for F2
|
Dawn@4
|
49 if (smoothwin~=0)
|
Dawn@4
|
50 mdata.H1u = filter(ones(smoothwin,1)/smoothwin, 1, mdata.H1u);
|
Dawn@4
|
51 mdata.H1c = filter(ones(smoothwin,1)/smoothwin, 1, mdata.H1c);
|
Dawn@4
|
52 end
|
Dawn@4
|
53 %mdata = rmfield(mdata, 'H1'); % remove H1 to remove confusion
|
Dawn@4
|
54 end
|
Dawn@4
|
55
|
Dawn@4
|
56 if (isfield(mdata, 'H2'))
|
Dawn@4
|
57 mdata.H2u = mdata.H2; % H2 is actually the uncorrected harmonic
|
Dawn@4
|
58 mdata.H2c = mdata.H2u - func_correct_iseli_z(2*F0, F1, B1, mdata.Fs);
|
Dawn@4
|
59 mdata.H2c = mdata.H2c - func_correct_iseli_z(2*F0, F2, B2, mdata.Fs);
|
Dawn@4
|
60 if (smoothwin~=0)
|
Dawn@4
|
61 mdata.H2u = filter(ones(smoothwin,1)/smoothwin, 1, mdata.H2u);
|
Dawn@4
|
62 mdata.H2c = filter(ones(smoothwin,1)/smoothwin, 1, mdata.H2c);
|
Dawn@4
|
63 end
|
Dawn@4
|
64 %mdata = rmfield(mdata, 'H2');
|
Dawn@4
|
65 end
|
Dawn@4
|
66
|
Dawn@4
|
67 if (isfield(mdata, 'H4'))
|
Dawn@4
|
68 mdata.H4u = mdata.H4; % H4 is actually the uncorrected harmonic
|
Dawn@4
|
69 mdata.H4c = mdata.H4u - func_correct_iseli_z(4*F0, F1, B1, mdata.Fs);
|
Dawn@4
|
70 mdata.H4c = mdata.H4c - func_correct_iseli_z(4*F0, F2, B2, mdata.Fs);
|
Dawn@4
|
71 if (smoothwin~=0)
|
Dawn@4
|
72 mdata.H4u = filter(ones(smoothwin,1)/smoothwin, 1, mdata.H4u);
|
Dawn@4
|
73 mdata.H4c = filter(ones(smoothwin,1)/smoothwin, 1, mdata.H4c);
|
Dawn@4
|
74 end
|
Dawn@4
|
75 %mdata = rmfield(mdata, 'H4');
|
Dawn@4
|
76 end
|
Dawn@4
|
77
|
Dawn@4
|
78
|
Dawn@4
|
79 % Ax
|
Dawn@4
|
80 if (isfield(mdata, 'A1'))
|
Dawn@4
|
81 mdata.A1u = mdata.A1; % A1 is actually the uncorrected amplitude
|
Dawn@4
|
82 mdata.A1c = mdata.A1u - func_correct_iseli_z(F1, F1, B1, mdata.Fs);
|
Dawn@4
|
83 mdata.A1c = mdata.A1c - func_correct_iseli_z(F1, F2, B3, mdata.Fs);
|
Dawn@4
|
84 if (smoothwin~=0)
|
Dawn@4
|
85 mdata.A1u = filter(ones(smoothwin,1)/smoothwin, 1, mdata.A1u);
|
Dawn@4
|
86 mdata.A1c = filter(ones(smoothwin,1)/smoothwin, 1, mdata.A1c);
|
Dawn@4
|
87 end
|
Dawn@4
|
88 %mdata = rmfield(mdata, 'A1');
|
Dawn@4
|
89 end
|
Dawn@4
|
90
|
Dawn@4
|
91 if (isfield(mdata, 'A2'))
|
Dawn@4
|
92 mdata.A2u = mdata.A2; % A2 is acutally the uncorrected amplitude
|
Dawn@4
|
93 mdata.A2c = mdata.A2u - func_correct_iseli_z(F2, F1, B1, mdata.Fs);
|
Dawn@4
|
94 mdata.A2c = mdata.A2c - func_correct_iseli_z(F2, F2, B2, mdata.Fs);
|
Dawn@4
|
95 if (smoothwin~=0)
|
Dawn@4
|
96 mdata.A2u = filter(ones(smoothwin,1)/smoothwin, 1, mdata.A2u);
|
Dawn@4
|
97 mdata.A2c = filter(ones(smoothwin,1)/smoothwin, 1, mdata.A2c);
|
Dawn@4
|
98 end
|
Dawn@4
|
99 %mdata = rmfield(mdata, 'A2');
|
Dawn@4
|
100 end
|
Dawn@4
|
101
|
Dawn@4
|
102 if (isfield(mdata, 'A3'))
|
Dawn@4
|
103 mdata.A3u = mdata.A3; % A3 is actually the uncorrected amplitude
|
Dawn@4
|
104 mdata.A3c = mdata.A3u - func_correct_iseli_z(F3, F1, B1, mdata.Fs);
|
Dawn@4
|
105 mdata.A3c = mdata.A3c - func_correct_iseli_z(F3, F2, B2, mdata.Fs);
|
Dawn@4
|
106 mdata.A3c = mdata.A3c - func_correct_iseli_z(F3, F3, B3, mdata.Fs);
|
Dawn@4
|
107 if (smoothwin~=0)
|
Dawn@4
|
108 mdata.A3u = filter(ones(smoothwin,1)/smoothwin, 1, mdata.A3u);
|
Dawn@4
|
109 mdata.A3c = filter(ones(smoothwin,1)/smoothwin, 1, mdata.A3c);
|
Dawn@4
|
110 end
|
Dawn@4
|
111 %mdata = rmfield(mdata, 'A3');
|
Dawn@4
|
112 end
|
Dawn@4
|
113
|
Dawn@4
|
114
|
Dawn@4
|
115 % the uncorrected combo parameters
|
Dawn@4
|
116 if (isfield(mdata, 'H1') && isfield(mdata, 'H2'))
|
Dawn@4
|
117 mdata.H1H2u = mdata.H1 - mdata.H2;
|
Dawn@4
|
118 if (smoothwin ~= 0)
|
Dawn@4
|
119 mdata.H1H2u = filter(ones(smoothwin,1)/smoothwin, 1, mdata.H1H2u);
|
Dawn@4
|
120 end
|
Dawn@4
|
121 end
|
Dawn@4
|
122
|
Dawn@4
|
123 if (isfield(mdata, 'H2') && isfield(mdata, 'H4'))
|
Dawn@4
|
124 mdata.H2H4u = mdata.H2 - mdata.H4;
|
Dawn@4
|
125 if (smoothwin ~= 0)
|
Dawn@4
|
126 mdata.H2H4u = filter(ones(smoothwin,1)/smoothwin, 1, mdata.H2H4u);
|
Dawn@4
|
127 end
|
Dawn@4
|
128 end
|
Dawn@4
|
129
|
Dawn@4
|
130 if (isfield(mdata, 'H1') && isfield(mdata, 'A1'))
|
Dawn@4
|
131 mdata.H1A1u = mdata.H1 - mdata.A1;
|
Dawn@4
|
132 if (smoothwin ~= 0)
|
Dawn@4
|
133 mdata.H1A1u = filter(ones(smoothwin,1)/smoothwin, 1, mdata.H1A1u);
|
Dawn@4
|
134 end
|
Dawn@4
|
135 end
|
Dawn@4
|
136
|
Dawn@4
|
137 if (isfield(mdata, 'H1') && isfield(mdata, 'A2'))
|
Dawn@4
|
138 mdata.H1A2u = mdata.H1 - mdata.A2;
|
Dawn@4
|
139 if (smoothwin ~= 0)
|
Dawn@4
|
140 mdata.H1A2u = filter(ones(smoothwin,1)/smoothwin, 1, mdata.H1A2u);
|
Dawn@4
|
141 end
|
Dawn@4
|
142 end
|
Dawn@4
|
143
|
Dawn@4
|
144 if (isfield(mdata, 'H1') && isfield(mdata, 'A3'))
|
Dawn@4
|
145 mdata.H1A3u = mdata.H1 - mdata.A3;
|
Dawn@4
|
146 if (smoothwin ~= 0)
|
Dawn@4
|
147 mdata.H1A3u = filter(ones(smoothwin,1)/smoothwin, 1, mdata.H1A3u);
|
Dawn@4
|
148 end
|
Dawn@4
|
149 end
|
Dawn@4
|
150
|
Dawn@4
|
151 % this section is included for old VS compatibility, previously, the
|
Dawn@4
|
152 % corrected versions of HxHx and HxAx were stored as HxHx and HxAx (i.e.
|
Dawn@4
|
153 % without the "c"
|
Dawn@4
|
154 if (isfield(mdata, 'H1H2'))
|
Dawn@4
|
155 mdata.H1H2c = mdata.H1H2;
|
Dawn@4
|
156 end
|
Dawn@4
|
157
|
Dawn@4
|
158 if (isfield(mdata, 'H2H4'))
|
Dawn@4
|
159 mdata.H2H4c = mdata.H2H4;
|
Dawn@4
|
160 end
|
Dawn@4
|
161
|
Dawn@4
|
162 if (isfield(mdata, 'H1A1'))
|
Dawn@4
|
163 mdata.H1A1c = mdata.H1A1;
|
Dawn@4
|
164 end
|
Dawn@4
|
165
|
Dawn@4
|
166 if (isfield(mdata, 'H1A2'))
|
Dawn@4
|
167 mdata.H1A2c = mdata.H1A2;
|
Dawn@4
|
168 end
|
Dawn@4
|
169
|
Dawn@4
|
170 if (isfield(mdata, 'H1A3'))
|
Dawn@4
|
171 mdata.H1A3c = mdata.H1A3;
|
Dawn@4
|
172 end
|
Dawn@4
|
173
|
Dawn@4
|
174
|
Dawn@4
|
175 % check if the others require smoothing
|
Dawn@4
|
176 if (smoothwin ~= 0)
|
Dawn@4
|
177 if (isfield(mdata, 'H1H2c'))
|
Dawn@4
|
178 mdata.H1H2c = filter(ones(smoothwin,1)/smoothwin, 1, mdata.H1H2c);
|
Dawn@4
|
179 end
|
Dawn@4
|
180
|
Dawn@4
|
181 if (isfield(mdata, 'H2H4c'))
|
Dawn@4
|
182 mdata.H2H4c = filter(ones(smoothwin,1)/smoothwin, 1, mdata.H2H4c);
|
Dawn@4
|
183 end
|
Dawn@4
|
184
|
Dawn@4
|
185 if (isfield(mdata, 'H1A1c'))
|
Dawn@4
|
186 mdata.H1A1c = filter(ones(smoothwin,1)/smoothwin, 1, mdata.H1A1c);
|
Dawn@4
|
187 end
|
Dawn@4
|
188
|
Dawn@4
|
189 if (isfield(mdata, 'H1A2c'))
|
Dawn@4
|
190 mdata.H1A2c = filter(ones(smoothwin,1)/smoothwin, 1, mdata.H1A2c);
|
Dawn@4
|
191 end
|
Dawn@4
|
192
|
Dawn@4
|
193 if (isfield(mdata, 'H1A3c'))
|
Dawn@4
|
194 mdata.H1A3c = filter(ones(smoothwin,1)/smoothwin, 1, mdata.H1A3c);
|
Dawn@4
|
195 end
|
Dawn@4
|
196
|
Dawn@4
|
197 if (isfield(mdata, 'CPP'))
|
Dawn@4
|
198 mdata.CPP = filter(ones(smoothwin,1)/smoothwin, 1, mdata.CPP);
|
Dawn@4
|
199 end
|
Dawn@4
|
200
|
Dawn@4
|
201 if (isfield(mdata, 'HNR05'))
|
Dawn@4
|
202 mdata.HNR05 = filter(ones(smoothwin,1)/smoothwin, 1, mdata.HNR05);
|
Dawn@4
|
203 end
|
Dawn@4
|
204
|
Dawn@4
|
205 if (isfield(mdata, 'HNR15'))
|
Dawn@4
|
206 mdata.HNR15 = filter(ones(smoothwin,1)/smoothwin, 1, mdata.HNR15);
|
Dawn@4
|
207 end
|
Dawn@4
|
208
|
Dawn@4
|
209 if (isfield(mdata, 'HNR25'))
|
Dawn@4
|
210 mdata.HNR25 = filter(ones(smoothwin,1)/smoothwin, 1, mdata.HNR25);
|
Dawn@4
|
211 end
|
Dawn@4
|
212
|
Dawn@4
|
213 if (isfield(mdata, 'HNR35'))
|
Dawn@4
|
214 mdata.HNR35 = filter(ones(smoothwin,1)/smoothwin, 1, mdata.HNR35);
|
Dawn@4
|
215 end
|
Dawn@4
|
216
|
Dawn@4
|
217 end |