Commit 2bd1e704 authored by hmund's avatar hmund
Browse files

remove code that was moved to seperate function fir_to_cldfb_fir

parent eaf9690d
Loading
Loading
Loading
Loading
+0 −269
Original line number Diff line number Diff line
@@ -99,272 +99,3 @@ writeData3L(fid, ['const float rightHRIRImag_' order '[BINAURAL_CONVBANDS][' ord

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

function F = fir_to_cldfb_fir( target_fir, num_cldfb_taps, eval_flag, legacy_flag )

[pFilter, D, S, L] = get_cldfb_filter;
cldfb_delay = D - S + 1; % processing delay given stride
pFilt = sqrt(S)/L * pFilter(:);
N = length(pFilt);
%legacy_flag = 1; % = 1 used to indicate slightly too short buffers as used to generate tested coefficients 

% Filter Bank analysis / synthesis filters
cldfb_mod_mat = exp(1i*((0:N-1)'-D/2) * ((0:L-1)+0.5) * pi/L ); % N x L modulation matrix with alternating sign periodicity of 2*L in time (row) direction
cldfb_ansyn_filters = pFilt .* cldfb_mod_mat; % all (L) analysis/synthesis filters

target_fir = target_fir(:);
fir_length = length(target_fir);

%% brute force least squares
if legacy_flag
   num_slots = ceil(fir_length/S) + 10; % used to generate tested IVAS coefficients in CLDFB HRIR ROM with slightly too short buffers 
   inp_len = S * num_slots;
   len = inp_len - cldfb_delay;
   idx_opt = cldfb_delay + (1:len);
   pos_offset = 200;
else
   num_slots = ceil((fir_length + 2 * N - 1) / S); % convolution with target fir, analysis + synthesis filters (of length N each)
   len = S * num_slots;
   inp_len = len;
   idx_opt = (1:len); % use all output samples in the optimization, including the filter bank delay
   pos_offset = 0;
end

% Big trial and error
Nbins = num_cldfb_taps * L;
Vreal = zeros(S*len, Nbins);  % all real for all shifts concatenated for each mask bin,
Vimag = zeros(S*len, Nbins);  % then all imag
r = zeros(S*len,1); % right hand side all shifts concatenated

x  = zeros(inp_len,1);
for pos = 1:S
   % input dirac pulse
   x(:) = 0;

   % target impulse response y0 for input pulse at pos
   out = x;
   out(pos+pos_offset+(0:fir_length-1)) = target_fir;
   y0 = [zeros(cldfb_delay,1);out(1:end-cldfb_delay)];
   r(len*(pos-1)+(1:len)) = y0(idx_opt);
   fprintf('.');

   % CLDFB analysis for impulse input
   x(pos+pos_offset) = 1;
   X = zeros(L,num_slots);
   frm_idx = (1:N)';
   x_tmp = [zeros(N-S,1);x];
   for slt = 1:num_slots
      X(:,slt) = sum(cldfb_ansyn_filters.*flipud(x_tmp(frm_idx))).';
      frm_idx = frm_idx + S;
   end
   for cldfb_bin = 1:Nbins
      cldfb_band = rem(cldfb_bin-1,L)+1;
      cldfb_lag = fix((cldfb_bin-1)/L);

      % real-valued filter contribution of a single tap
      frm_idx = cldfb_lag * S + (1:N)';
      y_tmp = zeros( num_slots * S + N - S,1);
      for slt = cldfb_lag+1:num_slots
         y_tmp(frm_idx) = y_tmp(frm_idx) + real(X(cldfb_band,slt-cldfb_lag) * cldfb_ansyn_filters(:,cldfb_band));
         frm_idx = frm_idx + S;
      end
      Vreal(len*(pos-1)+1:len*pos,cldfb_bin) = y_tmp(idx_opt);

      % imaginary-valued filter contribution of a single tap
      frm_idx = cldfb_lag * S + (1:N)';
      y_tmp(:) = 0;
      for slt = cldfb_lag+1:num_slots
         y_tmp(frm_idx) = y_tmp(frm_idx) + real(1i*X(cldfb_band,slt-cldfb_lag) * cldfb_ansyn_filters(:,cldfb_band));
         frm_idx = frm_idx + S;
      end
      Vimag(len*(pos-1)+1:len*pos,cldfb_bin) = y_tmp(idx_opt);
   end % bin
end % pos
fprintf('\n');

% solve lsq
V = [Vreal,Vimag];
M = V'*V;
Mrel = M + 1e-8*norm(M)*eye(size(M));
c = Mrel\(V'*r);

% map back to mask locations
F = zeros(L,num_cldfb_taps);
for cldfb_bin = 1:Nbins
   F(cldfb_bin) = c(cldfb_bin)+1i*c(Nbins+cldfb_bin);
end

if eval_flag
   % evaluation (not needed for table generation, needs signal processing toolbox)
   get_snr( target_fir, F, cldfb_ansyn_filters, cldfb_delay, S );
end

function get_snr( target_fir, cldfb_firs, cldfb_ansyn_filters, cldfb_delay, S )

rng(0);
num_samples = 5*48000;
x = randn(num_samples,1);

% Filter noise in time domain
y1 = fftfilt(target_fir,x);

% Filter noise in CLDFB domain
[N,L] = size(cldfb_ansyn_filters);
num_slots = ceil((num_samples + cldfb_delay) / S);
% analysis
X = zeros(L,num_slots);
frm_idx = (1:N)';
x_tmp = [zeros(N-S,1);x;zeros(cldfb_delay,1)];
for slt = 1:num_slots
   X(:,slt) = sum(cldfb_ansyn_filters.*flipud(x_tmp(frm_idx))).';
   frm_idx = frm_idx + S;
end
% filter
X = fftfilt(cldfb_firs.',X.').';
% synthesis
frm_idx =  (1:N)';
y_tmp = zeros( num_slots * S + N - S,1);
for slt = 1:num_slots
   y_tmp(frm_idx) = y_tmp(frm_idx) + real(sum(X(:,slt).' .* cldfb_ansyn_filters,2));
   frm_idx = frm_idx + S;
end
y2 = y_tmp(cldfb_delay+(1:num_samples));

plot(y1), hold on, plot(y2,'r--'), plot(y1-y2,'k'), hold off
set(gca,'xlim',[1,num_samples])
fprintf('SNR: %.1f dB \n', 10*log10(sum(y1.^2)/sum((y1-y2).^2)));
legend('time domain','CLDFB domain','difference')
title('Filtered noise')

function [h, D, S, L] = get_cldfb_filter()
% const float LDQMF_60[] in \lib_com\rom_com.c, line 5219 
S = 60; % stride
L = 60; % frequency bands
D = 240 + S - 1; % system delay
h = [
   0.0000953076,  0.0001230230,  0.0001279964,  0.0001260533,  0.0001211219 
   0.0001122123,  0.0001010860,  0.0000876540,  0.0000719883,  0.0000545472 
   0.0000352143,  0.0000145686, -0.0000074264, -0.0000303788, -0.0000539205 
  -0.0000782743, -0.0001028838, -0.0001275374, -0.0001520015, -0.0001760167 
  -0.0001997108, -0.0002226708, -0.0002446725, -0.0002655797, -0.0002852145 
  -0.0003034996, -0.0003203036, -0.0003356283, -0.0003493345, -0.0003614030 
  -0.0003719004, -0.0003807641, -0.0003881051, -0.0003939842, -0.0003985357 
  -0.0004019095, -0.0004041938, -0.0004056677, -0.0004065430, -0.0004069925 
  -0.0004072535, -0.0004075877, -0.0004083676, -0.0004098394, -0.0004122990 
  -0.0004160839, -0.0004214063, -0.0004285777, -0.0004378651, -0.0004495422 
  -0.0004637682, -0.0004806494, -0.0005003878, -0.0005231378, -0.0005489803 
  -0.0005777747, -0.0006095612, -0.0006443121, -0.0006813223, -0.0007226231 
  -0.0007722576, -0.0008268412, -0.0008839625, -0.0009417336, -0.0010004630 
  -0.0010601623, -0.0011206097, -0.0011817788, -0.0012432419, -0.0013045983 
  -0.0013656860, -0.0014260965, -0.0014855355, -0.0015435946, -0.0015999591 
  -0.0016543545, -0.0017062968, -0.0017554691, -0.0018015467, -0.0018441341 
  -0.0018829798, -0.0019177221, -0.0019480695, -0.0019736972, -0.0019943134 
  -0.0020097434, -0.0020197174, -0.0020240925, -0.0020226294, -0.0020152442 
  -0.0020017736, -0.0019820682, -0.0019561697, -0.0019240153, -0.0018855907 
  -0.0018409232, -0.0017900462, -0.0017330211, -0.0016699535, -0.0016009507 
  -0.0015261442, -0.0014456788, -0.0013597424, -0.0012685407, -0.0011722331 
  -0.0010710671, -0.0009652392, -0.0008549765, -0.0007405236, -0.0006221444 
  -0.0005001140, -0.0003745670, -0.0002458634, -0.0001142541,  0.0000199491 
   0.0001564174,  0.0002949402,  0.0004350246,  0.0005769439,  0.0007203126 
  -0.0008803223, -0.0010328424, -0.0011841310, -0.0013346316, -0.0014848098 
  -0.0016343417, -0.0017832819, -0.0019316213, -0.0020790498, -0.0022252349 
  -0.0023701149, -0.0025136294, -0.0026556554, -0.0027960713, -0.0029348312 
  -0.0030717771, -0.0032068293, -0.0033399195, -0.0034709862, -0.0035999804 
  -0.0037267797, -0.0038513308, -0.0039736414, -0.0040935921, -0.0042111278 
  -0.0043262239, -0.0044388464, -0.0045489701, -0.0046565188, -0.0047614835 
  -0.0048637423, -0.0049632201, -0.0050599808, -0.0051539382, -0.0052450863 
  -0.0053333500, -0.0054187514, -0.0055012843, -0.0055808770, -0.0056575472 
  -0.0057313135, -0.0058021732, -0.0058701355, -0.0059352517, -0.0059975707 
  -0.0060571772, -0.0061141332, -0.0061685541, -0.0062205540, -0.0062703062 
  -0.0063179093, -0.0063635921, -0.0064075105, -0.0064498796, -0.0064908965 
  -0.0065308069, -0.0065698619, -0.0066083665, -0.0066466411, -0.0066849431 
  -0.0067233290, -0.0067621553, -0.0068021296, -0.0068436749, -0.0068870094 
  -0.0069324085, -0.0069801519, -0.0070305937, -0.0070840055, -0.0071406048 
  -0.0072006541, -0.0072644479, -0.0073321410, -0.0074039386, -0.0074799177 
  -0.0075602704, -0.0076450342, -0.0077342330, -0.0078278277, -0.0079257628 
  -0.0080279401, -0.0081341872, -0.0082442267, -0.0083577875, -0.0084744738 
  -0.0085938899, -0.0087156557, -0.0088391500, -0.0089637861, -0.0090888245 
  -0.0092134504, -0.0093367994, -0.0094579896, -0.0095760096, -0.0096898535 
  -0.0097982995, -0.0099003557, -0.0099947909, -0.0100801717, -0.0101551116 
  -0.0102182031, -0.0102678994, -0.0103026126, -0.0103207529, -0.0103206923 
  -0.0103006857, -0.0102590285, -0.0101939747, -0.0101036867, -0.0099863587 
  -0.0098401112, -0.0096632261, -0.0094537362, -0.0092098210, -0.0089295702 
  -0.0086111929, -0.0082527259, -0.0078523541, -0.0074084769, -0.0069190590 
   0.0063841688,  0.0057985946,  0.0051621343,  0.0044734711,  0.0037309236 
   0.0029329660,  0.0020781513,  0.0011651339,  0.0001925042, -0.0008409545 
  -0.0019364181, -0.0030950012, -0.0043176264, -0.0056051607, -0.0069584334 
  -0.0083780792, -0.0098646237, -0.0114185056, -0.0130400723, -0.0147295250 
  -0.0164868534, -0.0183120724, -0.0202049762, -0.0221651513, -0.0241921283 
  -0.0262852497, -0.0284437388, -0.0306666382, -0.0329528190, -0.0353010744 
  -0.0377098918, -0.0401776619, -0.0427025780, -0.0452826768, -0.0479161367 
  -0.0506004691, -0.0533332452, -0.0561118126, -0.0589331910, -0.0617944039 
  -0.0646922663, -0.0676232576, -0.0705836788, -0.0735698044, -0.0765774846 
  -0.0796026587, -0.0826408863, -0.0856874809, -0.0887378305, -0.0917868018 
  -0.0948293805, -0.0978601947, -0.1008738130, -0.1038645208, -0.1068264544 
  -0.1097536832, -0.1126400903, -0.1154794544, -0.1182654947, -0.1209914312 
  -0.1236500666, -0.1262341589, -0.1287376434, -0.1311538219, -0.1334753036 
  -0.1356947273, -0.1378047168, -0.1397978216, -0.1416664869, -0.1434033662 
  -0.1450008005, -0.1464512348, -0.1477471888, -0.1488809884, -0.1498452872 
  -0.1506324410, -0.1512351334, -0.1516460329, -0.1518578976, -0.1518635303 
  -0.1516559124, -0.1512281001, -0.1505732536, -0.1496847868, -0.1485562176 
  -0.1471813470, -0.1455538720, -0.1436681300, -0.1415183097, -0.1390990764 
  -0.1364052594, -0.1334318966, -0.1301742792, -0.1266280264, -0.1227891371 
  -0.1186537445, -0.1142183766, -0.1094799563, -0.1044355705, -0.0990828425 
  -0.0934195668, -0.0874440819, -0.0811550021, -0.0745511875, -0.0676321834 
  -0.0603975877, -0.0528475679, -0.0449828543, -0.0368040986, -0.0283128861 
  -0.0195108838, -0.0104003223, -0.0009837818,  0.0087356847,  0.0187546927 
   0.0290693250,  0.0396753438,  0.0505682528,  0.0617432520,  0.0731955394 
  -0.0849232078, -0.0969054326, -0.1091460735, -0.1216373071, -0.1343720406 
  -0.1473424733, -0.1605402082, -0.1739567965, -0.1875831038, -0.2014097124 
  -0.2154271752, -0.2296251506, -0.2439934313, -0.2585212290, -0.2731975317 
  -0.2880111337, -0.3029502928, -0.3180032372, -0.3331578076, -0.3484017253 
  -0.3637222052, -0.3791064322, -0.3945416212, -0.4100143015, -0.4255111217 
  -0.4410185516, -0.4565227628, -0.4720100164, -0.4874662757, -0.5028775334 
  -0.5182296634, -0.5335084200, -0.5486994982, -0.5637886524, -0.5787616372 
  -0.5936041474, -0.6083019376, -0.6228409410, -0.6372069120, -0.6513859630 
  -0.6653640866, -0.6791275144, -0.6926627755, -0.7059561610, -0.7189947963 
  -0.7317654490, -0.7442554235, -0.7564523220, -0.7683438063, -0.7799182534 
  -0.7911639810, -0.8020697832, -0.8126249313, -0.8228194118, -0.8326428533 
  -0.8420860767, -0.8511404991, -0.8597975969, -0.8680517077, -0.8758881092 
  -0.8832823634, -0.8902196884, -0.8967157602, -0.9027729034, -0.9083824754 
  -0.9135394692, -0.9182395935, -0.9224776030, -0.9262499809, -0.9295535684 
  -0.9323854446, -0.9347436428, -0.9366261959, -0.9380323887, -0.9389615655 
  -0.9394137263, -0.9393896461, -0.9388904572, -0.9379178882, -0.9364743829 
  -0.9345626831, -0.9321863055, -0.9293491840, -0.9260557890, -0.9223110080 
  -0.9181203246, -0.9134896994, -0.9084255695, -0.9029349089, -0.8970250487 
  -0.8907034993, -0.8839784265, -0.8768582940, -0.8693521619, -0.8614694476 
  -0.8532197475, -0.8446131349, -0.8356599212, -0.8263708353, -0.8167568445 
  -0.8068289757, -0.7965991497, -0.7860788107, -0.7752800584, -0.7642148733 
  -0.7528960109, -0.7413358092, -0.7295469642, -0.7175422311, -0.7053351402 
  -0.6929380894, -0.6803644896, -0.6676273942, -0.6547405124, -0.6417166591 
  -0.6285686493, -0.6153115034, -0.6019562483, -0.5885198116, -0.5750215650 
   0.5615197420,  0.5478612781,  0.5341838002,  0.5204906464,  0.5067980289 
   0.4931168854,  0.4794588387,  0.4658361673,  0.4522601366,  0.4387422502 
   0.4252935350,  0.4119254053,  0.3986486793,  0.3854739666,  0.3724119067 
   0.3594728410,  0.3466667533,  0.3340034485,  0.3214924335,  0.3091430366 
   0.2969639599,  0.2849639654,  0.2731511295,  0.2615332901,  0.2501178682 
   0.2389119864,  0.2279221565,  0.2171545923,  0.2066148520,  0.1963084787 
   0.1862401515,  0.1764142811,  0.1668347418,  0.1575049609,  0.1484276950 
   0.1396053135,  0.1310400218,  0.1227331311,  0.1146853194,  0.1068974212 
   0.0993694067,  0.0921007246,  0.0850901082,  0.0783365741,  0.0718384907 
   0.0655927584,  0.0595967993,  0.0538481586,  0.0483424664,  0.0430756323 
   0.0380428955,  0.0332404599,  0.0286619961,  0.0242999699,  0.0201510899 
   0.0162059069,  0.0124559226,  0.0088928537,  0.0054926532,  0.0023052765 
  -0.0005515143, -0.0030201224, -0.0052712574, -0.0073737046, -0.0093160523 
  -0.0111072771, -0.0127562135, -0.0142635731, -0.0156361461, -0.0168790054 
  -0.0179969221, -0.0189934950, -0.0198726747, -0.0206398536, -0.0212980714 
  -0.0218509119, -0.0223025978, -0.0226570386, -0.0229178313, -0.0230882075 
  -0.0231725387, -0.0231746566, -0.0230979007, -0.0229462404, -0.0227237809 
  -0.0224345829, -0.0220820960, -0.0216706358, -0.0212045144, -0.0206875466 
  -0.0201238506, -0.0195175279, -0.0188730918, -0.0181944817, -0.0174855441 
  -0.0167510118, -0.0159947462, -0.0152208358, -0.0144332750, -0.0136361914 
  -0.0128338682, -0.0120294262, -0.0112272501, -0.0104311826, -0.0096443929 
  -0.0088709844, -0.0081134979, -0.0073764324, -0.0066623385, -0.0059733889 
  -0.0053142183, -0.0046856776, -0.0040914025, -0.0035321070, -0.0030089030 
  -0.0025271603, -0.0020749648, -0.0016621647, -0.0012705614, -0.0008115423
];
h = h.';
h = h(:);
h(1*120+(1:120)) = -h(1*120+(1:120));
h(3*120+(1:120)) = -h(3*120+(1:120));
h(:) = h(end:-1:1);
 No newline at end of file