1 function apmtest(task, testname, filepath, casenumber, legacy) 2 %APMTEST is a tool to process APM file sets and easily display the output. 3 % APMTEST(TASK, TESTNAME, CASENUMBER) performs one of several TASKs: 4 % 'test' Processes the files to produce test output. 5 % 'list' Prints a list of cases in the test set, preceded by their 6 % CASENUMBERs. 7 % 'show' Uses spclab to show the test case specified by the 8 % CASENUMBER parameter. 9 % 10 % using a set of test files determined by TESTNAME: 11 % 'all' All tests. 12 % 'apm' The standard APM test set (default). 13 % 'apmm' The mobile APM test set. 14 % 'aec' The AEC test set. 15 % 'aecm' The AECM test set. 16 % 'agc' The AGC test set. 17 % 'ns' The NS test set. 18 % 'vad' The VAD test set. 19 % 20 % FILEPATH specifies the path to the test data files. 21 % 22 % CASENUMBER can be used to select a single test case. Omit CASENUMBER, 23 % or set to zero, to use all test cases. 24 % 25 26 if nargin < 5 || isempty(legacy) 27 % Set to true to run old VQE recordings. 28 legacy = false; 29 end 30 31 if nargin < 4 || isempty(casenumber) 32 casenumber = 0; 33 end 34 35 if nargin < 3 || isempty(filepath) 36 filepath = 'data/'; 37 end 38 39 if nargin < 2 || isempty(testname) 40 testname = 'all'; 41 end 42 43 if nargin < 1 || isempty(task) 44 task = 'test'; 45 end 46 47 if ~strcmp(task, 'test') && ~strcmp(task, 'list') && ~strcmp(task, 'show') 48 error(['TASK ' task ' is not recognized']); 49 end 50 51 if casenumber == 0 && strcmp(task, 'show') 52 error(['CASENUMBER must be specified for TASK ' task]); 53 end 54 55 inpath = [filepath 'input/']; 56 outpath = [filepath 'output/']; 57 refpath = [filepath 'reference/']; 58 59 if strcmp(testname, 'all') 60 tests = {'apm','apmm','aec','aecm','agc','ns','vad'}; 61 else 62 tests = {testname}; 63 end 64 65 if legacy 66 progname = './test'; 67 else 68 progname = './process_test'; 69 end 70 71 global farFile; 72 global nearFile; 73 global eventFile; 74 global delayFile; 75 global driftFile; 76 77 if legacy 78 farFile = 'vqeFar.pcm'; 79 nearFile = 'vqeNear.pcm'; 80 eventFile = 'vqeEvent.dat'; 81 delayFile = 'vqeBuf.dat'; 82 driftFile = 'vqeDrift.dat'; 83 else 84 farFile = 'apm_far.pcm'; 85 nearFile = 'apm_near.pcm'; 86 eventFile = 'apm_event.dat'; 87 delayFile = 'apm_delay.dat'; 88 driftFile = 'apm_drift.dat'; 89 end 90 91 simulateMode = false; 92 nErr = 0; 93 nCases = 0; 94 for i=1:length(tests) 95 simulateMode = false; 96 97 if strcmp(tests{i}, 'apm') 98 testdir = ['apm/']; 99 outfile = ['out']; 100 if legacy 101 opt = ['-ec 1 -agc 2 -nc 2 -vad 3']; 102 else 103 opt = ['--no_progress -hpf' ... 104 ' -aec --drift_compensation -agc --fixed_digital' ... 105 ' -ns --ns_moderate -vad']; 106 end 107 108 elseif strcmp(tests{i}, 'apm-swb') 109 simulateMode = true; 110 testdir = ['apm-swb/']; 111 outfile = ['out']; 112 if legacy 113 opt = ['-fs 32000 -ec 1 -agc 2 -nc 2']; 114 else 115 opt = ['--no_progress -fs 32000 -hpf' ... 116 ' -aec --drift_compensation -agc --adaptive_digital' ... 117 ' -ns --ns_moderate -vad']; 118 end 119 elseif strcmp(tests{i}, 'apmm') 120 testdir = ['apmm/']; 121 outfile = ['out']; 122 opt = ['-aec --drift_compensation -agc --fixed_digital -hpf -ns ' ... 123 '--ns_moderate']; 124 125 else 126 error(['TESTNAME ' tests{i} ' is not recognized']); 127 end 128 129 inpathtest = [inpath testdir]; 130 outpathtest = [outpath testdir]; 131 refpathtest = [refpath testdir]; 132 133 if ~exist(inpathtest,'dir') 134 error(['Input directory ' inpathtest ' does not exist']); 135 end 136 137 if ~exist(refpathtest,'dir') 138 warning(['Reference directory ' refpathtest ' does not exist']); 139 end 140 141 [status, errMsg] = mkdir(outpathtest); 142 if (status == 0) 143 error(errMsg); 144 end 145 146 [nErr, nCases] = recurseDir(inpathtest, outpathtest, refpathtest, outfile, ... 147 progname, opt, simulateMode, nErr, nCases, task, casenumber, legacy); 148 149 if strcmp(task, 'test') || strcmp(task, 'show') 150 system(['rm ' farFile]); 151 system(['rm ' nearFile]); 152 if simulateMode == false 153 system(['rm ' eventFile]); 154 system(['rm ' delayFile]); 155 system(['rm ' driftFile]); 156 end 157 end 158 end 159 160 if ~strcmp(task, 'list') 161 if nErr == 0 162 fprintf(1, '\nAll files are bit-exact to reference\n', nErr); 163 else 164 fprintf(1, '\n%d files are NOT bit-exact to reference\n', nErr); 165 end 166 end 167 168 169 function [nErrOut, nCases] = recurseDir(inpath, outpath, refpath, ... 170 outfile, progname, opt, simulateMode, nErr, nCases, task, casenumber, ... 171 legacy) 172 173 global farFile; 174 global nearFile; 175 global eventFile; 176 global delayFile; 177 global driftFile; 178 179 dirs = dir(inpath); 180 nDirs = 0; 181 nErrOut = nErr; 182 for i=3:length(dirs) % skip . and .. 183 nDirs = nDirs + dirs(i).isdir; 184 end 185 186 187 if nDirs == 0 188 nCases = nCases + 1; 189 190 if casenumber == nCases || casenumber == 0 191 192 if strcmp(task, 'list') 193 fprintf([num2str(nCases) '. ' outfile '\n']) 194 else 195 vadoutfile = ['vad_' outfile '.dat']; 196 outfile = [outfile '.pcm']; 197 198 % Check for VAD test 199 vadTest = 0; 200 if ~isempty(findstr(opt, '-vad')) 201 vadTest = 1; 202 if legacy 203 opt = [opt ' ' outpath vadoutfile]; 204 else 205 opt = [opt ' --vad_out_file ' outpath vadoutfile]; 206 end 207 end 208 209 if exist([inpath 'vqeFar.pcm']) 210 system(['ln -s -f ' inpath 'vqeFar.pcm ' farFile]); 211 elseif exist([inpath 'apm_far.pcm']) 212 system(['ln -s -f ' inpath 'apm_far.pcm ' farFile]); 213 end 214 215 if exist([inpath 'vqeNear.pcm']) 216 system(['ln -s -f ' inpath 'vqeNear.pcm ' nearFile]); 217 elseif exist([inpath 'apm_near.pcm']) 218 system(['ln -s -f ' inpath 'apm_near.pcm ' nearFile]); 219 end 220 221 if exist([inpath 'vqeEvent.dat']) 222 system(['ln -s -f ' inpath 'vqeEvent.dat ' eventFile]); 223 elseif exist([inpath 'apm_event.dat']) 224 system(['ln -s -f ' inpath 'apm_event.dat ' eventFile]); 225 end 226 227 if exist([inpath 'vqeBuf.dat']) 228 system(['ln -s -f ' inpath 'vqeBuf.dat ' delayFile]); 229 elseif exist([inpath 'apm_delay.dat']) 230 system(['ln -s -f ' inpath 'apm_delay.dat ' delayFile]); 231 end 232 233 if exist([inpath 'vqeSkew.dat']) 234 system(['ln -s -f ' inpath 'vqeSkew.dat ' driftFile]); 235 elseif exist([inpath 'vqeDrift.dat']) 236 system(['ln -s -f ' inpath 'vqeDrift.dat ' driftFile]); 237 elseif exist([inpath 'apm_drift.dat']) 238 system(['ln -s -f ' inpath 'apm_drift.dat ' driftFile]); 239 end 240 241 if simulateMode == false 242 command = [progname ' -o ' outpath outfile ' ' opt]; 243 else 244 if legacy 245 inputCmd = [' -in ' nearFile]; 246 else 247 inputCmd = [' -i ' nearFile]; 248 end 249 250 if exist([farFile]) 251 if legacy 252 inputCmd = [' -if ' farFile inputCmd]; 253 else 254 inputCmd = [' -ir ' farFile inputCmd]; 255 end 256 end 257 command = [progname inputCmd ' -o ' outpath outfile ' ' opt]; 258 end 259 % This prevents MATLAB from using its own C libraries. 260 shellcmd = ['bash -c "unset LD_LIBRARY_PATH;']; 261 fprintf([command '\n']); 262 [status, result] = system([shellcmd command '"']); 263 fprintf(result); 264 265 fprintf(['Reference file: ' refpath outfile '\n']); 266 267 if vadTest == 1 268 equal_to_ref = are_files_equal([outpath vadoutfile], ... 269 [refpath vadoutfile], ... 270 'int8'); 271 if ~equal_to_ref 272 nErr = nErr + 1; 273 end 274 end 275 276 [equal_to_ref, diffvector] = are_files_equal([outpath outfile], ... 277 [refpath outfile], ... 278 'int16'); 279 if ~equal_to_ref 280 nErr = nErr + 1; 281 end 282 283 if strcmp(task, 'show') 284 % Assume the last init gives the sample rate of interest. 285 str_idx = strfind(result, 'Sample rate:'); 286 fs = str2num(result(str_idx(end) + 13:str_idx(end) + 17)); 287 fprintf('Using %d Hz\n', fs); 288 289 if exist([farFile]) 290 spclab(fs, farFile, nearFile, [refpath outfile], ... 291 [outpath outfile], diffvector); 292 %spclab(fs, diffvector); 293 else 294 spclab(fs, nearFile, [refpath outfile], [outpath outfile], ... 295 diffvector); 296 %spclab(fs, diffvector); 297 end 298 end 299 end 300 end 301 else 302 303 for i=3:length(dirs) 304 if dirs(i).isdir 305 [nErr, nCases] = recurseDir([inpath dirs(i).name '/'], outpath, ... 306 refpath,[outfile '_' dirs(i).name], progname, opt, ... 307 simulateMode, nErr, nCases, task, casenumber, legacy); 308 end 309 end 310 end 311 nErrOut = nErr; 312 313 function [are_equal, diffvector] = ... 314 are_files_equal(newfile, reffile, precision, diffvector) 315 316 are_equal = false; 317 diffvector = 0; 318 if ~exist(newfile,'file') 319 warning(['Output file ' newfile ' does not exist']); 320 return 321 end 322 323 if ~exist(reffile,'file') 324 warning(['Reference file ' reffile ' does not exist']); 325 return 326 end 327 328 fid = fopen(newfile,'rb'); 329 new = fread(fid,inf,precision); 330 fclose(fid); 331 332 fid = fopen(reffile,'rb'); 333 ref = fread(fid,inf,precision); 334 fclose(fid); 335 336 if length(new) ~= length(ref) 337 warning('Reference is not the same length as output'); 338 minlength = min(length(new), length(ref)); 339 new = new(1:minlength); 340 ref = ref(1:minlength); 341 end 342 diffvector = new - ref; 343 344 if isequal(new, ref) 345 fprintf([newfile ' is bit-exact to reference\n']); 346 are_equal = true; 347 else 348 if isempty(new) 349 warning([newfile ' is empty']); 350 return 351 end 352 snr = snrseg(new,ref,80); 353 fprintf('\n'); 354 are_equal = false; 355 end 356