rmeddis@38
|
1 function Exp_Tutorial_2(isMasterNode)
|
rmeddis@38
|
2
|
rmeddis@38
|
3 % This tutorial recycles a HMM
|
rmeddis@38
|
4
|
rmeddis@38
|
5 %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
rmeddis@38
|
6 % Set up the basic experiment parameters
|
rmeddis@38
|
7 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
rmeddis@38
|
8 expName = 'Tutorial';
|
rmeddis@38
|
9 dataFolderPrefix = 'recycle_featR';
|
rmeddis@38
|
10 if isunix
|
rmeddis@38
|
11 expFolderPrefix = '/scratch/nrclark/exps/';
|
rmeddis@38
|
12 else
|
rmeddis@38
|
13 expFolderPrefix = 'D:\Exps';
|
rmeddis@38
|
14 end
|
rmeddis@38
|
15
|
rmeddis@38
|
16 % expFolderPrefix = pwd;
|
rmeddis@38
|
17 expFolder = fullfile(expFolderPrefix,expName);
|
rmeddis@38
|
18 hmmFolder = fullfile(expFolder,'hmm');
|
rmeddis@38
|
19
|
rmeddis@38
|
20 %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
rmeddis@38
|
21 % Sort out the training (LEARNING) condition
|
rmeddis@38
|
22 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
rmeddis@38
|
23 learnFolder = fullfile(expFolder,'featL');
|
rmeddis@38
|
24
|
rmeddis@38
|
25 xL = cJob('L', learnFolder);
|
rmeddis@38
|
26
|
rmeddis@38
|
27 xL.participant = 'Normal';
|
rmeddis@38
|
28 xL.MAPparamChanges= {'DRNLParams.rateToAttenuationFactorProb=0;', 'OMEParams.rateToAttenuationFactorProb=0;' };
|
rmeddis@38
|
29
|
rmeddis@38
|
30 xL.noiseLevToUse = -200;
|
rmeddis@38
|
31 xL.speechLevToUse = 60;
|
rmeddis@38
|
32
|
rmeddis@38
|
33 xL.MAPopHSR = 1;
|
rmeddis@38
|
34 xL.MAPopMSR = 0;
|
rmeddis@38
|
35 xL.MAPopLSR = 0;
|
rmeddis@38
|
36
|
rmeddis@38
|
37
|
rmeddis@38
|
38 xL.numCoeff = 14;
|
rmeddis@38
|
39 xL.removeEnergyStatic = 0;
|
rmeddis@38
|
40
|
rmeddis@38
|
41 %%%%% Group of params that will influence simulation run time %%%%%%%
|
rmeddis@38
|
42 xL.numWavs = 12; %MAX=8440
|
rmeddis@38
|
43 testWavs = 6; %MAX = 358
|
rmeddis@38
|
44 nzLevel = [-200 40:10:70];
|
rmeddis@38
|
45 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
rmeddis@38
|
46
|
rmeddis@38
|
47 xL.noisePreDur = 1;
|
rmeddis@38
|
48 xL.noisePostDur = 0.1;
|
rmeddis@38
|
49 xL.truncateDur = xL.noisePreDur-0.1;
|
rmeddis@38
|
50 xL.noiseName = 'pink_demo';
|
rmeddis@38
|
51
|
rmeddis@38
|
52
|
rmeddis@38
|
53 % if isMasterNode && ~isdir(xL.opFolder)
|
rmeddis@38
|
54 % mkdir(xL.opFolder);
|
rmeddis@38
|
55 % xL = xL.assignFiles;
|
rmeddis@38
|
56 % xL.storeSelf;
|
rmeddis@38
|
57 % end
|
rmeddis@38
|
58
|
rmeddis@38
|
59 %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
rmeddis@38
|
60 % Sort out the testing (RECOGNITION) conditions
|
rmeddis@38
|
61 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
rmeddis@38
|
62 recConditions = numel(nzLevel);
|
rmeddis@38
|
63
|
rmeddis@38
|
64 tmpIdx=0;
|
rmeddis@38
|
65 for nn = 0*recConditions+1:1*recConditions
|
rmeddis@38
|
66 tmpIdx=tmpIdx+1;
|
rmeddis@38
|
67 xR{nn} = xL; %simply copy the "Learn" object and change it a bit below
|
rmeddis@38
|
68 recFolder = fullfile(expFolder,[dataFolderPrefix num2str(nn)]);
|
rmeddis@38
|
69 xR{nn}.opFolder = recFolder;
|
rmeddis@38
|
70
|
rmeddis@38
|
71 %These are the interesting differences between training and testing
|
rmeddis@38
|
72 xR{nn}.numWavs = testWavs; %MAX = 358
|
rmeddis@38
|
73 xR{nn}.noiseLevToUse = nzLevel(tmpIdx);
|
rmeddis@38
|
74 xR{nn}.MAPparamChanges= {'DRNLParams.a=400;'};
|
rmeddis@38
|
75
|
rmeddis@38
|
76
|
rmeddis@38
|
77 %Now just to wrap it up ready for processing
|
rmeddis@38
|
78 if isMasterNode && ~isdir(xR{nn}.opFolder)
|
rmeddis@38
|
79 mkdir(xR{nn}.opFolder);
|
rmeddis@38
|
80 xR{nn} = xR{nn}.assignWavPaths('R');
|
rmeddis@38
|
81 xR{nn} = xR{nn}.assignFiles;
|
rmeddis@38
|
82 xR{nn}.storeSelf;
|
rmeddis@38
|
83 end
|
rmeddis@38
|
84 end
|
rmeddis@38
|
85
|
rmeddis@38
|
86 tmpIdx=0;
|
rmeddis@38
|
87 for nn = 1*recConditions+1:2*recConditions
|
rmeddis@38
|
88 tmpIdx=tmpIdx+1;
|
rmeddis@38
|
89 xR{nn} = xL; %simply copy the "Learn" object and change it a bit below
|
rmeddis@38
|
90 recFolder = fullfile(expFolder,[dataFolderPrefix num2str(nn)]);
|
rmeddis@38
|
91 xR{nn}.opFolder = recFolder;
|
rmeddis@38
|
92
|
rmeddis@38
|
93 %These are the interesting differences between training and testing
|
rmeddis@38
|
94 xR{nn}.numWavs = testWavs; %MAX = 358
|
rmeddis@38
|
95 xR{nn}.noiseLevToUse = nzLevel(tmpIdx);
|
rmeddis@38
|
96 xR{nn}.MAPparamChanges= {'DRNLParams.a=400;'};
|
rmeddis@38
|
97
|
rmeddis@38
|
98 xR{nn}.mainGain = [27.2013; 26.0797; 26.0939; 26.7997; 26.0520];
|
rmeddis@38
|
99 xR{nn}.TCdBO = [37; 37; 37; 37; 37]; %Compression thresholds (in dB OUTPUT from 2nd filt)
|
rmeddis@38
|
100 xR{nn}.TMdBO = [20; 20; 20; 20; 20]; %MOC thresholds (in dB OUTPUT from 2nd filt)
|
rmeddis@38
|
101 xR{nn}.ARthresholddB = 85; % dB SPL (input signal level) =>200 to disable
|
rmeddis@38
|
102 xR{nn}.MOCtau = 1;
|
rmeddis@38
|
103 xR{nn}.useAid = 1;
|
rmeddis@38
|
104
|
rmeddis@38
|
105 %Now just to wrap it up ready for processing
|
rmeddis@38
|
106 if isMasterNode && ~isdir(xR{nn}.opFolder)
|
rmeddis@38
|
107 mkdir(xR{nn}.opFolder);
|
rmeddis@38
|
108 xR{nn} = xR{nn}.assignWavPaths('R');
|
rmeddis@38
|
109 xR{nn} = xR{nn}.assignFiles;
|
rmeddis@38
|
110 xR{nn}.storeSelf;
|
rmeddis@38
|
111 end
|
rmeddis@38
|
112 end
|
rmeddis@38
|
113
|
rmeddis@38
|
114
|
rmeddis@38
|
115
|
rmeddis@38
|
116 %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
rmeddis@38
|
117 % ** Generate features **
|
rmeddis@38
|
118 % This is the time consuming, processing intensive portion of the program.
|
rmeddis@38
|
119 % Nodes that are not the master node are only interested in the opFolder
|
rmeddis@38
|
120 % member of the jobjects.
|
rmeddis@38
|
121 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
rmeddis@38
|
122 % worker(xL.opFolder);
|
rmeddis@38
|
123 maxConds = nn;
|
rmeddis@38
|
124 if ~isMasterNode %dont bother wasting master node effort on generating testing features (for now)
|
rmeddis@38
|
125 for nn = 1:maxConds
|
rmeddis@38
|
126 worker(xR{nn}.opFolder);
|
rmeddis@38
|
127 end
|
rmeddis@38
|
128 end
|
rmeddis@38
|
129
|
rmeddis@38
|
130 %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
rmeddis@38
|
131 % Train and test the recogniser - a job for the master node only
|
rmeddis@38
|
132 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
rmeddis@38
|
133 if isMasterNode
|
rmeddis@38
|
134 % while(~all(xL.todoStatus==2))
|
rmeddis@38
|
135 % disp('Waiting on straggler nodes to complete their jobs before HMM is trained . . .')
|
rmeddis@38
|
136 % pause(30); %Wait for 30 seconds before looking again
|
rmeddis@38
|
137 % xL.lockJobList;
|
rmeddis@38
|
138 % xL = xL.loadSelf; %Reload incase changed
|
rmeddis@38
|
139 % xL.unlockJobList;
|
rmeddis@38
|
140 % end
|
rmeddis@38
|
141 y = cHMM(hmmFolder);
|
rmeddis@38
|
142 y.numCoeff = 14*3;
|
rmeddis@38
|
143 % y.createSCP(xL.opFolder)
|
rmeddis@38
|
144 % y.createMLF(xL.opFolder)
|
rmeddis@38
|
145 % y.train(xL.opFolder) %This node can be busy training, even if other jobs are being processed for testing
|
rmeddis@38
|
146
|
rmeddis@38
|
147 % ALLOW MASTER NODE TO MUCK IN WITH GENERATING TESTING FEATURES ONCE
|
rmeddis@38
|
148 % HMM HAS BEEN TRAINED
|
rmeddis@38
|
149 for nn = 1:maxConds
|
rmeddis@38
|
150 worker(xR{nn}.opFolder);
|
rmeddis@38
|
151 end
|
rmeddis@38
|
152
|
rmeddis@38
|
153 xR{end}.lockJobList;
|
rmeddis@38
|
154 xR{end} = xR{end}.loadSelf; %Reload changes
|
rmeddis@38
|
155 xR{end}.unlockJobList;
|
rmeddis@38
|
156 while(~all(xR{end}.todoStatus==2))
|
rmeddis@38
|
157 disp('Waiting on straggler nodes to complete their jobs before HMM is tested . . .')
|
rmeddis@38
|
158 pause(30); %Wait for 30 seconds before looking again
|
rmeddis@38
|
159 xR{end}.lockJobList;
|
rmeddis@38
|
160 xR{end} = xR{end}.loadSelf; %Reload incase changed
|
rmeddis@38
|
161 xR{end}.unlockJobList;
|
rmeddis@38
|
162 end
|
rmeddis@38
|
163
|
rmeddis@38
|
164 for nn = 1:maxConds
|
rmeddis@38
|
165 y.createSCP(xR{nn}.opFolder);
|
rmeddis@38
|
166 y.test(xR{nn}.opFolder);
|
rmeddis@38
|
167 end
|
rmeddis@38
|
168
|
rmeddis@38
|
169 %Show all of the scores in the command window at the end
|
rmeddis@38
|
170 for nn = 1:maxConds
|
rmeddis@38
|
171 y.score(xR{nn}.opFolder);
|
rmeddis@38
|
172 end
|
rmeddis@38
|
173 end
|