The 5.1 ch data is processed by HRTF and then downmix to 2ch, so that the 2ch data has the effect of virtual surround.
Function output = hrir_process (input)
HRTF = load ("E: \ cipic_hrtf_database \ standard_hrir_database \ subject_21 \ hrir_final.mat ");
Ls = [1 9];
L = [8 9];
R = [17 9];
Rs = [25 9];
C = [13 9]
% Sources from 5.1 to L CH
H_l_l = squeeze (HRTF. hrir_l (L (1), L (2 ),:));
H_r_l = squeeze (HRTF. hrir_l (r (1), R (2 ),:));
H_ls_l = squeeze (HRTF. hrir_l (LS (1), ls (2 ),:));
H_rs_l = squeeze (HRTF. hrir_l (RS (1), RS (2 ),:));
H_c_l = squeeze (HRTF. hrir_l (C (1), C (2 ),:));
% Origin from 5.1 to r ch
H_l_r = squeeze (HRTF. hrir_r (L (1), L (2 ),:));
H_r_r = squeeze (HRTF. hrir_r (r (1), R (2 ),:));
H_ls_r = squeeze (HRTF. hrir_r (LS (1), ls (2 ),:));
H_rs_r = squeeze (HRTF. hrir_r (RS (1), RS (2 ),:));
H_c_r = squeeze (HRTF. hrir_r (C (1), C (2 ),:));
[Input, FS] = wavread('input.wav ');
H_l = zeros (length (h_l_l), 6 );
H_l (:, 1) = h_l_l;
H_l (:, 2) = h_r_l;
H_l (:, 3) = h_c_l;
H_l (:, 5) = h_ls_l;
H_l (:, 6) = h_rs_l;
H_r = zeros (length (h_l_r), 6 );
H_r (:, 1) = h_l_r;
H_r (:, 2) = h_r_r;
H_r (:, 3) = h_c_r;
H_r (:, 5) = h_ls_r;
H_r (:, 6) = h_rs_r;
Hrir_out_l = zeros (length (input (:, 1), length (1 ,:));
Hrir_out_r = zeros (length (input (:, 1), length (1 ,:));
For CH = 1:6
Hrir_out_l (:, CH) = filter (h_l (:, CH), 1, input (:, CH ));
Hrir_out_r (:, CH) = filter (h_r (:, CH), 1, input (:, CH ));
End
Cmix = 0.707/2;
Surmix = 1.0/2;
Xsurmix = 0.5/2;
% Downmix to 2ch.
% Output (:, 1) = hrir_out_l (:, 1) + hrir_out_l (:, 3) * cmix-hrir_out_l (:, 5) * surmix-hrir_out_l (:, 6) * xsurmix;
% Output (:, 2) = hrir_out_r (:, 2) + hrir_out_r (:, 3) * cmix + hrir_out_r (:, 6) * surmix + hrir_out_r (:, 5) * xsurmix;
% Output (:, 1) = hrir_out_l (:, 1) + hrir_out_l (:, 3) * cmix + hrir_out_l (:, 5) * surmix + hrir_out_l (:, 2) * xsurmix;
% Output (:, 2) = hrir_out_r (:, 2) + hrir_out_r (:, 3) * cmix + hrir_out_r (:, 6) * surmix + hrir_out_r (:, 1) * xsurmix;
Output (:, 1) = hrir_out_l (:, 1) + hrir_out_l (:, 3) * cmix + hrir_out_l (:, 5) * surmix;
Output (:, 2) = hrir_out_r (:, 2) + hrir_out_r (:, 3) * cmix + hrir_out_r (:, 6) * surmix;
End
Function [Loro ltrt] = downmix (input)
Cmix = 0.707/2;
Surmix = 1.0/2;
Xsurmix = 0.5/2;
L = input (:, 1 );
R = input (:, 2 );
C = input (: 3 );
Ls = input (: 5 );
Rs = input (: 6 );
Loro (:, 1) = L + cmix * C + surmix * ls;
Loro (:, 2) = R + cmix * C + surmix * RS;
Ltrt (:, 1) = L + cmix * C-surmix * ls-xsurmix * RS;
Ltrt (:, 2) = R + cmix * C + surmix * ls + xsurmix * RS;
End
Main. M:
CLC:
Clear all;
[Input, FS] = wavread('input.wav ');
Y = hrir_process (input );
[Loro ltrt] = dowmix('input.wav ');
Wavwrite (Y, FS, 'output.wav ');
Wavwrite (Loro, FS, 'loro.wav ');
Wavwrite (ltrt, FS, 'ltrt.wav ');
HRTF virtual surround MATLAB implementation