Commit af83a608 authored by hmund's avatar hmund
Browse files

avoid depency when writing the rom table

parent 2bd1e704
Loading
Loading
Loading
Loading
+42 −15
Original line number Diff line number Diff line
@@ -28,16 +28,10 @@
function IR_cldfb = SHD_2_ROM( py_path, rom_c_file, sofa_file )
% SHD_2_ROM( python_path, rom_c_file, sofa_file )
%
% - converts sphere-sampled Head Related Impulse Responses (HRIRs) given in sofa_file to the Spherical Harmonics domain (SHD)
% - converts sphere-sampled Head Related Impulse Responses (HRIRs) given in sofa_file to the Spherical Harmonics domain (SHD) using generate_HOA_HRIRs_MOD_lens.m
% - converts SHD HRIRs to Complex Low Delay Filter Bank (CLDFB) domain
% - writes CLDFB HRIRs to c-code ROM tables.
% 
%   Processing chain: 
%   
%   HRIRs --> SHD --> CLDFB --> ROM
%   HRIRs --> SHD: Using ./generate_HOA_HRIRs_MOD_lens.m
%   SHD --> CLDFB: Least squares optimization
%   CLDFB --> ROM: Using ../param_bin/writeData3L.m

[thispath,~,~] = fileparts(mfilename('fullpath'));
thispath = [thispath,filesep];

@@ -78,6 +72,7 @@ latency_s = 2.083333333333333e-05; % No added latency from conversion method
max_band = 50;                      % Compute 60 bands, but only use 50 in ROM table

IR_cldfb_rom = permute(IR_cldfb, [3 1 4 2]); % after permute: [ears(2), bands(60), chans(16), taps(3)]
IR_cldfb_rom = IR_cldfb_rom(:,1:max_band,:,:);
order_int = (round(sqrt(size(IR_cldfb_rom,3))-1));
if order_int == 1
    order = 'FOA';
@@ -87,15 +82,47 @@ end
if ~exist('rom_c_file','var') || isempty(rom_c_file)
   rom_c_file = [thispath,'ivas_rom_binauralRenderer_',order,'.c']; % fullfile(thispath,'..','..','..','lib_rend',['ivas_rom_binauralRenderer_',order,'.c']);
end

fid = fopen(rom_c_file,'wt');

fprintf(fid, ['const float FASTCONV_' order '_latency_s = %10.9ff;\n'], latency_s);

addpath(fullfile(thispath,'..','param_bin')); % for writeData3L()
writeData3L(fid, ['const float leftHRIRReal_' order '[BINAURAL_CONVBANDS][' order '_CHANNELS][BINAURAL_NTAPS_SBA]'], real( squeeze(IR_cldfb_rom(1,1:max_band,:,:))));
writeData3L(fid, ['const float leftHRIRImag_' order '[BINAURAL_CONVBANDS][' order '_CHANNELS][BINAURAL_NTAPS_SBA]'], imag( squeeze(IR_cldfb_rom(1,1:max_band,:,:))));
writeData3L(fid, ['const float rightHRIRReal_' order '[BINAURAL_CONVBANDS][' order '_CHANNELS][BINAURAL_NTAPS_SBA]'], real( squeeze(IR_cldfb_rom(2,1:max_band,:,:))));
writeData3L(fid, ['const float rightHRIRImag_' order '[BINAURAL_CONVBANDS][' order '_CHANNELS][BINAURAL_NTAPS_SBA]'], imag( squeeze(IR_cldfb_rom(2,1:max_band,:,:))));
write_one_ear( fid, ['const float leftHRIRReal_' order '[BINAURAL_CONVBANDS][' order '_CHANNELS][BINAURAL_NTAPS_SBA]='], real(IR_cldfb_rom(1,:,:,:)));
write_one_ear( fid, ['const float leftHRIRImag_' order '[BINAURAL_CONVBANDS][' order '_CHANNELS][BINAURAL_NTAPS_SBA]='], imag(IR_cldfb_rom(1,:,:,:)));
write_one_ear( fid, ['const float rightHRIRReal_' order '[BINAURAL_CONVBANDS][' order '_CHANNELS][BINAURAL_NTAPS_SBA]='], real(IR_cldfb_rom(2,:,:,:)));
write_one_ear( fid, ['const float rightHRIRImag_' order '[BINAURAL_CONVBANDS][' order '_CHANNELS][BINAURAL_NTAPS_SBA]='], imag(IR_cldfb_rom(2,:,:,:)));

fclose(fid);
rmpath(fullfile(thispath,'..','param_bin'));

function write_one_ear( fid, first_line, IR_cldfb_rom)
IR_cldfb_rom = squeeze(IR_cldfb_rom);
[num_bands,num_chans, num_taps] = size(IR_cldfb_rom);
num_spaces = 4;
num_spaces_cur = 0;
fprintf(fid,[first_line,'\n{\n']);
num_spaces_cur = num_spaces_cur + num_spaces;
for band = 1:num_bands
   fprintf(fid,[blanks(num_spaces_cur),'{\n']);
   num_spaces_cur = num_spaces_cur + num_spaces;
   for chan = 1:num_chans
      fprintf(fid,[blanks(num_spaces_cur),'{']);
      for tap = 1:num_taps
         if tap == num_taps
            fprintf(fid,'%+ff',IR_cldfb_rom(band,chan,tap));
         else
            fprintf(fid,'%+ff, ',IR_cldfb_rom(band,chan,tap));
         end
      end
      if chan == num_chans
         fprintf(fid,'}\n');
      else
         fprintf(fid,'},\n');
      end
   end
   num_spaces_cur = num_spaces_cur - num_spaces;
   if band == num_bands
      fprintf(fid,[blanks(num_spaces_cur),'}\n']);
   else
      fprintf(fid,[blanks(num_spaces_cur),'},\n']);
   end
end
fprintf(fid,'};\n\n');