From 5b15577c3b75063698089583df337dfef3319407 Mon Sep 17 00:00:00 2001
From: Marina Kreme <amamarinak@gmail.com>
Date: Wed, 27 May 2020 21:57:01 +0200
Subject: [PATCH] function for rank estimation by halko versus eigs

---
 .../rank_estimation_halko_vs_eigs_gausswin.m  | 99 +++++++++++++++++++
 1 file changed, 99 insertions(+)
 create mode 100644 matlab/tfgm/scripts/rank_estimation_halko_vs_eigs_gausswin.m

diff --git a/matlab/tfgm/scripts/rank_estimation_halko_vs_eigs_gausswin.m b/matlab/tfgm/scripts/rank_estimation_halko_vs_eigs_gausswin.m
new file mode 100644
index 0000000..ae7c2a8
--- /dev/null
+++ b/matlab/tfgm/scripts/rank_estimation_halko_vs_eigs_gausswin.m
@@ -0,0 +1,99 @@
+clc; clear; close all;
+
+% The script permet d'�tuider l'estimation du rang par Halko vs eigs
+%% Repertoires pour les figures
+
+pwd;
+pathname ='figures_JSTSP';
+if ~exist('figures_JSTSP','dir')
+    mkdir('figures_JSTSP');
+end
+addpath('figures_JSTSP')
+
+%%  Parametres du signal
+
+resampling_fs=8000; % frequence d'echantillonage
+sig_len = 8192; % longueur du signal
+
+tolerance = 1e-6; %  parametres pour Halko
+proba = 1-1e-4;
+r =  compute_r(sig_len, sig_len, proba);
+
+%%  Generation des parametres de la DGT
+
+
+t_lim = [0.4, 0.6];
+f_lims = 0.2:0.05:0.6;
+
+win_type = 'gauss';
+
+approx_win_len = 64; % changer sinon trop long.
+
+dgt_params = generate_dgt_parameters(win_type, approx_win_len);
+signal_params = generate_signal_parameters(resampling_fs, sig_len);
+[dgt, idgt] = get_stft_operators(dgt_params, signal_params);
+
+
+%%
+mask_area_list = zeros(length(f_lims),1);
+ranks_arrf = zeros(length(f_lims),1);
+ranks_eigs= zeros(length(f_lims),1);
+t_arrf = zeros(length(f_lims),1);
+t_eigs = zeros(length(f_lims),1);
+s_vec_list = cell(length(f_lims),1);
+
+
+seuil = 10^(-14); % pour la EVD via eigs
+%%
+for k =1:length(f_lims)
+    fprintf("Je suis a l'iteration numero %.f patiente\n",k);
+    % Mask Generation
+    %%
+    f_lim =[0.1, f_lims(k)];
+    mask = generate_rectangular_mask(dgt_params.nbins,dgt_params.hop, signal_params.sig_len, t_lim, f_lim);
+    
+    [mask_area, mask_area_ratio] = get_mask_area(mask);
+    mask_area_list(k) = mask_area;
+    
+    fprintf('mask area:%.f\n', mask_area)
+    if mask_area>signal_params.sig_len
+        fprintf('attention %.f\n',k)
+    end
+    figure(k);
+    plot_mask(mask, dgt_params.nbins, dgt_params.hop, signal_params.fs);
+    %% Gabor multiplier
+    gab_mul = gen_gabmul_operator(dgt, idgt, mask);
+    
+    %% EVD via Halko
+    tic;
+    q_mat = adaptative_randomized_range_finder(gab_mul, sig_len, tolerance, r);
+    t_arrf(k) = toc;
+    
+    ranks_arrf(k)= size(q_mat,2);
+    %% EVD via eigs
+    tic;
+    [u_mat,s] = eigs(gab_mul, signal_params.sig_len, signal_params.sig_len);
+    t_eigs(k) = toc;
+    
+    s_vec = diag(s);
+    s_vec_list{k} = s_vec;
+    ranks_eigs(k) = length(s_vec(s_vec > seuil));
+end
+
+%%
+save('rank_estimation.mat','ranks_arrf','ranks_eigs', 'mask_area_list',...,
+    't_arrf','t_eigs', 's_vec_list');
+
+%% plot figures
+
+figure;
+plot(mask_area_list,ranks_arrf,'LineWidth',3); hold on;
+plot(mask_area_list,ranks_eigs,'LineWidth',3);
+%set(gca,'XScale','log')
+xlabel('Mask area')
+ylabel('Estimated rank')
+grid('on');
+legend('Rand-EVD', 'eigs', 'Location','northwest');
+set(gca, 'FontSize', 20, 'fontName','Times');
+saveas(gcf,fullfile(pathname,'rank_estimation_gauss.png'));
+saveas(gcf,fullfile(pathname,'rank_estimation_gauss.fig'));
-- 
GitLab