% This script file loads an impulse response stored in a WAV file, formats % the coefficients, and then sends to Audio Weaver. Make sure that you % have the file whose name is given by the designerFile variable open in Designer. designerFile = 'LongFIRExample.awd'; reverbImpulseRespWav = 'CathedralRoom.wav'; % reverbImpulseRespWav = 'BatteryBenson.wav'; % Get the location of this .m file on disk str = mfilename('fullpath'); ind = find(str == filesep); dirStr = str(1:ind(end)-1); LR = audioread(fullfile(dirStr, reverbImpulseRespWav)); GSYS = get_gsys(fullfile(dirStr, designerFile)); % Get the lengths of the individual filters L1 = GSYS.SYS.FIR1.L; L2 = GSYS.SYS.FIR2.L; % make sure that the size of L3 is an integer multiple of L1 + L2 wavLengthInfo = size(LR); wavLength = wavLengthInfo(1) - (L1 + L2); L3Length = floor(wavLength/(L1 + L2)) * (L1 + L2); % L3PadLength is number of zeroes to add so that L3 is an integer % multiple of (L1 + L2). L3PadLength = L1 + L2 - wavLength + L3Length; % Zero pad or truncate the impulse response % LR = truncate(LR, L_total); L = LR(:, 1); R = LR(:, 2); % Pick which impulse response to use fprintf(1,'Using the left channel of %s.\n', reverbImpulseRespWav); h = L; zeroes = zeros(L3PadLength, 1); fprintf(1,'Padding the impulse response %s by %d bytes.\n', reverbImpulseRespWav, L3PadLength); h = [h; zeroes]; % Scale the impulse response. Keep the peak frequency response value at % 0 dB p2 = ceil(log2(length(h))); FFT_L = 2^p2; H = desym(fft(truncate(h, FFT_L))); Hmax = max(abs(H)); h = h / Hmax; fprintf(1, 'Impulse response scaled by %.1f dB\n', db20(1/Hmax)); % Split into individual filters h1 = h(1:L1); h2 = h(L1+1:L1+L2); h3 = h(L1+L2+1:end); % Update the coefficients GSYS.SYS.FIR1.coeffs = h1; GSYS.SYS.FIR2.coeffs = h2; % the argument FIR3.L in the awd file needs to be set manually for each % impulse response WAV file. This try-catch code shows an error message % if the size is not correct. length3 = L3Length + L1 + L2; GSYS.SYS.FIR3.L = length3; try GSYS.SYS.FIR3.coeffs = h3; catch warning('Make sure the that "L" argument of FIR3 is %d\n', length3); return end % Now send the updated system to Designer set_gsys(GSYS); disp('Filter coefficients uploaded.');