clc; clear; close all;
% Test de l'algorithme randomized range finder  avec le multiplicteur 
%%  
duration = 1;
fs = 1024;
c= 1; s = 4;
win_type='hann';
approx_win_duration = 0.02;

%% Parametres du signal et de la DGT
signal_params = generate_signal_parameters(fs, duration);
dgt_params = generate_dgt_parameters(signal_params, win_type, approx_win_duration,c ,s);
[direct_stft, adjoint_stft] = get_stft_operators(dgt_params, signal_params);


%% Generation du mask
M = dgt_params.nbins/2 +1; 
N = signal_params.sig_len/ dgt_params.hop; 

T= duration;     
t1= [0.1,0.5];
f1= [32, 100];

mask = generate_maskby_hand(T, fs, t1, f1, M, N); % generation du masque

figure; plotdgtreal(mask, dgt_params.hop, dgt_params.nbins, fs);

%% Le multiplicateur

A = gen_gabmul_operator(direct_stft, adjoint_stft, mask);

%% Determination du rang de la matrice associee a  l'operateur A

x = randn(signal_params.sig_len,1);
Amat = A(x);

disp(sum(Amat~=0));

%%  Construction de la matrice Q
l = sum(Amat~=0);

tic; 
Q = randomized_range_finder(A, signal_params.sig_len, l);
t_Q = toc;
 


%% A t-on norm(Amat - Q*Q'*Amat) <= epsilon ?
I = eye(signal_params.sig_len);
B = A(I-Q*Q');
disp(norm(B,2))