1aace5b6bac7ad0aaa655d832aa72ae323b522504ajm@google.comfunction apmtest(task, testname, filepath, casenumber, legacy)
2470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com%APMTEST is a tool to process APM file sets and easily display the output.
3470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com%   APMTEST(TASK, TESTNAME, CASENUMBER) performs one of several TASKs:
4470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com%     'test'  Processes the files to produce test output.
5470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com%     'list'  Prints a list of cases in the test set, preceded by their
6470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com%             CASENUMBERs.
7470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com%     'show'  Uses spclab to show the test case specified by the
8470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com%             CASENUMBER parameter.
9470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com%
10470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com%   using a set of test files determined by TESTNAME:
11470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com%     'all'   All tests.
12470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com%     'apm'   The standard APM test set (default).
13470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com%     'apmm'  The mobile APM test set.
14470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com%     'aec'   The AEC test set.
15470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com%     'aecm'  The AECM test set.
16470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com%     'agc'   The AGC test set.
17470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com%     'ns'    The NS test set.
18470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com%     'vad'   The VAD test set.
19470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com%
20aace5b6bac7ad0aaa655d832aa72ae323b522504ajm@google.com%   FILEPATH specifies the path to the test data files.
21aace5b6bac7ad0aaa655d832aa72ae323b522504ajm@google.com%
22470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com%   CASENUMBER can be used to select a single test case. Omit CASENUMBER,
23470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com%   or set to zero, to use all test cases.
24470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com%
25470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
26aace5b6bac7ad0aaa655d832aa72ae323b522504ajm@google.comif nargin < 5 || isempty(legacy)
27470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  % Set to true to run old VQE recordings.
28470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  legacy = false;
29470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comend
30470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
31aace5b6bac7ad0aaa655d832aa72ae323b522504ajm@google.comif nargin < 4 || isempty(casenumber)
32470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  casenumber = 0;
33470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comend
34470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
35aace5b6bac7ad0aaa655d832aa72ae323b522504ajm@google.comif nargin < 3 || isempty(filepath)
36aace5b6bac7ad0aaa655d832aa72ae323b522504ajm@google.com  filepath = 'data/';
37470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comend
38470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
39aace5b6bac7ad0aaa655d832aa72ae323b522504ajm@google.comif nargin < 2 || isempty(testname)
40470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  testname = 'all';
41470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comend
42470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
43aace5b6bac7ad0aaa655d832aa72ae323b522504ajm@google.comif nargin < 1 || isempty(task)
44aace5b6bac7ad0aaa655d832aa72ae323b522504ajm@google.com  task = 'test';
45aace5b6bac7ad0aaa655d832aa72ae323b522504ajm@google.comend
46aace5b6bac7ad0aaa655d832aa72ae323b522504ajm@google.com
47470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comif ~strcmp(task, 'test') && ~strcmp(task, 'list') && ~strcmp(task, 'show')
48470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  error(['TASK ' task ' is not recognized']);
49470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comend
50470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
51470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comif casenumber == 0 && strcmp(task, 'show')
52470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  error(['CASENUMBER must be specified for TASK ' task]);
53470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comend
54470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
55470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.cominpath = [filepath 'input/'];
56470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comoutpath = [filepath 'output/'];
57470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comrefpath = [filepath 'reference/'];
58470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
59470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comif strcmp(testname, 'all')
60470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  tests = {'apm','apmm','aec','aecm','agc','ns','vad'};
61470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comelse
62470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  tests = {testname};
63470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comend
64470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
65470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comif legacy
66aace5b6bac7ad0aaa655d832aa72ae323b522504ajm@google.com  progname = './test';
67470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comelse
68470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  progname = './process_test';
69470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comend
70470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
71470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comglobal farFile;
72470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comglobal nearFile;
73470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comglobal eventFile;
74470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comglobal delayFile;
75470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comglobal driftFile;
76470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
77470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comif legacy
78470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  farFile = 'vqeFar.pcm';
79470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  nearFile = 'vqeNear.pcm';
80470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  eventFile = 'vqeEvent.dat';
81470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  delayFile = 'vqeBuf.dat';
82470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  driftFile = 'vqeDrift.dat';
83470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comelse
84470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  farFile = 'apm_far.pcm';
85470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  nearFile = 'apm_near.pcm';
86470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  eventFile = 'apm_event.dat';
87470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  delayFile = 'apm_delay.dat';
88470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  driftFile = 'apm_drift.dat';
89470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comend
90470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
91470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comsimulateMode = false;
92470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comnErr = 0;
93470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comnCases = 0;
94470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comfor i=1:length(tests)
95470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  simulateMode = false;
96470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
97470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  if strcmp(tests{i}, 'apm')
98470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    testdir = ['apm/'];
99470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    outfile = ['out'];
100470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    if legacy
101470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      opt = ['-ec 1 -agc 2 -nc 2 -vad 3'];
102470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    else
103470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      opt = ['--no_progress -hpf' ...
104470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com          ' -aec --drift_compensation -agc --fixed_digital' ...
105470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com          ' -ns --ns_moderate -vad'];
106470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    end
107470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
108470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  elseif strcmp(tests{i}, 'apm-swb')
109470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    simulateMode = true;
110470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    testdir = ['apm-swb/'];
111470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    outfile = ['out'];
112470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    if legacy
113470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      opt = ['-fs 32000 -ec 1 -agc 2 -nc 2'];
114470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    else
115470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      opt = ['--no_progress -fs 32000 -hpf' ...
116470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com          ' -aec --drift_compensation -agc --adaptive_digital' ...
117470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com          ' -ns --ns_moderate -vad'];
118470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    end
119470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  elseif strcmp(tests{i}, 'apmm')
120470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    testdir = ['apmm/'];
121470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    outfile = ['out'];
122470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    opt = ['-aec --drift_compensation -agc --fixed_digital -hpf -ns ' ...
123470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        '--ns_moderate'];
124470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
125470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  else
126470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    error(['TESTNAME ' tests{i} ' is not recognized']);
127470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  end
128470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
129aace5b6bac7ad0aaa655d832aa72ae323b522504ajm@google.com  inpathtest = [inpath testdir];
130aace5b6bac7ad0aaa655d832aa72ae323b522504ajm@google.com  outpathtest = [outpath testdir];
131aace5b6bac7ad0aaa655d832aa72ae323b522504ajm@google.com  refpathtest = [refpath testdir];
132470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
133aace5b6bac7ad0aaa655d832aa72ae323b522504ajm@google.com  if ~exist(inpathtest,'dir')
134aace5b6bac7ad0aaa655d832aa72ae323b522504ajm@google.com    error(['Input directory ' inpathtest ' does not exist']);
135470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  end
136470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
137aace5b6bac7ad0aaa655d832aa72ae323b522504ajm@google.com  if ~exist(refpathtest,'dir')
138aace5b6bac7ad0aaa655d832aa72ae323b522504ajm@google.com    warning(['Reference directory ' refpathtest ' does not exist']);
139470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  end
140470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
141aace5b6bac7ad0aaa655d832aa72ae323b522504ajm@google.com  [status, errMsg] = mkdir(outpathtest);
142470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  if (status == 0)
143470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    error(errMsg);
144470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  end
145470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
146aace5b6bac7ad0aaa655d832aa72ae323b522504ajm@google.com  [nErr, nCases] = recurseDir(inpathtest, outpathtest, refpathtest, outfile, ...
147470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      progname, opt, simulateMode, nErr, nCases, task, casenumber, legacy);
148470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
149470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  if strcmp(task, 'test') || strcmp(task, 'show')
150470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    system(['rm ' farFile]);
151470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    system(['rm ' nearFile]);
152470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    if simulateMode == false
153470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      system(['rm ' eventFile]);
154470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      system(['rm ' delayFile]);
155470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      system(['rm ' driftFile]);
156470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    end
157470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  end
158470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comend
159470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
160470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comif ~strcmp(task, 'list')
161470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  if nErr == 0
162470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    fprintf(1, '\nAll files are bit-exact to reference\n', nErr);
163470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  else
164470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    fprintf(1, '\n%d files are NOT bit-exact to reference\n', nErr);
165470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  end
166470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comend
167470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
168470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
169470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comfunction [nErrOut, nCases] = recurseDir(inpath, outpath, refpath, ...
170470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    outfile, progname, opt, simulateMode, nErr, nCases, task, casenumber, ...
171470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    legacy)
172470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
173470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comglobal farFile;
174470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comglobal nearFile;
175470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comglobal eventFile;
176470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comglobal delayFile;
177470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comglobal driftFile;
178470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
179470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comdirs = dir(inpath);
180470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comnDirs = 0;
181470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comnErrOut = nErr;
182470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comfor i=3:length(dirs) % skip . and ..
183470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  nDirs = nDirs + dirs(i).isdir;
184470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comend
185470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
186470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
187470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comif nDirs == 0
188470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  nCases = nCases + 1;
189470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
190470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  if casenumber == nCases || casenumber == 0
191470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
192470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    if strcmp(task, 'list')
193470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      fprintf([num2str(nCases) '. ' outfile '\n'])
194470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    else
195470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      vadoutfile = ['vad_' outfile '.dat'];
196470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      outfile = [outfile '.pcm'];
197470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
198470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      % Check for VAD test
199470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      vadTest = 0;
200470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      if ~isempty(findstr(opt, '-vad'))
201470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        vadTest = 1;
202470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        if legacy
203470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com          opt = [opt ' ' outpath vadoutfile];
204470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        else
205470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com          opt = [opt ' --vad_out_file ' outpath vadoutfile];
206470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        end
207470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      end
208470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
209470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      if exist([inpath 'vqeFar.pcm'])
210470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        system(['ln -s -f ' inpath 'vqeFar.pcm ' farFile]);
211470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      elseif exist([inpath 'apm_far.pcm'])
212470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        system(['ln -s -f ' inpath 'apm_far.pcm ' farFile]);
213470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      end
214470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
215470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      if exist([inpath 'vqeNear.pcm'])
216470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        system(['ln -s -f ' inpath 'vqeNear.pcm ' nearFile]);
217470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      elseif exist([inpath 'apm_near.pcm'])
218470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        system(['ln -s -f ' inpath 'apm_near.pcm ' nearFile]);
219470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      end
220470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
221470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      if exist([inpath 'vqeEvent.dat'])
222470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        system(['ln -s -f ' inpath 'vqeEvent.dat ' eventFile]);
223aace5b6bac7ad0aaa655d832aa72ae323b522504ajm@google.com      elseif exist([inpath 'apm_event.dat'])
224470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        system(['ln -s -f ' inpath 'apm_event.dat ' eventFile]);
225470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      end
226470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
227470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      if exist([inpath 'vqeBuf.dat'])
228470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        system(['ln -s -f ' inpath 'vqeBuf.dat ' delayFile]);
229aace5b6bac7ad0aaa655d832aa72ae323b522504ajm@google.com      elseif exist([inpath 'apm_delay.dat'])
230470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        system(['ln -s -f ' inpath 'apm_delay.dat ' delayFile]);
231470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      end
232470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
233470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      if exist([inpath 'vqeSkew.dat'])
234470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        system(['ln -s -f ' inpath 'vqeSkew.dat ' driftFile]);
235470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      elseif exist([inpath 'vqeDrift.dat'])
236470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        system(['ln -s -f ' inpath 'vqeDrift.dat ' driftFile]);
237470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      elseif exist([inpath 'apm_drift.dat'])
238470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        system(['ln -s -f ' inpath 'apm_drift.dat ' driftFile]);
239470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      end
240470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
241470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      if simulateMode == false
242470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        command = [progname ' -o ' outpath outfile ' ' opt];
243470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      else
244470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        if legacy
245470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com          inputCmd = [' -in ' nearFile];
246470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        else
247470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com          inputCmd = [' -i ' nearFile];
248470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        end
249470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
250470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        if exist([farFile])
251470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com          if legacy
252470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            inputCmd = [' -if ' farFile inputCmd];
253470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com          else
254470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            inputCmd = [' -ir ' farFile inputCmd];
255470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com          end
256470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        end
257470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        command = [progname inputCmd ' -o ' outpath outfile ' ' opt];
258470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      end
259470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      % This prevents MATLAB from using its own C libraries.
260470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      shellcmd = ['bash -c "unset LD_LIBRARY_PATH;'];
261470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      fprintf([command '\n']);
262470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      [status, result] = system([shellcmd command '"']);
263470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      fprintf(result);
264470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
265470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      fprintf(['Reference file: ' refpath outfile '\n']);
266470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
267470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      if vadTest == 1
268470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        equal_to_ref = are_files_equal([outpath vadoutfile], ...
269470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                       [refpath vadoutfile], ...
270470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                       'int8');
271470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        if ~equal_to_ref
272470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com          nErr = nErr + 1;
273470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        end
274470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      end
275470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
276470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      [equal_to_ref, diffvector] = are_files_equal([outpath outfile], ...
277470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                                   [refpath outfile], ...
278470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com                                                   'int16');
279470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      if ~equal_to_ref
280470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        nErr = nErr + 1;
281470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      end
282470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
283470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      if strcmp(task, 'show')
284470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        % Assume the last init gives the sample rate of interest.
285470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        str_idx = strfind(result, 'Sample rate:');
286470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        fs = str2num(result(str_idx(end) + 13:str_idx(end) + 17));
287470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        fprintf('Using %d Hz\n', fs);
288470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
289470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        if exist([farFile])
290470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com          spclab(fs, farFile, nearFile, [refpath outfile], ...
291470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com              [outpath outfile], diffvector);
292470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com          %spclab(fs, diffvector);
293470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        else
294470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com          spclab(fs, nearFile, [refpath outfile], [outpath outfile], ...
295470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com              diffvector);
296470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com          %spclab(fs, diffvector);
297470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        end
298470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      end
299470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    end
300470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  end
301470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comelse
302470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
303470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  for i=3:length(dirs)
304470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    if dirs(i).isdir
305470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      [nErr, nCases] = recurseDir([inpath dirs(i).name '/'], outpath, ...
306470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com          refpath,[outfile '_' dirs(i).name], progname, opt, ...
307470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com          simulateMode, nErr, nCases, task, casenumber, legacy);
308470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    end
309470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  end
310470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comend
311470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comnErrOut = nErr;
312470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
313470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comfunction [are_equal, diffvector] = ...
314470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    are_files_equal(newfile, reffile, precision, diffvector)
315470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
316470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comare_equal = false;
317470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comdiffvector = 0;
318470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comif ~exist(newfile,'file')
319470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  warning(['Output file ' newfile ' does not exist']);  
320470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  return
321470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comend
322470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
323470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comif ~exist(reffile,'file')
324470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  warning(['Reference file ' reffile ' does not exist']);  
325470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  return
326470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comend
327470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
328470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comfid = fopen(newfile,'rb');
329470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comnew = fread(fid,inf,precision);
330470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comfclose(fid);
331470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
332470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comfid = fopen(reffile,'rb');
333470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comref = fread(fid,inf,precision);
334470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comfclose(fid);
335470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
336470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comif length(new) ~= length(ref)
337470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  warning('Reference is not the same length as output');
338470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  minlength = min(length(new), length(ref));
339470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  new = new(1:minlength);
340470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  ref = ref(1:minlength);
341470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comend
342470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comdiffvector = new - ref;
343470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
344470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comif isequal(new, ref)
345470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  fprintf([newfile ' is bit-exact to reference\n']);
346470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  are_equal = true;
347470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comelse
348470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  if isempty(new)
349470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    warning([newfile ' is empty']);
350470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    return
351470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  end
352470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  snr = snrseg(new,ref,80);
353470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  fprintf('\n');
354470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  are_equal = false;
355470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comend
356