function apmtest(task, testname, filepath, casenumber, legacy) %APMTEST is a tool to process APM file sets and easily display the output. % APMTEST(TASK, TESTNAME, CASENUMBER) performs one of several TASKs: % 'test' Processes the files to produce test output. % 'list' Prints a list of cases in the test set, preceded by their % CASENUMBERs. % 'show' Uses spclab to show the test case specified by the % CASENUMBER parameter. % % using a set of test files determined by TESTNAME: % 'all' All tests. % 'apm' The standard APM test set (default). % 'apmm' The mobile APM test set. % 'aec' The AEC test set. % 'aecm' The AECM test set. % 'agc' The AGC test set. % 'ns' The NS test set. % 'vad' The VAD test set. % % FILEPATH specifies the path to the test data files. % % CASENUMBER can be used to select a single test case. Omit CASENUMBER, % or set to zero, to use all test cases. % if nargin < 5 || isempty(legacy) % Set to true to run old VQE recordings. legacy = false; end if nargin < 4 || isempty(casenumber) casenumber = 0; end if nargin < 3 || isempty(filepath) filepath = 'data/'; end if nargin < 2 || isempty(testname) testname = 'all'; end if nargin < 1 || isempty(task) task = 'test'; end if ~strcmp(task, 'test') && ~strcmp(task, 'list') && ~strcmp(task, 'show') error(['TASK ' task ' is not recognized']); end if casenumber == 0 && strcmp(task, 'show') error(['CASENUMBER must be specified for TASK ' task]); end inpath = [filepath 'input/']; outpath = [filepath 'output/']; refpath = [filepath 'reference/']; if strcmp(testname, 'all') tests = {'apm','apmm','aec','aecm','agc','ns','vad'}; else tests = {testname}; end if legacy progname = './test'; else progname = './process_test'; end global farFile; global nearFile; global eventFile; global delayFile; global driftFile; if legacy farFile = 'vqeFar.pcm'; nearFile = 'vqeNear.pcm'; eventFile = 'vqeEvent.dat'; delayFile = 'vqeBuf.dat'; driftFile = 'vqeDrift.dat'; else farFile = 'apm_far.pcm'; nearFile = 'apm_near.pcm'; eventFile = 'apm_event.dat'; delayFile = 'apm_delay.dat'; driftFile = 'apm_drift.dat'; end simulateMode = false; nErr = 0; nCases = 0; for i=1:length(tests) simulateMode = false; if strcmp(tests{i}, 'apm') testdir = ['apm/']; outfile = ['out']; if legacy opt = ['-ec 1 -agc 2 -nc 2 -vad 3']; else opt = ['--no_progress -hpf' ... ' -aec --drift_compensation -agc --fixed_digital' ... ' -ns --ns_moderate -vad']; end elseif strcmp(tests{i}, 'apm-swb') simulateMode = true; testdir = ['apm-swb/']; outfile = ['out']; if legacy opt = ['-fs 32000 -ec 1 -agc 2 -nc 2']; else opt = ['--no_progress -fs 32000 -hpf' ... ' -aec --drift_compensation -agc --adaptive_digital' ... ' -ns --ns_moderate -vad']; end elseif strcmp(tests{i}, 'apmm') testdir = ['apmm/']; outfile = ['out']; opt = ['-aec --drift_compensation -agc --fixed_digital -hpf -ns ' ... '--ns_moderate']; else error(['TESTNAME ' tests{i} ' is not recognized']); end inpathtest = [inpath testdir]; outpathtest = [outpath testdir]; refpathtest = [refpath testdir]; if ~exist(inpathtest,'dir') error(['Input directory ' inpathtest ' does not exist']); end if ~exist(refpathtest,'dir') warning(['Reference directory ' refpathtest ' does not exist']); end [status, errMsg] = mkdir(outpathtest); if (status == 0) error(errMsg); end [nErr, nCases] = recurseDir(inpathtest, outpathtest, refpathtest, outfile, ... progname, opt, simulateMode, nErr, nCases, task, casenumber, legacy); if strcmp(task, 'test') || strcmp(task, 'show') system(['rm ' farFile]); system(['rm ' nearFile]); if simulateMode == false system(['rm ' eventFile]); system(['rm ' delayFile]); system(['rm ' driftFile]); end end end if ~strcmp(task, 'list') if nErr == 0 fprintf(1, '\nAll files are bit-exact to reference\n', nErr); else fprintf(1, '\n%d files are NOT bit-exact to reference\n', nErr); end end function [nErrOut, nCases] = recurseDir(inpath, outpath, refpath, ... outfile, progname, opt, simulateMode, nErr, nCases, task, casenumber, ... legacy) global farFile; global nearFile; global eventFile; global delayFile; global driftFile; dirs = dir(inpath); nDirs = 0; nErrOut = nErr; for i=3:length(dirs) % skip . and .. nDirs = nDirs + dirs(i).isdir; end if nDirs == 0 nCases = nCases + 1; if casenumber == nCases || casenumber == 0 if strcmp(task, 'list') fprintf([num2str(nCases) '. ' outfile '\n']) else vadoutfile = ['vad_' outfile '.dat']; outfile = [outfile '.pcm']; % Check for VAD test vadTest = 0; if ~isempty(findstr(opt, '-vad')) vadTest = 1; if legacy opt = [opt ' ' outpath vadoutfile]; else opt = [opt ' --vad_out_file ' outpath vadoutfile]; end end if exist([inpath 'vqeFar.pcm']) system(['ln -s -f ' inpath 'vqeFar.pcm ' farFile]); elseif exist([inpath 'apm_far.pcm']) system(['ln -s -f ' inpath 'apm_far.pcm ' farFile]); end if exist([inpath 'vqeNear.pcm']) system(['ln -s -f ' inpath 'vqeNear.pcm ' nearFile]); elseif exist([inpath 'apm_near.pcm']) system(['ln -s -f ' inpath 'apm_near.pcm ' nearFile]); end if exist([inpath 'vqeEvent.dat']) system(['ln -s -f ' inpath 'vqeEvent.dat ' eventFile]); elseif exist([inpath 'apm_event.dat']) system(['ln -s -f ' inpath 'apm_event.dat ' eventFile]); end if exist([inpath 'vqeBuf.dat']) system(['ln -s -f ' inpath 'vqeBuf.dat ' delayFile]); elseif exist([inpath 'apm_delay.dat']) system(['ln -s -f ' inpath 'apm_delay.dat ' delayFile]); end if exist([inpath 'vqeSkew.dat']) system(['ln -s -f ' inpath 'vqeSkew.dat ' driftFile]); elseif exist([inpath 'vqeDrift.dat']) system(['ln -s -f ' inpath 'vqeDrift.dat ' driftFile]); elseif exist([inpath 'apm_drift.dat']) system(['ln -s -f ' inpath 'apm_drift.dat ' driftFile]); end if simulateMode == false command = [progname ' -o ' outpath outfile ' ' opt]; else if legacy inputCmd = [' -in ' nearFile]; else inputCmd = [' -i ' nearFile]; end if exist([farFile]) if legacy inputCmd = [' -if ' farFile inputCmd]; else inputCmd = [' -ir ' farFile inputCmd]; end end command = [progname inputCmd ' -o ' outpath outfile ' ' opt]; end % This prevents MATLAB from using its own C libraries. shellcmd = ['bash -c "unset LD_LIBRARY_PATH;']; fprintf([command '\n']); [status, result] = system([shellcmd command '"']); fprintf(result); fprintf(['Reference file: ' refpath outfile '\n']); if vadTest == 1 equal_to_ref = are_files_equal([outpath vadoutfile], ... [refpath vadoutfile], ... 'int8'); if ~equal_to_ref nErr = nErr + 1; end end [equal_to_ref, diffvector] = are_files_equal([outpath outfile], ... [refpath outfile], ... 'int16'); if ~equal_to_ref nErr = nErr + 1; end if strcmp(task, 'show') % Assume the last init gives the sample rate of interest. str_idx = strfind(result, 'Sample rate:'); fs = str2num(result(str_idx(end) + 13:str_idx(end) + 17)); fprintf('Using %d Hz\n', fs); if exist([farFile]) spclab(fs, farFile, nearFile, [refpath outfile], ... [outpath outfile], diffvector); %spclab(fs, diffvector); else spclab(fs, nearFile, [refpath outfile], [outpath outfile], ... diffvector); %spclab(fs, diffvector); end end end end else for i=3:length(dirs) if dirs(i).isdir [nErr, nCases] = recurseDir([inpath dirs(i).name '/'], outpath, ... refpath,[outfile '_' dirs(i).name], progname, opt, ... simulateMode, nErr, nCases, task, casenumber, legacy); end end end nErrOut = nErr; function [are_equal, diffvector] = ... are_files_equal(newfile, reffile, precision, diffvector) are_equal = false; diffvector = 0; if ~exist(newfile,'file') warning(['Output file ' newfile ' does not exist']); return end if ~exist(reffile,'file') warning(['Reference file ' reffile ' does not exist']); return end fid = fopen(newfile,'rb'); new = fread(fid,inf,precision); fclose(fid); fid = fopen(reffile,'rb'); ref = fread(fid,inf,precision); fclose(fid); if length(new) ~= length(ref) warning('Reference is not the same length as output'); minlength = min(length(new), length(ref)); new = new(1:minlength); ref = ref(1:minlength); end diffvector = new - ref; if isequal(new, ref) fprintf([newfile ' is bit-exact to reference\n']); are_equal = true; else if isempty(new) warning([newfile ' is empty']); return end snr = snrseg(new,ref,80); fprintf('\n'); are_equal = false; end