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