diff --git a/matlab/tfgm/scripts/exp_all_tffP.m b/matlab/tfgm/scripts/exp_all_tffP.m index 8924e5c13cd60f3c767a896d8b06d7471833a4c9..6e714e5bb06bceea7225bdfe79d4a5bbceeb5e0d 100644 --- a/matlab/tfgm/scripts/exp_all_tffP.m +++ b/matlab/tfgm/scripts/exp_all_tffP.m @@ -6,69 +6,102 @@ clc; clear; close all; % [1] Time-frequency fading algorithms based on Gabor multipliers, % A. Marina Kreme Valentin Emiya, Caroline Chaux, and Bruno Torresani %% -wb_list ={'car','plane','train'}; -loc_list = {'beeps','bird','clicks','finger_snaps','modulations'}; -win_list = {'gauss 256', 'hann 512'}; +wideband_name ={'car','plane','train'}; +localized_name = {'beeps','bird','chirps','clicks','finger_snaps',..., + 'modulations'}; +wins_params = struct('Gauss256', struct('win_type','gauss','win_len',..., + 256,'hop_ratio',1/4,'nbins_ratio', 4, 'win_dur',256/8000),..., + 'Hann512', struct('win_type','hann','win_len', 512,..., + 'hop_ratio',1/8,'nbins_ratio', 2, 'win_dur',512/8000)); + + +keys = fieldnames(wins_params); + +%% tol_subregions = 1e-5; gamma=0.7; + +fs = 8000; +sig_len =16384; +signal_params = generate_signal_parameters(fs, sig_len); + + %% -f = fopen('exp_1area_cuicui.csv', 'w'); -fprintf(f, '%s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s \n','loc_src', 'wb_src',..., - 'win_type','win_len','t_oracle','t_true_energy','t_est','t_arrf',..., +f = fopen('exp_tffP_car_bird.csv', 'w'); +fprintf(f, '%s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s \n','loc_src', 'wb_src',..., + 'win_type','win_len','t_oracle','t_est','t_arrf',..., 't_evdn','t_ut_x','sdr_mix','sdr_interp', 'sdr_zero','sdr_est',..., 'sdr_oracle','is_interp', 'is_mix', 'is_true', 'is_zero', 'is_est'); %% -for win =1:length(win_list) +for win_param = 1 :length(keys) + + %[win_type, win_dur, win_len, hop_ratio, nbins_ratio] = get_win_params(win_list{win}); + + win_len = wins_params.(keys{win_param}).win_len; + win_type = wins_params.(keys{win_param}).win_type; + win_dur = wins_params.(keys{win_param}).win_dur; + hop_ratio = wins_params.(keys{win_param}).hop_ratio; + nbins_ratio = wins_params.(keys{win_param}).nbins_ratio; - [win_type, win_dur, win_len, hop_ratio, nbins_ratio] = get_win_params(win_list{win}); + params = get_params(win_len, win_type); + + fprintf("window %s:\n\n",win_type); + + fprintf("window: %s - length: %.f\n", win_type, win_len); + + % DGT parameters + dgt_params = generate_dgt_parameters(win_type, win_len, params.hop,..., + params.nbins, sig_len); + + %DGT operators + [dgt, idgt] = get_stft_operators(dgt_params, signal_params); fprintf("window: %s - length: %.f\n", win_type, win_len); - for wb = 1:1%length(wb_list) - wideband_src = wb_list{wb}; + + for wb = 1: length(wideband_name) + wideband_src =wideband_name{wb}; fprintf("**************************************\n\n") - fprintf("This is the %.f ieme run. wideband source is:%s \n",wb ,wb_list{wb}); + fprintf("This is the %.f ieme run. wideband source is:%s \n", wb , wideband_src); fprintf("**************************************\n\n") - for loc=1:1%length(loc_list) - - pwd; - fig_dir =['fig_Paeras_',wb_list{wb},'_',loc_list{loc},'_', win_type,'_',num2str(win_len)]; + for loc=1:length(localized_name) + loc_source = localized_name{loc}; + fprintf("loalized source number %.f : %s \n",loc,loc_source) ; + fprintf("**************************************\n\n") + %% + fig_dir =['fig_', wideband_src,'_',loc_source,'_', win_type,'_',num2str(win_len)]; if ~exist(fig_dir,'dir') mkdir(fig_dir); end addpath(fig_dir) - - %% - fprintf("loalized source number %.f : %s \n",loc,loc_list{loc}) ; - fprintf("**************************************\n\n") - loc_source=loc_list{loc}; - %% - [alpha, seuil, radius] = set_smooth_mask_params(wideband_src, loc_source, win_type); + [alpha, thres, radius] = set_smooth_mask_params(wideband_src, loc_source, win_type); [signals, dgt_params, signal_params, mask, mask_area, dgt,..., idgt] = get_mix(loc_source, wideband_src, gamma, win_dur, hop_ratio,..., - nbins_ratio, win_type, alpha, seuil, radius, fig_dir); - + nbins_ratio, win_type, alpha, thres, radius, fig_dir); fprintf('win_len:%.f\n', length(dgt_params.win)); fprintf('hop:%.f\n', dgt_params.hop); fprintf('n_bins:%.f\n', dgt_params.nbins); - %% create subregions + + %% create subregions mask_bool = mask; [mask_labeled, n_areas,t_subregions] = get_nareas(mask_bool,dgt, idgt, dgt_params,..., signal_params, fig_dir, tol_subregions); - %% EVD via Halko + + + %% [gabmul_list, mask_list] = get_P_gabmul(mask_labeled, dgt, idgt); x_mix = signals.mix; @@ -80,15 +113,14 @@ for win =1:length(win_list) ut_x_list,r] = compute_decomposition(x_mix, mask_list, gabmul_list,..., tolerance_arrf, proba_arrf); - %% mask - [mask_area, mask_area_ratio] = get_mask_area(mask); + %% plot mask + figure('name','mask'); - plot_spectrogram(mask, dgt_params,signal_params, dgt); + plot_mask(mask, dgt_params.hop,dgt_params.nbins, signal_params.fs); title(['mask : mask-area = ',num2str(mask_area)]); set(gca, 'FontSize', 20, 'fontName','Times'); - saveas(gcf,fullfile(fig_dir,'mask.pdf')); - + saveas(gcf,fullfile(fig_dir, 'mask.pdf')); %% Plot eigenvalues figure; @@ -108,19 +140,15 @@ for win =1:length(win_list) set(gca, 'FontSize', 25, 'fontName','Times'); saveas(gcf,fullfile(fig_dir, 'gabmul_eigenvalues.pdf')); - - - %% Find optimal lambda (best SDR) - + %% find optimal lambda (best SDR) x_wideband = signals.wideband; x_rec = @(lambda_coef)compute_estimate(lambda_coef, x_mix, s_vec_list,..., u_mat_list, ut_x_list); [lambda_oracle, t_oracle] = compute_lambda_oracle_sdr(n_areas,x_wideband, x_rec); - - - fprintf("Running time to tune lambda (oracle): %f \n",t_oracle); + disp("Running time to tune lambda (oracle): %f \n") + disp(t_oracle); %% Estimate energy and lambda @@ -133,167 +161,135 @@ for win =1:length(win_list) disp(t_lambda_est); - %% Estimate lambda from true energy - - e_wideband_true_energy = zeros(n_areas,1); - x_wideband_tf_mat = dgt(gabmul_list{1}(signals.wideband)); - - for k_area =1:n_areas - mask_k = (mask_labeled==k_area); - x_wideband_tf_masked = mask_k .* x_wideband_tf_mat; - - e_wideband_true_energy(k_area) =norm(x_wideband_tf_masked, 'fro').^2; - end - e_wideband = e_wideband_true_energy; - - [lambda_true_energy, t_true_energy] = compute_lambda(x_mix, mask, dgt_params,..., - signal_params, dgt, s_vec_list, u_mat_list, ut_x_list,..., - gabmul_list,fig_dir, e_wideband); - - - fprintf("Running time to tune lambda (True):\n") - disp(t_true_energy); %% Results x_wideband = signals.wideband; sdr_wideband = @(lambda_coef)sdr(x_wideband, x_rec(lambda_coef)); - sdr_wideband_1area = @(lambda_coef, k_area)sdr_engine_1area(lambda_coef, k_area, x_rec, x_wideband, n_areas); + sdr_wideband_1area = @(lambda_coef, k_area)sdr_1region(lambda_coef, k_area, x_rec, x_wideband, n_areas); is_wideband = @(lambda_coef) itakura_saito_dist_spectrum(x_wideband, x_rec(lambda_coef)); - is_wideband_1area = @(lambda_coef,k_area)is_spectrum_engine_1aera(x_wideband, k_area,lambda_coef, n_areas,x_rec); - + is_wideband_1area = @(lambda_coef,k_area)is_spectrum_1region(x_wideband, k_area,lambda_coef, n_areas,x_rec); - %% sdr wideband + %% SDR for each area l_range = 10.^linspace(-10,10,100); sdr_engine1area_l = zeros(length(l_range),1); - figure; for k_area =1: n_areas + figure; for k=1:length(l_range) sdr_engine1area_l(k) = sdr_wideband_1area(l_range(k), k_area); end - txt = ['SDR sub-reg =' num2str(k_area)]; - plot(l_range, sdr_engine1area_l,'DisplayName',txt) - end - - hold on; - for k_area =1:n_areas - txt1 = ['TFF-O ',num2str(k_area)]; + txt = 'SDR'; + plot(l_range, sdr_engine1area_l,'LineWidth',3,'DisplayName',txt) + + + hold on; + + txt1 = 'TFF-O '; plot(lambda_oracle(k_area), sdr_wideband_1area(lambda_oracle(k_area), k_area),..., '*','LineWidth',3,'DisplayName',txt1); - txt2 = ['TFF-P',num2str(k_area)]; + txt2 = 'TFF-P'; plot(lambda_est(k_area),sdr_wideband_1area(lambda_est(k_area), k_area),..., 'o','LineWidth',3,'DisplayName',txt2); - txt3 = ['TFF-E',num2str(k_area)]; - plot(lambda_true_energy(k_area),sdr_wideband_1area(lambda_true_energy(k_area), k_area),..., - 'o','LineWidth',3,'DisplayName',txt3); - txt4 = ['Zero fill',num2str(k_area)]; - plot(1, sdr_wideband_1area(1, k_area), 'o','LineWidth',3,'DisplayName',txt4); + txt3 = 'Zero fill'; + plot(1, sdr_wideband_1area(1, k_area), 'o','LineWidth',3,'DisplayName',txt3); + + legend show; + + + xlabel('$\lambda$','Interpreter','latex') + ylabel('SDR(dB)') + title(['SDR sub-region:' num2str(k_area)]) + set(gca,'XScale','log'); + grid on; + set(gca, 'FontSize', 20, 'fontName','Times'); + + saveas(gcf,fullfile(fig_dir, ['tuning_lambda_area_',num2str(k_area),'.pdf'])); end - legend show; - - - xlabel('$\lambda$','Interpreter','latex') - ylabel('SDR(dB)') - set(gca,'XScale','log'); - grid on; - set(gca, 'FontSize', 20, 'fontName','Times'); - - saveas(gcf,fullfile(fig_dir, 'tuning_lambda.pdf')); - + %% Itakura saito for each aera - %% Itakura saito is_engine1area_l = zeros(length(l_range),1); - figure; for k_area =1: n_areas + figure; for k=1:length(l_range) is_engine1area_l(k) = is_wideband_1area(l_range(k), k_area); end - txt = ['SDR sub-reg =' num2str(k_area)]; + txt ='IS'; plot(l_range, is_engine1area_l,'LineWidth',3,'DisplayName',txt) - end - hold on; - for k_area=1:n_areas + + hold on; + plot(lambda_oracle(k_area), is_wideband_1area(lambda_oracle(k_area),k_area), 'o','LineWidth',3) plot(lambda_est(k_area), is_wideband_1area(lambda_est(k_area),k_area), 'o') - plot(lambda_true_energy(k_area), is_wideband_1area(lambda_true_energy(k_area),k_area),'o','LineWidth',3) plot(1, is_wideband_1area(1,k_area), 'o','LineWidth',3) + xlabel('$\lambda$','Interpreter','latex') + ylabel('IS (dB)') + set(gca,'XScale','log'); + title(['IS sub-region:' num2str(k_area)]) + grid() + legend('IS','TFF-O','TFF-P','Zero fill') + axis tight; + set(gca, 'FontSize', 20, 'fontName','Times'); + saveas(gcf,fullfile(fig_dir, ['tuning_IS_',num2str(k_area),'.pdf'])); end - - xlabel('$\lambda$','Interpreter','latex') - ylabel('IS (dB)') - set(gca,'XScale','log'); - grid() - legend('IS','TFF-O','TFF-P','TFF-E','Zero fill') - axis tight; - saveas(gcf,fullfile(fig_dir, 'tuning_lambda_IS.pdf')); - - %% Itakura saito for each aera - figure; - yyaxis left; - plot(l_range, sdr_engine1area_l, '-','LineWidth',3); hold on; - - grid on; - xlabel('$\lambda$','Interpreter','latex') - ylabel('SDR (dB)') - set(gca,'XScale','log'); - - - yyaxis right; - - plot(l_range,is_engine1area_l,'-','LineWidth',3); hold on; - - - axis tight; - legend('SDR TFF-P','IS TFF-P','Location','northwest'); - xlabel('$\lambda$','Interpreter','latex') - ylabel('IS divergence') - set(gca, 'FontSize', 20, 'fontName','Times'); - - - saveas(gcf,fullfile(fig_dir, 'tuning_lambda_SDR_IS.pdf')); - %% - figure; - yyaxis left; - plot(l_range, sdr_engine1area_l, '-','LineWidth',3); hold on; - - grid on; - xlabel('$\lambda$','Interpreter','latex') - ylabel('SDR (dB)') - set(gca,'XScale','log'); - - - yyaxis right; - - plot(l_range,is_engine1area_l,'-','LineWidth',3); hold on; - - - axis tight; - legend('SDR TFF-P','IS TFF-P','Location','northwest'); - xlabel('$\lambda$','Interpreter','latex') - ylabel('IS divergence') - set(gca, 'FontSize', 20, 'fontName','Times'); - - - saveas(gcf,fullfile(fig_dir, 'tuning_lambda_SDR_IS.pdf')); - - - + %% plot both sdr and itakura saito in the same axis + sdr_engine1area_l = zeros(length(l_range),1); + is_engine1area_l = zeros(length(l_range),1); + for k_area =1:n_areas + figure; + for k=1:length(l_range) + sdr_engine1area_l(k) = sdr_wideband_1area(l_range(k), k_area); + is_engine1area_l(k) = is_wideband_1area(l_range(k), k_area); + end + + txt = ['SDR sub-reg =' num2str(k_area)]; + yyaxis left; + plot(l_range, sdr_engine1area_l, '-','LineWidth',3); hold on; + plot(lambda_oracle(k_area), sdr_wideband_1area(lambda_oracle(k_area), k_area), ..., + 'o','LineWidth',3) + plot(lambda_est(k_area),sdr_wideband_1area(lambda_est(k_area), k_area),..., + 'bo','LineWidth',3) + plot(1, sdr_wideband_1area(1, k_area), 'mo', 'LineWidth',3); + grid on; + xlabel('$\lambda$','Interpreter','latex') + ylabel('SDR (dB)') + set(gca,'XScale','log'); + + + yyaxis right; + + plot(l_range,is_engine1area_l,'-','LineWidth',3); hold on; + plot(lambda_oracle(k_area), is_wideband_1area(lambda_oracle(k_area),k_area),..., + 'o','LineWidth',3) + plot(lambda_est(k_area), is_wideband_1area(lambda_est(k_area),k_area), 'bo',..., + 'LineWidth',3) + plot(1, is_wideband_1area(1,k_area), 'mo','LineWidth',3) + + + legend('SDR','TFF-O','TFF-P','Zero fill','Location','northwest'); + xlabel('$\lambda$','Interpreter','latex') + ylabel('IS divergence') + title(['SDR-IS sub-reg:' num2str(k_area)]) + set(gca, 'FontSize', 20, 'fontName','Times'); + + + saveas(gcf,fullfile(fig_dir, ['tuning_lambda_SDR_IS',num2str(k_area),'.pdf'])); + end %% Reconstructed signals - tf_mat_mix = compute_dgt(signals.mix, dgt ); + x_oracle = x_rec(lambda_oracle); wav_write('x_oracle.wav', x_oracle, signal_params.fs); @@ -305,18 +301,17 @@ for win =1:length(win_list) wav_write('x_true_energy.wav', x_true_energy, signal_params.fs); - x_zero = solver_tfgm_zero(tf_mat_mix, mask, idgt); + x_zero = zero_fill_solver(x_mix, mask, dgt, idgt, dgt_params,..., + signal_params, fig_dir); wav_write('x_zero_fill.wav', x_zero, signal_params.fs); - x_interp= solver_tfgm_interp(tf_mat_mix, mask, idgt); + x_interp= interpolation_solver(x_mix, mask, dgt, idgt, dgt_params,..., + signal_params, fig_dir); wav_write('x_interp.wav', x_zero, signal_params.fs); %% Sdr - - - sdr_oracle = sdr(x_wideband, x_oracle); sdr_est = sdr(x_wideband, x_est); sdr_true_energy = sdr(x_wideband, x_true_energy); @@ -335,7 +330,6 @@ for win =1:length(win_list) %% - fprintf('Oracle lambda: %f\n', lambda_oracle); fprintf('SDR for oracle lambda: %f dB\n',sdr_oracle); @@ -351,7 +345,6 @@ for win =1:length(win_list) fprintf('Mix SDR: %f dB \n',sdr_mix); fprintf('Interp + random phases filling SDR: %e dB\n',sdr_interp); - %% figure; @@ -384,10 +377,6 @@ for win =1:length(win_list) axis tight; saveas(gcf,fullfile(fig_dir,'spectrogram_TFF-O.pdf')); - - - %% - figure; plot_spectrogram(x_est, dgt_params, signal_params, dgt) title(['TFF-P - SDR= ',num2str(sdr_est,4),'dB ','IS=',num2str(is_est)]) @@ -395,32 +384,22 @@ for win =1:length(win_list) axis tight; saveas(gcf,fullfile(fig_dir, 'spectrogram_TFF-P.pdf')); - - %% - figure; - plot_spectrogram(x_true_energy, dgt_params, signal_params,dgt) - title(['TFF-E SDR= ', num2str(sdr_true_energy,4),'dB ','IS=',num2str(is_true_energy) ]) - set(gca, 'FontSize', 20, 'fontName','Times'); - saveas(gcf,fullfile(fig_dir, 'spectrogram_TFF-E.pdf')); - %% - - figure; plot_spectrogram(x_interp, dgt_params, signal_params,dgt) title(['Interp SDR= ', num2str(sdr_interp,4),'dB ','IS=',num2str(is_interp)]) set(gca, 'FontSize', 20, 'fontName','Times'); saveas(gcf,fullfile(fig_dir,'spectrogram_interp.pdf')); %% save in csv - fprintf(f,'%s %s %s %.3f %.3f %.3f %.3f %.3f %.3f %.3f %.3f %.3f %.3f %.3f %.3f %.3f %.3f %.3f %.3f %.3f \n',..., - wb_list{wb},loc_list{loc},win_list{win},win_len,t_oracle,t_true_energy,..., + fprintf(f,'%s %s %s %.3f %.3f %.3f %.3f %.3f %.3f %.3f %.3f %.3f %.3f %.3f %.3f %.3f %.3f %.3f %.3f \n',..., + wideband_src, loc_source, win_type, win_len,t_oracle,..., t_est,t_arrf,t_evdn,t_ut_x,sdr_mix, sdr_interp,..., sdr_zero,sdr_est,sdr_oracle, is_interp, is_mix, is_est, is_zero, is_oracle); - + end - end end + diff --git a/matlab/tfgm/scripts/exp_gabmul_eigs_properties.m b/matlab/tfgm/scripts/exp_gabmul_eigs_properties.m index 9761f1c49b6022b4cd7c3d0933277f68a6644707..0a3a1d66257e90354639158cb2ba12afe06f5c5e 100644 --- a/matlab/tfgm/scripts/exp_gabmul_eigs_properties.m +++ b/matlab/tfgm/scripts/exp_gabmul_eigs_properties.m @@ -143,7 +143,12 @@ l = legend('Gauss','Hann',..., set(l, 'interpreter', 'latex') saveas(gcf,fullfile(fig_dir, 'eigenvalues_gauss_hann.fig')); saveas(gcf,fullfile(fig_dir, 'eigenvalues_gauss_hann.png')); + %% eigenvectors + +eigs_gauss = evdn_gauss.Gauss256.U; + + figure; set(gcf,'position',[1, 1 1000 800]); subplot(221);