function test = mix_chirp(test) %% % Copyright (c) 2017, Intel Corporation % All rights reserved. % % Redistribution and use in source and binary forms, with or without % modification, are permitted provided that the following conditions are met: % * Redistributions of source code must retain the above copyright % notice, this list of conditions and the following disclaimer. % * Redistributions in binary form must reproduce the above copyright % notice, this list of conditions and the following disclaimer in the % documentation and/or other materials provided with the distribution. % * Neither the name of the Intel Corporation nor the % names of its contributors may be used to endorse or promote products % derived from this software without specific prior written permission. % % THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" % AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE % IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE % ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE % LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR % CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF % SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS % INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN % CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) % ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE % POSSIBILITY OF SUCH DAMAGE. % % Author: Seppo Ingalsuo % %% Adjust tone length to integer number of samples test.nt = round(test.cl*test.fs); % Make number of samples per tone test.tl = test.nt/test.fs; % an integer by adjusting tl. %% Test start and end marker tones [h1, mark_start] = sync_chirp(test.fs, 'up'); [h2, mark_end] = sync_chirp(test.fs, 'down'); test.mark_t = mark_start.t; test.mark_a = mark_start.a; test.mark_a_db = mark_start.a_db; test.ts = mark_start.t; %% Idle time to start and end test.idle_t = 0.5; n_idle = round(test.fs*test.idle_t); t_idle = n_idle/test.fs; x = zeros(test.nt + mark_start.n + mark_end.n +2*n_idle, test.nch, 'int32'); %% Add markers idx1 = n_idle+1; idx2 = length(x)-n_idle-mark_end.n; for ch=test.ch x(idx1:idx1+mark_start.n-1, ch) = dither_and_quantize(h1, test.bits_in); x(idx2:idx2+mark_end.n-1, ch) = dither_and_quantize(h2, test.bits_in); end %% Dither also idle parts x(1:n_idle) = dither_and_quantize(zeros(n_idle,1), test.bits_in); x(end-n_idle+1:end) = dither_and_quantize(zeros(n_idle,1), test.bits_in); %% Add Chirp i1 = n_idle+mark_start.n+1; i2 = i1+test.nt-1; fprintf('Mixing %.1f dBFS chirp ...\n', test.a_db); tc = ((1:round(test.cl*test.fs))-1)/test.fs; s = test.a * chirp(tc, test.f_min, test.tl, test.f_max, 'linear', 90); sign = 1; for ch=test.ch x(i1:i2, ch) = dither_and_quantize(sign * s, test.bits_in); sign = -sign; end test.signal = x; %% Output fprintf('Writing output data file %s...\n', test.fn_in); write_test_data(x, test.fn_in, test.bits_in, test.fmt); fprintf('Done.\n') end