rmeddis@38: function Exp_Tutorial_2(isMasterNode) rmeddis@38: rmeddis@38: % This tutorial recycles a HMM rmeddis@38: rmeddis@38: %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% rmeddis@38: % Set up the basic experiment parameters rmeddis@38: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% rmeddis@38: expName = 'Tutorial'; rmeddis@38: dataFolderPrefix = 'recycle_featR'; rmeddis@38: if isunix rmeddis@38: expFolderPrefix = '/scratch/nrclark/exps/'; rmeddis@38: else rmeddis@38: expFolderPrefix = 'D:\Exps'; rmeddis@38: end rmeddis@38: rmeddis@38: % expFolderPrefix = pwd; rmeddis@38: expFolder = fullfile(expFolderPrefix,expName); rmeddis@38: hmmFolder = fullfile(expFolder,'hmm'); rmeddis@38: rmeddis@38: %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% rmeddis@38: % Sort out the training (LEARNING) condition rmeddis@38: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% rmeddis@38: learnFolder = fullfile(expFolder,'featL'); rmeddis@38: rmeddis@38: xL = cJob('L', learnFolder); rmeddis@38: rmeddis@38: xL.participant = 'Normal'; rmeddis@38: xL.MAPparamChanges= {'DRNLParams.rateToAttenuationFactorProb=0;', 'OMEParams.rateToAttenuationFactorProb=0;' }; rmeddis@38: rmeddis@38: xL.noiseLevToUse = -200; rmeddis@38: xL.speechLevToUse = 60; rmeddis@38: rmeddis@38: xL.MAPopHSR = 1; rmeddis@38: xL.MAPopMSR = 0; rmeddis@38: xL.MAPopLSR = 0; rmeddis@38: rmeddis@38: rmeddis@38: xL.numCoeff = 14; rmeddis@38: xL.removeEnergyStatic = 0; rmeddis@38: rmeddis@38: %%%%% Group of params that will influence simulation run time %%%%%%% rmeddis@38: xL.numWavs = 12; %MAX=8440 rmeddis@38: testWavs = 6; %MAX = 358 rmeddis@38: nzLevel = [-200 40:10:70]; rmeddis@38: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% rmeddis@38: rmeddis@38: xL.noisePreDur = 1; rmeddis@38: xL.noisePostDur = 0.1; rmeddis@38: xL.truncateDur = xL.noisePreDur-0.1; rmeddis@38: xL.noiseName = 'pink_demo'; rmeddis@38: rmeddis@38: rmeddis@38: % if isMasterNode && ~isdir(xL.opFolder) rmeddis@38: % mkdir(xL.opFolder); rmeddis@38: % xL = xL.assignFiles; rmeddis@38: % xL.storeSelf; rmeddis@38: % end rmeddis@38: rmeddis@38: %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% rmeddis@38: % Sort out the testing (RECOGNITION) conditions rmeddis@38: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% rmeddis@38: recConditions = numel(nzLevel); rmeddis@38: rmeddis@38: tmpIdx=0; rmeddis@38: for nn = 0*recConditions+1:1*recConditions rmeddis@38: tmpIdx=tmpIdx+1; rmeddis@38: xR{nn} = xL; %simply copy the "Learn" object and change it a bit below rmeddis@38: recFolder = fullfile(expFolder,[dataFolderPrefix num2str(nn)]); rmeddis@38: xR{nn}.opFolder = recFolder; rmeddis@38: rmeddis@38: %These are the interesting differences between training and testing rmeddis@38: xR{nn}.numWavs = testWavs; %MAX = 358 rmeddis@38: xR{nn}.noiseLevToUse = nzLevel(tmpIdx); rmeddis@38: xR{nn}.MAPparamChanges= {'DRNLParams.a=400;'}; rmeddis@38: rmeddis@38: rmeddis@38: %Now just to wrap it up ready for processing rmeddis@38: if isMasterNode && ~isdir(xR{nn}.opFolder) rmeddis@38: mkdir(xR{nn}.opFolder); rmeddis@38: xR{nn} = xR{nn}.assignWavPaths('R'); rmeddis@38: xR{nn} = xR{nn}.assignFiles; rmeddis@38: xR{nn}.storeSelf; rmeddis@38: end rmeddis@38: end rmeddis@38: rmeddis@38: tmpIdx=0; rmeddis@38: for nn = 1*recConditions+1:2*recConditions rmeddis@38: tmpIdx=tmpIdx+1; rmeddis@38: xR{nn} = xL; %simply copy the "Learn" object and change it a bit below rmeddis@38: recFolder = fullfile(expFolder,[dataFolderPrefix num2str(nn)]); rmeddis@38: xR{nn}.opFolder = recFolder; rmeddis@38: rmeddis@38: %These are the interesting differences between training and testing rmeddis@38: xR{nn}.numWavs = testWavs; %MAX = 358 rmeddis@38: xR{nn}.noiseLevToUse = nzLevel(tmpIdx); rmeddis@38: xR{nn}.MAPparamChanges= {'DRNLParams.a=400;'}; rmeddis@38: rmeddis@38: xR{nn}.mainGain = [27.2013; 26.0797; 26.0939; 26.7997; 26.0520]; rmeddis@38: xR{nn}.TCdBO = [37; 37; 37; 37; 37]; %Compression thresholds (in dB OUTPUT from 2nd filt) rmeddis@38: xR{nn}.TMdBO = [20; 20; 20; 20; 20]; %MOC thresholds (in dB OUTPUT from 2nd filt) rmeddis@38: xR{nn}.ARthresholddB = 85; % dB SPL (input signal level) =>200 to disable rmeddis@38: xR{nn}.MOCtau = 1; rmeddis@38: xR{nn}.useAid = 1; rmeddis@38: rmeddis@38: %Now just to wrap it up ready for processing rmeddis@38: if isMasterNode && ~isdir(xR{nn}.opFolder) rmeddis@38: mkdir(xR{nn}.opFolder); rmeddis@38: xR{nn} = xR{nn}.assignWavPaths('R'); rmeddis@38: xR{nn} = xR{nn}.assignFiles; rmeddis@38: xR{nn}.storeSelf; rmeddis@38: end rmeddis@38: end rmeddis@38: rmeddis@38: rmeddis@38: rmeddis@38: %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% rmeddis@38: % ** Generate features ** rmeddis@38: % This is the time consuming, processing intensive portion of the program. rmeddis@38: % Nodes that are not the master node are only interested in the opFolder rmeddis@38: % member of the jobjects. rmeddis@38: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% rmeddis@38: % worker(xL.opFolder); rmeddis@38: maxConds = nn; rmeddis@38: if ~isMasterNode %dont bother wasting master node effort on generating testing features (for now) rmeddis@38: for nn = 1:maxConds rmeddis@38: worker(xR{nn}.opFolder); rmeddis@38: end rmeddis@38: end rmeddis@38: rmeddis@38: %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% rmeddis@38: % Train and test the recogniser - a job for the master node only rmeddis@38: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% rmeddis@38: if isMasterNode rmeddis@38: % while(~all(xL.todoStatus==2)) rmeddis@38: % disp('Waiting on straggler nodes to complete their jobs before HMM is trained . . .') rmeddis@38: % pause(30); %Wait for 30 seconds before looking again rmeddis@38: % xL.lockJobList; rmeddis@38: % xL = xL.loadSelf; %Reload incase changed rmeddis@38: % xL.unlockJobList; rmeddis@38: % end rmeddis@38: y = cHMM(hmmFolder); rmeddis@38: y.numCoeff = 14*3; rmeddis@38: % y.createSCP(xL.opFolder) rmeddis@38: % y.createMLF(xL.opFolder) rmeddis@38: % y.train(xL.opFolder) %This node can be busy training, even if other jobs are being processed for testing rmeddis@38: rmeddis@38: % ALLOW MASTER NODE TO MUCK IN WITH GENERATING TESTING FEATURES ONCE rmeddis@38: % HMM HAS BEEN TRAINED rmeddis@38: for nn = 1:maxConds rmeddis@38: worker(xR{nn}.opFolder); rmeddis@38: end rmeddis@38: rmeddis@38: xR{end}.lockJobList; rmeddis@38: xR{end} = xR{end}.loadSelf; %Reload changes rmeddis@38: xR{end}.unlockJobList; rmeddis@38: while(~all(xR{end}.todoStatus==2)) rmeddis@38: disp('Waiting on straggler nodes to complete their jobs before HMM is tested . . .') rmeddis@38: pause(30); %Wait for 30 seconds before looking again rmeddis@38: xR{end}.lockJobList; rmeddis@38: xR{end} = xR{end}.loadSelf; %Reload incase changed rmeddis@38: xR{end}.unlockJobList; rmeddis@38: end rmeddis@38: rmeddis@38: for nn = 1:maxConds rmeddis@38: y.createSCP(xR{nn}.opFolder); rmeddis@38: y.test(xR{nn}.opFolder); rmeddis@38: end rmeddis@38: rmeddis@38: %Show all of the scores in the command window at the end rmeddis@38: for nn = 1:maxConds rmeddis@38: y.score(xR{nn}.opFolder); rmeddis@38: end rmeddis@38: end