%% -*- mode: octave -*- %% %% *SpHEAR Project %% %% sphear_af_calibrate: read reference microphone signal, filter with convolution %% kernel created by DRC and filter all recorded signals, %% calibrated A format files are written to disk %% %% usage: %% [] = sphear_af_calibrate(measurements, keep, fade) %% %% keep: time to keep after main impulse in seconds %% fade: fade out time after keep in seconds %% %% Copyright 2016-2017, Fernando Lopez-Lezcano, All Rights Reserved %% nando@ccrma.stanford.edu %% %% This program is free software: you can redistribute it and/or modify %% it under the terms of the GNU General Public License as published by %% the Free Software Foundation, either version 3 of the License, or %% (at your option) any later version. %% %% This program is distributed in the hope that it will be useful, %% but WITHOUT ANY WARRANTY; without even the implied warranty of %% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %% GNU General Public License for more details. %% %% You should have received a copy of the GNU General Public License %% along with this program. If not, see . function [] = sphear_af_calibrate(measurements, keep, fade); %% the measurement from the reference microphone is processed through %% DRC (Digital Room Correction) to create a convolution kernel that is %% used to equalize the measurements %% %% read the convolution kernel [ref, Fs] = wavread('../data/current/cal/drc-filter.wav'); %% window the DRC generated filter, eliminate the stuff before the main %% peak and limit the length to the approximate useful length of the %% original recorded impulse response [peaks, locs] = findpeaks(abs(ref)); [value, index] = max(peaks); loc = locs(index); %% truncate before the main peak b_len = 4; before = tukeywin(2 * b_len, 0.9)(1:end/2) .* ref(loc-2*b_len:loc-b_len-1); %% useful samples samples = keep * Fs/2; during = ref(loc-b_len:loc+samples-1); %% fade out after useful samples a_len = fade * Fs/2; after = tukeywin(2 * a_len, 0.9)(end/2:end) .* ref(loc+samples:loc+samples+a_len); %% and the whole thing is: trunc = cat(1, before, during, after); capnames = cellstr(['LF'; 'RF'; 'LB'; 'RB']); %% all requested measurements for m = measurements %% read in capsule signal and normalize it for c = 1:4 printf("processing capsule %d\n", c); sig = wavread(["../data/current/af/a-format-" sprintf("%03d", m) "-" char(capnames(c)) ".wav"]); cal_sig(:,c) = conv(trunc, sig); wavwrite(cal_sig(:,c), Fs, ["../data/current/af/a-format-cal-" sprintf("%03d", m) "-" char(capnames(c)) ".wav"]); printf("end capsule %d\n", c); end wavwrite(cal_sig, Fs, ["../data/current/af/a-format-cal-" sprintf("%03d", m) ".wav"]); end end