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