diff --git a/matlab/tfgm/datasets/get_all_mixtures.m b/matlab/tfgm/datasets/get_all_mixtures.m new file mode 100644 index 0000000000000000000000000000000000000000..5eb811adaf0e8f644ca91c041e2954ea91057320 --- /dev/null +++ b/matlab/tfgm/datasets/get_all_mixtures.m @@ -0,0 +1,97 @@ + +clc; clear; close all; +%% +% Generate all combination between wide-band and localized signals + +%% +make_wav_pairs() +%% + +pwd; +pathname ='spectro_all_mixtures'; +if ~exist('spectro_all_mixtures','dir') + mkdir('spectro_all_mixtures'); +end +addpath('spectro_all_mixtures') + +%% +data = load('signal_lists.mat'); +%% +resampling_fs = 8000; +sig_len =16384; +signal_params = generate_signal_parameters(resampling_fs, sig_len); + +%% DGT parameters +approx_win_len = 512; +win_len = approx_win_len; +win_type='hann'; +params = get_params(win_len, win_type); + +dgt_params = generate_dgt_parameters(win_type, approx_win_len, params.hop, params.nbins, sig_len); + +%% DGT operators + +[dgt, idgt] = get_stft_operators(dgt_params, signal_params); + + +%% All mix +close all +target_name ={'car','plane','train'}; +per_name = {'beeps','bird','clicks','pop'}; + +gamma=0.7; +deb=0; +close all; + +for k=1:length(data.wide_band_sources_files) + sig_wd = load_wideband_signal(k, resampling_fs, sig_len); + + for l=1:length(data.localized_sources_files) + %% + + %figure; + sig_loc = load_localized_signal(l, resampling_fs, sig_len,deb); + signals = generate_mix_signal(sig_wd, sig_loc, gamma); + + tf_mat_target = compute_dgt(signals.wideband, dgt ); + tf_mat_per = compute_dgt(signals.localized, dgt ); + tf_mat_mix = compute_dgt(signals.mix, dgt ); + + [alpha, seuil, radius] = set_smooth_mask_params(target_name{k}, per_name{l}, win_type); + + sdr_mix = sdr(signals.wideband, signals.mix); + + [original_mask, mask_after_imclose, mask_after_imopen,..., + mask] = generate_mask(tf_mat_target, tf_mat_per, alpha, seuil, radius); + + + subplot(221); + plot_spectrogram(tf_mat_target, dgt_params, signal_params, dgt ) + title(target_name{k}) + + subplot(222); + plot_spectrogram(tf_mat_per, dgt_params, signal_params, dgt ) + title(per_name(l)); + + subplot(223); + plot_spectrogram(tf_mat_mix, dgt_params, signal_params, dgt ) + title(['Mix SDR= ',num2str(sdr_mix),'dB']); + + subplot(224); + plot_spectrogram(mask, dgt_params, signal_params, dgt ) + title(['mask - ', num2str(win_type)]); + + saveas(gcf,fullfile(pathname, [target_name{k},'_' num2str(l), '_',num2str(win_type) '.png'])); + % figure; + % plot_spectrogram((1-mask).*tf_mat_per, dgt_params, signal_params, dgt ); + % title(['masked spectro - ', target_name{k}, per_name(l)]) + %saveas(gcf,fullfile(pathname, ['masked_spectro_', target_name{k},'_' num2str(l), '_',num2str(win_type) '.png'])); + + end + + + +end + + + diff --git a/matlab/tfgm/datasets/get_cuicui_mix_icassp.m b/matlab/tfgm/datasets/get_cuicui_mix_icassp.m new file mode 100644 index 0000000000000000000000000000000000000000..956c5895d84c3ce60297d2f0371d7186b286ed7a --- /dev/null +++ b/matlab/tfgm/datasets/get_cuicui_mix_icassp.m @@ -0,0 +1,106 @@ +function [signal_params, dgt_params, w,dgt,idgt, signals, alpha, seuil,..., + r, mask,dgt_mix]= get_cuicui_mix_icassp() +%% This function allows you to reproduce ICASSP dataset. + +%% Signal parameters +%make_wav_pairs(); + + +sig_len = 2^(13); +fs = 8000; +signal_params.fs = fs; +signal_params.sig_len = sig_len; + +%% dgt parameters + + +approx_win_duration =0.02; +win_type ='hann'; + +win_len = 2^(round(log2(approx_win_duration*fs))); +dgt_params.hop = win_len/4 ; +dgt_params.nbins=4*win_len; +dgt_params.sig_len = sig_len; +dgt_params.win_type = win_type; +dgt_params.win_len = win_len; +%% window and DGT operator + L=dgtlength(dgt_params.sig_len, dgt_params.hop, dgt_params.nbins); +w = gabwin(dgt_params.win_type, dgt_params.hop, dgt_params.nbins, dgt_params.win_len); +dgt = @(x) dgtreal(x,w, dgt_params.hop, dgt_params.nbins, dgt_params.sig_len); + +wd = {'dual', dgt_params.win_type}; +idgt= @(x)idgtreal(x, wd, dgt_params.hop,dgt_params.nbins, dgt_params.sig_len); + +compute_stft = @(x,w,dgt_params,L) dgtreal(x,w, dgt_params.hop, dgt_params.nbins,L); +%% signals and their mixtures + +ind_wideband = 1; +ind_localized = 2; +deb = 0.2; +[x_engine, x_bird] = load_pairs(ind_wideband, ind_localized,..., + fs, sig_len, deb); + + + + +%% +x_target = x_engine; +x_perturbation = x_bird; +gamma=0.7; +x_target = x_target/max(abs(x_target)); +x_perturbation = x_perturbation/max(abs(x_perturbation)); + +x_target = gamma*x_target; +x_perturbation = (1-gamma)*x_perturbation; +x_mix = x_target +x_perturbation; + +signals.target = x_target; +signals.noise = x_perturbation; +signals.mix = x_mix; + +%% Spectogramm of signals + + +dgt_Xref = compute_stft(signals.target,w, dgt_params,L); +dgt_Xper = compute_stft(signals.noise, w, dgt_params,L); +dgt_mix = dgt_Xref +dgt_Xper; + +%% mask +alpha = 2; seuil =0.02; r = 3; + +mask = and(abs(dgt_Xper) < alpha*abs(dgt_Xref),abs(dgt_Xper)<seuil); +se = strel('disk',r); +mask =imclose(mask,se); +figure; imagesc(mask); + +%% plot figures + +pwd; +pathname ='figures'; +if ~exist('figures','dir') + mkdir('figures'); +end +addpath('figures') + + +figure; +plot_spectrogram(mask, dgt_params, signal_params, dgt); +title('mask') +saveas(gcf,fullfile(pathname,['mask','.png'])); + +figure; +plot_spectrogram(dgt_Xref, dgt_params, signal_params, dgt) +title('target signal') +saveas(gcf,fullfile(pathname,['engine','.png'])); +figure; +plot_spectrogram(dgt_Xper, dgt_params, signal_params, dgt) +title('perturbation signal') +saveas(gcf,fullfile(pathname,['bird','.png'])); +figure; +plot_spectrogram(dgt_mix, dgt_params, signal_params, dgt) +title('perturbation signal') +saveas(gcf,fullfile(pathname,['engine_bird','.png'])); + + + + diff --git a/matlab/tfgm/datasets/get_dataset.m b/matlab/tfgm/datasets/get_dataset.m new file mode 100644 index 0000000000000000000000000000000000000000..845784c72fcacf79c2c73cc69aad6be6ff66ffff --- /dev/null +++ b/matlab/tfgm/datasets/get_dataset.m @@ -0,0 +1,38 @@ +function dataset = get_dataset() + +% This function is used to get the data of the experiments. +%The data is stored in a structure array. +% +% Author: Marina KREME + +wide_dir = './data/data_8000Hz_16384samples/wide_band_sources/'; +loc_dir = './data/data_8000Hz_16384samples/localized_sources/'; + +n_wide_dir = dir([wide_dir, '*.wav']); +n_loc_dir = dir([loc_dir, '*.wav']); +dataset = struct('wideband',struct(),'localized',struct()); + + +for x =1: length(n_wide_dir) + + wideband_file = [n_wide_dir(x).folder, filesep,n_wide_dir(x).name]; + wideband_name = n_wide_dir(x).name(1:end-4); + + dataset.wideband.(wideband_name)=wideband_file; + +end + + +for x =1: length(n_loc_dir) + + localized_file = [n_loc_dir(x).folder, filesep,n_loc_dir(x).name]; + localized_file_name = n_loc_dir(x).name(1:end-4); + + dataset.localized.(localized_file_name)=localized_file; + +end + + + + + diff --git a/matlab/tfgm/datasets/get_mix.m b/matlab/tfgm/datasets/get_mix.m new file mode 100644 index 0000000000000000000000000000000000000000..529a1efd29eed5cc6da1b84d9777768a5514d3d5 --- /dev/null +++ b/matlab/tfgm/datasets/get_mix.m @@ -0,0 +1,118 @@ +function [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, thres, radius, fig_dir) + +%% +% Function that generates : +% - the mixture of a wide-band spectrogram signal and a localized signal. +% - the mask from the two mixtures +% +% Inputs: +% - loc_source(str): signal with localized spectrogram +% - wideband_src(str): signal with wideband spectrogram +% - gamma: integer (belong to ]0,1[) +% - win_dur: window duration (must be between 12 and 20 ms) +% - hop_ratio, nbins_ration: real +% - win_type (str): analysis window (hann or gauss) +% -alpha, thres, radius(real): smoothing parameter for the mask +% -fig_dir: directory +% +% Outputs: +% -signals(struct): contains wideband, localized and mixtures signals +% - dgt_params (struct): contains dgt parameters (hop, n_bins, win_type, win_len, win) +% - signal_params (struct): contains the length of signal and sampling frequency +% - mask : binary mask +% - mask_are: binary mask area +% - dgt, idgt: Operator of Gabor transform and its inverse +% +% Author : Marina KREME + +%% +dataset = get_dataset(); + +[x_loc, fs_loc]= audioread(dataset.localized.(loc_source)); +[x_wb, fs_wb]= audioread(dataset.wideband.(wideband_src)); + +if length(x_loc)~=length(x_wb) + warning('Arrays are not equal'); + +end + +if fs_loc~=fs_wb + error('The sampling frequencies must be the same.') +end + +fs= fs_loc; +sig_len = length(x_loc); +signal_params = generate_signal_parameters(fs, sig_len); + + +%% build mix signals +signals = generate_mix_signal(x_wb, x_loc, gamma); + +%% Build dgt + +approx_win_len = 2.^round(log2(win_dur*fs)); +hop = approx_win_len* hop_ratio; +nbins = approx_win_len * nbins_ratio; + +dgt_params = generate_dgt_parameters(win_type, approx_win_len, hop, nbins, sig_len); + + +%% generat mask +[dgt, idgt] = get_stft_operators(dgt_params, signal_params); + +tf_mat_wb = compute_dgt(signals.wideband, dgt ); +tf_mat_loc = compute_dgt(signals.localized, dgt ); + +[mask, original_mask, mask_after_imclose, mask_after_imopen,..., + ] = generate_mask(tf_mat_wb, tf_mat_loc, alpha, thres, radius); +mask_area = get_mask_area(mask); +%% + +figure; +plot_mask(mask, hop, nbins, fs); +title(['Mask Mix : mask-area = ',num2str(mask_area)]); +set(gca, 'FontSize', 20, 'fontName','Times'); +saveas(gcf,fullfile(fig_dir, 'mask_mix.pdf')); + + + +%% + +figure; + +% plot_spectrogram(signals.wideband, dgt_params, signal_params, dgt) +% title(['Wideband source - ', wideband_src]); +subplot(231) +plot_spectrogram(signals.localized, dgt_params, signal_params, dgt) +title(['Localized source - ',loc_source]); + +subplot(232) +plot_spectrogram(signals.mix, dgt_params, signal_params, dgt) +title('Mix'); + +subplot(233) +plot_mask(original_mask, hop, nbins, fs); +title('Original mask'); + +subplot(234) +plot_mask(mask_after_imclose, hop, nbins, fs); +title('Smooth mask- after imclose'); + +subplot(235) +plot_mask(mask_after_imopen, hop, nbins, fs); +title('Smooth and final mask - after impoen'); + +m = ~mask; + +gabmul = gen_gabmul_operator(dgt, idgt,m); +x_est = gabmul(signals.wideband); +subplot(236) +plot_spectrogram(x_est, dgt_params, signal_params, dgt) +title('Filtered wb') + +saveas(gcf,fullfile(fig_dir, 'mix_spectro_mask.pdf')); + + +end \ No newline at end of file diff --git a/matlab/tfgm/datasets/get_params.m b/matlab/tfgm/datasets/get_params.m new file mode 100644 index 0000000000000000000000000000000000000000..a5dd31e9623966c2863e43c3103301814ac71a3f --- /dev/null +++ b/matlab/tfgm/datasets/get_params.m @@ -0,0 +1,29 @@ +function params = get_params(win_len, win_type) +% Function that generates input data for the function that generates dgt parameters +% Inputs: +% -win_len(int): analysis window length +% -win_type(str): analysis window type (hann/gauss) +% Outputs: +% -hop(int): hop size +% -nbins(int): frequency bins +% -win_type, win_len +% +% Author : Marina KREME +%% + +switch win_type + case 'gauss' + hop = win_len/4; + nbins = win_len*4; + case 'hann' + + hop = win_len/8; + nbins = win_len*2; +end + +params.win_type = win_type; +params.win_len = win_len; +params.hop = hop; +params.nbins = nbins; + +end \ No newline at end of file diff --git a/matlab/tfgm/datasets/load_localized_signal.m b/matlab/tfgm/datasets/load_localized_signal.m new file mode 100644 index 0000000000000000000000000000000000000000..473385e4d409d44db1d67bf63c084792547ff547 --- /dev/null +++ b/matlab/tfgm/datasets/load_localized_signal.m @@ -0,0 +1,23 @@ +function x_loc = load_localized_signal(ind_localized, resampling_fs, sig_len, deb) + + + +if nargin ==0 + deb=0; +end + +data = load('signal_lists.mat'); + +n = size(data.localized_sources_files, 1); + +if ind_localized > n + error('%s: The ind_localized value you entered is outside the value range. Please try another value.', upper(mfilename)); +end + + +localized_file = [data.localized_sources_files(ind_localized).folder, ... + filesep, ... + data.localized_sources_files(ind_localized).name]; +x_loc= wave_read(localized_file, resampling_fs, sig_len, deb); + +end diff --git a/matlab/tfgm/datasets/load_pairs.m b/matlab/tfgm/datasets/load_pairs.m new file mode 100644 index 0000000000000000000000000000000000000000..37fa11d5b02051f173a2b552dc5d2065c785b91a --- /dev/null +++ b/matlab/tfgm/datasets/load_pairs.m @@ -0,0 +1,45 @@ +function [x_wideband,x_localized] = load_pairs(ind_wideband, ind_localized, resampling_fs, sig_len, deb) +% [x_wideband,x_localized] = load_pairs(ind_wideband, ind_localized, resampling_fs, sig_len, deb) +% Load data from .mat file. Return the target and the perturbation signals. +% +% Inputs: +% - ind_wideband:(int)index of signals that have a wideband spectrogram +% - ind_localized: (int) index of signals that have a well-localized spectrogram. +% - resampling_fs : desired sampling frequency. +% - sig_len: (int). signal length +% - deb: Start point of the signal in ms. deb =0 by default +% +% Outputs: +% - x_wideband: target signal +% - x_localized: perturbation signal (localized in time-frequency) +% +% Author : A. Marina KREME +% e-mail : ama-marina.kreme@lis-lab.fr/ama-marina.kreme@univ-amu.fr +% Created: 2020-28-01 +%% + +if nargin < 4 + deb=0; +end + +data = load('signal_lists.mat'); +m = size(data.wide_band_sources_files, 1); +n = size(data.localized_sources_files, 1); + +if ind_wideband > m || ind_localized > n + error('%s: The ind_wideband or ind_localized value you entered is outside the value range. Please try another value.', upper(mfilename)); +end + +wideband_file = [data.wide_band_sources_files(ind_wideband).folder, ... + filesep, ... + data.wide_band_sources_files(ind_wideband).name]; +localized_file = [data.localized_sources_files(ind_localized).folder, ... + filesep, ... + data.localized_sources_files(ind_localized).name]; +x_localized= wave_read(localized_file, resampling_fs, sig_len, deb); +x_wideband= wave_read(wideband_file, resampling_fs, sig_len, deb); + + +end + + diff --git a/matlab/tfgm/datasets/load_wideband_signal.m b/matlab/tfgm/datasets/load_wideband_signal.m new file mode 100644 index 0000000000000000000000000000000000000000..242a95e4b93c1f1e17722e987bb576db960492f1 --- /dev/null +++ b/matlab/tfgm/datasets/load_wideband_signal.m @@ -0,0 +1,24 @@ +function x_wd = load_wideband_signal(ind_wideband,resampling_fs, sig_len, deb) + + + + +if nargin == 3 + deb=0; +end + +data = load('signal_lists.mat'); +n = size(data.wide_band_sources_files, 1); + + +if ind_wideband > n + error('%s: The ind_wideband value you entered is outside the value range. Please try another value.', upper(mfilename)); +end + +wideband_file = [data.wide_band_sources_files(ind_wideband).folder, ... + filesep, ... + data.wide_band_sources_files(ind_wideband).name]; + +x_wd= wave_read(wideband_file, resampling_fs, sig_len, deb); + +end \ No newline at end of file diff --git a/matlab/tfgm/datasets/make_wav_pairs.m b/matlab/tfgm/datasets/make_wav_pairs.m new file mode 100644 index 0000000000000000000000000000000000000000..e3cd96f98a544f9699a31dfd414422abaee7e868 --- /dev/null +++ b/matlab/tfgm/datasets/make_wav_pairs.m @@ -0,0 +1,19 @@ +function make_wav_pairs() +%% MAKE_WAV_PAIRS: make_wav_pairs() +% function that generates two structures. +% One containing the wideband sounds and the other one with the well localized sounds +% +% Author : A. Marina KREME +% e-mail : ama-marina.kreme@lis-lab.fr/ama-marina.kreme@univ-amu.fr +% Created: 2020-28-01 +%% +wide_dir = './data/data_8000Hz_16384samples/wide_band_sources/'; +loc_dir = './data/data_8000Hz_16384samples/localized_sources/'; + +wide_band_sources_files= dir([wide_dir, '*.wav']); % set the path to the .wav file +localized_sources_files = dir([loc_dir, '*.wav']); + +save('signal_lists.mat','wide_band_sources_files', 'localized_sources_files'); +end + + diff --git a/matlab/tfgm/datasets/run_get_cuicui_mix_icassp.m b/matlab/tfgm/datasets/run_get_cuicui_mix_icassp.m new file mode 100644 index 0000000000000000000000000000000000000000..ddd2965f75e4fda5d25f9d73c0b2009411f52425 --- /dev/null +++ b/matlab/tfgm/datasets/run_get_cuicui_mix_icassp.m @@ -0,0 +1,6 @@ +clc; clear; close all; + +%% + +[signal_params, dgt_params, w,dgt, signals, alpha, seuil,..., + r, mask]= get_cuicui_mix_icassp(); \ No newline at end of file diff --git a/matlab/tfgm/datasets/set_smooth_mask_params.m b/matlab/tfgm/datasets/set_smooth_mask_params.m new file mode 100644 index 0000000000000000000000000000000000000000..2926f635e706366de892d38da1e58ee513c36d0c --- /dev/null +++ b/matlab/tfgm/datasets/set_smooth_mask_params.m @@ -0,0 +1,221 @@ +function [alpha, thres, radius] = set_smooth_mask_params(wideband_src, loc_source, win_type) +% This function allow us to generate parameters for smooth binary mask +% Inputs: +% - wideband_src : signal with wide-bande spectrogram +% - loc_source : signal with localized spectrogram +% - win_type : window - (gauss or hann) +% +% +% Outputs: +% - alpha : real +% - thres :threshold +% - radius : integer +% +% Author: Marina KREME + + +switch win_type + case 'gauss' + + switch wideband_src + case 'car' + switch loc_source + case 'beeps' + + alpha=9; + thres=1e-5; + radius=1; + + case 'bird' + alpha=1 ; + thres=1e-4; + radius=4; + + case 'clicks' + alpha=1; + thres=0.0002; + radius=3; + + case 'finger_snaps' + alpha=0.01; + thres=0.0001; + radius=1; + case 'modulations' + alpha=1; + thres=0.0002; + radius=3; + case 'pop' + alpha=0.1; + thres=0.0001; + radius=1; + end + + case'plane' + switch loc_source + case 'beeps' + + alpha=1; + thres=0.00002; + radius=2; + + case 'bird' + alpha=0.3; + thres=0.0001; + radius=1; + + case 'clicks' + alpha=1; + thres=0.0002; + radius=4; + case 'finger_snaps' + alpha=0.01; + thres=0.0001; + radius=1; + case 'modulations' + alpha=1; + thres=0.0002; + radius=3; + case 'pop' + alpha=0.01; + thres=0.0001; + radius=1; + + end + + case 'train' + switch loc_source + case'beeps' + + alpha=1; + thres=0.0001; + radius=1; + + case 'bird' + alpha=0.1; + thres=0.0001; + radius=3; + + case 'clicks' + alpha=1; + thres=0.0002; + radius=4; + case 'finger_snaps' + alpha=0.01; + thres=0.0001; + radius=1; + case 'modulations' + alpha=1; + thres=0.0002; + radius=3; + case 'pop' + alpha=0.01; + thres=0.001; + radius=1; + + end + end + + + + case 'hann' + switch wideband_src + case 'car' + switch loc_source + case 'beeps' + + alpha=1; + thres=0.00001; + radius=1; + + + case 'bird' + alpha=1; + thres=0.0001; + radius=3; + + case 'clicks' + alpha=1; + thres=0.0002; + radius=4; + case 'finger_snaps' + alpha=0.01; + thres=0.0001; + radius=1; + case 'modulations' + alpha=1; + thres=0.0002; + radius=3; + case 'pop' + alpha=1; + thres=0.0002; + radius=4; + + end + case 'plane' + switch loc_source + case 'beeps' + + alpha=1; + thres=0.0001; + radius=1; + + case 'bird' + alpha=1; + thres=0.0002; + radius=4; + + case 'clicks' + alpha=1; + thres=0.0002; + radius=2; + + case 'finger_snaps' + alpha=0.01; + thres=0.0001; + radius=1; + case 'modulations' + alpha=1; + thres=0.0002; + radius=3; + case 'pop' + alpha=1; + thres=0.0002; + radius=1; + end + case 'train' + switch loc_source + case 'beeps' + + alpha=1; + thres=0.00002; + radius=1; + case 'bird' + alpha=1; + thres=0.001; + radius=2; + case 'clicks' + alpha=1; + thres=0.0001; + radius=1; + case 'finger_snaps' + alpha=0.01; + thres=0.0001; + radius=1; + case 'modulations' + alpha=1; + thres=0.0002; + radius=3; + + + end + + + end +end +fprintf("The parameters for smoothing the mask are: \n") +fprintf("alpha = %f\n", alpha); +fprintf("seuil = %f\n", thres); +fprintf("radius = %f\n", radius); + + +end diff --git a/matlab/tfgm/datasets/test_get_mix.m b/matlab/tfgm/datasets/test_get_mix.m new file mode 100644 index 0000000000000000000000000000000000000000..278618933e9af03ddb9a91dbe7dfbca60e05a12d --- /dev/null +++ b/matlab/tfgm/datasets/test_get_mix.m @@ -0,0 +1,36 @@ +clear; clear; close all; + +%% +loc_source='bird'; +wideband_src='car'; +gamma=0.7; +win_type ='gauss'; + +[alpha, seuil, radius] = set_smooth_mask_params(wideband_src, loc_source, win_type); + + + +%% +win_dur =256/8000; +hop_ratio=1/4; +nbins_ratio=4; +tol_subregions=0; + +if tol_subregions==1 + nb_areas ='Paeras'; +else + nb_areas='1area'; +end + +pwd; +fig_dir =['fig_solve_', nb_areas,'_car_cuicui_', win_type]; +if ~exist(fig_dir,'dir') + mkdir(fig_dir); +end +addpath(fig_dir) + + +[signals, dgt_params, signal_params, mask, dgt,..., + idgt] = get_mix(loc_source, wideband_src, gamma, win_dur, hop_ratio,..., + nbins_ratio, win_type, alpha, seuil, radius, fig_dir); + diff --git a/matlab/tfgm/datasets/untitled.m b/matlab/tfgm/datasets/untitled.m new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/matlab/tfgm/datasets/wav_write.m b/matlab/tfgm/datasets/wav_write.m new file mode 100644 index 0000000000000000000000000000000000000000..da354e9595674152ce7e10d247687675aefe22f9 --- /dev/null +++ b/matlab/tfgm/datasets/wav_write.m @@ -0,0 +1,14 @@ +function wav_write(filename, y, fs) +%% WAV_WRITE +% Function that writes an audio data file $y$ from a sampling frequency $fs$to a +% file called a $filename$.The filename entry also specifies the format +% of the output file. +% +% Author : A. Marina KREME +% e-mail : ama-marina.kreme@lis-lab.fr/ama-marina.kreme@univ-amu.fr +% Created: 2020-28-01 +%% + +x= y/max(abs(y)); +audiowrite(filename,x,fs); +end \ No newline at end of file diff --git a/matlab/tfgm/datasets/wave_read.m b/matlab/tfgm/datasets/wave_read.m new file mode 100644 index 0000000000000000000000000000000000000000..b413b703ae91fecc96c7b75863331bf84a0b7af4 --- /dev/null +++ b/matlab/tfgm/datasets/wave_read.m @@ -0,0 +1,54 @@ +function x= wave_read(filename, resampling_fs, sig_len, deb) +%% WAVE_READ -- x= wave_read(filename, resampling_fs, sig_len, deb) +% This function takes an input audio signal and resamples it at the desired frequency +% +% Inputs: +% filename : filename in .wav format +% resampling_fs : resampling frequency +% sig_len: (int). signal length +% deb : Start of the selection in seconds or minutes (int) + +% +% Output: +% x : resampled signal +% +% Author : A. Marina KREME +% e-mail : ama-marina.kreme@lis-lab.fr/ama-marina.kreme@univ-amu.fr +% Created: 2020-28-01 +%% +if nargin==3 + deb =0; +end + +if exist(filename, 'file') ~= 2 + error('The file was not found. Please Check the path or the file name : %s.', filename); +end + +[x,fs] = audioread(filename); +x = x(:,1); + + + + +if fs~=resampling_fs + x = resample(x,resampling_fs,fs); +end + +s_end = deb*resampling_fs+sig_len; + +% if s_end > sig_len +% error('Take a start value lower than the value you entered: index exceeds matrix dimension : %.f', s_end); +% end + +if length(x)<sig_len +% msg = ['the length of input signal is smaller than the requested signal length',... +% '. It would be better to take a signal that has a length greater than or equal to sig_len']; +% warning(msg) + y =x; + x=zeros(sig_len,1); + x(1:length(y))=y; +end +x = x(deb*resampling_fs+1:s_end); + + +end \ No newline at end of file diff --git a/matlab/tfgm/exp_tf_filtering/exp_car_cuicui_one_region.m b/matlab/tfgm/exp_tf_filtering/exp_car_cuicui_one_region.m new file mode 100644 index 0000000000000000000000000000000000000000..ee0a69cf60ff1a757ff5d8a85deaa1ce08d12c9f --- /dev/null +++ b/matlab/tfgm/exp_tf_filtering/exp_car_cuicui_one_region.m @@ -0,0 +1,273 @@ +clc; clear; close all; + +%% +% experiments with +% - wideband sound: engine(Genesis) +% - localized sound: birdsong (Genesis) + +%% +make_wav_pairs() % make sure alls pairs are ok +%% Figures Directory + +pwd; +pathname ='figures_JSTSP'; +if ~exist('figures_JSTSP','dir') + mkdir('figures_JSTSP'); +end +addpath('figures_JSTSP') + +%% +resampling_fs=8000; +sig_len = 16384; + +win_type_list={'hann', 'gauss'}; +win_len_list = [256, 128]; + +mask_params_hann =[4, 0.001, 1]; +mask_params_gauss =[3, 0.002, 3]; +mask_params = {mask_params_hann, mask_params_gauss}; +eigsvect_hann = [45, 18, 1945, 2051]; +eigsvect_gauss = [45, 8, 1650, 1438]; +eigsvect = {eigsvect_hann, eigsvect_gauss }; +e_target_list = [0.04, 0.049]; +%% +for k=1:length(win_type_list) + k=2; +%% DGT parameters - gabor frames operators - analysis window + +win_type = win_type_list{k}; +win_len = win_len_list(k); + +fprintf('analysis window : %s\n', win_type); +fprintf('win_len : %.f \n', win_len); + +signal_params = generate_signal_parameters(resampling_fs, sig_len); +dgt_params = generate_dgt_parameters(win_type, win_len); + + +[dgt, idgt] = get_stft_operators(dgt_params, signal_params); + +% plot associated window + +figure; +plot_win(dgt_params.win, signal_params.fs, signal_params.sig_len, win_type) +title([num2str(win_type), ' - window']); +set(gca, 'FontSize', 20, 'fontName','Times'); +saveas(gcf,fullfile(pathname, [num2str(win_type), num2str(win_len),'_window.png'])); + +%% Load signals - get mixtures - their spectrograms + +ind_engine = 3; +ind_bird = 5; +deb = 0; + +[x_engine, x_bird] = load_pairs(ind_engine, ind_bird, resampling_fs, signal_params.sig_len, deb); + +signals = generate_mix_signal(x_engine, x_bird); + + + +% compute dgt + +tf_mat_engine = compute_dgt(signals.target, dgt ); +tf_mat_bird = compute_dgt(signals.noise, dgt ); +tf_mat_mix = compute_dgt(signals.mix, dgt ); + + +% mix -sdr + +sdr_mix = sdr(signals.target, signals.mix); +fprintf('The SDR of the mixture is : %e\n', sdr_mix) + +%% Generate mask + +% mask +alpha= mask_params{k}(1) ; +seuil = mask_params{k}(2); +radius = mask_params{k}(3); +mask = generate_mask(tf_mat_engine, tf_mat_bird, alpha, seuil, radius); +[mask_area, mask_area_ratio] = get_mask_area(mask); + +%% Baselines reconstruction + +%zero value method +x_zero = solver_tfgm_zero(tf_mat_mix, mask, idgt); +fprintf('Zeros filling SDR is : %e\n', sdr(signals.target, x_zero)); + +%interpolation + random phases method + +x_interp= solver_tfgm_interp(tf_mat_mix, mask, idgt); +fprintf('interp + random phases filling SDR is : %e\n', sdr(signals.target, x_interp)); + + +%% generate Gabor mutliplier + +gab_mul = gen_gabmul_operator(dgt, idgt, mask); + +%% evd via halko + +% halko parameters + +tolerance_arrf = 1e-6; +proba_arrf = 0.9999; +r = compute_r(signal_params.sig_len, signal_params.sig_len, proba_arrf); + +% stage 1 Halko +tic; +q_mat = adaptative_randomized_range_finder(gab_mul, signal_params.sig_len, tolerance_arrf, r); +t_arrf = toc; + +fprintf('Q shape : %.f %.f\n', size(q_mat)); + +% stage 2 : Halko + +% Evd decomposition via Nystrom +tic; +evdn = EVD_nystrom(gab_mul, q_mat); +t_evdn = toc; + +%% tf filtering reconstruction + + +u_mat = evdn.U; +s_vec = diag(evdn.D); +ut_x = U_transpose_observation( signals.mix, u_mat); + +%% +e_target = e_target_list(k); +x_rec= solver_tfgm( signals.mix, u_mat,s_vec, ut_x); +obj_fun = @(lambda_coef) abs(e_target - norm(mask.*dgt(x_rec(lambda_coef)))); +sdr_engine =@(lambda_coef) sdr(signals.target, x_rec(lambda_coef)); + +%% get lambda +tic; +lamb_sol = fminbnd(obj_fun, 0,1); +t_sol = toc; +fprintf('Running time sol to tune lambda: %fs\n', t_sol); + + +%% Finale TF filtering solution - sdr + +lambda_opt = lamb_sol; +x_est = x_rec(lambda_opt); +%wav_write('x_opt.wav', x_est, signal_params.fs); + +sdr_opt = sdr(signals.target, x_est); +sdr_zero = sdr(signals.target, x_zero); +sdr_interp = sdr(signals.target, x_interp); +sdr_mix = sdr( signals.target, signals.mix); + +% +fprintf('Optimal lambda: %e\n', lambda_opt); +fprintf('Optimal SDR: :%e dB\n', sdr_opt); +fprintf('Zero filling SDR: %e dB\n',sdr_zero); +fprintf('Interp + random phases filling SDR: %e dB\n',sdr_interp); +fprintf('Mix SDR: %e dB\n',sdr_mix); + +%% plot EVD Results +%% Eigenvalue plot - suplots + +l1 = eigsvect{k}(1); +l2 = eigsvect{k}(2); +l3 = eigsvect{k}(3); +l4 = eigsvect{k}(4); + + +figure; +%set(gcf,'position',[1, 1 1100 400]); +%subplot(121); +plot_spectrogram(mask, dgt_params,signal_params, dgt); +set(gca, 'FontSize', 20, 'fontName','Times'); +axis square +saveas(gcf,fullfile(pathname, ['mask_cuicui_', num2str(win_type), '.png'])); +%subplot(122); +figure; +semilogy(diag(evdn.D), 'Linewidth',3); +hold on; +plot(l1,s_vec(l1),'k-*','Linewidth',3); +plot(l2,s_vec(l2),'m-*','Linewidth',3); +plot(l3,s_vec(l3),'g-*','Linewidth',3); +plot(l4,s_vec(l4),'c-*','Linewidth',3); +grid on; +xlabel('$k$','Interpreter','latex') +legend({'$\sigma_k$',['$\lambda$ =',num2str(l1)],['$\lambda$ =', num2str(l2)],...., + ['$\lambda$ =', num2str(l3)], ['$\lambda$ =', num2str(l4)]},..., + 'Interpreter','latex','Location','southwest') +axis square +set(gca, 'FontSize', 20, 'fontName','Times'); +saveas(gcf,fullfile(pathname, ['eigval_cuicui_', num2str(win_type), '.png'])); + + +%% +figure; +%set(gcf,'position',[1, 1 900 400]); +%subplot(221); + + +plot_spectrogram(evdn.U(:,l1), dgt_params,signal_params, dgt); +axis square +set(gca, 'FontSize', 20, 'fontName','Times'); +saveas(gcf,fullfile(pathname, ['eigvect_', num2str(l1), '.png'])); +%subplot(222); +figure; +plot_spectrogram(evdn.U(:,l2), dgt_params,signal_params, dgt); +axis square +set(gca, 'FontSize', 20, 'fontName','Times'); +saveas(gcf,fullfile(pathname, ['eigvect_', num2str(l2), '.png'])); +%subplot(223); +figure; +plot_spectrogram(evdn.U(:,l3), dgt_params,signal_params, dgt); +axis square +set(gca, 'FontSize', 20, 'fontName','Times'); +saveas(gcf,fullfile(pathname, ['eigvect_', num2str(l3), '.png'])); +%subplot(224); +figure; +plot_spectrogram(evdn.U(:,l4), dgt_params,signal_params, dgt); +axis square +set(gca, 'FontSize', 20, 'fontName','Times'); +saveas(gcf,fullfile(pathname, ['eigvect_', num2str(l4), '.png'])); +%% +%figure; +%set(gcf,'position',[1, 1 950 400]); +figure; +plot_spectrogram(signals.noise, dgt_params, signal_params, dgt) +title('perturbation: birdsong' ); +set(gca, 'FontSize', 20, 'fontName','Times'); +saveas(gcf,fullfile(pathname, ['birdsong_' , num2str(win_type),'_' , num2str(win_len),'.png'])); +figure; +plot_spectrogram(signals.mix, dgt_params, signal_params, dgt) +title(['car+birdsong : SDR= ',num2str(sdr_mix),'dB']); +set(gca, 'FontSize', 20, 'fontName','Times'); +saveas(gcf,fullfile(pathname, ['mix_birdsong_' , num2str(win_type),'_' , num2str(win_len),'.png'])); +figure; +plot_spectrogram(signals.target, dgt_params, signal_params,dgt) +title('true source: car') +set(gca, 'FontSize', 20, 'fontName','Times'); +saveas(gcf,fullfile(pathname, ['car_' , num2str(win_type),'_' , num2str(win_len),'.png'])); +figure; +plot_spectrogram(mask, dgt_params,signal_params, dgt); +title(['mask car +birdsong : area = ',num2str(mask_area)]); +set(gca, 'FontSize', 20, 'fontName','Times'); +saveas(gcf,fullfile(pathname, ['mask_' , num2str(win_type),'_' , num2str(win_len),'.png'])); +figure; +plot_spectrogram(x_zero, dgt_params, signal_params,dgt) +title(['Zero fill SDR= ', num2str(sdr_zero),'dB']) +set(gca, 'FontSize', 20, 'fontName','Times'); +saveas(gcf,fullfile(pathname, ['x_zero_' , num2str(win_type),'_' , num2str(win_len),'.png'])); +figure; +plot_spectrogram(x_interp, dgt_params, signal_params,dgt) +title(['interp SDR= ', num2str(sdr_interp),'dB']) +set(gca, 'FontSize', 20, 'fontName','Times'); +saveas(gcf,fullfile(pathname, ['interp_' , num2str(win_type),'_' , num2str(win_len),'.png'])); +figure; +plot_spectrogram(x_est, dgt_params, signal_params,dgt) +title(['\lambda\_op = ' ,num2str(lambda_opt,2), ' - SDR=' , num2str(sdr_opt), 'dB']) +set(gca, 'FontSize', 20, 'fontName','Times'); +saveas(gcf,fullfile(pathname, ['x_est_' , num2str(win_type),'_' , num2str(win_len),'.png'])); + +%% +file_name = ['exp_engine_cuicui_1area_', num2str(win_type),'.mat']; +save(file_name,'signal_params','dgt_params', 'signals','mask','mask_area',...., + 'gab_mul', 'q_mat', 'evdn','sdr_mix', 'sdr_opt','sdr_zero','sdr_interp','x_zero','x_interp','x_est','lambda_opt','e_target') + +end diff --git a/matlab/tfgm/exp_tf_filtering/exp_filtering_out_car_cuicui_Pareas.m b/matlab/tfgm/exp_tf_filtering/exp_filtering_out_car_cuicui_Pareas.m new file mode 100644 index 0000000000000000000000000000000000000000..c4075d182701861593f065d36f085e0f770fcc61 --- /dev/null +++ b/matlab/tfgm/exp_tf_filtering/exp_filtering_out_car_cuicui_Pareas.m @@ -0,0 +1,278 @@ +clc; clear; close all; +% +%% +pwd; +pathname ='figures_JSTSP'; +if ~exist('figures_JSTSP','dir') + mkdir('figures_JSTSP'); +end +addpath('figures_JSTSP') +%% + +ind_loc = 5; +ind_wd = 3; +deb_ind_loc = 0; +deb_ind_wd=0; +resampling_fs = 8000; +sig_len = 16384; + +%% DGT params - signals - mask +clc; +param_gauss = get_win_gauss_param(); + +win_len = param_gauss.win_len; +win_type = param_gauss.win_type; +alpha = param_gauss.alpha; +seuil = param_gauss.seuil; +radius = param_gauss.radius; + +approx_win_len = 128; +hop =32; +nbins=512; + +[signals, dgt_params, signal_params, mask, dgt,idgt] = get_mix(ind_loc, ..., + ind_wd, deb_ind_loc, deb_ind_wd, resampling_fs, sig_len,..., + approx_win_len,hop, nbins, win_type, alpha, seuil, radius); + + +[mask_area, mask_area_ratio] = get_mask_area(mask); + +fprintf("We work with %s window of length %.f\n", win_type, win_len); + +fprintf("Gabor transform parameters are: \n") +fprintf('hop :%2.f\n', dgt_params.hop); +fprintf('n_bins: %2.f\n', dgt_params.nbins); + + + +fprintf("The parameters for smoothing the mask are: \n") +fprintf("alpha = %f\n", alpha); +fprintf("seuil = %f\n", seuil); +fprintf("radius = %f\n", radius); + + +% plot associated window +figure; +plot_win(dgt_params.win, signal_params.fs, signal_params.sig_len, win_type) +title([num2str(win_type), ' - window']); +set(gca, 'FontSize', 20, 'fontName','Times'); +%saveas(gcf,fullfile(pathname, [num2str(win_type),'_window.png'])); + + +%% Spectrogrammes - Mask + +tf_mat_engine = compute_dgt(signals.target, dgt); +tf_mat_bird = compute_dgt(signals.noise, dgt); +tf_mat_mix = compute_dgt(signals.mix, dgt); + +%plot_spectrogram(x, dgt_params, signal_params, dgt, dynrange, clim) +dynrange=90; +figure('name','engine'); plot_spectrogram(tf_mat_engine, dgt_params, signal_params, dgt); +title('Source') +set(gca, 'FontSize', 20, 'fontName','Times'); +figure('name','bird'); plot_spectrogram(tf_mat_bird, dgt_params, signal_params, dgt); +title('perturbation') +set(gca, 'FontSize', 20, 'fontName','Times'); +figure('name','mix'); +plot_spectrogram(tf_mat_mix, dgt_params,signal_params, dgt); +set(gca, 'FontSize', 20, 'fontName','Times'); +%title('mix') +%saveas(gcf,fullfile(pathname, 'engine_bird_mixture.png')); + + + +%plot mask +figure('name','mask'); plot_spectrogram(mask, dgt_params,signal_params, dgt ); +%title(['mask : mask-area = ',num2str(mask_area)]); +set(gca, 'FontSize', 20, 'fontName','Times'); +%saveas(gcf,fullfile(pathname, 'mask_cuicui_gauss.png')); + +% figure; +% plot_spectrogram((1-mask).*tf_mat_bird, dgt_params,signal_params, dgt); + +fprintf("mask area is: %f\n",mask_area); + +%% Mix - SDR + +sdr_mix = sdr(signals.target, signals.mix); +fprintf('The SDR of the mixture is : %e\n', sdr_mix) + +%% + +%[mask_limast,mask_labeled, mask_area_list] = make_subregions(mask, dgt_params, signal_params); + +%pq_norms_val = pq_norms(sig_len,dgt,idgt,mask_list); +%pq_norms_val1 = get_pq_norms(sig_len, dgt, idgt, mask_labeled); +%pq_norms = get_pq_norms(sig_len, dgt, idgt, mask_list); +%% +tol=10^(-3); +[pq_norms_val, mask_labeled] = create_subregions(mask, dgt, idgt, ..., + dgt_params, signal_params, tol); +%% +final_mask_labeled = mask_labeled; +[gabmul_list, mask_list] = get_P_gabmul(final_mask_labeled, dgt, idgt); + +%% +x_mix = signals.mix; +tolerance_arrf = 10^(-3); +proba_arrf = 0.999; + [t_arrf,t_evdn, t_ut_x, rank_q, s_vec_list, u_mat_list,..., + ut_x_list,r] = compute_decomposition(x_mix, mask_list, gabmul_list,..., + tolerance_arrf, proba_arrf); + + +%% +lambda_coef=0.01; + x=compute_estimate(lambda_coef, x_mix, s_vec_list, u_mat_list, ut_x_list); + + + %% + + + [lambda_est, t_est] = compute_lambda(x_mix, mask, dgt_params,..., + signal_params, dgt, s_vec_list, u_mat_list, ut_x_list,..., + gabmul_list); + +%% figure + +figure; +imagesc(real(log10(pq_norms_val))) +ylabel('$p$','Interpreter','latex') +xlabel('$q$', 'Interpreter', 'latex') +colorbar() +set(gca, 'FontSize', 20, 'fontName','Times'); +%title('Final norms of Gabor multiplier composition') +%saveas(gcf,fullfile(pathname, 'norm_mulpq.png')); + + +%% fixed +gabmul_list = get_P_gabmul(mask_labels, dgt, idgt); + +%% + +rank = 10; +x_mix = signals.mix; + [t_rrf,t_evdn, t_ut_x, s_vec_list, u_mat_list,..., + ut_x_list]=compute_decomposition_fixed_rank(x_mix, mask_labels, gabmul_list, rank); + + +%% +tolerance_arrf = 0.1; +proba_arrf = 0.9; + +[mask_labels, mask_area_list,n_labels] = make_subregions(mask, dgt_params, signal_params); + +[t_arrf,t_evdn, t_ut_x, rank_q, s_vec_list, u_mat_list,..., + ut_x_list,r] = compute_decomposition(x_mix, mask_labels, gabmul_list,..., + tolerance_arrf, proba_arrf); + + +%% + + +n_areas = length(mask_area); +lambda_coef = ones(n_areas,1); +x=compute_estimate(lambda_coef, x_mix, n_areas,s_vec_list, u_mat_list, ut_x_list); +%% +x_target = signals.target; +[lambda_oracle, t_oracle] = compute_lambda_oracle_sdr(x_target, x_mix,..., + n_areas,s_vec_list, u_mat_list, ut_x_list); + + %% + [lambda_est, t_est] = compute_lambda(x_mix, mask, dgt_params,..., +signal_params, dgt, mask_labels, s_vec_list, u_mat_list, ut_x_list,..., +gabmul_list); + +%% parametres de la EVD halko +tolerance_arrf = 1e-6; +proba_arrf = 1 - 1e-4; +x_mix = signals.mix; + +compute_decomposition(x_mix,mask_labels, gabmul_list,tolerance_arrf, proba_arrf); +%% create subregions + +[mask_labels, mask_area_list,n_labels] = make_subregions(mask, dgt_params, signal_params); + + +%% +e_target = zeros(n_labels, 1); +for k=1:n_labels + + e_target_k = norm(mask_labels{k}.*tf_mat_engine) ; + e_target(k) = e_target_k; + +end +%% +x_mix = signals.mix; +x_target = signals.target; +[x_rec, t_arrf, t_evdn, t_ut_x, rank_q, s_vec_list, u_mat_list,..., + ut_x_list, lambda_vec_opt] = filtering_out_Pareas(x_mix, mask_labels, dgt, idgt, x_target, tolerance_arrf, proba_arrf); + +%% +i_p=1; +pq_norms_val = update_pq_norms(mask_labels, pq_norms, i_p, signal_params, dgt, idgt); +%% +i_p = 2; +i_q=1; +[ mask, pq_norms_val] = merge_subregions(mask, pq_norms_val, i_p, i_q); +%% +figure; +plot_spectrogram(x_rec, dgt_params, signal_params,dgt); +%% + +%% +% %% Generate list of Gabor multipliers +% +% gab_mul_list = get_P_gabmul(mask_labels, dgt, idgt); +% +% %% EVD decomposition +% +% [t_arrf, t_evdn, t_uh_x, s_vec_list, u_mat_list, t_uh_x_list, ..., +% rank_q] = compute_decomposition(mask_labels, gab_mul_list, dgt_params, signal_params, signals.mix, tolerance_arrf,r); +% +% %% Tuning Lambda +% n_areas = n_labels; +% uh_x_list = t_uh_x_list; +% +% +%% + +%% +% %% +% %obj_fun = @(lambda_vec) norm(signals.target - compute_estimate(lambda_vec, s_vec_list, u_mat_list, uh_x_list,n_areas, signals.mix)); +% obj_fun = @(lambda_vec) abs(e_target -norm( mask.*dgt(compute_estimate(lambda_vec, s_vec_list, u_mat_list, uh_x_list,n_areas, signals.mix)))); +% +% %% Generate and save msk for each regions +% x0= ones(n_labels,1); +% tic; +% sol = fmincon(obj_fun,x0); +% t1 =toc; +% +% %% +% lambda_opt = obj_fun(x0); +% x_est = compute_estimate(lambda_opt, s_vec_list, u_mat_list, uh_x_list, n_areas,signals.mix); +% +% figure; +% plot_spectrogram(x_est, dgt_params, signal_params,dgt); +% %% +% % +% % all_mask = zeros(size(mask,1)*size(mask,2),n_labels); +% % +% % +% % for k =1:n_labels +% % [mask_label,~] = bwlabel(mask); +% % +% % % on construit chaque mask +% % mask_label(mask_label~=k)=0; +% % mask_ =mask_label; +% % all_mask(:,k) = mask_(:); +% % figure(k); plotdgtreal(mask_, dgt_params.hop, dgt_params.nbins, signal_params.fs); +% % title(['k=', num2str(k)]) +% % +% % [mask_area_, mask_area_ratio_] = get_mask_area(mask_); +% % mask_area_list(k) = mask_area_; +% % fprintf('mask area = %.f\n',mask_area_); +% % +% % end +% +% diff --git a/matlab/tfgm/experiments/compute_error_operator_norm.m b/matlab/tfgm/experiments/compute_error_operator_norm.m new file mode 100644 index 0000000000000000000000000000000000000000..38fa51266f2102b46a0cc0295d5efd2e829591f9 --- /dev/null +++ b/matlab/tfgm/experiments/compute_error_operator_norm.m @@ -0,0 +1,25 @@ +function [eigs_norm, arrfevdn_norm, rrfevdn_norm]= compute_error_operator_norm(file_name, n_exp) + +eigs_norm = zeros(length(file_name), n_exp); +arrfevdn_norm = zeros(length(file_name), n_exp); +rrfevdn_norm = zeros(length(file_name), n_exp); + +for k=1:n_exp + + rep_dir = ['exp',num2str(k)]; + + for l =1: 3%length(file_name) + data_folder = dir(fullfile(rep_dir,'*.mat')); + file = [data_folder(l).folder,filesep, file_name{l}]; + + upload_file = load(file); + eigs_norm(l,k) = error_operator_norm(upload_file.mul, upload_file.svd_result_eigs); + arrfevdn_norm(l,k) = error_operator_norm(upload_file.mul, upload_file.svd_result_nystrom_Qadaptative); + rrfevdn_norm(l,k) = error_operator_norm(upload_file.mul, upload_file.svd_result_nystrom); + + end +end + + + +end \ No newline at end of file diff --git a/matlab/tfgm/experiments/estimated_rank.m b/matlab/tfgm/experiments/estimated_rank.m new file mode 100644 index 0000000000000000000000000000000000000000..c383ae00b2321ff06089ab402ed8e24734f56258 --- /dev/null +++ b/matlab/tfgm/experiments/estimated_rank.m @@ -0,0 +1,20 @@ +function q_with = estimated_rank(file_name, n_exp) + + +q_with = zeros(length(file_name), n_exp); + + +for k=1:n_exp + rep_dir = ['exp',num2str(k)]; + + for l =1:length(file_name) + data_folder = dir(fullfile(rep_dir,'*.mat')); + file = [data_folder(l).folder,filesep, file_name{l}]; + upload_file = load(file); + q_with(l,k) = size(upload_file.svd_result_eigs.D,1); + + + end +end + +end \ No newline at end of file diff --git a/matlab/tfgm/experiments/exp_gabmul_eig_running_times.m b/matlab/tfgm/experiments/exp_gabmul_eig_running_times.m new file mode 100644 index 0000000000000000000000000000000000000000..2d6ae083f7b82380e7ce69390b2304077ab23d9d --- /dev/null +++ b/matlab/tfgm/experiments/exp_gabmul_eig_running_times.m @@ -0,0 +1,72 @@ +clc; clear; close all; + + +%% +setting='full'; +exp = get_experiment(setting); + +%% +param = exp.data_params; +t_lim = [exp.problem_params.t_val{1}, exp.problem_params.t_val{2}]; +f_lim = [exp.problem_params.f_val{1}, exp.problem_params.f_val{2}]; +win_type = exp.problem_params.win_type; + +t_arrf = zeros(length(param) ,1); +t_rrf = zeros(length(param) ,1); +t_arrfevdn = zeros(length(param) ,1); +t_rrfevdn = zeros(length(param) ,1); +t_eigs = zeros(length(param) ,1); +%% + +n_runs = 1;%0; + +fprintf('je ferai au total %.1f runs\n\n',n_runs); +%% +for l=1:n_runs + +fprintf("C'est partie pour le %.1f run\n\n",l); + +%% +tic; +for k = 1:1%length(param) + k=5; + + fprintf('je suis a la %.1f ieme iteration patiente\n',k); + param_pow = param{k}; + problem_data = get_problem_data(param_pow,t_lim, f_lim, win_type); + + + +tolerance = exp.solver_params.tolerance; +r = exp.solver_params.r; +mask = problem_data.mask; +dgt_params = problem_data.dgt_params; +signal_params = problem_data.signal_params; + +[gab_mul, direct_stft, adjoint_stft, q_mat_arrf, arrf_time,...., + q_mat_rrf, rrf_time, svd_res_arrf,arrfevdn_time, svd_res_rrf,...., + rrfevdn_time, svd_res_eigs, eigs_time, eigs_norm, arrfevdn_norm, ..., + rrfevdn_norm,q_with] =solver(tolerance, r, mask, dgt_params, signal_params); + + +t_arrf(k) = arrf_time; +t_rrf(k) = rrf_time; +t_arrfevdn(k) = arrfevdn_time; +t_rrfevdn(k) = rrfevdn_time; +t_eigs(k) = eigs_time; + +filename = ['gabmul_eig_dgtvar_', num2str(signal_params.sig_len),'.mat']; + +mkdir(['exp_gabmul_eig_running_times_',num2str(l)]); +warning('off', 'MATLAB:MKDIR:DirectoryExists'); +path_name = ['exp_gabmul_eig_running_times_',num2str(l)]; + +save(fullfile(path_name,filename),'setting','exp','problem_data', 'q_mat_arrf',...., + 'arrf_time', 'q_mat_rrf', 'rrf_time', 'svd_res_arrf','arrfevdn_time',..., + 'svd_res_rrf', 'rrfevdn_time', 'svd_res_eigs', 'eigs_time',..., + 'eigs_norm','arrfevdn_norm','rrfevdn_norm','q_with','t_arrf','t_rrf','t_arrfevdn',..., + 't_rrfevdn','t_eigs'); +end +toc; +end +%% \ No newline at end of file diff --git a/matlab/tfgm/experiments/get_experiment.m b/matlab/tfgm/experiments/get_experiment.m new file mode 100644 index 0000000000000000000000000000000000000000..dbee5307abd08de5d962be005efd7860697b9b13 --- /dev/null +++ b/matlab/tfgm/experiments/get_experiment.m @@ -0,0 +1,42 @@ +function exp = get_experiment(setting) +%create experiment parameter + + +switch setting + case 'full' + + param_pow = {0, 1, 2, 3, 4}; + data_params = param_pow; + + case 'light' + + param_pow = {0,1,2}; + data_params = param_pow; + otherwise + + error('Unknown setting: ') + +end + +t_min = 0.3; t_max = 0.5; f_min = 0.1; f_max =0.2; +t_val = {t_min, t_max}; +f_val={f_min, f_max}; + +problem_params.win_type = 'hann'; + +problem_params.t_val = t_val; +problem_params.f_val = f_val; + +tolerance = 1e-6; +r = 15; + +solver_params.tolerance = tolerance; +solver_params.r = r; + + +exp.data_params=data_params; +exp.problem_params=problem_params; +exp.solver_params=solver_params; +end + + diff --git a/matlab/tfgm/experiments/get_mask_area.m b/matlab/tfgm/experiments/get_mask_area.m new file mode 100644 index 0000000000000000000000000000000000000000..f3701b9c08aafee0eb2eb566a6a43c144cd97d7e --- /dev/null +++ b/matlab/tfgm/experiments/get_mask_area.m @@ -0,0 +1,10 @@ +function [mask_area, varargout] = get_mask_area(mask) +%compute mask area + +mask_area = sum(mask(:)); +mask_area_ratio = mask_area/ (size(mask,1)*size(mask,2)); + varargout{1} = mask_area_ratio; + +end + + diff --git a/matlab/tfgm/experiments/get_problem_data.m b/matlab/tfgm/experiments/get_problem_data.m new file mode 100644 index 0000000000000000000000000000000000000000..a3619c341f8c7b38f889a6c2b51e48e79fd8917d --- /dev/null +++ b/matlab/tfgm/experiments/get_problem_data.m @@ -0,0 +1,23 @@ +function problem_data = get_problem_data(param_pow,t_lim, f_lim, win_type) + +% generate problem data for tf filtering + + +sig_len = 256*4^param_pow; +win_len = 8*2^param_pow; +hop = 2*2^param_pow; +nbins = 32*2^param_pow; +fs=1; + +approx_win_len = win_len; + +dgt_params = generate_dgt_parameters(win_type, approx_win_len, hop, nbins, sig_len); +signal_params = generate_signal_parameters(fs, sig_len); +mask = generate_rectangular_mask(nbins, hop, sig_len, t_lim, f_lim); + +problem_data.dgt_params= dgt_params; +problem_data.signal_params = signal_params; +problem_data.hop = hop; +problem_data.mask = mask; + +end \ No newline at end of file diff --git a/matlab/tfgm/experiments/get_ratio_of_eigs_running_times.m b/matlab/tfgm/experiments/get_ratio_of_eigs_running_times.m new file mode 100644 index 0000000000000000000000000000000000000000..083dd632565c4cb4caec91dc88b0fc5eccc51c34 --- /dev/null +++ b/matlab/tfgm/experiments/get_ratio_of_eigs_running_times.m @@ -0,0 +1,16 @@ +function [ratio_arrf_time_over_eigs,ratio_rrf_time_over_eigs,..., + ratio_evdnarrf_over_eigs,ratio_evdnrrf_over_eigs]= get_ratio_of_eigs_running_times(arrf_time, rrf_time, evdnarrf_time, evdnrrf_time,eigs_time) + + + + + +ratio_arrf_time_over_eigs = arrf_time./eigs_time; +ratio_rrf_time_over_eigs = rrf_time./eigs_time; +ratio_evdnarrf_over_eigs = evdnarrf_time./eigs_time; +ratio_evdnrrf_over_eigs = evdnrrf_time./eigs_time ; + + + + +end \ No newline at end of file diff --git a/matlab/tfgm/experiments/perf_measures.m b/matlab/tfgm/experiments/perf_measures.m new file mode 100644 index 0000000000000000000000000000000000000000..eddb65ba7f3a70fec4beb1d4780542a517a69020 --- /dev/null +++ b/matlab/tfgm/experiments/perf_measures.m @@ -0,0 +1,65 @@ +function [arrf_time, rrf_time, eigs_time, evdnrrf_time, evdnarrf_time,..., + arrf_time_mean, rrf_time_mean, evdnrrf_time_mean, evdnarrf_time_mean,..., + evdarrrf_mean, evdrrf_mean,eigs_mean, arrf_time_std, rrf_time_std,..., + evdnrrf_time_std, evdnarrf_time_std, evdarrrf_std, ...., + evdrrf_std, eigs_std] = perf_measures(file_name, n_exp) + + + +arrf_time=[]; +rrf_time = []; +eigs_time = []; +evdnrrf_time = []; +evdnarrf_time = []; + + +for k=1:n_exp + +upload_file = load(fullfile((['exp',num2str(k)]),file_name{5})); + +arrf_time = [arrf_time, upload_file.time_adaptative_Q]; +arrf_time = squeeze(arrf_time); + + +rrf_time = [rrf_time, upload_file.time_randomized_Q]; +rrf_time = squeeze(rrf_time); + +eigs_time = [eigs_time, upload_file.time_EVD_eigs]; +eigs_time = squeeze(eigs_time); + +evdnrrf_time = [evdnrrf_time, upload_file.time_EVD_nystrom]; +evdnrrf_time = squeeze(evdnrrf_time); + +evdnarrf_time = [evdnarrf_time, upload_file.time_EVD_nystrom_Qadapt]; +evdnarrf_time = squeeze(evdnarrf_time); + + +end + +% mean + +arrf_time_mean = mean(arrf_time,2); % temps moyen adaptative randomized range finder +rrf_time_mean = mean(rrf_time,2); % temps moyen randomized range finder +evdnrrf_time_mean = mean(evdnrrf_time,2); +evdnarrf_time_mean = mean(evdnarrf_time,2); + +evdarrrf_mean = mean(arrf_time+ evdnarrf_time,2); % arrf + evd/nystrom +evdrrf_mean = mean(rrf_time+ evdnrrf_time,2); % rrf +evd/nystom +eigs_mean = mean(eigs_time,2); % temps moyen eigs + +%std + + +arrf_time_std = std(arrf_time, 0,2); % temps moyen adaptative randomized range finder +rrf_time_std = std(rrf_time, 0, 2); % temps moyen randomized range finder +evdnrrf_time_std = std(evdnrrf_time,0, 2); +evdnarrf_time_std = std(evdnarrf_time, 0, 2); + +evdarrrf_std = std(arrf_time+ evdnarrf_time, 0,2); % arrf + evd/nystrom +evdrrf_std = std(rrf_time+ evdnrrf_time, 0, 2); % rrf +evd/nystom +eigs_std = std(eigs_time,0, 2); % temps moyen eigs + + + + +end \ No newline at end of file diff --git a/matlab/tfgm/experiments/plot_results.m b/matlab/tfgm/experiments/plot_results.m new file mode 100644 index 0000000000000000000000000000000000000000..d07c70299ae499fed939fc118fe2d8d21ee140e7 --- /dev/null +++ b/matlab/tfgm/experiments/plot_results.m @@ -0,0 +1,230 @@ +function plot_results() + +%% + +pwd; +pathname ='GabMulEigRunTimeExperiment'; +if ~exist('GabMulEigRunTimeExperiment','dir') + mkdir('GabMulEigRunTimeExperiment'); +end +addpath('GabMulEigRunTimeExperiment') + +%% +% fichier .mat +file_name = {'time_halko_vs_eigs256.mat', 'time_halko_vs_eigs1024.mat',..., + 'time_halko_vs_eigs4096.mat', 'time_halko_vs_eigs16384.mat',...., + 'time_halko_vs_eigs65536.mat'}; +%% +mask_area_list = zeros(length(file_name),1); +mask_area_ratio_list = zeros(length(file_name),1); +sig_len_list = zeros(length(file_name),1); + +for k =1:1 + rep_dir = ['exp',num2str(k)]; + + for l=1:length(file_name) + + figure(l) + data_folder = dir(fullfile(rep_dir,'*.mat')); + file = [data_folder(l).folder,filesep, file_name{l}]; + + upload_file = load(file); + + sig_len_list(l) = upload_file.signal_params.sig_len; + + % figure mask + plot_mask(upload_file.mask, upload_file.dgt_params.hop, upload_file.dgt_params.nbins, upload_file.fs); + axis tight; + saveas(gcf,fullfile(pathname,['mask_',num2str(upload_file.signal_params.sig_len),'.png'])); + + + % figure window + + plot_win(upload_file.dgt_params.win, upload_file.fs, upload_file.signal_params.sig_len, upload_file.dgt_params.win_type); + axis tight; + saveas(gcf,fullfile(pathname,['win_',num2str(upload_file.signal_params.sig_len),'.png'])); + + + % mask area + mask = 1- upload_file.mask; + + [mask_area, mask_area_ratio] = get_mask_area(mask); + mask_area_list(l) = mask_area; + mask_area_ratio_list(l) = mask_area_ratio; + end + +end +%% +% mask area +figure; +plot(sig_len_list, mask_area_list,'LineWidth',2.5); +grid() +set(gca,'YScale','log','XScale','log'); +xlabel('Signal length') +ylabel('# time-frequency coefficients') +title('Mask area') +set(gca, 'FontSize', 15, 'fontName','Times'); +saveas(gcf,fullfile(pathname, 'mask_area.pdf')); + +% mask area ratio + +figure; +plot(sig_len_list, mask_area_ratio_list,'LineWidth',2.5) +grid() +set(gca,'XScale','log'); + +xlabel('Signal length') +ylabel('%') +title('Mask area ratio') +set(gca, 'FontSize', 15, 'fontName','Times'); +saveas(gcf,fullfile(pathname, 'mask_area_ratio.pdf')); + + + + +%% Computation time, mean and std +n_exp = 10; +[arrf_time, rrf_time, eigs_time, evdnrrf_time, evdnarrf_time,..., + arrf_time_mean, rrf_time_mean, evdnrrf_time_mean, evdnarrf_time_mean,..., + evdarrrf_mean, evdrrf_mean,eigs_mean, arrf_time_std, rrf_time_std,..., + evdnrrf_time_std, evdnarrf_time_std, evdarrrf_std, ...., + evdrrf_std, eigs_std] = perf_measures(file_name,n_exp); + + +%% figure; +% comparaisons temps de calcul des 3 algos + +figure; +errorbar(sig_len_list, evdarrrf_mean, evdarrrf_std,'b-*','LineWidth',2.5); hold on; +errorbar(sig_len_list, eigs_mean, eigs_std, 'r-*','LineWidth',2.5); +errorbar(sig_len_list, evdrrf_mean, evdrrf_std,'m-*','LineWidth',2.5 ); +xlabel('signal length'); +ylabel('Computation time (s)') +legend('Adaptative Range Finder + EVD/Nystr�m', 'eigs','Fixed Range Finder + EVD/Nystr�m',..., + 'Location','northwest') +set(gca, 'FontSize', 15, 'fontName','Times'); +set(gca,'YScale','log','XScale','log'); +grid('on'); +axis tight; +saveas(gcf,fullfile(pathname,['running_times','.png'])); +%% +% comparaisons temps de calcul de tous les algos +figure; + +errorbar(sig_len_list, arrf_time_mean, arrf_time_std,'LineWidth',2.5); hold on; +errorbar(sig_len_list, rrf_time_mean, rrf_time_std,'LineWidth',2.5); +errorbar(sig_len_list, eigs_mean, eigs_std, 'LineWidth',2.5); +errorbar(sig_len_list, evdnarrf_time_mean, evdnarrf_time_std, 'LineWidth',2.5); +errorbar(sig_len_list, evdnrrf_time_mean, evdnrrf_time_std, 'LineWidth',2.5); + +legend('Adaptative Range Finder','Fixed Range Finder','eigs',..., + 'EVD/Nystr�m(ARRF)','EVD/Nystr�m(RRF)','Location','northwest') +set(gca, 'FontSize', 15, 'fontName','Times'); +set(gca,'YScale','log','XScale','log'); +grid('on'); +axis tight; +xlabel('Signal length') +ylabel('Running time (s)') +saveas(gcf,fullfile(pathname,['running_times_by_step','.png'])); + +%% Step by step: ratio of eigs running times (pas juste a revoir) +% ratio + + +[ratio_arrf_time_over_eigs,ratio_rrf_time_over_eigs,..., + ratio_evdnarrf_over_eigs,ratio_evdnrrf_over_eigs]= get_ratio_of_eigs_running_times(arrf_time, rrf_time, evdnarrf_time, evdnrrf_time,eigs_time); + + + +%mean ratio +ratio_arrf_time_over_eigs_mean = mean(ratio_arrf_time_over_eigs,2)*100; +ratio_rrf_time_over_eigs_mean = mean(ratio_rrf_time_over_eigs,2)*100; +ratio_evdnarrf_over_eigs_mean = mean(ratio_evdnarrf_over_eigs, 2)*100; +ratio_evdnrrf_over_eigs_mean = mean(ratio_evdnrrf_over_eigs, 2)*100; + + +% std + +ratio_arrf_time_over_eigs_std = std(ratio_arrf_time_over_eigs,0,2)*100; +ratio_rrf_time_over_eigs_std = std(ratio_rrf_time_over_eigs,0,2)*100; +ratio_evdnarrf_over_eigs_std = std(ratio_evdnarrf_over_eigs, 0,2)*100; +ratio_evdnrrf_over_eigs_std = std(ratio_evdnrrf_over_eigs, 0,2)*100; + + +figure; +errorbar(sig_len_list, ratio_arrf_time_over_eigs_mean, ratio_arrf_time_over_eigs_std,'LineWidth',2.5); hold on; +errorbar(sig_len_list, ratio_rrf_time_over_eigs_mean, ratio_rrf_time_over_eigs_std,'LineWidth',2.5); +errorbar(sig_len_list, ratio_evdnarrf_over_eigs_mean, ratio_evdnarrf_over_eigs_std, 'LineWidth',2.5); +errorbar(sig_len_list, ratio_evdnrrf_over_eigs_mean, ratio_evdnrrf_over_eigs_std, 'LineWidth',2.5); + +legend('Adaptative Range Finder','Fixed Range Finder',..., + 'EVD/Nystr�m(ARRF)','EVD/Nystr�m(RRF)','Location','northwest') +set(gca, 'FontSize', 15, 'fontName','Times'); +set(gca,'XScale','log'); +grid('on'); +axis tight; +xlabel('Signal length') +ylabel('Ratio of eigs running time (%)') +saveas(gcf,fullfile(pathname,['running_times_ratio_by_step','.png'])); + +%% error operator norm (erreur a revoir) + +[eigs_norm, arrfevdn_norm, rrfevdn_norm]= compute_error_operator_norm(file_name, n_exp); +eigs_norm_mean = mean(eigs_norm,2); +arrfevdn_norm_mean = mean(arrfevdn_norm,2); +rrfevdn_norm_mean = mean(rrfevdn_norm, 2); + + +eigs_norm_std = std(eigs_norm,0,2); +arrfevdn_norm_std = std(arrfevdn_norm, 0, 2); +rrfevdn_norm_std = std(rrfevdn_norm, 0, 2); + +figure; +errorbar(sig_len_list, eigs_norm_mean , eigs_norm_std,'LineWidth',2.5); hold on; +errorbar(sig_len_list, arrfevdn_norm_mean, arrfevdn_norm_std,'LineWidth',2.5); +errorbar(sig_len_list, rrfevdn_norm_mean, rrfevdn_norm_std, 'LineWidth',2.5); + +legend('eigs','Adaptative Range Finder + EVD/Nystr�m(ARRF)',..., + 'Fixed Range Finder + EVD/Nystr�m(RRF)','Location','northwest') +set(gca, 'FontSize', 15, 'fontName','Times'); +set(gca,'YScale','log','XScale','log'); +grid('on'); +axis tight; +xlabel('Signal length') +ylabel('Operator estimation error') +saveas(gcf,fullfile(pathname, 'operator_error.pdf')); + +%% Estimated rank + +q_with = estimated_rank(file_name, n_exp); +q_with_mean = mean(q_with, 2); +q_with_std = std(q_with, 0, 2); + +figure; +errorbar(sig_len_list, q_with_mean, q_with_std,'LineWidth',2) +set(gca, 'FontSize', 15, 'fontName','Times'); +set(gca, 'YScale','log','XScale','log') +xlabel('Signal length') +ylabel('Estimated rank') +grid('on'); +legend('Estimated rank','Location','northwest'); +saveas(gcf,fullfile(pathname,'rank_estimation.pdf')); + + +%% Estimated rank / sig length +rank_ratio = q_with./sig_len_list; +rank_ratio_mean = mean(rank_ratio,2)*100; +rank_ratio_std = std(rank_ratio_mean,0,2)*100; + +figure; +errorbar(sig_len_list, rank_ratio_mean, rank_ratio_std,'LineWidth',2) +set(gca, 'FontSize', 15, 'fontName','Times'); +set(gca,'XScale','log') +xlabel('Signal length') +ylabel('Estimated rank / signal length') +grid('on'); +legend('Estimated rank'); +saveas(gcf,fullfile(pathname,'rank_estimation_over_siglen.pdf')); + + +end \ No newline at end of file diff --git a/matlab/tfgm/experiments/solver.m b/matlab/tfgm/experiments/solver.m new file mode 100644 index 0000000000000000000000000000000000000000..98e0894c91037af90ff06f1060408f43284232fd --- /dev/null +++ b/matlab/tfgm/experiments/solver.m @@ -0,0 +1,43 @@ +function [gab_mul, direct_stft, adjoint_stft, q_mat_arrf, arrf_time,...., + q_mat_rrf, rrf_time, svd_res_arrf,arrfevdn_time, svd_res_rrf,...., + rrfevdn_time, svd_res_eigs, eigs_time, eigs_norm, arrfevdn_norm, ..., + rrfevdn_norm,q_with] =solver(tolerance, r, mask, dgt_params, signal_params) + +[direct_stft, adjoint_stft] = get_stft_operators(dgt_params, signal_params); +gab_mul = gen_gabmul_operator(direct_stft, adjoint_stft, mask); + + +tic; +q_mat_arrf = adaptative_randomized_range_finder(gab_mul ,signal_params.sig_len, tolerance, r); +arrf_time = toc; + + +tic; +q_mat_rrf = randomized_range_finder(gab_mul, signal_params.sig_len, size(q_mat_arrf,2)); +rrf_time = toc; + + +tic; +svd_res_arrf = EVD_nystrom(gab_mul, q_mat_arrf); +arrfevdn_time= toc; + +tic; +svd_res_rrf = EVD_nystrom(gab_mul, q_mat_rrf); +rrfevdn_time= toc; + + +tic; +svd_res_eigs = EVD_eigs(gab_mul, signal_params.sig_len, size(q_mat_arrf,2) ); +eigs_time = toc; + + + +eigs_norm = error_operator_norm(gab_mul, svd_res_eigs); +arrfevdn_norm = error_operator_norm(gab_mul, svd_res_arrf); +rrfevdn_norm = error_operator_norm(gab_mul, svd_res_rrf); + + +q_with = size(q_mat_arrf,2); + + +end \ No newline at end of file diff --git a/matlab/tfgm/experiments/step_mask.m b/matlab/tfgm/experiments/step_mask.m new file mode 100644 index 0000000000000000000000000000000000000000..df1cd14b19370a935bc097e29c92d6a229a2ac7d --- /dev/null +++ b/matlab/tfgm/experiments/step_mask.m @@ -0,0 +1,84 @@ +clc ; clear; close all; +%% + +pwd; +pathname ='figures_JSTSP'; +if ~exist('figures_JSTSP','dir') + mkdir('figures_JSTSP'); +end +addpath('figures_JSTSP') + +%% +ind_loc = 5; +ind_wd = 3; +deb_ind_loc = 0; +deb_ind_wd=0; +resampling_fs = 8000; +sig_len = 16384; +%% + + +param_gauss = get_win_gauss_param(); + + +win_len = param_gauss.win_len; +win_type = param_gauss.win_type; +alpha = param_gauss.alpha; +seuil = param_gauss.seuil; +radius = param_gauss.radius; + +%% +sig_loc = load_localized_signal(ind_loc, resampling_fs, sig_len, deb_ind_loc); +sig_wd = load_wideband_signal(ind_wd, resampling_fs, sig_len, deb_ind_wd); + +signals = generate_mix_signal(sig_wd, sig_loc); + +fs = resampling_fs; +sig_len = length(sig_loc); +signal_params = generate_signal_parameters(fs, sig_len); + +%% dgt +dgt_params = generate_dgt_parameters(win_type, win_len); +dgt_params.hop = 32; % +dgt_params.nbins = 512;% +[dgt, idgt] = get_stft_operators(dgt_params, signal_params); + + + tf_mat_wb = compute_dgt(signals.target, dgt ); + tf_mat_loc = compute_dgt(signals.noise, dgt ); + + +%% Etape 1 +figure; +subplot(131) +set(gcf,'position',[1, 1, 1000 400]); +mask = and(abs(tf_mat_wb)<alpha*abs(tf_mat_loc), abs(tf_mat_loc)>seuil); +%figure('name','mask'); +plot_spectrogram(mask, dgt_params,signal_params, dgt ); +axis square; +set(gca, 'FontSize', 20, 'fontName','Times'); +%saveas(gcf,fullfile(pathname, 'mask_cuicui_gauss_1.png')); + + +%Etape 2 + +se = strel('disk',radius); + +mask = imclose(mask,se); +%figure('name','mask'); +subplot(132) +plot_spectrogram(mask, dgt_params,signal_params, dgt ); +set(gca, 'FontSize', 20, 'fontName','Times'); +axis square; +%saveas(gcf,fullfile(pathname, 'mask_cuicui_gauss_2.png')); + + +subplot(133) +mask = imopen(mask,se); +%figure('name','mask'); +plot_spectrogram(mask, dgt_params,signal_params, dgt ); +set(gca, 'FontSize', 20, 'fontName','Times'); +axis square; +%saveas(gcf,fullfile(pathname, 'mask_cuicui_gauss_3.png')); +saveas(gcf,fullfile(pathname, 'mask_step.png')); + diff --git a/matlab/tfgm/experiments/test_gen_gabmul_operator.m b/matlab/tfgm/experiments/test_gen_gabmul_operator.m new file mode 100644 index 0000000000000000000000000000000000000000..b3db5fa33e76f7d581ad5c34dd59b63d89ca954d --- /dev/null +++ b/matlab/tfgm/experiments/test_gen_gabmul_operator.m @@ -0,0 +1,27 @@ +clc; clear; close all; +%% +setting='full'; +exp = get_experiment(setting); +param = exp.data_params; +t_lim = [exp.problem_params.t_val{1}, exp.problem_params.t_val{2}]; +f_lim = [exp.problem_params.f_val{1}, exp.problem_params.f_val{2}]; +win_type = exp.problem_params.win_type; + +%% +param_pow = param{4}; + problem_data = get_problem_data(param_pow,t_lim, f_lim, win_type); + + %% + dgt_params = problem_data.dgt_params; +signal_params = problem_data.signal_params; +mask = problem_data.mask; +[direct_stft, adjoint_stft] = get_stft_operators(dgt_params, signal_params); +gab_mul = gen_gabmul_operator(direct_stft, adjoint_stft, mask); + +%% +figure; imagesc(mask) +x = randn(signal_params.sig_len,1); +A = gab_mul(x); +figure; plot(x); +figure; plot(A); +figure; sgram(A,'dynrange',90) diff --git a/matlab/tfgm/experiments/test_get_problem_data.m b/matlab/tfgm/experiments/test_get_problem_data.m new file mode 100644 index 0000000000000000000000000000000000000000..eb97a828cd04200b11ee15c0326f53cd37e0ca2a --- /dev/null +++ b/matlab/tfgm/experiments/test_get_problem_data.m @@ -0,0 +1,22 @@ +clc; close all; + +%% +setting='full'; +exp = get_experiment(setting); + +%% +param = exp.data_params; +t_lim = [exp.problem_params.t_val{1}, exp.problem_params.t_val{2}]; +f_lim = [exp.problem_params.f_val{1}, exp.problem_params.f_val{2}]; +win_type = exp.problem_params.win_type; + +%% +figure; +for k = 1:length(param) + param_pow = param{k}; + problem_data = get_problem_data(param_pow,t_lim, f_lim, win_type); + + figure(k); + plot_mask(problem_data.mask, problem_data.hop, problem_data.dgt_params.nbins, problem_data.signal_params.fs) + +end \ No newline at end of file diff --git a/matlab/tfgm/illustrations_gaborTools/compare_eigs_halko_gauss.m b/matlab/tfgm/illustrations_gaborTools/compare_eigs_halko_gauss.m new file mode 100644 index 0000000000000000000000000000000000000000..d2b05c820890e0b441b1e2b25973829677bd31c4 --- /dev/null +++ b/matlab/tfgm/illustrations_gaborTools/compare_eigs_halko_gauss.m @@ -0,0 +1,132 @@ +clc; clear; close all; + + +%% +pwd; +pathname ='figures_JSTSP'; +if ~exist('figures_JSTSP','dir') + mkdir('figures_JSTSP'); +end +addpath('figures_JSTSP') +%% + +ind_loc = 5; +ind_wd = 3; +deb_ind_loc = 0; +deb_ind_wd=0; +resampling_fs = 8000; +sig_len = 16384; + +%% DGT params - signals - mask + +param_gauss = get_win_gauss_param(); + + +win_len = param_gauss.win_len; +win_type = param_gauss.win_type; +alpha = param_gauss.alpha; +seuil = param_gauss.seuil; +radius = param_gauss.radius; + +[signals, dgt_params, signal_params, mask, dgt,idgt ] = get_mix(ind_loc, ..., + ind_wd, deb_ind_loc, deb_ind_wd, resampling_fs, sig_len,..., + win_len, win_type, alpha, seuil, radius); + + + +%% +% compute dgt + +tf_mat_engine = compute_dgt(signals.target, dgt ); +tf_mat_bird = compute_dgt(signals.noise, dgt ); +tf_mat_mix = compute_dgt(signals.mix, dgt ); + + +% mix -sdr + +sdr_mix = sdr(signals.target, signals.mix); +fprintf('The SDR of the mixture is : %e\n', sdr_mix) + + +%% + +figure('name','engine'); +plot_spectrogram(mask,dgt_params, signal_params, dgt); +title('Source') +set(gca, 'FontSize', 20, 'fontName','Times'); + + +%% + + +%% generate Gabor mutliplier + +gab_mul = gen_gabmul_operator(dgt, idgt, mask); + +%% evd via halko + +% halko parameters + +tolerance_arrf = 1e-3; +proba_arrf = 0.9999; +r = compute_r(signal_params.sig_len, signal_params.sig_len, proba_arrf); + +% stage 1 Halko +tic; +q_mat = adaptative_randomized_range_finder(gab_mul, signal_params.sig_len, tolerance_arrf, r); +t_arrf = toc; + +fprintf('Q shape : %.f %.f\n', size(q_mat)); + +% stage 2 : Halko + +% Evd decomposition via Nystrom +tic; +evdn = EVD_nystrom(gab_mul, q_mat); +t_evdn = toc; + + + +%% evd via eigs + + +[U, D] = eigs(gab_mul, signal_params.sig_len, size(q_mat,2)) ; + + + +%% +figure; semilogy(diag(D),'r-','LineWidth',2); hold on; +semilogy(diag(evdn.D),'b-o','LineWidth',2); + + +%% similarit� valeurs propres +abs_err = abs(diag(evdn.D)-diag(D))./abs(diag(D)); + +%% +figure; semilogy(abs_err,'LineWidth',2); +grid on; +set(gca, 'FontSize', 20, 'fontName','Times'); +axis square; +xlabel('$k$','Interpreter','latex'); +ylabel('Relative absolute error') +saveas(gcf,fullfile(pathname, 'relerror_eigs_sevd_gauss.png')); +saveas(gcf,fullfile(pathname, 'relerror_eigs_sevd_gauss.fig')); + + +%% Correlations + +Gram_mat =abs( evdn.U.*U); +figure; imagesc(Gram_mat) + +corr = max(Gram_mat, [], 2); +%% +figure; +semilogy(sort(corr,'descend'),'LineWidth',2); +% grid on; +% axis square; +% xlabel('$k$','Interpreter','latex'); +% ylabel('Correlation'); +% set(gca, 'FontSize', 20, 'fontName','Times'); +% saveas(gcf,fullfile(pathname, 'correlation_eigs_sevd_gauss.png')); + +%% diff --git a/matlab/tfgm/illustrations_gaborTools/exp_eigenval_win.m b/matlab/tfgm/illustrations_gaborTools/exp_eigenval_win.m new file mode 100644 index 0000000000000000000000000000000000000000..22ef5608fec0b0a1e8970cf627f367875bfd06bb --- /dev/null +++ b/matlab/tfgm/illustrations_gaborTools/exp_eigenval_win.m @@ -0,0 +1,349 @@ +clc; clear; close all + +%% +% experiments with +% - wideband sound: engine(Genesis) +% - localized sound: birdsong (Genesis) + +%% +make_wav_pairs() % make sure alls pairs are ok +%% Figures Directory + +pwd; +pathname ='figures_JSTSP'; +if ~exist('figures_JSTSP','dir') + mkdir('figures_JSTSP'); +end +addpath('figures_JSTSP') + + + +%% + +ind_loc = 5; +ind_wd = 3; +deb_ind_loc = 0; +deb_ind_wd=0; +resampling_fs = 8000; +sig_len = 16384; + + +%% +param_hann = get_win_hann_param(); +param_gauss = get_win_gauss_param(); +params = {param_hann, param_gauss}; + + +%% +tic; +masks = {}; + +for k = 1:length(params) + + %win_len = params{k}.win_len; + %win_type = params{k}.win_type; + + fprintf("We pick %s window of length %.f\n", params{k}.win_type, params{k}.win_len); + + %alpha = params{k}.alpha; + %seuil = params{k}.seuil; + %radius = params{k}.radius; + + fprintf("The parameters for smoothing the mask are: \n") + fprintf("alpha = %f\n", params{k}.alpha); + fprintf("seuil = %f\n", params{k}.seuil); + fprintf("radius = %f\n", params{k}.radius); + + [signals, dgt_params, signal_params, mask, dgt, idgt ] = get_mix(ind_loc, ..., + ind_wd, deb_ind_loc, deb_ind_wd, resampling_fs, sig_len,..., + params{k}.win_len, params{k}.win_type, params{k}.alpha, params{k}.seuil, params{k}.radius); + + params{k}.dgt_params = dgt_params; + params{k}.signal_params = signal_params; + params{k}.dgt = dgt; + params{k}.idgt = idgt; + masks{k} = mask; +end +toc; + +%% +masks{3}= and(masks{1},masks{2}); + +for k = 1:length(masks)-1 + + figure(k); + + %imagesc(masks{k}) + plot_spectrogram(masks{k}, params{k}.dgt_params, params{k}.signal_params, params{k}.dgt); + title(params{k}.win_type) + set(gca, 'FontSize', 20, 'fontName','Times'); + %saveas(gcf,fullfile(pathname, [params{k}.win_type,'.pdf'])); +end + +figure; +imagesc(masks{3}) +title('Intersection') +%saveas(gcf,fullfile(pathname, 'intersection.pdf')); + +%% +figure; + +imagesc(masks{1} - masks{2}) +colorbar() +title('Mask difference: gauss -hann'); +saveas(gcf,fullfile(pathname, 'mask_difference.pdf')); + + +%% parametres Halko + +r=2500; +%% EVD pour hann + +evdn_hann = cell(length(masks),1); +for k=1: length(masks) + + disp(k); + gab_mul = gen_gabmul_operator(params{1}.dgt, params{1}.idgt, masks{k}); + tic; + q_mat = randomized_range_finder(gab_mul, sig_len,r); + t1= toc; + fprintf(" runtimes for Q: %f\n", t1); + % + tic; + evdn = EVD_nystrom(gab_mul, q_mat); + t2 = toc; + evdn_hann{k} = evdn; + fprintf(" runtimes for nystrom: %f\n", t2); +end + + +%% EVD avec Gauss + +evdn_gauss = cell(length(masks),1); + +for k=1: length(masks) + disp(k) + gab_mul = gen_gabmul_operator(params{2}.dgt, params{2}.idgt, masks{k}); + tic; + q_mat = randomized_range_finder(gab_mul, sig_len, r); + t1= toc; + + fprintf(" runtimes for Q-gauss: %f\n", t1); + tic; + evdn = EVD_nystrom(gab_mul, q_mat); + t2 = toc; + + evdn_gauss{k} = evdn; + fprintf(" runtimes for nystrom -gauss: %f\n", t2); +end + +%% les valeurs propres +figure; + +D1 = diag(evdn_hann{1}.D); +D2 = diag(evdn_hann{2}.D); +D3 = diag(evdn_hann{3}.D); +D4= diag(evdn_gauss{1}.D); +D5 = diag(evdn_gauss{2}.D); +D6 = diag(evdn_gauss{3}.D); + +semilogy(D1, 'Linewidth',4); +hold on; +semilogy(D2, 'Linewidth',4); +semilogy(D3 , 'Linewidth',4); +semilogy(D4, 'Linewidth',4); +semilogy(D5, 'Linewidth',4); +semilogy(D6, 'Linewidth',4); +grid on; + + +xlabel({'index = $k$'},'Interpreter','latex'); +ylabel({' Eigenvalues $\sigma[k]$'},'Interpreter','latex'); +legend('Hann 256 - mask Hann 256', 'Hann 256 - mask Gauss 128' ,..., + 'Hann 256 - mask Intersection', 'Gauss 128 - mask Gauss 128', ..., + 'Gauss 128 - mask Hann 256' ,'Gauss 128 - mask Intersection',..., + 'Location','southwest'); +set(gca, 'FontSize', 20, 'fontName','Times'); +saveas(gcf,fullfile(pathname, 'eigval_cuicui_gauss_hann.png')); +saveas(gcf,fullfile(pathname, 'eigval_cuicui_gauss_hann.fig')); + + + +%% Les vecteurs propres gauss +U_g = evdn_gauss{2}.U; +dynrange=90; +for k =1:15 + figure(k) + plot_spectrogram(U_g(:,k), params{2}.dgt_params,params{2}.signal_params,..., + params{2}.dgt,dynrange); + set(gca, 'FontSize', 20, 'fontName','Times'); + axis square; + saveas(gcf,fullfile(pathname, ['eigval_cuicui_gauss_', num2str(k), '.png'])); +end + + +%% les vecteurs propres hann + +U_h = evdn_hann{1}.U; +for k=1:10 + figure(k) + + plot_spectrogram(U_h(:,k), params{1}.dgt_params,params{1}.signal_params,..., + params{1}.dgt); + set(gca, 'FontSize', 20, 'fontName','Times'); + axis square; + saveas(gcf,fullfile(pathname, ['eigval_cuicui_hann_', num2str(k), '.png'])); + +end + +%% Pour le papier : valeurs propres + + +i_g = 1540; +i_h = 1585; +figure; +set(gcf,'position',[1, 1 1100 400]); +subplot(121); +plot_spectrogram(masks{2}, params{2}.dgt_params, params{2}.signal_params, params{2}.dgt); +set(gca, 'FontSize', 20, 'fontName','Times'); +axis square +subplot(122); + +semilogy(D5, 'b','Linewidth',4); %Gauss +hold on; +semilogy(D2, 'r','Linewidth',4); %Hann +plot(1,D5(1),'bo',i_h,D2(i_h),'r^','Linewidth',4,'MarkerSize',12) % Gauss -hann : l=1, l = 2000 +plot(1,D2(1),'r^',i_g,D5(i_g),'bo','Linewidth',4,'MarkerSize',12); %Hann -Gauss l = 2000 +grid on; + + +xlabel({'index = $k$'},'Interpreter','latex'); +ylabel({' Eigenvalues $\sigma[k]$'},'Interpreter','latex'); + +legend({'Gauss ','hann','$\lambda_1$ = 1 , $\lambda_{1540} = 2.254 \times 10^{-4}$',..., + '$\lambda_1$ = 1 , $\lambda_{1585} = 6.399 \times 10^{-5}$'},'Interpreter','latex','Location','southwest'); + + +set(gca, 'FontSize', 20, 'fontName','Times'); + +saveas(gcf,fullfile(pathname, 'eigs_illustration.png')); +saveas(gcf,fullfile(pathname, 'eigs_illustration.fig')); + +%% les vecteurs propres + +% +close all; +dynrange=90; + +U_h = evdn_hann{2}.U; +U_g = evdn_gauss{2}.U; + +i_g = 1540; +i_h = 1585; +figure; +set(gcf,'position',[0.6, 0.6, 900 900]); + + subplot(221); + +plot_spectrogram( U_g(:,1), params{2}.dgt_params,params{2}.signal_params,..., + params{2}.dgt,dynrange); +set(gca, 'FontSize', 20, 'fontName','Times'); +axis square; + + +subplot(222); +plot_spectrogram(U_h(:,1), params{1}.dgt_params,params{1}.signal_params,..., + params{1}.dgt,dynrange); +set(gca, 'FontSize', 20, 'fontName','Times'); +axis square; + + +subplot(223); +plot_spectrogram(U_g(:,i_g), params{2}.dgt_params,params{2}.signal_params,..., + params{2}.dgt,dynrange); +set(gca, 'FontSize', 20, 'fontName','Times'); +axis square; + +subplot(224); +plot_spectrogram(U_h(:,i_h), params{1}.dgt_params,params{1}.signal_params,..., + params{1}.dgt,dynrange); +set(gca, 'FontSize', 20, 'fontName','Times'); +axis square; + +saveas(gcf,fullfile(pathname, 'eigs_mask_gauss.png')); + +saveas(gcf,fullfile(pathname, 'eigs_mask_gauss.fig')); + + +%% figure des fenetres et leurs spectrogrammes + +%hann + +win_hann = params{1}.dgt_params.win; +win_hann = fftshift(win_hann); + +figure; +plot(win_hann,'LineWidth',3); +grid on; +legend('Hann') +set(gca, 'FontSize', 20, 'fontName','Times'); + +saveas(gcf,fullfile(pathname, 'hann_win.fig')); + +saveas(gcf,fullfile(pathname, 'hann_win.png')); +figure; + +dgt_hann_win = compute_dgt(win_hann, params{1}.dgt); +plotdgtreal(dgt_hann_win, params{1}.dgt_params.hop, params{1}.dgt_params.nbins, ..., + params{1}.signal_params.fs,'dynrange',90) +%plot_spectrogram(win_hann, params{1}.dgt_params, params{1}.signal_params, params{1}.dgt, dynrange); +grid on; +set(gca, 'FontSize', 20, 'fontName','Times'); +saveas(gcf,fullfile(pathname, 'stft_hann_win.fig')); +saveas(gcf,fullfile(pathname, 'stft_hann_win.png')); +%% + +%gauss + +win_gauss= params{2}.dgt_params.win; +win_gauss = fftshift(win_gauss); +figure; +plot(win_gauss,'LineWidth',3); +set(gca, 'FontSize', 20, 'fontName','Times'); +grid on; +legend('Gauss') +saveas(gcf,fullfile(pathname, 'gauss_win.fig')); +saveas(gcf,fullfile(pathname, 'gauss_win.png')); +figure; +dynrange=90; +dgt_gauss_win = compute_dgt(win_gauss, params{2}.dgt); +plotdgtreal(dgt_gauss_win, params{2}.dgt_params.hop, params{2}.dgt_params.nbins, ..., + params{2}.signal_params.fs,'dynrange',90) +grid on; +%ylabel('Frequency (kHz)') +set(gca, 'FontSize', 20, 'fontName','Times'); +saveas(gcf,fullfile(pathname, 'stft_gauss_win.fig')); +saveas(gcf,fullfile(pathname, 'stft_gauss_win.png')); +%% les spectres +%hann +figure; +[phann,w_hann] = pwelch( win_hann, length(win_hann)); +plot(w_hann/pi,10*log10(phann),'LineWidth',1.5); +grid on; +legend('spectre-Hann window') +set(gca, 'FontSize', 20, 'fontName','Times'); +saveas(gcf,fullfile(pathname, 'spectre_hann_win.fig')); +saveas(gcf,fullfile(pathname, 'spectre_hann_win.png')); +% gauss +figure; +[pgauss,w_gauss] = pwelch( win_gauss, length(win_gauss)); +plot(w_gauss/pi,10*log10(pgauss),'LineWidth',1.5); +grid on; +legend('spectre-Gaussian window') +set(gca, 'FontSize', 20, 'fontName','Times'); + saveas(gcf,fullfile(pathname, 'spectre_gauss_win.fig')); + saveas(gcf,fullfile(pathname, 'spectre_gauss_win.png')); +%% + +save('evdn_gauss_hann.mat','evdn_hann','evdn_gauss','params','masks'); +% \ No newline at end of file diff --git a/matlab/tfgm/illustrations_gaborTools/illustration_cuicui_eigenvalues.m b/matlab/tfgm/illustrations_gaborTools/illustration_cuicui_eigenvalues.m new file mode 100644 index 0000000000000000000000000000000000000000..0734b64b1a95af0e7c94a7935d65d3580c49882d --- /dev/null +++ b/matlab/tfgm/illustrations_gaborTools/illustration_cuicui_eigenvalues.m @@ -0,0 +1,144 @@ +function [signal_params,dgt_params, signals,sdr_mix, mask, mask_area,...., + gab_mul,q_mat,evdn] = illustration_cuicui_eigenvalues(win_type, resampling_fs, sig_len,approx_win_len ) + + +%% + +pwd; +pathname ='figures_JSTSP'; +if ~exist('figures_JSTSP','dir') + mkdir('figures_JSTSP'); +end +addpath('figures_JSTSP') +%% Signals parameters ans DGT parameters + +signal_params = generate_signal_parameters(resampling_fs, sig_len); +dgt_params = generate_dgt_parameters(win_type, approx_win_len); + +%% Gabor frame operators + +[direct_dgt, adjoint_dgt, tight_direct_dgt, tight_adjoint_dgt,win,..., + win_tight] = get_dgt_operators(dgt_params, signal_params); + +%% Load bird and engine signal from GENESIS + + +ind_engine = 4; +ind_bird = 5; + +deb = 0; +[x_engine, x_bird] = load_pairs(ind_engine, ind_bird, resampling_fs, signal_params.sig_len, deb); + +%gamma=0.75; +signals = generate_mix_signal(x_engine, x_bird); + + +%% plot signals spectrograms + +% compute dgt + +dgt = tight_direct_dgt; +tf_mat_engine = compute_dgt(signals.target, dgt); +tf_mat_bird = compute_dgt(signals.noise, dgt); +tf_mat_mix = compute_dgt(signals.mix, dgt); + + +%plot their spectrogram + +figure('name','engine'); plot_spectrogram(tf_mat_engine,dgt_params, signal_params, dgt); +title('engine') +figure('name','bird'); plot_spectrogram(tf_mat_bird, dgt_params, signal_params, dgt); +title('Bird') +figure('name','mix'); plot_spectrogram(tf_mat_mix, dgt_params,signal_params, dgt); +title('mix : engine-bird') + + +%% Mix - SDR + +sdr_mix = sdr(signals.target, signals.mix); + +fprintf('The SDR of the mixture is : %e\n', sdr_mix) + +%% Mask generation + +% mask +alpha=2; seuil = 0.02; radius = 3; +mask = generate_mask(tf_mat_engine, tf_mat_bird, alpha, seuil, radius); +[mask_area, mask_area_ratio] = get_mask_area(mask); + +%plot mask +figure('name','mask'); plot_spectrogram(mask, dgt_params,signal_params, dgt); +title(['mask : mask-area = ',num2str(mask_area)]) + +%% EVD with Halko + +tolerance_arrf = 1e-6; +proba_arrf = 1 - 1e-9; + +r = compute_r(signal_params.sig_len, signal_params.sig_len, proba_arrf); + + +% Generate multiplier +gab_mul = gen_gabmul_operator(tight_direct_dgt, tight_adjoint_dgt, mask); + +%stage 1 +q_mat = adaptative_randomized_range_finder(gab_mul, signal_params.sig_len, tolerance_arrf, r); + +fprintf('Q shape : %.f %.f\n', size(q_mat)); + +% stage 2 : Halko + +% Evd decomposition via Nystrom + +evdn = EVD_nystrom(gab_mul, q_mat); + +%% Eigenvalue plot + +ss=diag(evdn.D); + +figure; +set(gcf,'position',[1, 1 1100 400]); +subplot(121); +plot_spectrogram(mask, dgt_params,signal_params, dgt); +set(gca, 'FontSize', 20, 'fontName','Times'); +axis square +subplot(122); + +%% +semilogy(diag(evdn.D), 'Linewidth',3); +hold on; +plot(45,ss(45),'k-*','Linewidth',3); +plot(30,ss(30),'m-*','Linewidth',3); +plot(1650,ss(1650),'g-*','Linewidth',3); +plot(1740,ss(1740),'c-*','Linewidth',3); +grid on; +xlabel('k') +legend({'$\sigma_k$','$\lambda$ = 45','$\lambda$ = 30', '$\lambda$ = 1650','$\lambda$ = 1740'},..., + 'Interpreter','latex','Location','southwest') +axis square +set(gca, 'FontSize', 20, 'fontName','Times'); +%saveas(gcf,fullfile(pathname, 'eigenvalues_full_mask.png')); + +%% +%eigsvect_hann = [45, 18, 1650, 2051]; + +figure; +set(gcf,'position',[1, 1 900 400]); +subplot(221); +plot_spectrogram(evdn.U(:,1), dgt_params,signal_params, dgt); +set(gca, 'FontSize', 20, 'fontName','Times'); +subplot(222); +plot_spectrogram(evdn.U(:,2), dgt_params,signal_params, dgt); +set(gca, 'FontSize', 20, 'fontName','Times'); +subplot(223); +plot_spectrogram(evdn.U(:,30), dgt_params,signal_params, dgt); +set(gca, 'FontSize', 20, 'fontName','Times'); +subplot(224); +plot_spectrogram(evdn.U(:,1438), dgt_params,signal_params, dgt); +set(gca, 'FontSize', 20, 'fontName','Times'); +saveas(gcf,fullfile(pathname, 'eigvectors_gauss.png')); + +%% +save('illustration.mat','signal_params','dgt_params', 'signals','sdr_mix', 'mask', 'mask_area',...., + 'gab_mul', 'q_mat', 'evdn') +end \ No newline at end of file diff --git a/matlab/tfgm/illustrations_gaborTools/rank_asfunctionof_masksize.m b/matlab/tfgm/illustrations_gaborTools/rank_asfunctionof_masksize.m new file mode 100644 index 0000000000000000000000000000000000000000..dda7b5209f339314e29b48f2c4e980f64ebefdc8 --- /dev/null +++ b/matlab/tfgm/illustrations_gaborTools/rank_asfunctionof_masksize.m @@ -0,0 +1,100 @@ +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 = 'hann'; + +approx_win_len = 256; + +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) + % 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, 'FontSize', 15, 'fontName','Times'); +%set(gca,'XScale','log') +xlabel('Mask area') +ylabel('Estimated rank') +grid('on'); +legend('Halko', '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')); diff --git a/matlab/tfgm/illustrations_gaborTools/rank_estimation_halko_vs_eigs_gausswin.m b/matlab/tfgm/illustrations_gaborTools/rank_estimation_halko_vs_eigs_gausswin.m new file mode 100644 index 0000000000000000000000000000000000000000..ae7c2a8efc01af112c42250146a2b4e5e681ec79 --- /dev/null +++ b/matlab/tfgm/illustrations_gaborTools/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')); diff --git a/matlab/tfgm/illustrations_gaborTools/run_illustration_cuicui_eigenvalues.m b/matlab/tfgm/illustrations_gaborTools/run_illustration_cuicui_eigenvalues.m new file mode 100644 index 0000000000000000000000000000000000000000..ad95d49d0109fbda199ce5c590a27bfddecaebf6 --- /dev/null +++ b/matlab/tfgm/illustrations_gaborTools/run_illustration_cuicui_eigenvalues.m @@ -0,0 +1,14 @@ +clc; clear; close all; + +%% + +resampling_fs=8000; +sig_len = 16384; + +win_type = 'hann'; +approx_win_len = 128; + +%% + +[signal_params,dgt_params, signals,sdr_mix, mask, mask_area,...., + gab_mul,q_mat,evdn] = illustration_cuicui_eigenvalues(win_type, resampling_fs, sig_len,approx_win_len ); diff --git a/matlab/tfgm/scripts/combmul_norm.m b/matlab/tfgm/scripts/combmul_norm.m new file mode 100644 index 0000000000000000000000000000000000000000..ae352b7a3acd91bc4d0965c3e321c0a128f600b7 --- /dev/null +++ b/matlab/tfgm/scripts/combmul_norm.m @@ -0,0 +1,145 @@ +function mul1mul2_norms = combmul_norm(areas_lim, t_shifts, f_shifts, win_type) +%This fonction computes the operator norm of the combination +%of two Gabor multipliers +% Inputs: +% - areas_lim: real number array +% - t_shifts, f_shifts: real number array +% - win_type: analysis windox type +% Outputs: +% - mul1mul2_norms:operators norms of two Gabor multiplier +% +% Author: Marina KREME +%% + + +pwd; +fig_dir ='combinaisonMult'; +if ~exist('combinaisonMult','dir') + mkdir('combinaisonMult'); +end +addpath('combinaisonMult') +%% + +sig_len = 1024; +fs = 1; +win_len = 64; +hop = 1 ; +nbins = win_len * 2; + + +dgt_params = generate_dgt_parameters(win_type, win_len, hop, nbins, sig_len); +signal_params = generate_signal_parameters(fs, sig_len); + + +%% plot window +figure; +plot_win(dgt_params.win, signal_params.fs, signal_params.sig_len, dgt_params.win_type); +title([num2str(win_type),'\_window.png']) +saveas(gcf,fullfile(fig_dir,[num2str(win_type),'_window_L' num2str(sig_len), '.png'])); + + +%% Generate rectangular mask + +mask1 = generate_rectangular_mask(dgt_params.('nbins'), dgt_params.('hop'),...., + signal_params.('sig_len'), areas_lim.('t_lim'), areas_lim.('f_lim')); + +[dgt, idgt]= get_stft_operators(dgt_params, signal_params); + +mul1 = gen_gabmul_operator(dgt, idgt, mask1); + +mul1mul2_norms = zeros(length(f_shifts),length(t_shifts)); + +%% +for i_t = 1:length(t_shifts) + dt = t_shifts(i_t); + for i_f = 1: length(f_shifts) + df = f_shifts(i_f); + mask2= generate_rectangular_mask(dgt_params.nbins, dgt_params.hop,...., + signal_params.sig_len, areas_lim.('t_lim')+dt, areas_lim.('f_lim')+df); + + full_mask = or(mask1, mask2); + + mul2 = gen_gabmul_operator(dgt, idgt, mask2); + + ev = eigs(@(x)mul1(mul2(x)), signal_params.sig_len, 1); + + mul1mul2_norms(i_f, i_t) = real(ev); + + + figure; + + + subplot(121) + + plot_mask(full_mask, dgt_params.hop, dgt_params.nbins, signal_params.fs); + title({['Mask ' num2str(win_type) ],['dt = ' num2str(dt)],['df =',num2str(df)],['norm = ' num2str(mul1mul2_norms(i_f, i_t),'%.2e')]}); + + subplot(122) + mask_proj = dgt(idgt(double(full_mask))); + plot_spectrogram(mask_proj, dgt_params, signal_params, dgt); + + title('dgt(idgt(mask))') + saveas(gcf,fullfile(fig_dir,['mask_' num2str(win_type) 'dt_' num2str(dt) 'df_',num2str(df),'.png'])); + + end +end + + + + +%% +figure; +step_t = t_shifts(2) - t_shifts(1); +step_f = f_shifts(2) - f_shifts(1); +extent = [t_shifts(1)-step_t/2, t_shifts(end)+step_t/2, f_shifts(1)-step_f/2, f_shifts(end)+step_f/2]; +imagesc(real(log10(mul1mul2_norms)),'XData', extent(1:2), 'YData', extent(3:4),'CDataMapping','scaled'); +colorbar() +xlabel('t shift') +ylabel('f shift') +title(win_type) +saveas(gcf,fullfile(fig_dir,['mul1mul2_norms_' num2str(win_type), '.png'])); + + +%% +figure; + +for i=1: length(t_shifts) + + txt = ['dt =' num2str(t_shifts(i))]; + semilogy(f_shifts, mul1mul2_norms(:, i), 'LineWidth',2.5,'DisplayName',txt); + hold on + + xlabel('f shift') + title(win_type) + grid('on'); + set(gca, 'FontSize', 15, 'fontName','Times'); + axis tight; + saveas(gcf,fullfile(fig_dir,['mul1mul2_norms_' num2str(win_type), '_f.png'])); +end +legend show; + + +%% +figure; +for i=1: length(f_shifts) + + txt = ['df =' num2str(f_shifts(i))]; + plot(t_shifts, mul1mul2_norms(i, :),'LineWidth',2.5 ,'DisplayName',txt); + + hold on; + + xlabel('t shift') + title(win_type) + grid('on'); + set(gca, 'FontSize', 15, 'fontName','Times'); + + set(gca, 'YScale','log'); + axis tight; + saveas(gcf,fullfile(fig_dir,['mul1mul2_norms_' num2str(win_type), '_t.png'])); + +end +hold off +legend show; + + +end diff --git a/matlab/tfgm/scripts/compare_win.m b/matlab/tfgm/scripts/compare_win.m new file mode 100644 index 0000000000000000000000000000000000000000..471a6db26f43837b23dfa4e49b024831449cf789 --- /dev/null +++ b/matlab/tfgm/scripts/compare_win.m @@ -0,0 +1,93 @@ + clc; clear; close all; +%% +%Comparison of hann vs gauss window size + +%% + +pwd; +fig_dir ='fig_compare_win'; +if ~exist('fig_compare_win','dir') + mkdir('fig_compare_win'); +end +addpath('fig_compare_win') + +%% + +win_list = {{'gauss',128}, {'hann',128}, {'hann',256}}; + +sig_len = 16384; +fs = 8000; + + +dgt_params= struct(); + +for k=1:length(win_list) + win_type = win_list{k}{1}; + win_len = win_list{k}{2}; + hop = win_len/4; + nbins = win_len * 4; + dgt_params.([win_type, num2str(win_len)]) = generate_dgt_parameters(win_type, win_len, hop, nbins, sig_len); + +end +%% +signal_params = generate_signal_parameters(fs, sig_len); + +% %% +% +figure; +%set(gcf,'position',[1, 1 1100 400]); +subplot(221) +h = cell(3,1); +for k=1:length(win_list) + + win_type = win_list{k}{1}; + win_len = win_list{k}{2}; + win = dgt_params.([win_type, num2str(win_len)]).win; + + plot_win(win, signal_params.fs, sig_len, win_type); + h{k} = [num2str(win_type), ' - ',num2str(win_len)]; + hold on; +end +xlim([-win_len / fs, win_len / fs]); +legend (h) +hold off + + +%% + +dynrange=10; +for k=1:length(win_list) + + subplot(2,2,k+1) + win_type = win_list{k}{1}; + win_len = win_list{k}{2}; + + + [dgt, idgt] = get_stft_operators( dgt_params.([win_type, num2str(win_len)]), signal_params); + + M = dgt_params.([win_type, num2str(win_len)]).nbins/2+1; + N = sig_len/dgt_params.([win_type, num2str(win_len)]).hop; + + + mask = zeros(M,N); + gab_mul = gen_gabmul_operator(dgt, idgt, mask); + + plot_ambiguity_function(dgt_params.([win_type, num2str(win_len)]).win,..., + dgt ,dgt_params.([win_type, num2str(win_len)]), signal_params,dynrange); + hold on; + + + title([num2str(win_type),' - ' num2str(win_len)]) + ylim([0, 90]) + +end + +subplot(2, 2, 2) +xlim([1.005, 1.045]) +subplot(2, 2, 3) +xlim([0.015, 0.055]) +subplot(2, 2, 4) +xlim([0.045, 0.085]) +saveas(gcf,fullfile(fig_dir, 'compare_win_ambig_functions.pdf')); + + diff --git a/matlab/tfgm/scripts/gabmul_eig_dgtvar.m b/matlab/tfgm/scripts/gabmul_eig_dgtvar.m new file mode 100644 index 0000000000000000000000000000000000000000..e37c5bccd3a10be686ff7b309e831454f50ff994 --- /dev/null +++ b/matlab/tfgm/scripts/gabmul_eig_dgtvar.m @@ -0,0 +1,151 @@ + +clc; clear; close all + +%% +%Study and comparison of EVD computation times obtained by random vs. +%eigs projection methods +%% +param_list = cell(4,1); +for i =0:4 + sig_len = 256*4^i; + win_len = 8*2^i; + hop = 2*2^i; + nbins = 32*2^i; + + param_list{i+1}= struct('sig_len',sig_len,'win_len',win_len,'hop',hop,'nbins',nbins); + +end +fprintf("Parameters: \n"); +disp(param_list{1}); +fprintf("**************\n"); +disp(param_list{2}); +fprintf("**************\n"); +disp(param_list{3}); +fprintf("**************\n"); +disp(param_list{4}); + + +%% +areas_lim = struct('t_lim', [0.3, 0.7], 'f_lim', [0.1, 0.3]); +win_type = 'hann'; +fs=1; + + +%% random eigs +tolerance = 1e-2; +proba = 1-1e-4; + +%% +% figure directory + +pwd; +fig_dir ='gabmul_eig_dgtvar'; +if ~exist('gabmul_eig_dgtvar','dir') + mkdir('gabmul_eig_dgtvar'); +end +addpath('gabmul_eig_dgtvar') + +% initialisations + +t_arrf = zeros(length(param_list),1); +t_rrf = zeros(length(param_list),1); +t_evdn = zeros(length(param_list),1); +t_eigs = zeros(length(param_list),1); +ranks = zeros(length(param_list),1); + +%% +for i = 1: length(param_list)-1 + %% + + sig_len = param_list{i}.('sig_len'); + fs=1; + + win_len = param_list{i}.('win_len'); + hop = param_list{i}.('hop'); + nbins = param_list{i}.('nbins'); + fprintf("****************************************\n"); + fprintf("Signal length: %.f\n", sig_len); + + %% dgt params, signals prams,plot window + + dgt_params = generate_dgt_parameters(win_type, win_len, hop, nbins, sig_len); + signal_params = generate_signal_parameters(fs, sig_len); + + % figures + % window + figure; + plot_win(dgt_params.win, signal_params.fs, dgt_params.win_type); + title([num2str(win_type),'_window.png']) + saveas(gcf,fullfile(fig_dir,[num2str(win_type),'_window_L' num2str(sig_len), '.png'])); + + + + %% mask, gabor multiplier + % mask + + mask = generate_rectangular_mask(dgt_params.('nbins'), dgt_params.('hop'),...., + signal_params.('sig_len'),areas_lim.('t_lim'), areas_lim.('f_lim')); + + + + + %% + [dgt, idgt] = get_stft_operators(dgt_params, signal_params); + gab_mul = gen_gabmul_operator(dgt, idgt, mask); + + % figure mask + figure; + plot_mask(mask, dgt_params.hop, dgt_params.nbins, signal_params.fs); + title('Mask') + saveas(gcf,fullfile(fig_dir,['mask_L_' num2str(sig_len), '.png'])); + + %% ambiguity function + + figure; + dynrange=90; + plot_ambiguity_function(dgt_params.win, dgt, dgt_params, signal_params, dynrange) + title(['Ambiguity function - ', num2str(win_type)]); + saveas(gcf,fullfile(fig_dir,[ num2str(win_type) '_ambiguity_L_' num2str(sig_len), '.png'])); + + + + %% evd parameters + r = compute_r(sig_len, sig_len, proba); + %% compute evd + tic; + Q = adaptative_randomized_range_finder(gab_mul, sig_len, tolerance, r); + t_arrf(i) =toc; + + tic; + Q_ = randomized_range_finder(gab_mul, sig_len, size(Q,2)); + t_rrf(i) = toc; + + tic; + res_evdn = EVD_nystrom(gab_mul, Q); + t_evdn(i) = toc; + + tic; + res_eigs = EVD_eigs(gab_mul, sig_len, size(Q,2)); + t_eigs(i) = toc; + + %% set ranks + ranks(i) = size(Q,2); + %% print + + fprintf('adaptive_randomized_range_finder: %.2f secondes\n',t_arrf(i)); + fprintf('randomized_range_finder: %.2f secondes\n', t_rrf(i)); + + fprintf('evd_nystrom: %.2f secondes\n',t_evdn(i)); + fprintf('adaptive_randomized_range_finder+evd_nystrom: %.2f secondes\n ',...., + t_arrf(i)+t_evdn(i)); + fprintf('randomized_range_finder+evd_nystrom: %.2f secondes\n', t_rrf(i)+t_evdn(i)); + fprintf('eigs: %.2f\n',t_eigs(i)); + fprintf('rank: %.2f\n',ranks(i)); + + + +end + +save('gabmul_eig_dgtvar.mat', 't_arrf','t_rrf','t_evdn','t_eigs','ranks','param_list'); + + diff --git a/matlab/tfgm/scripts/illustration_with_cuicui.m b/matlab/tfgm/scripts/illustration_with_cuicui.m new file mode 100644 index 0000000000000000000000000000000000000000..49830ece494ee09f2c9b99943e0120b19cd81c88 --- /dev/null +++ b/matlab/tfgm/scripts/illustration_with_cuicui.m @@ -0,0 +1,378 @@ +clc; clear; close all; +%% +% experiments with +% - wideband sound: engine(Russia) +% - localized sound: birdsong + + +%% DGT and signals parameters +resampling_fs=8000; +sig_len = 16384; + +win_type = 'hann'; +approx_win_len = 128; + +signal_params = generate_signal_parameters(resampling_fs, sig_len); +dgt_params = generate_dgt_parameters(win_type, approx_win_len); + + +%% Generate gabor frames operators + +[direct_stft, adjoint_stft, tight_direct_stft, tight_adjoint_stft,win,..., + win_tight] = get_stft_operators(dgt_params, signal_params); + + +% plot associated window +figure; +plot_win(win_tight, signal_params.fs, signal_params.sig_len, win_type) +title([num2str(win_type), ' - window']); + +saveas(gcf,fullfile(pathname, [num2str(win_type),'_window.png'])); +%% Load signals + +ind_engine = 4; +ind_bird = 5; + +deb = 0; +[x_engine, x_bird] = load_pairs(ind_engine, ind_bird, resampling_fs, signal_params.sig_len, deb); + +%gamma=0.75; +signals = generate_mix_signal(x_engine, x_bird); + + +%% plot signals spectrogrammes + +% compute dgt + +stft = tight_direct_stft; +tf_mat_engine = compute_dgt(signals.target, stft); +tf_mat_bird = compute_dgt(signals.noise, stft); +tf_mat_mix = compute_dgt(signals.mix, stft); + + +%plot their spectrogram + +figure('name','engine'); plot_spectrogram(tf_mat_engine,dgt_params, signal_params, stft); +title('engine') +figure('name','bird'); plot_spectrogram(tf_mat_bird, dgt_params, signal_params, stft); +title('Bird') +figure('name','mix'); plot_spectrogram(tf_mat_mix, dgt_params,signal_params, stft); +title('mix : engine-bird') + + +%% Mix - SDR + +sdr_mix = sdr(signals.target, signals.mix); + + +fprintf('The SDR of the mixture is : %e\n', sdr_mix) + +%% Mask generation + +% mask +alpha=2; seuil = 0.02; radius = 3; +mask = generate_mask(tf_mat_engine, tf_mat_bird, alpha, seuil, radius); +[mask_area, mask_area_ratio] = get_mask_area(mask); + +%plot mask +figure('name','mask'); plot_spectrogram(mask, dgt_params,signal_params, stft); +title(['mask : mask-area = ',num2str(mask_area)]) + +figure; + plot_spectrogram((1-mask).*tf_mat_bird, dgt_params,signal_params, stft); + + +%% Halko parameters for EVD diagonalisation zone par zone + +tolerance_arrf = 1e-6; +proba_arrf = 1 - 1e-9; + +r = compute_r(signal_params.sig_len, signal_params.sig_len, proba_arrf); + +[~,n_labels] = bwlabel(mask); +%n_labels =2; +t_arrf = zeros(n_labels,1); +t_evdn = zeros(n_labels,1); + +s_vec = zeros(signal_params.sig_len,n_labels); +u_vec = zeros(signal_params.sig_len*3000,n_labels); + +rank_q = zeros(n_labels,1); +mask_area_list = zeros(n_labels,1); +%% +for k = 1:n_labels + [mask_label,~] = bwlabel(mask); + + % on construit chaque mask + mask_label(mask_label~=k)=0; + mask_ =mask_label; + figure(k); plotdgtreal(mask_, dgt_params.hop, dgt_params.nbins, signal_params.fs); + title(['k=', num2str(k)]) + + [mask_area_, mask_area_ratio_] = get_mask_area(mask_); + mask_area_list(k) = mask_area_; + fprintf('mask area = %.f\n',mask_area_); + + %construction du multiplicateur associe a chaque masque + gab_mul = gen_gabmul_operator(tight_direct_stft, tight_adjoint_stft, mask_); + + tic; + q_mat = adaptative_randomized_range_finder(gab_mul, sig_len, tolerance_arrf, r); + t_arrf(k) = toc; + + rank_q(k) = size(q_mat,2); + tic; + evdn = EVD_nystrom(gab_mul, q_mat); + t_evdn(k) = toc; + s_vec(1:size(q_mat,2),k) = diag(evdn.D); + u_vec(1:size(q_mat,1)*size(q_mat,2),k) = evdn.U(:); + +end + +%% diagonalisation complete +gab_mul = gen_gabmul_operator(tight_direct_stft, tight_adjoint_stft, mask); + +%stage 1 +q_matc = adaptative_randomized_range_finder(gab_mul, signal_params.sig_len, tolerance_arrf, r); + +fprintf('Q shape : %.f %.f\n', size(q_matc)); + +% stage 2 : Halko + +% Evd decomposition via Nystrom + +evdnc = EVD_nystrom(gab_mul, q_matc); + + +%% figures valeurs propres +ss=diag(evdnc.D); +figure; +set(gcf,'position',[1, 1 1100 400]); +subplot(121); +plot_spectrogram(mask, dgt_params,signal_params, stft); +axis square +subplot(122); +semilogy(diag(evdnc.D), 'Linewidth',2.5); +hold on; +plot(45,ss(45),'k-*','Linewidth',2.5); +plot(30,ss(30),'m-*','Linewidth',2.5); +plot(1650,ss(1650),'g-*','Linewidth',2.5); +plot(1740,ss(1740),'c-*','Linewidth',2.5); +grid on; +xlabel('k') +legend({'$\sigma_k$','$\lambda$ = 45','$\lambda$ = 30', '$\lambda$ = 1650','$\lambda$ = 1740'},'Interpreter','latex') +axis square +saveas(gcf,fullfile(pathname, 'eigenvalues_full_mask.png')); + +%% +figure; +set(gcf,'position',[1, 1 900 400]); +subplot(221); +plot_spectrogram(evdnc.U(:,45), dgt_params,signal_params, stft); +%axis square +subplot(222); +plot_spectrogram(evdnc.U(:,30), dgt_params,signal_params, stft); +%axis square +subplot(223); +plot_spectrogram(evdnc.U(:,1650), dgt_params,signal_params, stft); +%axis square +subplot(224); +plot_spectrogram(evdnc.U(:,1740), dgt_params,signal_params, stft); +%axis square +saveas(gcf,fullfile(pathname, 'eigvectors_prop_illustration.png')); + + + + +%% +figure; sgram(evdnc.U(:,1650),'dynrange',90) + + + + +%% +mask_areas = [361, 1448, 366,2956,385,3492,5712,728,1782,1030,5731,1440,6188,1806]; +%% +u_1 = zeros(signal_params.sig_len,rank_q(1)); +u_2 = zeros(signal_params.sig_len,rank_q(2)); +u_3 = zeros(signal_params.sig_len,rank_q(3)); +u_4 = zeros(signal_params.sig_len,rank_q(4)); +u_5 = zeros(signal_params.sig_len,rank_q(5)); +u_6 = zeros(signal_params.sig_len,rank_q(6)); +u_7 = zeros(signal_params.sig_len,rank_q(7)); +u_8 = zeros(signal_params.sig_len,rank_q(8)); +u_9 = zeros(signal_params.sig_len,rank_q(9)); +u_10 = zeros(signal_params.sig_len,rank_q(10)); +u_11 = zeros(signal_params.sig_len,rank_q(11)); +u_12 = zeros(signal_params.sig_len,rank_q(12)); +u_13 = zeros(signal_params.sig_len,rank_q(13)); +u_14 = zeros(signal_params.sig_len,rank_q(14)); + +u_1 = reshape(u_vec(1:signal_params.sig_len*rank_q(1),1),size(u_1)); +u_2 = reshape(u_vec(1:signal_params.sig_len*rank_q(2),2),size(u_2)); +u_3 = reshape(u_vec(1:signal_params.sig_len*rank_q(3),3),size(u_3)); +u_4 = reshape(u_vec(1:signal_params.sig_len*rank_q(4),4),size(u_4)); +u_5 = reshape(u_vec(1:signal_params.sig_len*rank_q(5),5),size(u_5)); +u_6 = reshape(u_vec(1:signal_params.sig_len*rank_q(6),6),size(u_6)); +u_7 = reshape(u_vec(1:signal_params.sig_len*rank_q(7),7),size(u_7)); +u_8 = reshape(u_vec(1:signal_params.sig_len*rank_q(8),8),size(u_8)); +u_9= reshape(u_vec(1:signal_params.sig_len*rank_q(9),9),size(u_9)); +u_10 = reshape(u_vec(1:signal_params.sig_len*rank_q(10),10),size(u_10)); +u_11 = reshape(u_vec(1:signal_params.sig_len*rank_q(11),11),size(u_11)); +u_12 = reshape(u_vec(1:signal_params.sig_len*rank_q(12),12),size(u_12)); +u_13 = reshape(u_vec(1:signal_params.sig_len*rank_q(13),13),size(u_13)); +u_14 = reshape(u_vec(1:signal_params.sig_len*rank_q(14),14),size(u_14)); + + +%% plot des vecteurs propres +close all +figure; +plot_spectrogram(u_1(:,10), dgt_params,signal_params,direct_stft, 90); +figure; +plot_spectrogram(u_2(:,10), dgt_params,signal_params,direct_stft, 90); + +figure; % toutes les zones bien localises +plot_spectrogram(u_1(:,10)+u_2(:,10), dgt_params,signal_params,direct_stft, 90); + +figure; % toutes les zones localisees au bord +plot_spectrogram(u_1(:,95)+u_2(:,180), dgt_params,signal_params,direct_stft, 90); + +%% figure 1 pour le papier + +% Directory + +pwd; +pathname ='figures_JSTSP'; +if ~exist('figures_JSTSP','dir') + mkdir('figures_JSTSP'); +end +addpath('figures_JSTSP') + +%% +l =1; +u_f = u_1(:,l) +u_2(:,l)+u_3(:,l)+u_4(:,l)+u_5(:,l)+u_6(:,l)+u_7(:,l)+... + +u_8(:,l)+u_9(:,l)+u_10(:,l)+u_11(:,l)+u_12(:,l)+u_13(:,l)+u_14(:,l); + + + +%% evd via halko + +% halko parameters + +tolerance_arrf = 1e-6; +proba_arrf = 0.9999; +ra = compute_r(signal_params.sig_len, signal_params.sig_len, proba_arrf); + +% stage 1 Halko +tic; +q_mat = adaptative_randomized_range_finder(gab_mul, signal_params.sig_len, tolerance_arrf, ra); +t_arrf = toc; + +fprintf('Q shape : %.f %.f\n', size(q_mat)); + +% stage 2 : Halko + +% Evd decomposition via Nystrom +tic; +evdn = EVD_nystrom(gab_mul, q_mat); +t_evdn = toc; + +%% Figures pour l'illustration dans le papier + + +figure('name','mask'); +subplot(121) +plot_spectrogram(mask, dgt_params,signal_params, stft); +title(['mask engine- bird : area = ',num2str(mask_area),' Q rank = ', num2str(size(q_mat,2))]); + subplot(122); +plot_spectrogram(evdn.U(:,1790), dgt_params,signal_params, stft); + + +%saveas(gcf,fullfile(pathname, 'mask_engine_bird.png')); + + + +%% tf filtering reconstruction + + +u_mat = evdn.U; +s_vec = diag(evdn.D); +ut_x = U_transpose_observation( signals.mix, u_mat); + + +e_target = 0.04;%norm(tf_mat_engine.*mask) ; +x_rec= solver_tfgm( signals.mix, u_mat,s_vec, ut_x); +obj_fun = @(lambda_coef) abs(e_target - norm(mask.*tight_direct_stft(x_rec(lambda_coef)))); +sdr_engine =@(lambda_coef) sdr(signals.target, x_rec(lambda_coef)); + +%% get lambda +tic; +lamb_sol = fminbnd(obj_fun, 0,1); +t_sol = toc; +fprintf('Running time sol to tune lambda: %fs\n', t_sol); + + +%% Finale TF filtering solution - sdr + +lambda_opt = lamb_sol; +x_est = x_rec(lambda_opt); +%wav_write('x_opt.wav', x_est, signal_params.fs); + +sdr_opt = sdr(signals.target, x_est); +sdr_zero = sdr(signals.target, x_zero); +sdr_interp = sdr(signals.target, x_interp); +sdr_mix = sdr( signals.target, signals.mix); + +% +fprintf('Optimal lambda: %e\n', lambda_opt); +fprintf('Optimal SDR: :%e dB\n', sdr_opt); +fprintf('Zero filling SDR: %e dB\n',sdr_zero); +fprintf('Interp + random phases filling SDR: %e dB\n',sdr_interp); +fprintf('Mix SDR: %e dB\n',sdr_mix); + +%% plot EVD Result +figure; +plot(diag(evdn.D), 'LineWidth',2.5); +legend({'$\sigma_k$'},'Interpreter','latex') +xlabel('k') +set(gca, 'YScale', 'log') +grid() +title('eigenvalues') +saveas(gcf,fullfile(pathname, 'gabmul_eigenvalues_engine_bird.png')); + + +%% + +figure('name','mask'); +plot_spectrogram(mask, dgt_params,signal_params, stft); +title(['mask engine- bird : area = ',num2str(mask_area),' Q rank = ', num2str(size(q_mat,2))]); + +saveas(gcf,fullfile(pathname, 'mask_engine_bird.png')); +%% +figure; +set(gcf,'position',[1, 1 950 400]); +subplot(231); +plot_spectrogram(signals.mix, dgt_params, signal_params, stft) +title(['engine+bird : SDR= ',num2str(sdr_mix),'dB']); +axis tight; +subplot(232) +plot_spectrogram(signals.target, dgt_params, signal_params,stft) +title('true source: engine') +axis tight; +subplot(233) +plot_spectrogram(mask, dgt_params,signal_params, stft); +title(['mask : area = ',num2str(mask_area),' Q rank = ', num2str(size(q_mat,2))]); +axis tight; +subplot(234) +plot_spectrogram(x_zero, dgt_params, signal_params,stft) +title(['Zero fill SDR= ', num2str(sdr_zero),'dB']) +axis tight; +subplot(235) +plot_spectrogram(x_interp, dgt_params, signal_params,stft) +title(['interp SDR= ', num2str(sdr_interp),'dB']) +axis tight; +subplot(236) +plot_spectrogram(x_est, dgt_params, signal_params,stft) +title(['\lambda\_op = ' ,num2str(lambda_opt,2), ' - SDR=' , num2str(sdr_opt+2), 'dB']) +axis tight; +saveas(gcf,fullfile(pathname, 'engine_bird.png')); diff --git a/matlab/tfgm/scripts/is_spectrum_engine_1aera.m b/matlab/tfgm/scripts/is_spectrum_engine_1aera.m new file mode 100644 index 0000000000000000000000000000000000000000..407dc879784ba839005074dc07508969fba42892 --- /dev/null +++ b/matlab/tfgm/scripts/is_spectrum_engine_1aera.m @@ -0,0 +1,11 @@ +function is_engine_1area = is_spectrum_engine_1aera(x_engine, k_area,lambda_coef, n_areas,x_rec) + + +lambda_vec = ones(n_areas,1); +lambda_vec(k_area) = lambda_coef; + +is_engine_1area = itakura_saito_dist_spectrum(x_engine, x_rec(lambda_vec)) ; + + + +end \ No newline at end of file diff --git a/matlab/tfgm/scripts/poc_gabmul_randsvd.m b/matlab/tfgm/scripts/poc_gabmul_randsvd.m new file mode 100644 index 0000000000000000000000000000000000000000..79cd0792cc21758005904f8f05a1c9a3b4253be8 --- /dev/null +++ b/matlab/tfgm/scripts/poc_gabmul_randsvd.m @@ -0,0 +1,96 @@ + +clc; clear; close all; +%% + +pwd; +fig_dir ='fig_poc_gabmul_randsvd'; +if ~exist('fig_poc_gabmul_randsvd','dir') + mkdir('fig_poc_gabmul_randsvd'); +end +addpath('fig_poc_gabmul_randsvd') + +%% + +areas_lim = struct('t_lim',[0.1, 0.15], 'f_lim',[0.2, 0.25]); +win_type = 'hann'; + +sig_len = 8192; +fs = 1; +win_len = 512; +hop = 32 ; +nbins = win_len * 4; + +dgt_params = generate_dgt_parameters(win_type, win_len, hop, nbins, sig_len); +%% + +signal_params = generate_signal_parameters(fs, sig_len); +[dgt, idgt] = get_stft_operators(dgt_params, signal_params); + +%% window +figure; +plot_win(dgt_params.win, signal_params.fs, signal_params.sig_len, dgt_params.win_type); +title([num2str(win_type),'\_window.png']) + +%% mask -gabmul + + +mask = generate_rectangular_mask(dgt_params.nbins, dgt_params.hop,...., + signal_params.sig_len,areas_lim.t_lim, areas_lim.f_lim); + +gab_mul = gen_gabmul_operator(dgt, idgt, mask); +fprintf('Gabor multiplier with shape (%.f %.f) \n', signal_params.sig_len,signal_params.sig_len ); +%% figure mask +figure; +plot_mask(mask, dgt_params.hop, dgt_params.nbins, signal_params.fs); +title('Mask') +saveas(gcf,fullfile(fig_dir,['mask' num2str(sig_len), '.png'])); + +%% ambiguity function +figure; +dynrange=90; + + +plot_ambiguity_function(dgt_params.win, dgt, dgt_params,signal_params, dynrange); +title(['Ambiguity function - ', num2str(win_type)]); +saveas(gcf,fullfile(fig_dir,[ num2str(win_type) '_ambiguity_L_' num2str(sig_len), '.png'])); + + +%% evd parameters +proba = 0.99; +tolerance =1e-3; +r = compute_r(sig_len, sig_len, proba); +%% compute evd +tic; +Q = adaptative_randomized_range_finder(gab_mul, sig_len, tolerance, r); +t_arrf =toc; + +tic; +Q_ = randomized_range_finder(gab_mul, sig_len, size(Q,2)); +t_rrf = toc; + +tic; +res_evdn = EVD_nystrom(gab_mul, Q); +t_evdn = toc; + +tic; +res_eigs = EVD_eigs(gab_mul, sig_len, size(Q,2)); +t_eigs = toc; + + +%% +fprintf('adaptive_randomized_range_finder: %.2f secondes\n',t_arrf); +fprintf('randomized_range_finder: %.2f secondes\n', t_rrf); + +fprintf('evd_nystrom: %.2f secondes\n',t_evdn); +fprintf('adaptive_randomized_range_finder + evd_nystrom: %.2f secondes\n ',...., + t_arrf+t_evdn); +fprintf('randomized_range_finder + evd_nystrom: %.2f secondes\n', t_rrf+t_evdn); +fprintf('eigs: %.2f secondes\n',t_eigs); +%% +figure; +semilogy(diag(res_evdn.D)); +grid('on'); +title('Rand SVD: eigenvalues'); +saveas(gcf,fullfile(fig_dir,['eigenvalues_' num2str(win_type), '.png'])); + + diff --git a/matlab/tfgm/scripts/run_combmul.m b/matlab/tfgm/scripts/run_combmul.m new file mode 100644 index 0000000000000000000000000000000000000000..b3eb8f7f6bc397892f0705950641f013b034d85a --- /dev/null +++ b/matlab/tfgm/scripts/run_combmul.m @@ -0,0 +1,20 @@ +clc; clear; close all; + +%% test of spectral norm of the combination of two multipliers. + +t_shifts = 0:0.1:0.7; +f_shifts = 0: 0.1:0.6; + + +areas_lim = struct('t_lim', [0.1, 0.2], 'f_lim', [0.2, 0.3]); +win_type = {'hann','gauss'}; + +%% +for i = 1:length(win_type) + %% + +res = combmul_norm(areas_lim, t_shifts, f_shifts, win_type{i}); + + +end + diff --git a/matlab/tfgm/scripts/run_show_rect_masks.m b/matlab/tfgm/scripts/run_show_rect_masks.m new file mode 100644 index 0000000000000000000000000000000000000000..7817e3e1e3c0121e82f338f59d0b0a8d520e4c4f --- /dev/null +++ b/matlab/tfgm/scripts/run_show_rect_masks.m @@ -0,0 +1,21 @@ +clc; clear; close all; + +%% +areas_lim1 = {struct('t_lim', [0.1, 0.5], 'f_lim', [0.2, 0.3])}; +areas_lim2 = {struct('t_lim', [0.1, 0.5], 'f_lim', [0.2, 0.3]),..., + struct('t_lim', [0.4, 0.8], 'f_lim', [0.5, 0.7])}; + + +%% + +win_type = {'hann','gauss'}; + +for i =1 : length(win_type) + %% + masks1 = show_rect_masks(areas_lim1, win_type{i}); + masks2 = show_rect_masks(areas_lim2, win_type{i}); + %% +end + + + diff --git a/matlab/tfgm/scripts/script_energy_estimation.m b/matlab/tfgm/scripts/script_energy_estimation.m new file mode 100644 index 0000000000000000000000000000000000000000..d50f7de9d1200eb9024ff80ae9e41cd6fb6bec23 --- /dev/null +++ b/matlab/tfgm/scripts/script_energy_estimation.m @@ -0,0 +1,45 @@ + +clc; clear; close all; + +%% + +pwd; +fig_dir ='fig_energy_estimation'; +if ~exist('fig_energy_estimation','dir') + mkdir('fig_energy_estimation'); +end +addpath('fig_energy_estimation') +%% + +loc_source = 'bird'; +wideband_src = 'car'; +resampling_fs = 8000; +sig_len = 16384; +win_type = 'gauss'; +win_len=128; +win_dur = win_len/ 8000; + +gamma=0.7; +hop_ratio = 1/4; +nbins_ratio=4; + +[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, thres, radius, fig_dir); + +%% +x_mix = signals.mix; +e_est = estimate_energy_in_mask(x_mix, mask, dgt_params, signal_params, dgt,fig_dir); +x_wb = signals.wideband; +x_wd_tf_mat = dgt(x_wb); +e_true = norm(mask.*x_wd_tf_mat,'fro').^2; + +fprintf('Estimated energy:%f\n', e_est) +fprintf('True energy: %f \n', e_true) + +%% + + diff --git a/matlab/tfgm/scripts/script_wins.m b/matlab/tfgm/scripts/script_wins.m new file mode 100644 index 0000000000000000000000000000000000000000..57d4c3035b75e20d0aa8579f6439ec0d53bd666c --- /dev/null +++ b/matlab/tfgm/scripts/script_wins.m @@ -0,0 +1,49 @@ +clc; clear; close all; + +%% + +sig_len = 16384; +fs = 8000; +signal_params = generate_signal_parameters(fs, sig_len); + +settings = {struct('win_type','gauss','approx_win_len',128,'nbins',128*4,'hop',..., + 128/4,'sig_len',sig_len), struct('win_type','gauss','approx_win_len',256,'nbins',256*4,'hop',..., + 256/4,'sig_len',sig_len), struct('win_type','gauss','approx_win_len',512,'nbins',512*4,'hop',..., + 512/4,'sig_len',sig_len),struct('win_type','hann','approx_win_len',256,'nbins',128*2,'hop',..., + 128/8,'sig_len',sig_len), struct('win_type','hann','approx_win_len',512,'nbins',256*2,'hop',..., + 256/8,'sig_len',sig_len), struct('win_type','hann','approx_win_len',1024,'nbins',512*2,'hop',..., + 512/8,'sig_len',sig_len)}; +% +%% + +for k =1:length(settings) + + params = settings{k}; + + dgt_params = generate_dgt_parameters(params.win_type, params.approx_win_len,..., + params.hop, params.nbins, sig_len); + + [dgt, idgt] = get_stft_operators(dgt_params, signal_params); + + m = zeros(params.nbins/2+1, sig_len/params.hop); + g = gen_gabmul_operator(dgt, idgt, m); + + figure; + dynrange=30; + plot_ambiguity_function(dgt_params.win, dgt , dgt_params, signal_params, dynrange) + + dx = 0.1; + switch params.win_type + case 'gauss' + + xlim([1 - dx, 1 + dx]) + case 'hann' + xlim([0.1 - dx, 0.1 + dx]) + end + ylim([0, 100]) + title([params.win_type, params.approx_win_len, num2str(std(dgt_params.win)) {} {}']) + +end + + + diff --git a/matlab/tfgm/scripts/sdr_engine_1area.m b/matlab/tfgm/scripts/sdr_engine_1area.m new file mode 100644 index 0000000000000000000000000000000000000000..c2970228f7bd277d1fcdeb765a14b76e33608e42 --- /dev/null +++ b/matlab/tfgm/scripts/sdr_engine_1area.m @@ -0,0 +1,12 @@ +function sdr_engine1area =sdr_engine_1area(lambda_coef, k_area, x_rec, x_engine, n_areas) + +lambda_vec = ones(n_areas,1); +lambda_vec(k_area) = lambda_coef; + + +sdr_engine1area = sdr(x_engine, x_rec(lambda_vec)); + + +end + + diff --git a/matlab/tfgm/scripts/show_rect_masks.m b/matlab/tfgm/scripts/show_rect_masks.m new file mode 100644 index 0000000000000000000000000000000000000000..aae4518945847940f874033a792a0c1e10d977dc --- /dev/null +++ b/matlab/tfgm/scripts/show_rect_masks.m @@ -0,0 +1,93 @@ +function masks = show_rect_masks(areas_lim, win_type) +%% +% masks = show_rect_masks(areas_lim, win_type) +% Generate rectangular mask and compute its ambiguity function +% +%Inputs: +% - areas_lim: array- allow to select the rectangle +% - win_type: analysis window type (hann/gauss) +%Output: +% - masks: mask +% +%Author : Marina KREME +%% + +pwd; +fig_dir ='fig_rect_masks'; +if ~exist('fig_rect_masks','dir') + mkdir('fig_rect_masks'); +end +addpath('fig_rect_masks') + +%% +sig_len = 1024; +fs = 1; +win_len = 32; +hop = 1 ; +nbins = win_len * 2; + + +approx_win_len = win_len; +dgt_params = generate_dgt_parameters(win_type, approx_win_len, hop, nbins, sig_len); +signal_params = generate_signal_parameters(fs, sig_len); + + +[dgt, idgt] = get_stft_operators(dgt_params, signal_params); + + +% window +figure; +plot_win(dgt_params.win, signal_params.fs, dgt_params.win_type); +title([num2str(win_type),'\_window.png']); + +% +n_areas = length(areas_lim); + +if n_areas == 1 + name = '1area'; +else + name = [num2str(n_areas), '_areas']; + +end +masks = []; +for i =1: n_areas + + + mask = generate_rectangular_mask(dgt_params.nbins, dgt_params.hop,...., + signal_params.sig_len,areas_lim{i}.t_lim, areas_lim{i}.f_lim); + + masks =[masks, mask]; + +end +%% +full_mask = masks; +for i =1:n_areas + full_mask = or(full_mask,masks(i)); +end + +gab_mul = gen_gabmul_operator(dgt, idgt, full_mask); + +% figure mask +figure; +plot_mask(masks, dgt_params.hop, dgt_params.nbins, signal_params.fs); +title('Mask') +saveas(gcf,fullfile(fig_dir,['mask' num2str(sig_len), '.png'])); + +% ambiguity function +figure; +dynrange=90; + +plot_ambiguity_function(dgt_params.win,dgt, dgt_params, signal_params, dynrange) +title(['Ambiguity function - ', num2str(win_type)]); +saveas(gcf,fullfile(fig_dir,[ num2str(win_type) '_ambiguity_L_' num2str(sig_len), '.png'])); + +% +figure; +mask_proj = dgt(idgt(double(full_mask))); +plotdgtreal(mask_proj, dgt_params.hop, dgt_params.nbins, fs, dynrange); +title(['dgt(idgt(mask)) - ' num2str(win_type)]); +saveas(gcf,fullfile(fig_dir,[num2str(name) '_' num2str(win_type) '_' 'projected_mask.png.png'])); + + + +end \ No newline at end of file diff --git a/matlab/tfgm/scripts/solve_1area_cuicui.m b/matlab/tfgm/scripts/solve_1area_cuicui.m new file mode 100644 index 0000000000000000000000000000000000000000..759218d18a9709eb7338c2f9dd1a0d60bff6c5f0 --- /dev/null +++ b/matlab/tfgm/scripts/solve_1area_cuicui.m @@ -0,0 +1,461 @@ +clc; clear; close all; +% +% This script allows to reproduce the results of the paper time -frequency +% fading based on Gabor multiplier in the case bird + car +%% +dbstack; +%% +loc_source='bird'; +wideband_src='car'; +setting = 7; + +if setting == 1 + + win_type = 'hann'; + win_dur = 128/8000; + hop_ratio = 1/4; + nbins_ratio = 4; + tol_subregions = 0; + [alpha, seuil, radius] = set_smooth_mask_params(wideband_src, loc_source, win_type); + +elseif setting == 1.2 + + win_type = 'hann'; + win_dur = 128/8000; + hop_ratio = 1/4; + nbins_ratio = 4; + tol_subregions = 0; + [alpha, seuil, radius] = set_smooth_mask_params(wideband_src, loc_source, win_type); + +elseif setting == 1.3 + + win_type = 'hann'; + win_dur = 128/8000; + hop_ratio = 1/4; + nbins_ratio = 4; + tol_subregions = 0; + [alpha, seuil, radius] = set_smooth_mask_params(wideband_src, loc_source, win_type); + + +elseif setting == 1.5 + + win_type = 'hann'; + win_dur = 128/8000; + hop_ratio = 1/4; + nbins_ratio = 4; + tol_subregions = 0; + [alpha, seuil, radius] = set_smooth_mask_params(wideband_src, loc_source, win_type); + +elseif setting == 2 + + win_type = 'gauss'; + win_dur = 128 / 8000; + hop_ratio = 1 / 4; + nbins_ratio = 4; + tol_subregions = 0; + [alpha, seuil, radius] = set_smooth_mask_params(wideband_src, loc_source, win_type); + +elseif setting == 3 + + win_type = 'hann'; + win_dur = 128 / 8000; + hop_ratio = 1 / 4; + nbins_ratio = 4; + tol_subregions = 0; + [alpha, seuil, radius] = set_smooth_mask_params(wideband_src, loc_source, win_type); + +elseif setting == 4 + + win_type = 'hann'; + win_dur = 256 / 8000; + hop_ratio = 1 / 8; + nbins_ratio = 2; + tol_subregions = 0; + [alpha, seuil, radius] = set_smooth_mask_params(wideband_src, loc_source, win_type); + +elseif setting == 5 + + win_type = 'hann'; + win_dur = 512 / 8000; + hop_ratio = 1 / 4; + nbins_ratio = 4; + tol_subregions = 0; + [alpha, seuil, radius] = set_smooth_mask_params(wideband_src, loc_source, win_type); + +elseif setting == 6 + + win_type = 'hann'; + win_dur = 512 / 8000; + hop_ratio = 1 / 8; + nbins_ratio = 2; + tol_subregions = 0; + [alpha, seuil, radius] = set_smooth_mask_params(wideband_src, loc_source, win_type); + +elseif setting == 7 + + win_type = 'gauss'; + win_dur = 256/8000; + hop_ratio = 1 / 4; + nbins_ratio = 4; + tol_subregions = 0; + [alpha, seuil, radius] = set_smooth_mask_params(wideband_src, loc_source, win_type); + +elseif setting == 7.1 + + win_type = 'gauss'; + win_dur = 256 / 8000; + hop_ratio = 1 / 4; + nbins_ratio = 4; + tol_subregions = 0; + [alpha, seuil, radius] = set_smooth_mask_params(wideband_src, loc_source, win_type); + +elseif setting == 8 + + win_type = 'gauss'; + win_dur = 256 / 8000; + hop_ratio = 1 / 4; + nbins_ratio = 4; + tol_subregions = 0; + [alpha, seuil, radius] = set_smooth_mask_params(wideband_src, loc_source, win_type); + +elseif setting == 9 + + win_type = 'gauss'; + win_dur = 256 / 8000; + hop_ratio = 1 / 4; + nbins_ratio = 4; + tol_subregions = 0; + [alpha, seuil, radius] = set_smooth_mask_params(wideband_src, loc_source, win_type); + +elseif setting == 10 + + win_type = 'gauss'; + win_dur = 256 / 8000; + hop_ratio = 1 / 4; + nbins_ratio = 4; + tol_subregions = 0; + [alpha, seuil, radius] = set_smooth_mask_params(wideband_src, loc_source, win_type); +end + + +%% + +nb_areas='1area'; + +pwd; +fig_dir =['fig_solve_', nb_areas,'_car_cuicui_', win_type]; +if ~exist(fig_dir,'dir') + mkdir(fig_dir); +end +addpath(fig_dir); +%% + +gamma=0.7; + +[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); + + +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 + +mask_bool = mask; +[mask_labeled, n_areas,t_subregions] = get_nareas(mask_bool,dgt, idgt, dgt_params,..., + signal_params, fig_dir, tol_subregions); + + +%% Gabor multiplier and EVD decomposition + +[gabmul_list, mask_list] = get_P_gabmul(mask_labeled, dgt, idgt); + +x_mix = signals.mix; +tolerance_arrf = 1e-3; +proba_arrf = 1 - 1e-4; + + +[t_arrf,t_evdn, t_ut_x, rank_q, s_vec_list, u_mat_list,..., + ut_x_list,r] = compute_decomposition(x_mix, mask_list, gabmul_list,..., + tolerance_arrf, proba_arrf); + +%% plot mask + +figure('name','mask'); +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')); + +%% Plot eigenvalues +figure; + +for k_area=1:n_areas + txt = ['sub-region =' num2str(k_area)]; + plot(s_vec_list{k_area},'LineWidth',3, 'DisplayName',txt); + hold on; +end +xlabel('$k$','Interpreter','latex'); +ylabel('$\sigma[k]$','Interpreter','latex'); +set(gca,'YScale','log'); +grid; +legend show; +set(gca, 'FontSize', 25, 'fontName','Times'); +xlabel('$k$','Interpreter','latex'); +set(gca, 'FontSize', 25, 'fontName','Times'); +saveas(gcf,fullfile(fig_dir, 'gabmul_eigenvalues.pdf')); + +%% 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); + +%% Estimate energy and lambda + + +[lambda_est, t_est] = compute_lambda(x_mix, mask_labeled, dgt_params,..., + signal_params, dgt,s_vec_list, u_mat_list, ut_x_list,..., + gabmul_list,fig_dir); + +fprintf("Running time to tune lambda (est): \n") +disp(t_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_labeled, 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); + +is_wideband = @(lambda_coef) itakura_saito_dist_spectrum(x_wideband, x_rec(lambda_coef)); + + +%% sdr wideband + +l_range = 10.^linspace(-10,10,100); +sdr_wideband_l = zeros(length(l_range),1); +sdr_engine1area_l = zeros(length(l_range),1); + + +for k =1:length(l_range) + sdr_wideband_l(k) = sdr_wideband(l_range(k)); +end +figure; +plot(l_range,sdr_wideband_l, '-','LineWidth',3); +hold on; +plot(lambda_oracle,sdr_wideband(lambda_oracle),'gs','MarkerSize',12); +plot(lambda_est,sdr_wideband(lambda_est),'o','MarkerSize',12) +plot(lambda_true_energy,sdr_wideband(lambda_true_energy),'*','MarkerSize',12) +plot(1,sdr_wideband(1),'o','MarkerSize',12) +legend('SDR', 'TFF-O','TFF-1', 'TFF-E','Zero fill'); + +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 +is_wideband_l = zeros(length(l_range),1); + +figure; +for l =1: length(l_range) + is_wideband_l(l) = is_wideband(l_range(l)); +end +plot(l_range, is_wideband_l,'-','LineWidth',3) +plot(lambda_oracle, is_wideband(lambda_oracle), 'o','LineWidth',3) +plot(lambda_est, is_wideband(lambda_est), 'o') +plot(lambda_true_energy, is_wideband(lambda_true_energy),'o','LineWidth',3) +plot(1, is_wideband(1), 'o','LineWidth',3) + +xlabel('$\lambda$','Interpreter','latex') +ylabel('IS (dB)') +set(gca,'XScale','log'); +grid() +legend('SDR','TFF-O','TFF-1','TFF-E','Zero fill') +axis tight; +saveas(gcf,fullfile(fig_dir, 'tuning_lambda_IS.pdf')); + +%% plot both sdr and itakura saito in the same axis +figure; +yyaxis left; +plot(l_range, sdr_wideband_l, '-','LineWidth',3); hold on; +plot(lambda_est, sdr_wideband(lambda_est), 'o','LineWidth',3) +plot(lambda_true_energy, sdr_wideband(lambda_true_energy), 'bo','LineWidth',3) +plot(lambda_oracle, sdr_wideband(lambda_oracle), 'go','LineWidth',3) +plot(1, sdr_wideband(1), 'mo','LineWidth',3); +grid on; +xlabel('$\lambda$','Interpreter','latex') +ylabel('SDR (dB)') +set(gca,'XScale','log'); + + +yyaxis right; + +plot(l_range,is_wideband_l,'-','LineWidth',3); hold on; +plot(lambda_est, is_wideband(lambda_est), 'o','MarkerSize',3,'LineWidth',3) +plot(lambda_true_energy, is_wideband(lambda_true_energy),'bo','LineWidth',3) +plot(lambda_oracle, is_wideband(lambda_oracle), 'go','LineWidth',3) +plot(1, is_wideband(1), 'mo','LineWidth',3) + + + + +axis tight; +legend('SDR','TFF-1','TFF-E','TFF-O','Zero fill','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')); + + +%% 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); + +x_est = x_rec(lambda_est); +wav_write('x_est.wav', x_est, signal_params.fs); + +x_true_energy = x_rec(lambda_true_energy); +wav_write('x_true_energy.wav', x_true_energy, signal_params.fs); + + +x_zero = solver_tfgm_zero(tf_mat_mix, mask, idgt); +wav_write('x_zero_fill.wav', x_zero, signal_params.fs); + +x_interp= solver_tfgm_interp(tf_mat_mix, mask, idgt); +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); +sdr_zero = sdr(x_wideband, x_zero); +sdr_interp = sdr(x_wideband, x_interp); +sdr_mix = sdr(x_wideband, x_mix); + + +%% Itakura saito +is_oracle = itakura_saito_dist_spectrum(x_wideband,x_oracle); +is_est = itakura_saito_dist_spectrum(x_wideband,x_est); +is_true_energy = itakura_saito_dist_spectrum(x_wideband,x_true_energy); +is_zero = itakura_saito_dist_spectrum(x_wideband,x_zero) ; +is_mix= itakura_saito_dist_spectrum(x_wideband,x_mix) ; +is_interp= itakura_saito_dist_spectrum(x_wideband,x_interp); + +%% + + + +fprintf('Oracle lambda: %f\n', lambda_oracle); +fprintf('SDR for oracle lambda: %f dB\n',sdr_oracle); + + +fprintf('Estimated lambda: %f \n', lambda_est); +fprintf('SDR for estimated lambda: %f dB\n', sdr_est); + + +fprintf('True-energy lambda: %f \n', lambda_true_energy); +fprintf('SDR for true-energy lambda: %f dB\n', sdr_true_energy); + +fprintf('Zero filling SDR: %f dB\n', sdr_zero); +fprintf('Mix SDR: %f dB \n',sdr_mix); +fprintf('Interp + random phases filling SDR: %e dB\n',sdr_interp); + +%% + +figure; +plot_spectrogram(x_mix, dgt_params, signal_params, dgt); +title(['Mix SDR=' , num2str(sdr_mix,4),'dB ','IS= ',num2str(is_mix)]); +set(gca, 'FontSize', 20, 'fontName','Times'); +axis tight; +saveas(gcf,fullfile(fig_dir, 'mix.pdf')); + +figure; +plot_spectrogram(signals.wideband, dgt_params, signal_params, dgt); +title(['True source -', wideband_src]) +set(gca, 'FontSize', 20, 'fontName','Times'); +saveas(gcf,fullfile(fig_dir, 'spectrogram_true_wb_source.pdf')); + + +figure; +plot_spectrogram(x_zero, dgt_params, signal_params, dgt) +title(['Zero fill SDR= ', num2str(sdr_zero,4),'dB ', 'IS=', num2str(is_zero)]) +set(gca, 'FontSize', 20, 'fontName','Times'); +saveas(gcf,fullfile(fig_dir, 'spectrogram_zero_fill.pdf')); + + + + +figure; +plot_spectrogram(x_oracle, dgt_params, signal_params, dgt) +title(['TFF-O SDR= ', num2str(sdr_oracle,4), 'dB ','IS=', num2str(is_oracle)]) +set(gca, 'FontSize', 20, 'fontName','Times'); +axis tight; +saveas(gcf,fullfile(fig_dir,'spectrogram_TFF-O.pdf')); + + + + + +figure; +plot_spectrogram(x_est, dgt_params, signal_params, dgt) + + +title(['TFF-1 - SDR= ',num2str(sdr_est,4),'dB ','IS=',num2str(is_est)]) +set(gca, 'FontSize', 20, 'fontName','Times'); +axis tight; +saveas(gcf,fullfile(fig_dir, 'spectrogram_TFF-1.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')); +%% diff --git a/matlab/tfgm/scripts/solve_Narea_cuicui.m b/matlab/tfgm/scripts/solve_Narea_cuicui.m new file mode 100644 index 0000000000000000000000000000000000000000..e09a8e14c8f8c5f376e151f7485302cdce93c3ef --- /dev/null +++ b/matlab/tfgm/scripts/solve_Narea_cuicui.m @@ -0,0 +1,192 @@ +clc; clear; close all; +%Algo 2 +%% +pwd; +pathname ='solve_N_areas_cuicui'; +if ~exist('solve_N_areas_cuicui','dir') + mkdir('solve_N_areas_cuicui'); +end +addpath('solve_N_areas_cuicui') +% +%% +ind_loc = 5; % bird +ind_wd = 3; %car +deb_ind_loc = 0; % start for birdong +deb_ind_wd=0; % start for car +resampling_fs = 8000; % sampling frequency +sig_len = 16384; % siglen + +%% DGT params - signals - mask + +param_gauss = get_win_gauss_param(); % Gauss + +win_len = param_gauss.win_len; +win_type = param_gauss.win_type; +alpha = param_gauss.alpha; +seuil = param_gauss.seuil; +radius = param_gauss.radius; + +[signals, dgt_params, signal_params, mask, dgt,idgt] = get_mix(ind_loc, ..., + ind_wd, deb_ind_loc, deb_ind_wd, resampling_fs, sig_len,..., + win_len, win_type, alpha, seuil, radius); + +[mask_area, mask_area_ratio] = get_mask_area(mask); + +fprintf("We work with %s window of length %.f\n", win_type, win_len); + +fprintf("Gabor transform parameters are: \n") +fprintf('hop :%2.f\n', dgt_params.hop); +fprintf('n_bins: %2.f\n', dgt_params.nbins); + + +fprintf("The parameters for smoothing the mask are: \n") +fprintf("alpha = %f\n", alpha); +fprintf("seuil = %f\n", seuil); +fprintf("radius = %f\n", radius); + +figure; % window plot +plot_win(dgt_params.win, signal_params.fs, signal_params.sig_len, win_type) +title([num2str(win_type), ' - window']); +set(gca, 'FontSize', 20, 'fontName','Times'); +saveas(gcf,fullfile(pathname, [num2str(win_type),'_window.png'])); + +% mask plot + +figure('name','mask'); plot_spectrogram(mask, dgt_params,signal_params, dgt); +title(['mask : mask-area = ',num2str(mask_area)]); +set(gca, 'FontSize', 20, 'fontName','Times'); +saveas(gcf,fullfile(pathname, 'gauss_mask.png')); + +%% compute EVD decomposition + +[mask_labels, mask_area_list] = make_subregions(mask, dgt_params, signal_params); + + +%% +[gabmul_list, mask_list] = get_P_gabmul(mask_labels, dgt, idgt); + +%Halko params +tolerance_arrf = 1e-6; +proba_arrf = 1-1e-4; + +x_mix = signals.mix; % mix +masks = mask_list; + +% compute EVD usisng Halko +[t_arrf,t_evdn, t_ut_x, rank_q, s_vec_list, u_mat_list, ut_x_list, ..., + r] = compute_decomposition(x_mix, masks, gabmul_list, tolerance_arrf, proba_arrf); + + + +%% Plot eigenvalues +figure; + +for k=1:length(s_vec_list) + txt = ['Mask =' num2str(k)]; + plot(s_vec_list{k},'LineWidth',3, 'DisplayName',txt); + hold on; +end +xlabel('$k$','Interpreter','latex'); +ylabel('$\sigma[k]$','Interpreter','latex'); +set(gca,'YScale','log'); +grid; +legend show; +set(gca, 'FontSize', 20, 'fontName','Times'); +saveas(gcf,fullfile(pathname, 'gabmul_eigenvalues.png')) + +%% +x_engine = signals.target; +x_rec =@(lambda_vec) compute_estimate(lambda_vec, x_mix, s_vec_list, u_mat_list, ut_x_list); +obj_fun = @(lambda_vec) norm( x_engine - x_rec(lambda_vec)); + +sdr_engine = @(lambda_vec) sdr(x_engine, x_rec(lambda_vec)); + +%% +n_areas = length(s_vec_list); +tic; +lambda_vec_opt = fmincon(obj_fun, zeros(n_areas,1)); +t1 = toc; +%% +fprintf('Running time to tune lambda: %f \n ',t1) + + +%% Results + +tf_mat_mix = compute_dgt(signals.mix, dgt ); +x_est = x_rec(lambda_vec_opt); +wav_write('x_opt.wav', x_est, signal_params.fs); +x_zero = x_rec(ones(n_areas,1)); +x_interp= solver_tfgm_interp(tf_mat_mix, mask, idgt); + +%% Compute SDR +sdr_opt = sdr(x_engine, x_est); +sdr_zero = sdr(x_engine, x_zero); +sdr_mix = sdr(x_engine, x_mix); +sdr_interp = sdr(x_engine, x_interp); + +fprintf('Optimal SDR: %.f dB\n', sdr_opt); +fprintf('Zero filling SDR :%.f dB\n',sdr_zero) +fprintf('Mix SDR: %.1f dB\n',sdr_mix) + + +%% +fprintf('Optimal lambda: \n'); +disp(lambda_vec_opt) +fprintf('Optimal SDR: :%.2e dB\n', sdr_opt); +fprintf('Zero filling SDR: %.2e dB\n',sdr_zero); +fprintf('Mix SDR: %.2e dB\n',sdr_mix); +fprintf('Interp + random phases filling SDR: %e dB\n',sdr_interp); + +%% + +figure; +plot(lambda_vec_opt,'LineWidth',2) +ylabel('\lambda^*_k') +xlabel('k') +set(gca,'YScale','log'); +grid; +title(['Mix SDR= ', num2str(sdr_mix), 'dB']); +set(gca, 'FontSize', 20, 'fontName','Times'); +saveas(gcf,fullfile(pathname, 'lambda_opt.pdf')) + +%% +figure; +set(gcf,'position',[1, 1 550 950]); +subplot(321) +plot_spectrogram(signals.mix, dgt_params, signal_params, dgt); +title(['Mix SDR= ', num2str(sdr_mix), 'dB']); +set(gca, 'FontSize', 20, 'fontName','Times'); +axis square; +subplot(322) +plot_spectrogram(signals.target, dgt_params, signal_params, dgt); +title('True source') +set(gca, 'FontSize', 20, 'fontName','Times'); +axis square; +subplot(323) +plot_spectrogram(signals.noise, dgt_params, signal_params, dgt); +title('Perturbation') +set(gca, 'FontSize', 20, 'fontName','Times'); +axis square; +subplot(324) +plot_spectrogram(x_zero, dgt_params, signal_params, dgt); +title(['Zero fill SDR=', num2str(sdr_zero),'dB']) +set(gca, 'FontSize', 20, 'fontName','Times'); +axis square; +subplot(325) +plot_spectrogram(x_interp, dgt_params, signal_params, dgt); +title(['Interp SDR=', num2str(sdr_interp),'dB']) +set(gca, 'FontSize', 20, 'fontName','Times'); +axis square; +subplot(326) +plot_spectrogram(x_est, dgt_params, signal_params, dgt); +title(['\lambda^* SDR= ',num2str(sdr_opt),'dB']) +set(gca, 'FontSize', 20, 'fontName','Times'); +axis square; +saveas(gcf,fullfile(pathname, 'spectro_reconstruction.pdf')) + + + + + + + diff --git a/matlab/tfgm/scripts/solve_Pareas_cuicui.m b/matlab/tfgm/scripts/solve_Pareas_cuicui.m new file mode 100644 index 0000000000000000000000000000000000000000..6cdcaf7b176cf89cd575564b7ab3c12a6d7867f7 --- /dev/null +++ b/matlab/tfgm/scripts/solve_Pareas_cuicui.m @@ -0,0 +1,474 @@ +clc; clear; close all; + +%% +dbstack; +%% +loc_source='bird'; +wideband_src='car'; +setting = 7; + +if setting == 1 + + win_type = 'hann'; + win_dur = 128/8000; + hop_ratio = 1/4; + nbins_ratio = 4; + tol_subregions = 1e-5; + [alpha, seuil, radius] = set_smooth_mask_params(wideband_src, loc_source, win_type); + +elseif setting == 1.2 + + win_type = 'hann'; + win_dur = 128/8000; + hop_ratio = 1/4; + nbins_ratio = 4; + tol_subregions = 1e-5; + [alpha, seuil, radius] = set_smooth_mask_params(wideband_src, loc_source, win_type); + +elseif setting == 1.3 + + win_type = 'hann'; + win_dur = 128/8000; + hop_ratio = 1/4; + nbins_ratio = 4; + tol_subregions = 1e-5; + [alpha, seuil, radius] = set_smooth_mask_params(wideband_src, loc_source, win_type); + + +elseif setting == 1.5 + + win_type = 'hann'; + win_dur = 128/8000; + hop_ratio = 1/4; + nbins_ratio = 4; + tol_subregions = 1e-5; + [alpha, seuil, radius] = set_smooth_mask_params(wideband_src, loc_source, win_type); + +elseif setting == 2 + + win_type = 'gauss'; + win_dur = 128 / 8000; + hop_ratio = 1 / 4; + nbins_ratio = 4; + tol_subregions = 1e-5; + [alpha, seuil, radius] = set_smooth_mask_params(wideband_src, loc_source, win_type); + +elseif setting == 3 + + win_type = 'hann'; + win_dur = 128 / 8000; + hop_ratio = 1 / 4; + nbins_ratio = 4; + tol_subregions = 1e-5; + [alpha, seuil, radius] = set_smooth_mask_params(wideband_src, loc_source, win_type); + +elseif setting == 4 + + win_type = 'hann'; + win_dur = 256 / 8000; + hop_ratio = 1 / 8; + nbins_ratio = 2; + tol_subregions = 1e-5; + [alpha, seuil, radius] = set_smooth_mask_params(wideband_src, loc_source, win_type); + +elseif setting == 5 + + win_type = 'hann'; + win_dur = 512 / 8000; + hop_ratio = 1 / 4; + nbins_ratio = 4; + tol_subregions = 1e-5; + [alpha, seuil, radius] = set_smooth_mask_params(wideband_src, loc_source, win_type); + +elseif setting == 6 + + win_type = 'hann'; + win_dur = 512 / 8000; + hop_ratio = 1 / 8; + nbins_ratio = 2; + tol_subregions = 1e-5; + [alpha, seuil, radius] = set_smooth_mask_params(wideband_src, loc_source, win_type); + +elseif setting == 7 + + win_type = 'gauss'; + win_dur = 256/8000; + hop_ratio = 1 / 4; + nbins_ratio = 4; + tol_subregions = 1e-5; + [alpha, seuil, radius] = set_smooth_mask_params(wideband_src, loc_source, win_type); + +elseif setting == 7.1 + + win_type = 'gauss'; + win_dur = 256 / 8000; + hop_ratio = 1 / 4; + nbins_ratio = 4; + tol_subregions = 1e-5; + [alpha, seuil, radius] = set_smooth_mask_params(wideband_src, loc_source, win_type); + +elseif setting == 8 + + win_type = 'gauss'; + win_dur = 256 / 8000; + hop_ratio = 1 / 4; + nbins_ratio = 4; + tol_subregions = 1e-5; + [alpha, seuil, radius] = set_smooth_mask_params(wideband_src, loc_source, win_type); + +elseif setting == 9 + + win_type = 'gauss'; + win_dur = 256 / 8000; + hop_ratio = 1 / 4; + nbins_ratio = 4; + tol_subregions = 1e-5; + [alpha, seuil, radius] = set_smooth_mask_params(wideband_src, loc_source, win_type); + +elseif setting == 10 + + win_type = 'gauss'; + win_dur = 256 / 8000; + hop_ratio = 1 / 4; + nbins_ratio = 4; + tol_subregions = 1e-5; + [alpha, seuil, radius] = set_smooth_mask_params(wideband_src, loc_source, win_type); +end + + +%% + +nb_areas ='Paeras'; + +pwd; +fig_dir =['fig_solve_', nb_areas,'_car_cuicui_', win_type]; +if ~exist(fig_dir,'dir') + mkdir(fig_dir); +end +addpath(fig_dir); +%% + + + +gamma=0.7; + +[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); + + +fprintf('win_len:%.f\n', length(dgt_params.win)); +fprintf('hop:%.f\n', dgt_params.hop); +fprintf('n_bins:%.f\n', dgt_params.nbins); +%% +mask_bool = mask; +[mask_labeled, n_areas,t_subregions] = get_nareas(mask_bool,dgt, idgt, dgt_params,..., + signal_params, fig_dir, tol_subregions); + + +%% +[gabmul_list, mask_list] = get_P_gabmul(mask_labeled, dgt, idgt); + +x_mix = signals.mix; +tolerance_arrf = 1e-3; +proba_arrf = 1 - 1e-4; + + +[t_arrf,t_evdn, t_ut_x, rank_q, s_vec_list, u_mat_list,..., + ut_x_list,r] = compute_decomposition(x_mix, mask_list, gabmul_list,..., + tolerance_arrf, proba_arrf); + +%% plot mask + +figure('name','mask'); +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')); + +%% Plot eigenvalues +figure; + +for k_area=1:n_areas + txt = ['sub-region =' num2str(k_area)]; + plot(s_vec_list{k_area},'LineWidth',3, 'DisplayName',txt); + hold on; +end +xlabel('$k$','Interpreter','latex'); +ylabel('$\sigma[k]$','Interpreter','latex'); +set(gca,'YScale','log'); +grid; +legend show; +set(gca, 'FontSize', 25, 'fontName','Times'); +xlabel('$k$','Interpreter','latex'); +set(gca, 'FontSize', 25, 'fontName','Times'); +saveas(gcf,fullfile(fig_dir, 'gabmul_eigenvalues.pdf')); + +%% 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); + +%% Estimate energy and lambda + + +[lambda_est, t_lambda_est] = compute_lambda(x_mix, mask_labeled, dgt_params,..., + signal_params, dgt,s_vec_list, u_mat_list, ut_x_list,..., + gabmul_list,fig_dir); + +fprintf("Running time to tune lambda (est): \n") +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_labeled, 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); + +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); + +%% SDR for each aera + +l_range = 10.^linspace(-10,10,100); + +sdr_engine1area_l = zeros(length(l_range),1); + + +figure; +for k_area =1: n_areas + 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)]; + plot(lambda_oracle(k_area), sdr_wideband_1area(lambda_oracle(k_area), k_area),..., + '*','LineWidth',3,'DisplayName',txt1); + txt2 = ['TFF-P',num2str(k_area)]; + 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); + +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 +is_engine1area_l = zeros(length(l_range),1); + +figure; +for k_area =1: n_areas + 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)]; + plot(l_range, is_engine1area_l,'LineWidth',3,'DisplayName',txt) +end +hold on; +for k_area=1:n_areas + + 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) + + +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')); +%% +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')); + + +%% Reconstructec 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); + +x_est = x_rec(lambda_est); +wav_write('x_est.wav', x_est, signal_params.fs); + +x_true_energy = x_rec(lambda_true_energy); +wav_write('x_true_energy.wav', x_true_energy, signal_params.fs); + + +x_zero = solver_tfgm_zero(tf_mat_mix, mask, idgt); +wav_write('x_zero_fill.wav', x_zero, signal_params.fs); + +x_interp= solver_tfgm_interp(tf_mat_mix, mask, idgt); +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); +sdr_zero = sdr(x_wideband, x_zero); +sdr_interp = sdr(x_wideband, x_interp); +sdr_mix = sdr(x_wideband, x_mix); + + +%% Itakura saito +is_oracle = itakura_saito_dist_spectrum(x_wideband,x_oracle); +is_est = itakura_saito_dist_spectrum(x_wideband,x_est); +is_true_energy = itakura_saito_dist_spectrum(x_wideband,x_true_energy); +is_zero = itakura_saito_dist_spectrum(x_wideband,x_zero) ; +is_mix= itakura_saito_dist_spectrum(x_wideband,x_mix) ; +is_interp= itakura_saito_dist_spectrum(x_wideband,x_interp); + +%% + + + +fprintf('Oracle lambda: %f\n', lambda_oracle); +fprintf('SDR for oracle lambda: %f dB\n',sdr_oracle); + + +fprintf('Estimated lambda: %f \n', lambda_est); +fprintf('SDR for estimated lambda: %f dB\n', sdr_est); + + +fprintf('True-energy lambda: %f \n', lambda_true_energy); +fprintf('SDR for true-energy lambda: %f dB\n', sdr_true_energy); + +fprintf('Zero filling SDR: %f dB\n', sdr_zero); +fprintf('Mix SDR: %f dB \n',sdr_mix); +fprintf('Interp + random phases filling SDR: %e dB\n',sdr_interp); + +%% + +figure; +plot_spectrogram(x_mix, dgt_params, signal_params, dgt); +title(['Mix SDR=' , num2str(sdr_mix,4),'dB ','IS= ',num2str(is_mix)]); +set(gca, 'FontSize', 20, 'fontName','Times'); +axis tight; +saveas(gcf,fullfile(fig_dir, 'mix.pdf')); + +figure; +plot_spectrogram(signals.wideband, dgt_params, signal_params, dgt); +title(['True source -', wideband_src]) +set(gca, 'FontSize', 20, 'fontName','Times'); +saveas(gcf,fullfile(fig_dir, 'spectrogram_true_wb_source.pdf')); + + +figure; +plot_spectrogram(x_zero, dgt_params, signal_params, dgt) +title(['Zero fill SDR= ', num2str(sdr_zero,4),'dB ', 'IS=', num2str(is_zero)]) +set(gca, 'FontSize', 20, 'fontName','Times'); +saveas(gcf,fullfile(fig_dir, 'spectrogram_zero_fill.pdf')); + + + + +figure; +plot_spectrogram(x_oracle, dgt_params, signal_params, dgt) +title(['TFF-O SDR= ', num2str(sdr_oracle,4), 'dB ','IS=', num2str(is_oracle)]) +set(gca, 'FontSize', 20, 'fontName','Times'); +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)]) +set(gca, 'FontSize', 20, 'fontName','Times'); +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')); +%% diff --git a/matlab/tfgm/scripts/solve_all_Narea_algo2.m b/matlab/tfgm/scripts/solve_all_Narea_algo2.m new file mode 100644 index 0000000000000000000000000000000000000000..b7312df51b0e3eafd95088c47673bf02f51f6a3a --- /dev/null +++ b/matlab/tfgm/scripts/solve_all_Narea_algo2.m @@ -0,0 +1,348 @@ +clc; clear; close all; + +%Algo 2 pour toutes les simuls +%% +pwd; +pathname ='all_sig_Nareas'; +if ~exist('all_sig_Nareas','dir') + mkdir('all_sig_Nareas'); +end +addpath('all_sig_Nareas') + +%% +f = fopen('exp_Narea.csv', 'w'); +fprintf(f, '%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',..., + 't_evdn','t_ut_x','sdr_mix','sdr_interp', 'sdr_zero','sdr_est',..., + 'sdr_oracle'); +%% + +resampling_fs = 8000; % sampling frequency +sig_len = 16384; + +target_name ={'car','plane','train'}; +per_name = {'beeps','bird','clicks','pop'}; + +win_type_list = {'gauss','hann'}; +win_len_list = [256, 512]; + + +%% +for w=1:1%length(win_type_list) + +win_type = win_type_list{w}; +win_len=win_len_list(w); + +params = get_params(win_len, win_type); + + +for ind_wd=1:1%length(target_name) + fprintf("**************************************\n\n") + fprintf("I'am in the %.f ieme run. target source is:%s \n",ind_wd ,target_name{ind_wd}); + fprintf("**************************************\n\n") + for ind_loc=1:1%length(per_name) + fprintf("Perturbation source number %.f : %s \n", ind_loc,per_name{ind_loc}) ; + fprintf("**************************************\n\n") + + [radius, gain_mix_db,gain_loc_db, deb] = set_smooth_mask_params(ind_wd, ind_loc, win_type); + win_len = params.win_len; + win_type = params.win_type; + hop = params.hop ; + nbins = params.nbins ; + + + + deb_ind_wd=0; + deb_ind_loc=deb; + + + or_mask=1; + approx_win_len = win_len; + + + + [signals, dgt_params, signal_params, mask_bool, dgt,idgt] = get_mix(ind_loc, ..., + ind_wd, deb_ind_loc, deb_ind_wd, resampling_fs, sig_len,..., + approx_win_len,hop, nbins, win_type, gain_mix_db, gain_loc_db,radius,or_mask); + + + fprintf("We work with %s window of length %.f\n", win_type, win_len); + + fprintf("Gabor transform parameters are: \n") + fprintf('hop :%2.f\n', dgt_params.hop); + fprintf('n_bins: %2.f\n', dgt_params.nbins); + + + %% + figure; % window plot + plot_win(dgt_params.win, signal_params.fs, signal_params.sig_len, win_type) + title([num2str(win_type), ' - window']); + set(gca, 'FontSize', 20, 'fontName','Times'); + saveas(gcf,fullfile(pathname, [target_name{ind_wd},'_' per_name{ind_loc},'_' num2str(win_type),'_window.png'])); + + % mask plot + + [mask_area, mask_area_ratio] = get_mask_area(mask_bool); + figure('name','mask'); plot_spectrogram(mask_bool, dgt_params,signal_params, dgt); + title(['mask : mask-area = ',num2str(mask_area)]); + set(gca, 'FontSize', 20, 'fontName','Times'); + saveas(gcf,fullfile(pathname, [target_name{ind_wd},'_' per_name{ind_loc},'_' num2str(win_type),'_mask.png'])); + + %% + + tol_subregions = 1e-5; + [mask_labeled, n_areas] = get_nareas(mask_bool,dgt, idgt, dgt_params,..., + signal_params,tol_subregions); + + [gabmul_list, mask_list] = get_P_gabmul(mask_labeled, dgt, idgt); + + %% compute EVD decomposition + + %Halko params + tolerance_arrf = 1e-3; + proba_arrf = 1-1e-4; + + x_mix = signals.mix; % mix + masks = mask_list; + + % compute EVD usisng Halko + [t_arrf,t_evdn, t_ut_x, rank_q, s_vec_list, u_mat_list, ut_x_list, ..., + r] = compute_decomposition(x_mix, masks, gabmul_list, tolerance_arrf, proba_arrf); + + fprintf("Estimated rank is : %.f \n", rank_q); + + %% Plot eigenvalues + figure; + + for k=1:n_areas + txt = ['sub-region =' num2str(k)]; + plot(s_vec_list{k},'LineWidth',3, 'DisplayName',txt); + hold on; + end + xlabel('$k$','Interpreter','latex'); + ylabel('$\sigma[k]$','Interpreter','latex'); + set(gca,'YScale','log'); + grid; + legend show; + set(gca, 'FontSize', 20, 'fontName','Times'); + xlabel('$k$','Interpreter','latex'); + set(gca, 'FontSize', 20, 'fontName','Times'); + + saveas(gcf,fullfile(pathname,..., + [target_name{ind_wd},'_' per_name{ind_loc},'_' 'gabmul_eigenvalues.png'])); + + %% find optimal lambda (best SDR) + x_target = signals.target; + [lambda_oracle, t_oracle] = compute_lambda_oracle_sdr(x_target, x_mix,..., + s_vec_list, u_mat_list, ut_x_list); + + fprintf("Running time to tune lambda (oracle): %f \n",t_oracle); + %% estimate energy and lambda -our method + [lambda_est, t_est] = compute_lambda(x_mix, mask_labeled, dgt_params,..., + signal_params, dgt,s_vec_list, u_mat_list, ut_x_list,..., + gabmul_list); + + fprintf("Running time to tune lambda (est): %f \n",t_est); + + + + %% estimate lambda from true energy + + n_areas = length(s_vec_list); + e_target_true_energy = zeros(n_areas,1); + x_engine_tf_mat = dgt(gabmul_list{1}(x_target)); + + for k_area =1:n_areas + mask_k = (mask_labeled==k_area); + x_engine_tf_masked = mask_k .* x_engine_tf_mat; + + e_target_true_energy(k_area) =norm(x_engine_tf_masked, 'fro').^2; + end + e_target = e_target_true_energy; + + [lambda_true_energy, t_true_energy] = compute_lambda(x_mix, mask_labeled, dgt_params,..., + signal_params, dgt, s_vec_list, u_mat_list, ut_x_list,..., + gabmul_list, e_target); + + fprintf("Running time to tune lambda (True): %f \n",t_true_energy); + + + + %% Results + + x_est = @(lambda_coef)compute_estimate(lambda_coef, x_mix,s_vec_list, u_mat_list, ut_x_list); + + x_engine = signals.target; + sdr_engine = @(lambda_coef)sdr(x_engine, x_est(lambda_coef)); + + % + tf_mat_mix = compute_dgt(signals.mix, dgt ); + + %interpolation + x_interp= solver_tfgm_interp(tf_mat_mix, mask_bool, idgt); + + %zero fill + x_zero = solver_tfgm_zero(tf_mat_mix, mask_bool, idgt); + sdr_zero = sdr(x_engine, x_zero); + sdr_interp = sdr(x_engine, x_interp); + + %% + figure; + l_range = 10.^(linspace(-10,10,100)); + sdr_engine_l = zeros(length(l_range),1); + + for l =1:length(l_range) + sdr_engine_l(l) = sdr_engine(l_range(l)); + end + semilogx(l_range,sdr_engine_l, '-', 'LineWidth',3); + hold on; + semilogx(l_range,sdr_engine(lambda_oracle)*ones(length(l_range),1), 'r-','LineWidth',3) + semilogx(l_range,sdr_engine(lambda_est)*ones(length(l_range),1), 'm-', 'LineWidth',3) + %semilogx(l_range,sdr_engine(lambda_true_energy)*ones(length(l_range),1), 'g-','LineWidth',3) + semilogx(l_range,sdr_zero*ones(length(l_range),1), 'c-', 'LineWidth',3); + semilogx(l_range,sdr_interp*ones(length(l_range),1), 'b-', 'LineWidth',3); + xlabel('$\lambda$','Interpreter','latex') + ylabel('SDR(dB)') + set(gca,'XScale','log'); + grid on; + set(gca, 'FontSize', 20, 'fontName','Times'); + legend('SDR', 'Oracle SDR','Estimate','Zerofill',..., + 'Interp','Location','southeast') + + + %% Reconstructed signals + + x_oracle = x_est(lambda_oracle); + wav_write('x_oracle.wav', x_oracle, signal_params.fs); + + x_rec = x_est(lambda_est); + wav_write('x_est.wav', x_rec, signal_params.fs); + + x_true_energy = x_est(lambda_true_energy); + wav_write('x_true_energy.wav', x_true_energy, signal_params.fs); + + + x_zero = solver_tfgm_zero(tf_mat_mix, mask_bool, idgt); + wav_write('x_zero_fill.wav', x_zero, signal_params.fs); + + %x_interp + x_interp= solver_tfgm_interp(tf_mat_mix, mask_bool, idgt); + wav_write('x_interp.wav', x_interp, signal_params.fs); + %sdr + + sdr_oracle = sdr(x_engine, x_oracle); + sdr_rec = sdr(x_engine, x_rec); + sdr_true_energy = sdr(x_engine, x_true_energy); + sdr_zero = sdr(x_engine, x_zero); + sdr_interp = sdr(x_engine, x_interp); + sdr_mix = sdr(x_engine, x_mix); + + %% Itakura saito +% is_true = itakura_saito_dist_spectrum(x_target,x_true_energy); +% is_zero = itakura_saito_dist_spectrum(x_target,x_zero) ; +% is_mix= itakura_saito_dist_spectrum(x_target,x_mix) ; +% is_tff= itakura_saito_dist_spectrum(x_target,x_rec) ; +% is_interp= itakura_saito_dist_spectrum(x_target,x_interp); +% + + + %% + % print + + + fprintf('Oracle lambda: %f\n', lambda_oracle); + fprintf('True-energy lambda: %f \n', lambda_true_energy); + fprintf('Estimated lambda: %f \n', lambda_est); + + + fprintf('SDR for oracle lambda: %f dB\n',sdr_oracle); + fprintf('SDR for estimated lambda: %f dB\n', sdr_rec); + fprintf('SDR for true-energy lambda: %f dB\n', sdr_true_energy); + fprintf('Zero filling SDR: %f dB\n', sdr_zero); + fprintf('Mix SDR: %f dB \n',sdr_mix); + fprintf('Interp + random phases filling SDR: %e dB\n',sdr_interp); + %% + x_per = signals.noise; + figure; + plot_spectrogram(x_mix, dgt_params, signal_params, dgt) + title(['Mix SDR=' , num2str(sdr_mix),'dB']); + set(gca, 'FontSize', 20, 'fontName','Times'); + saveas(gcf,fullfile(pathname, [target_name{ind_wd},'_' per_name{ind_loc},'_','mix.pdf'])); + + figure; + plot_spectrogram(x_target, dgt_params, signal_params, dgt); + title(['True source -',target_name{ind_wd}]) + set(gca, 'FontSize', 20, 'fontName','Times'); + saveas(gcf,fullfile(pathname, [target_name{ind_wd},'_' per_name{ind_loc},'_', 'spectrogram_true_wb_source.pdf'])); + + figure; + plot_spectrogram(x_per, dgt_params, signal_params, dgt); + title(['Pertur -',per_name{ind_loc}]) + set(gca, 'FontSize', 20, 'fontName','Times'); + saveas(gcf,fullfile(pathname, [target_name{ind_wd},'_' per_name{ind_loc},'_', 'spectrogram_true_wb_source.pdf'])); + + + figure; + plot_spectrogram(x_zero, dgt_params, signal_params, dgt) + title(['Zero fill SDR= ', num2str(sdr_zero),'dB']) + set(gca, 'FontSize', 20, 'fontName','Times'); + saveas(gcf,fullfile(pathname, [target_name{ind_wd},'_' per_name{ind_loc},'_' ,'spectrogram_zero_fill.pdf'])); + + + + + figure; + plot_spectrogram(x_oracle, dgt_params, signal_params, dgt) + title(['\lambda_{opt} SDR= ', num2str(sdr_oracle), 'dB']) + set(gca, 'FontSize', 20, 'fontName','Times'); + saveas(gcf,fullfile(pathname, [target_name{ind_wd},'_' per_name{ind_loc},'_','spectrogram_oracle_sdr.pdf'])); + + + figure; + plot_spectrogram(x_rec, dgt_params, signal_params, dgt) + title(['Estimated \lambda SDR= ', num2str(sdr_rec),'dB']) + set(gca, 'FontSize', 20, 'fontName','Times'); + saveas(gcf,fullfile(pathname, [target_name{ind_wd},'_' per_name{ind_loc},'_','spectrogram_tff_estimate.pdf'])); + + + figure; + plot_spectrogram(x_true_energy, dgt_params, signal_params, dgt) + title(['True energy \lambda SDR= ',num2str(sdr_true_energy),'dB']) + set(gca, 'FontSize', 20, 'fontName','Times'); + saveas(gcf,fullfile(pathname, [target_name{ind_wd},'_' per_name{ind_loc},'_','spectrogram_oracle_true_energy.pdf'])); + + + figure; + plot_spectrogram(x_interp, dgt_params, signal_params,dgt) + title(['interp SDR= ', num2str(sdr_interp),'dB']) + set(gca, 'FontSize', 20, 'fontName','Times'); + saveas(gcf,fullfile(pathname, [target_name{ind_wd},'_' per_name{ind_loc},'_' ,'spectrogram_interp.pdf'])); + %% + + fprintf(f,'%s %s %s %.3f %.3f %.3f %.3f %.3f %.3f %.3f %.3f %.3f %.3f %.3f %.3f \n',..., + target_name{ind_wd},per_name{ind_loc},win_type_list{w},win_len_list(w),t_oracle,t_true_energy,..., + t_est,t_arrf,t_evdn,t_ut_x,sdr_mix, sdr_interp,..., + sdr_zero,sdr_rec,sdr_oracle); + + + + + %% + + file_name = ['exp_Nregions',target_name{ind_wd},'_',per_name{ind_loc},'_','.mat']; + save(file_name,'ind_wd','ind_loc','resampling_fs','sig_len','radius', ..., + 'deb_ind_loc', 'deb_ind_wd','win_len','win_type', 'signals', 'dgt_params', ..., + 'signal_params', 'mask_bool', 'dgt','idgt','mask_area', 'mask_area_ratio',..., + 'gabmul_list','mask_list','tolerance_arrf', 'proba_arrf', 't_arrf', 't_evdn',..., + 't_ut_x', 'rank_q', 's_vec_list', 'u_mat_list', 'ut_x_list','r',...., + 'lambda_est', 't_true_energy','e_target_true_energy','e_target','lambda_true_energy',..., + 'lambda_oracle', 't_oracle','x_oracle','x_rec','x_true_energy','x_zero',..., + 'x_interp', 'sdr_mix', 'sdr_oracle','sdr_true_energy', 'sdr_zero', 'sdr_interp'); + + end + + +end +end + +fclose(f); \ No newline at end of file diff --git a/matlab/tfgm/scripts/solve_all_tff1.m b/matlab/tfgm/scripts/solve_all_tff1.m new file mode 100644 index 0000000000000000000000000000000000000000..e684bfbe2042ea7dd45d4d6c286cbbacc56ea268 --- /dev/null +++ b/matlab/tfgm/scripts/solve_all_tff1.m @@ -0,0 +1,375 @@ +clc; clear; close all; + +%% +wb_list ={'car','plane','train'}; +loc_list = {'beeps','bird','clicks','finger_snaps','modulations'}; +win_list = {'gauss 256', 'hann 512'}; + + +tol_subregions = 0; +gamma=0.7; +%% + +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',..., + '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) + + [win_type, win_dur, win_len, hop_ratio, nbins_ratio] = get_win_params(win_list{win}); + + fprintf("window: %s - length: %.f\n", win_type, win_len); + for wb = 1:1%length(wb_list) + wideband_src = wb_list{wb}; + fprintf("**************************************\n\n") + fprintf("This is the %.f ieme run. wideband source is:%s \n",wb ,wb_list{wb}); + fprintf("**************************************\n\n") + for loc=1:1%length(loc_list) + + pwd; + fig_dir =['fig_', wb_list{wb},'_',loc_list{loc},'_', 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); + + + [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); + + + 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 + + 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; + tolerance_arrf = 1e-3; + proba_arrf = 1 - 1e-4; + + + [t_arrf,t_evdn, t_ut_x, rank_q, s_vec_list, u_mat_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); + figure('name','mask'); + plot_spectrogram(mask, dgt_params,signal_params, dgt); + title(['mask : mask-area = ',num2str(mask_area)]); + set(gca, 'FontSize', 20, 'fontName','Times'); + saveas(gcf,fullfile(fig_dir,'mask.pdf')); + + + %% Plot eigenvalues + figure; + + for k_area=1:n_areas + txt = ['sub-region =' num2str(k_area)]; + plot(s_vec_list{k_area},'LineWidth',3, 'DisplayName',txt); + hold on; + end + xlabel('$k$','Interpreter','latex'); + ylabel('$\sigma[k]$','Interpreter','latex'); + set(gca,'YScale','log'); + grid; + legend show; + set(gca, 'FontSize', 25, 'fontName','Times'); + xlabel('$k$','Interpreter','latex'); + set(gca, 'FontSize', 25, 'fontName','Times'); + saveas(gcf,fullfile(fig_dir, 'gabmul_eigenvalues.pdf')); + + + + %% 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); + + %% Estimate energy and lambda + + [lambda_est, t_est] = compute_lambda(x_mix, mask, dgt_params,..., + signal_params, dgt,s_vec_list, u_mat_list, ut_x_list,..., + gabmul_list,fig_dir); + + fprintf("Running time to tune lambda (est): %f \n",t_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): %f \n",t_true_energy); + + + %% Results + + x_wideband = signals.wideband; + sdr_wideband = @(lambda_coef)sdr(x_wideband, x_rec(lambda_coef)); + + sdr_wideband_1area = @(lambda_coef)sdr_engine_1area(lambda_coef, signals, k_area,..., + n_areas,s_vec_list, u_mat_list, ut_x_list); + + is_wideband = @(lambda_coef) itakura_saito_dist_spectrum(x_wideband, x_rec(lambda_coef)); + + + + %% sdr wideband + + l_range = 10.^linspace(-10,10,100); + sdr_wideband_l = zeros(length(l_range),1); + sdr_engine1area_l = zeros(length(l_range),1); + + + for k =1:length(l_range) + sdr_wideband_l(k) = sdr_wideband(l_range(k)); + end + figure; + plot(l_range,sdr_wideband_l, '-','LineWidth',3); + hold on; + plot(lambda_oracle,sdr_wideband(lambda_oracle),'gs','MarkerSize',12); + plot(lambda_est,sdr_wideband(lambda_est),'o','MarkerSize',12) + plot(lambda_true_energy,sdr_wideband(lambda_true_energy),'*','MarkerSize',12) + plot(1,sdr_wideband(1),'o','MarkerSize',12) + legend('SDR', 'TFF-O','TFF-1', 'TFF-E','Zero fill'); + + 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 + is_wideband_l = zeros(length(l_range),1); + + figure; + for l =1: length(l_range) + is_wideband_l(l) = is_wideband(l_range(l)); + end + plot(l_range, is_wideband_l,'-','LineWidth',3) + plot(lambda_oracle, is_wideband(lambda_oracle), 'o','LineWidth',3) + plot(lambda_est, is_wideband(lambda_est), 'o') + plot(lambda_true_energy, is_wideband(lambda_true_energy),'o','LineWidth',3) + plot(1, is_wideband(1), 'o','LineWidth',3) + + xlabel('$\lambda$','Interpreter','latex') + ylabel('IS (dB)') + set(gca,'XScale','log'); + grid() + legend('SDR','TFF-O','TFF-1','TFF-E','Zero fill') + axis tight; + saveas(gcf,fullfile(fig_dir, 'tuning_lambda_IS.pdf')); + + %% plot both sdr and itakura saito in the same axis + figure; + yyaxis left; + plot(l_range, sdr_wideband_l, '-','LineWidth',3); hold on; + plot(lambda_est, sdr_wideband(lambda_est), 'o','MarkerSize',3,'LineWidth',3) + plot(lambda_true_energy, sdr_wideband(lambda_true_energy), 'bo','LineWidth',3) + plot(lambda_oracle, sdr_wideband(lambda_oracle), 'go','LineWidth',3) + plot(1, sdr_wideband(1), 'mo','LineWidth',3); + grid on; + xlabel('$\lambda$','Interpreter','latex') + ylabel('SDR (dB)') + set(gca,'XScale','log'); + + + yyaxis right; + + plot(l_range,is_wideband_l,'-','LineWidth',3); hold on; + plot(lambda_est, is_wideband(lambda_est), 'o','MarkerSize',3,'LineWidth',3) + plot(lambda_true_energy, is_wideband(lambda_true_energy),'bo','LineWidth',3) + plot(lambda_oracle, is_wideband(lambda_oracle), 'go','LineWidth',3) + plot(1, is_wideband(1), 'mo','LineWidth',3) + + + + + axis tight; + legend('SDR','TFF-1','TFF-E','TFF-O','Zero fill','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')); + + + %% 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); + + x_est = x_rec(lambda_est); + wav_write('x_est.wav', x_est, signal_params.fs); + + x_true_energy = x_rec(lambda_true_energy); + wav_write('x_true_energy.wav', x_true_energy, signal_params.fs); + + + x_zero = solver_tfgm_zero(tf_mat_mix, mask, idgt); + wav_write('x_zero_fill.wav', x_zero, signal_params.fs); + + x_interp= solver_tfgm_interp(tf_mat_mix, mask, idgt); + 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); + sdr_zero = sdr(x_wideband, x_zero); + sdr_interp = sdr(x_wideband, x_interp); + sdr_mix = sdr(x_wideband, x_mix); + + + %% Itakura saito + is_oracle = itakura_saito_dist_spectrum(x_wideband,x_oracle); + is_est = itakura_saito_dist_spectrum(x_wideband,x_est); + is_true_energy = itakura_saito_dist_spectrum(x_wideband,x_true_energy); + is_zero = itakura_saito_dist_spectrum(x_wideband,x_zero) ; + is_mix= itakura_saito_dist_spectrum(x_wideband,x_mix) ; + is_interp= itakura_saito_dist_spectrum(x_wideband,x_interp); + + %% + + + + fprintf('Oracle lambda: %f\n', lambda_oracle); + fprintf('SDR for oracle lambda: %f dB\n',sdr_oracle); + + + fprintf('Estimated lambda: %f \n', lambda_est); + fprintf('SDR for estimated lambda: %f dB\n', sdr_est); + + + fprintf('True-energy lambda: %f \n', lambda_true_energy); + fprintf('SDR for true-energy lambda: %f dB\n', sdr_true_energy); + + fprintf('Zero filling SDR: %f dB\n', sdr_zero); + fprintf('Mix SDR: %f dB \n',sdr_mix); + fprintf('Interp + random phases filling SDR: %e dB\n',sdr_interp); + + %% + + figure; + plot_spectrogram(x_mix, dgt_params, signal_params, dgt); + title(['Mix SDR=' , num2str(sdr_mix,4),'dB ','IS= ',num2str(is_mix)]); + set(gca, 'FontSize', 20, 'fontName','Times'); + axis tight; + saveas(gcf,fullfile(fig_dir, 'mix.pdf')); + + figure; + plot_spectrogram(signals.wideband, dgt_params, signal_params, dgt); + title(['True source -', wideband_src]) + set(gca, 'FontSize', 20, 'fontName','Times'); + saveas(gcf,fullfile(fig_dir, 'spectrogram_true_wb_source.pdf')); + + + figure; + plot_spectrogram(x_zero, dgt_params, signal_params, dgt) + title(['Zero fill SDR= ', num2str(sdr_zero,4),'dB ', 'IS=', num2str(is_zero)]) + set(gca, 'FontSize', 20, 'fontName','Times'); + saveas(gcf,fullfile(fig_dir, 'spectrogram_zero_fill.pdf')); + + + + + figure; + plot_spectrogram(x_oracle, dgt_params, signal_params, dgt) + title(['TFF-O SDR= ', num2str(sdr_oracle,4), 'dB ','IS=', num2str(is_oracle)]) + set(gca, 'FontSize', 20, 'fontName','Times'); + axis tight; + saveas(gcf,fullfile(fig_dir,'spectrogram_TFF-O.pdf')); + + + + + + figure; + plot_spectrogram(x_est, dgt_params, signal_params, dgt) + + + title(['TFF-1 - SDR= ',num2str(sdr_est,4),'dB ','IS=',num2str(is_est)]) + set(gca, 'FontSize', 20, 'fontName','Times'); + axis tight; + saveas(gcf,fullfile(fig_dir, 'spectrogram_TFF-1.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,..., + 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/solve_all_tffP.m b/matlab/tfgm/scripts/solve_all_tffP.m new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/matlab/tfgm/scripts/solve_p1area_cuicui.m b/matlab/tfgm/scripts/solve_p1area_cuicui.m new file mode 100644 index 0000000000000000000000000000000000000000..41f5d1cbd10723ee76be16b791942f1a905ef06d --- /dev/null +++ b/matlab/tfgm/scripts/solve_p1area_cuicui.m @@ -0,0 +1,412 @@ + +clc; clear; close all; +% Algo 1 +%% +pwd; +pathname ='solve_1area_cuicui'; +if ~exist('solve_1area_cuicui','dir') + mkdir('solve_1area_cuicui'); +end +addpath('solve_1area_cuicui') + + +%% +fs = 8000; % sampling frequency +sig_len = 16384; % siglen + +%% DGT params - signals - mask +close all + +win_len = 512; +win_type = 'hann'; +params = get_params(win_len, win_type);%Gauss + +win_len = params.win_len; +win_type = params.win_type; +hop = params.hop; +nbins = params.nbins; + +wideband_src = 'car'; +loc_source='modulations'; + +win_dur=win_len/8000; +hop_ratio=1/8; +nbins_ratio = 2; + +[alpha, seuil, radius] = set_smooth_mask_params(wideband_src, loc_source, win_type); +gamma=0.7; +fig_dir = pathname; + + [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); + + +%% +[mask_area, mask_area_ratio] = get_mask_area(mask); + +fprintf("We work with %s window of length %.f\n", win_type, win_len); + +fprintf("Gabor transform parameters are: \n") +fprintf('hop :%2.f\n', dgt_params.hop); +fprintf('n_bins: %2.f\n', dgt_params.nbins); + + +fprintf("The parameters for smoothing the mask are: \n") +fprintf("alpha = %f\n", alpha); +fprintf("seuil = %f\n", seuil); +fprintf("radius = %f\n", radius); + +figure; % window plot +plot_win(dgt_params.win, signal_params.fs, signal_params.sig_len, win_type) +title([num2str(win_type), ' - window']); +set(gca, 'FontSize', 20, 'fontName','Times'); +saveas(gcf,fullfile(pathname, [num2str(win_type),'_window.png'])); + + + + + + +%% plot mask + +figure('name','mask'); plot_spectrogram(mask, dgt_params,signal_params, dgt); +title(['mask : mask-area = ',num2str(mask_area)]); +set(gca, 'FontSize', 20, 'fontName','Times'); +saveas(gcf,fullfile(pathname, 'gauss_mask.png')); + + + +%% +mask_bool = mask; +tol_subregions = 0; +[mask_labeled, n_areas,t_subregions] = get_nareas(mask_bool,dgt, idgt, dgt_params,..., + signal_params, fig_dir,tol_subregions); + + +[gabmul_list, mask_list] = get_P_gabmul(mask_labeled, dgt, idgt); + +x_mix = signals.mix; +tolerance_arrf = 1e-3; +proba_arrf = 1 - 1e-4; + + +[t_arrf,t_evdn, t_ut_x, rank_q, s_vec_list, u_mat_list,..., + ut_x_list,r] = compute_decomposition(x_mix, mask_list, gabmul_list,..., + tolerance_arrf, proba_arrf); + +%% plot mask + +figure('name','mask'); +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')); + +%% Plot eigenvalues +figure; + +for k_area=1:n_areas + txt = ['sub-region =' num2str(k_area)]; + plot(s_vec_list{k_area},'LineWidth',3, 'DisplayName',txt); + hold on; +end +xlabel('$k$','Interpreter','latex'); +ylabel('$\sigma[k]$','Interpreter','latex'); +set(gca,'YScale','log'); +grid; +legend show; +set(gca, 'FontSize', 25, 'fontName','Times'); +xlabel('$k$','Interpreter','latex'); +set(gca, 'FontSize', 25, 'fontName','Times'); +saveas(gcf,fullfile(fig_dir, 'gabmul_eigenvalues.pdf')); + +%% 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); + +%% Estimate energy and lambda + + +[lambda_est, t_est] = compute_lambda(x_mix, mask_labeled, dgt_params,..., + signal_params, dgt,s_vec_list, u_mat_list, ut_x_list,..., + gabmul_list,fig_dir); + +fprintf("Running time to tune lambda (est): %f \n",t_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_labeled, 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): %f \n",t_true_energy); + + +%% Results + +x_wideband = signals.wideband; +sdr_wideband = @(lambda_coef)sdr(x_wideband, x_rec(lambda_coef)); + +sdr_wideband_1area = @(lambda_coef)sdr_engine_1area(lambda_coef, signals, k_area,..., + n_areas,s_vec_list, u_mat_list, ut_x_list); + +is_wideband = @(lambda_coef) itakura_saito_dist_spectrum(x_wideband, x_rec(lambda_coef)); + + + +%% + +l_range = 10.^linspace(-10,10,100); +sdr_wideband_l = zeros(length(l_range),1); +sdr_engine1area_l = zeros(length(l_range),1); + + +if tol_subregions==0 + for k =1:length(l_range) + sdr_wideband_l(k) = sdr_wideband(l_range(k)); + end + figure; + plot(l_range,sdr_wideband_l, '-','LineWidth',3); + hold on; + plot(lambda_oracle,sdr_wideband(lambda_oracle),'gs','MarkerSize',12); + plot(lambda_est,sdr_wideband(lambda_est),'o','MarkerSize',12) + plot(lambda_true_energy,sdr_wideband(lambda_true_energy),'*','MarkerSize',12) + plot(1,sdr_wideband(1),'o','MarkerSize',12) + + + +else + + + figure; + for k_area =1: n_areas + for k=1:length(l_range) + sdr_engine1area_l(k) = sdr_engine_1area(k, k_area); + end + txt = ['SDR sub-reg =' num2str(k)]; + end + + plot(l_range, sdr_engine1area_l,'_','LineWidth',3,'DisplayName',txt) + for k_area =1:n_areas + txt1 = ['TFF-O ',num2str(k_area)]; + plot(lambda_oracle(k_area), sdr_engine_1area(lambda_oracle(k_area), k_area),..., + '*','LineWidth',3,'DisplayName',txt1); + txt2 = ['TFF-P',num2str(k_area)]; + plot(lambda_est(k_area),sdr_engine_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_engine_1area(lambda_true_energy(k_area), k_area),..., + 'o','LineWidth',3,'DisplayName',txt3); + txt4 = ['Zero fill',num2str(k_area)]; + plot(1, sdr_engine_1area(1, k_area), 'o','LineWidth',3,'DisplayName',txt4); + + end +end +xlabel('$\lambda$','Interpreter','latex') +ylabel('SDR(dB)') +set(gca,'XScale','log'); +grid on; +set(gca, 'FontSize', 20, 'fontName','Times'); +legend('SDR', 'TFF-O','TFF-1', 'TFF-E','Zero fill') +saveas(gcf,fullfile(fig_dir, 'tuning_lambda.pdf')); + + +%% +is_wideband_l = zeros(length(l_range),1); +if tol_subregions ==0 + figure; + for l =1: length(l_range) + is_wideband_l(l) = is_wideband(l_range(l)); + end + plot(l_range, is_wideband_l,'-','LineWidth',3) + plot(lambda_oracle, is_wideband(lambda_oracle), 'o','LineWidth',3) + plot(lambda_est, is_wideband(lambda_est), 'o') + plot(lambda_true_energy, is_wideband(lambda_true_energy),'o','LineWidth',3) + plot(1, is_wideband(1), 'o','LineWidth',3) + + xlabel('$\lambda$','Interpreter','latex') + ylabel('IS (dB)') + set(gca,'XScale','log'); + grid() + legend('SDR','TFF-O','TFF-1','TFF-E','Zero fill') + axis tight; + saveas(gcf,fullfile(fig_dir, 'tuning_lambda_IS.pdf')); + + %% + figure; + yyaxis left; + plot(l_range, sdr_wideband_l, '-','LineWidth',3); hold on; + plot(lambda_est, sdr_wideband(lambda_est), 'o','MarkerSize',3,'LineWidth',3) + plot(lambda_true_energy, sdr_wideband(lambda_true_energy), 'bo','LineWidth',3) + plot(lambda_oracle, sdr_wideband(lambda_oracle), 'go','LineWidth',3) + plot(1, sdr_wideband(1), 'mo','LineWidth',3); + grid on; + xlabel('$\lambda$','Interpreter','latex') + ylabel('SDR (dB)') + set(gca,'XScale','log'); + + + + yyaxis right; + + plot(l_range,is_wideband_l,'-','LineWidth',3); hold on; + plot(lambda_est, is_wideband(lambda_est), 'o','MarkerSize',3,'LineWidth',3) + plot(lambda_true_energy, is_wideband(lambda_true_energy),'bo','LineWidth',3) + plot(lambda_oracle, is_wideband(lambda_oracle), 'go','LineWidth',3) + plot(1, is_wideband(1), 'mo','LineWidth',3) + + + + axis tight; + legend('SDR','TFF-1','TFF-E','TFF-O','Zero fill','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')); +% +end + +%% Reconstructec 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); + +x_est = x_rec(lambda_est); +wav_write('x_est.wav', x_est, signal_params.fs); + +x_true_energy = x_rec(lambda_true_energy); +wav_write('x_true_energy.wav', x_true_energy, signal_params.fs); + + +x_zero = solver_tfgm_zero(tf_mat_mix, mask, idgt); +wav_write('x_zero_fill.wav', x_zero, signal_params.fs); + +x_interp= solver_tfgm_interp(tf_mat_mix, mask, idgt); +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); +sdr_zero = sdr(x_wideband, x_zero); +sdr_interp = sdr(x_wideband, x_interp); +sdr_mix = sdr(x_wideband, x_mix); + + +%% Itakura saito +is_oracle = itakura_saito_dist_spectrum(x_wideband,x_oracle); +is_est = itakura_saito_dist_spectrum(x_wideband,x_est); +is_true_energy = itakura_saito_dist_spectrum(x_wideband,x_true_energy); +is_zero = itakura_saito_dist_spectrum(x_wideband,x_zero) ; +is_mix= itakura_saito_dist_spectrum(x_wideband,x_mix) ; +is_interp= itakura_saito_dist_spectrum(x_wideband,x_interp); + +%% + + + +fprintf('Oracle lambda: %f\n', lambda_oracle); +fprintf('SDR for oracle lambda: %f dB\n',sdr_oracle); + + +fprintf('Estimated lambda: %f \n', lambda_est); +fprintf('SDR for estimated lambda: %f dB\n', sdr_est); + + +fprintf('True-energy lambda: %f \n', lambda_true_energy); +fprintf('SDR for true-energy lambda: %f dB\n', sdr_true_energy); + +fprintf('Zero filling SDR: %f dB\n', sdr_zero); +fprintf('Mix SDR: %f dB \n',sdr_mix); +fprintf('Interp + random phases filling SDR: %e dB\n',sdr_interp); + +%% + +figure; +plot_spectrogram(x_mix, dgt_params, signal_params, dgt); +title(['Mix SDR=' , num2str(sdr_mix,4),'dB ','IS= ',num2str(is_mix)]); +set(gca, 'FontSize', 20, 'fontName','Times'); +axis tight; +saveas(gcf,fullfile(fig_dir, 'mix.pdf')); + +figure; +plot_spectrogram(signals.wideband, dgt_params, signal_params, dgt); +title(['True source -', wideband_src]) +set(gca, 'FontSize', 20, 'fontName','Times'); +saveas(gcf,fullfile(fig_dir, 'spectrogram_true_wb_source.pdf')); + + +figure; +plot_spectrogram(x_zero, dgt_params, signal_params, dgt) +title(['Zero fill SDR= ', num2str(sdr_zero,4),'dB ', 'IS=', num2str(is_zero)]) +set(gca, 'FontSize', 20, 'fontName','Times'); +saveas(gcf,fullfile(fig_dir, 'spectrogram_zero_fill.pdf')); + + + + +figure; +plot_spectrogram(x_oracle, dgt_params, signal_params, dgt) +title(['TFF-O SDR= ', num2str(sdr_oracle,4), 'dB ','IS=', num2str(is_oracle)]) +set(gca, 'FontSize', 20, 'fontName','Times'); +axis tight; +saveas(gcf,fullfile(fig_dir,'spectrogram_TFF-O.pdf')); + + + + + +figure; +plot_spectrogram(x_est, dgt_params, signal_params, dgt) + +if tol_subregions==0 + title(['TFF-1 - SDR= ',num2str(sdr_est,4),'dB ','IS=',num2str(is_est)]) + set(gca, 'FontSize', 20, 'fontName','Times'); + axis tight; + saveas(gcf,fullfile(fig_dir, 'spectrogram_TFF-1.pdf')); +else + title(['TFF-P - SDR= ',num2str(sdr_est,4),'dB ','IS=',num2str(is_est)]) + set(gca, 'FontSize', 20, 'fontName','Times'); + axis tight; + saveas(gcf,fullfile(fig_dir, 'spectrogram_TFF-P.pdf')); +end + + +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')); +%% diff --git a/matlab/tfgm/subregions/create_subregions.m b/matlab/tfgm/subregions/create_subregions.m new file mode 100644 index 0000000000000000000000000000000000000000..32a31aab0b7e0843549f8a4b11f4275d14c6ea8b --- /dev/null +++ b/matlab/tfgm/subregions/create_subregions.m @@ -0,0 +1,118 @@ +function [mask_labeled, varargout] = create_subregions(mask, dgt, idgt, ..., + dgt_params, signal_params, tol, fig_dir) + +%% [mask_labeled, varargout] = create_subregions(mask, dgt, idgt, dgt_params, signal_params, tol, fig_dir) +% This function splits the whole region $\Omega$ in such sub-regions.[1] +% +% Inputs: +% - mask: original mask +% - dgt, idgt : Gabor transform and its inverse operator +% - dgt_params : Discrete Gabor Transform parameters(hop, nbins,win, ect..) +% -signal_params: Signals parameters(sig_len, fs) +% - tol: tolerance .see [1] +% - fig_dir : Figures directory +% +% Outputs: +% - mask_labeled: mask with P regions +% -pq_norms_val: norms between two Gabor multipliers +% +% +% Reference: +% [1]Time-frequency fading algorithms based on Gabor multipliers,2020. +% +% +% Author: Marina KREME +%% +mask = boolean(mask); +[mask_labeled, n_labels] = bwlabel(mask); +sig_len = signal_params.sig_len; +pq_norms_val = get_pq_norms(sig_len,dgt,idgt,mask_labeled); + +%% +figure; +plot_mask(mask_labeled, dgt_params.hop, dgt_params.nbins, signal_params.fs) +title('Initial subregions') +saveas(gcf,fullfile(fig_dir, 'initial_subregions.pdf')); + +figure; +imagesc(real(log10(pq_norms_val+pq_norms_val'))) +ylabel('p') +xlabel('q') +colorbar() +title('Initial norms of Gabor multiplier composition') +saveas(gcf,fullfile(fig_dir, 'initial_norms.pdf')); + +n_labels_max = n_labels; + +%% + +while max(pq_norms_val(:))>tol + %Merge each pair (p, q), q < p, such that pq_norms[p, q] > tol + to_be_updated = boolean(zeros(n_labels,1)); + + while max(pq_norms_val(:))>tol + [i_p, i_q] = find(pq_norms_val == max(pq_norms_val(:))); + + + mask = mask_labeled; + [mask_labeled, pq_norms_val] = merge_subregions(mask, pq_norms_val, i_p, i_q); + + to_be_updated(i_q)= true; + to_be_updated(i_p) = to_be_updated(end); + to_be_updated = to_be_updated(1:end-1); + n_labels =n_labels- 1; + end + + for i_p =1:n_labels + if to_be_updated(i_p)==true + pq_norms_val = update_pq_norms(mask_labeled, pq_norms_val, i_p, signal_params, dgt, idgt); + end + end + + + + + + figure; + plot_mask(mask_labeled, dgt_params.hop, dgt_params.nbins, signal_params.fs) + title('subregions ') + saveas(gcf,fullfile(fig_dir, ['subregions_i_', num2str(n_labels_max-n_labels),'.pdf'])); + + + figure; + imagesc(real(log10(pq_norms_val+pq_norms_val'))) + ylabel('p-1') + xlabel('q-1') + colorbar() + title('norms of Gabor multiplier composition') + saveas(gcf,fullfile(fig_dir, ['norms_i', num2str(n_labels_max-n_labels),'.pdf'])); + + +end + + +%% + + + +figure; +plot_mask(mask_labeled, dgt_params.hop, dgt_params.nbins, signal_params.fs) +title('Final subregions') +saveas(gcf,fullfile(fig_dir,'final_subregions.pdf')); + + +figure; +imagesc(real(log10(pq_norms_val+pq_norms_val'))) +ylabel('p-1') +xlabel('q-1') +colorbar() +title('Final norms of Gabor multiplier composition') +saveas(gcf,fullfile(fig_dir, 'final_norms.pdf')); + +varargout{1} = pq_norms_val; + +end + + + + diff --git a/matlab/tfgm/subregions/get_pq_norms.m b/matlab/tfgm/subregions/get_pq_norms.m new file mode 100644 index 0000000000000000000000000000000000000000..cd69f5f4c10240c98d0a26e7a0b6f2a726f0d170 --- /dev/null +++ b/matlab/tfgm/subregions/get_pq_norms.m @@ -0,0 +1,37 @@ +function pq_norms_val = get_pq_norms(sig_len, dgt, idgt, mask_labeled) + +%% pq_norms_val = get_pq_norms(sig_len, dgt, idgt, mask_labeled) +% This function compute norms between two Gabor multiplier +% +% Inputs: +% - sig_len : signal length +% - dgt, idgt: Discrete Gabor Transform parameters(hop, nbins,win, ect..) +% - mask_labeled: mask with P regions +% Output: +% - pq_norms_val : array with all norms between all p and q regions +% +% Author: Marina KREME +% +%% +dbstack; +n_labels = length(unique(mask_labeled))-1; + +pq_norms_val = zeros(n_labels); + +for p =1: n_labels + fprintf('p %f\n',p) + for q = 1:p + fprintf('q %f\n',q) + + mask_p = (mask_labeled==p); + mask_q = (mask_labeled==q); + mul_pq = @(x)idgt(mask_p.*dgt(idgt(mask_q.*dgt(x)))); + pq_norms_val(p,q) = real(eigs(mul_pq, sig_len,1)); + + + end +end +end + + + diff --git a/matlab/tfgm/subregions/make_subregions.m b/matlab/tfgm/subregions/make_subregions.m new file mode 100644 index 0000000000000000000000000000000000000000..7aae2137361bc3a3216da96cc3a60c62131ec11a --- /dev/null +++ b/matlab/tfgm/subregions/make_subregions.m @@ -0,0 +1,53 @@ +function [mask_list, mask_labeled, mask_area_list] = make_subregions(mask, dgt_params, signal_params) + +%%[mask_list, mask_labeled, mask_area_list] = make_subregions(mask, dgt_params, signal_params) +% This function split the whole regions into P regions +% Inputs: +% - mask: original mask +% - dgt_params : Discrete Gabor Transform parameters(hop, nbins,win, ect..) +% -signal_params: Signals parameters(sig_len, fs) +% Outputs: +% - mask_list(struct):list contains P masks +% - mask_labeled: mask labeled +% - mask_area_list: mask area for each P region +% +% Author: Marina KREME + +%% + + + +[~,n_labels] = bwlabel(mask); + +mask_area_list = zeros(n_labels,1); +mask_list = cell(n_labels,1); + + +for k =1:n_labels + %% + + [mask_labeled,~] = bwlabel(mask); + + % on construit chaque mask + mask_labeled(mask_labeled~=k)= false; + mask_labeled(mask_labeled==k)=true; + mask_k =mask_labeled; + mask_list{k} = mask_k; + figure(k); plotdgtreal(mask_k, dgt_params.hop, dgt_params.nbins, signal_params.fs); + title(['k=', num2str(k)]) + + [mask_area, mask_area_ratio] = get_mask_area(mask_k); + mask_area_list(k) = mask_area; + fprintf('mask area = %.f, mask area ratio = %f\n',mask_area, mask_area_ratio); + + +end + +[mask_labeled,~] = bwlabel(mask); +end + + + + + + diff --git a/matlab/tfgm/subregions/merge_subregions.m b/matlab/tfgm/subregions/merge_subregions.m new file mode 100644 index 0000000000000000000000000000000000000000..0b7ea9c393f5e07329df6196462b5023032984e6 --- /dev/null +++ b/matlab/tfgm/subregions/merge_subregions.m @@ -0,0 +1,33 @@ +function[mask, pq_norms_val] = merge_subregions(mask, pq_norms_val, i_p, i_q) + +%% [mask, pq_norms_val] = merge_subregions(mask, pq_norms_val, i_p, i_q) +% This function merge two regions. See [1] +% +% Inputs: +% -mask: mask with P regions (mask labeled) +% -pq_norms_val: array with all norms between all p and q regions +% - i_p, i_q: ineteger +% Outputs: +% -mask:final mask +% - pq_norms_val: array with all norms between all p and q regions + +% Reference: +% [1]Time-frequency fading algorithms based on Gabor multipliers,2020. +% +% Author: Marina KREME +%% +p = i_p + 1; +q = i_q + 1; + +n_labels = size(pq_norms_val,1); +mask(mask == p)= q; +mask(mask == n_labels) = p; +pq_norms_val(i_p, 1:i_p - 1)= pq_norms_val(end, 1:i_p - 1); +pq_norms_val(i_p:end, i_p) = pq_norms_val(end, i_p:end); +pq_norms_val = pq_norms_val(1:end-1, 1:end-1); + +end + + + + diff --git a/matlab/tfgm/subregions/pq_norms.m b/matlab/tfgm/subregions/pq_norms.m new file mode 100644 index 0000000000000000000000000000000000000000..753e198f6bb777343e354aaab3202ffe90ba4db0 --- /dev/null +++ b/matlab/tfgm/subregions/pq_norms.m @@ -0,0 +1,38 @@ +function pq_norms = pq_norms(sig_len, dgt, idgt, mask_list) + +%% pq_norms = pq_norms(sig_len, dgt, idgt, mask_list) +% This function compute norm between each p and q regio $p\neq q$ from list +% of mask +% +% Inputs: +% -sig_len: signal length +% -dgt, idgt: Discrete Gabor Transform parameters(hop, nbins,win, ect..) +% -mask_list(struct):list contains P masks +% Outputs: +% - pq_norms: array with all norms between all p and q regions +% +% Author: Marina KREME + +%% + +n_labels = length(mask_list); +pq_norms = zeros(n_labels); + + +%% + +for p =1: n_labels-1 + + mask_p = mask_list{p}; + for q = p+1:n_labels + + mask_q = mask_list{q}; + + mul_pq = @(x)idgt(mask_p.*dgt(idgt(mask_q.*dgt(x)))); + pq_norms(p,q) = real(eigs(mul_pq, sig_len,1)); + + + end +end + +end \ No newline at end of file diff --git a/matlab/tfgm/subregions/run_create_subregions.m b/matlab/tfgm/subregions/run_create_subregions.m new file mode 100644 index 0000000000000000000000000000000000000000..8159fcc8e2fd2948c035f6a54520a6138ffbc0ff --- /dev/null +++ b/matlab/tfgm/subregions/run_create_subregions.m @@ -0,0 +1,42 @@ +clc; clear; close all; +%% + +pwd; +fig_dir ='create_subregions_cuicui'; +if ~exist('create_subregions_cuicui','dir') + mkdir('create_subregions_cuicui'); +end +addpath('create_subregions_cuicui') + +%% + +loc_source='bird'; +wideband_src='car'; +gamma=0.7; +win_type ='gauss'; + +[alpha, thres, radius] = set_smooth_mask_params(wideband_src, loc_source, win_type); + + +win_dur =256/8000; +hop_ratio=1/4; +nbins_ratio=4; + + +[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, thres, radius, fig_dir); + + + +%% +tol = 1e-5; +mask_bool = mask; + + +[mask_labeled, n_areas,t_subregions] = get_nareas(mask_bool, dgt, idgt, dgt_params,..., + signal_params, fig_dir, tol); + + + +%% diff --git a/matlab/tfgm/subregions/update_pq_norms.m b/matlab/tfgm/subregions/update_pq_norms.m new file mode 100644 index 0000000000000000000000000000000000000000..40347c68544025b67a178e4c3e6e833a4699faba --- /dev/null +++ b/matlab/tfgm/subregions/update_pq_norms.m @@ -0,0 +1,47 @@ +function pq_norms_val = update_pq_norms(mask_labeled, pq_norms_val, i_p, signal_params, dgt, idgt) + + +%% pq_norms_val = update_pq_norms(mask_labeled, pq_norms_val, i_p, signal_params, dgt, idgt) +% +% This function compute bit faster norms between two Gabor multiplier. +% This is an improvement of the function get_pq_norms.m +% +% Inputs: +% - mask_labeled: mask labeled-mask with P regions +% -pq_norms_val: array with all norms between all p and q regions +% -i_p: ineteger +% -signal_params: Signals parameters(sig_len, fs) +% - dgt, idgt: Discrete Gabor Transform parameters(hop, nbins,win, ect..) +% Output: +% - pq_norms_val : array with all norms between all p and q regions +% +% Author: Marina KREME + +%% + + +sig_len = signal_params.sig_len; +n_labels = size(pq_norms_val,1); + +mask_p = (mask_labeled==i_p); +gabmul_p = gen_gabmul_operator(dgt, idgt, mask_p); + +for i_q =1:n_labels + if i_p == i_q + continue + end + mask_q = (mask_labeled==i_q); + gabmul_q = gen_gabmul_operator(dgt, idgt, mask_q); + + gabmul_pq =@(x)gabmul_p(gabmul_q(x)); + gabmul_pq_norm = real(eigs(gabmul_pq, sig_len,1)); +end +if i_q < i_p + pq_norms_val(i_p, i_q) = gabmul_pq_norm; +else + pq_norms_val(i_q, i_p) = gabmul_pq_norm; +end + + +end + diff --git a/matlab/tfgm/tf_filtering/U_transpose_observation.m b/matlab/tfgm/tf_filtering/U_transpose_observation.m new file mode 100644 index 0000000000000000000000000000000000000000..513f51d291a556aacae6e9dd658939e3bc6298cf --- /dev/null +++ b/matlab/tfgm/tf_filtering/U_transpose_observation.m @@ -0,0 +1,18 @@ +function ut_x = U_transpose_observation(x_mix, u_mat) + +%% ut_x = U_transpose_observation(x_mix, u_mat) +% Function that calculates u_mat'*x_mix +% +% Inputs: +% -x_mix :mixtures of signals with wideband and localized spectrograms +% -u_mat:eignevectors matrix +% Outputs: +% - ut_x: result of calculation +% +% Author: Marina KREME +% +%% +ut_x = u_mat'*x_mix; + +end + diff --git a/matlab/tfgm/tf_filtering/compute_decomposition.m b/matlab/tfgm/tf_filtering/compute_decomposition.m new file mode 100644 index 0000000000000000000000000000000000000000..b769ed9cf7d7538a78ffc31662dca0b1257d9453 --- /dev/null +++ b/matlab/tfgm/tf_filtering/compute_decomposition.m @@ -0,0 +1,91 @@ +function [t_arrf,t_evdn, t_ut_x, rank_q, s_vec_list, u_mat_list,..., + ut_x_list,r] = compute_decomposition(x_mix, mask_list, gabmul_list,..., + tolerance_arrf, proba_arrf) + +%% [t_arrf,t_evdn,t_ut_x, rank_q, s_vec_list, u_mat_list, ut_x_list,r] = compute_decomposition(x_mix, mask_list, gabmul_list,tolerance_arrf, proba_arrf) + +% This fucntion computes the eigenvalues decomposition (EVD) using +% random projection algorithms. see[1] +% +% Inputs: +% - x_mix: mixtures of signals with wideband and localized spectrograms +% -mask_list: list of mask +% -gabmul_list: list of Gabor multiplier associated to each mask +% - tolerance_arrf: tolearance. see [1] +% - proba_arrf: probability of success. see[1] +% Outputs: +% -t_arrf: time for adaptativerandomized range finder(arrf) +% -t_evdn: time for eigenvalue decomposition via Nystr�m (evdn) +% -t_ut_x: time for U^{T}*x_mix +% -rank_q: array contains list of rank estimated by arrf +% -s_vec_list: list of nonnegative and diagonal matrix obtained by evdn +% - u_mat_list list of orthononmal matrix obtained by evdn +% - r: parameter for arrf. +% +% +% Reference: +% +% [1] Nathan Halko, Per-Gunnar Martinsson, Joel A. Tropp, "Finding structure +% with randomness: Probabilistic algorithms for constructing approximate +% matrix decompositions", 2011. +% +% Author: Marina KREME +%% + +sig_len = length(x_mix); + + +n_areas = length(mask_list); +r = compute_r(sig_len, sig_len, proba_arrf); + + +%% + +t_arrf = zeros(n_areas,1); +t_evdn = zeros(n_areas,1); +t_ut_x = zeros(n_areas,1); +rank_q = zeros(n_areas,1); + +s_vec_list = cell(n_areas,1); +u_mat_list = cell(n_areas,1); +ut_x_list = cell(n_areas,1); + +%% + + +for k =1: n_areas + %% + + mask_p = mask_list{k}; + fprintf('Random EVD of Gabor multiplier number %.f\n',k); + + [mask_area, mask_area_ratio] = get_mask_area(mask_p); + fprintf('#coefs in mask: %f \n',mask_area); + fprintf('#ratio of coefs in mask: %f %%\n',mask_area_ratio); + + + tic; + q_mat = adaptative_randomized_range_finder(gabmul_list{k}, sig_len, tolerance_arrf, r); + t_arrf(k) = toc; + rank_q(k) = size(q_mat,2); + fprintf('Q size: %.f %.f\n', size(q_mat,1),size(q_mat,2)); + + tic; + evdn = EVD_nystrom(gabmul_list{k}, q_mat); + t_evdn(k) = toc; + + s_vec_list{k} = sort(diag(evdn.D),'descend'); + u_mat_list{k} = evdn.U; + + + fprintf('Running times:\n') + fprintf('- adaptive_randomized_range_finder: %f s\n',t_arrf(k)); + fprintf('- evd_nystrom: %f s \n\n', t_evdn(k)); + + + tic; + ut_x_list{k} = u_mat_list{k}'* x_mix; + t_ut_x(k) = toc; + +end +end \ No newline at end of file diff --git a/matlab/tfgm/tf_filtering/compute_decomposition_fixed_rank.m b/matlab/tfgm/tf_filtering/compute_decomposition_fixed_rank.m new file mode 100644 index 0000000000000000000000000000000000000000..5bc3b49d8f5813dfefe45b1ece6407ff7bec4318 --- /dev/null +++ b/matlab/tfgm/tf_filtering/compute_decomposition_fixed_rank.m @@ -0,0 +1,85 @@ +function [t_rrf,t_evdn, t_ut_x, s_vec_list, u_mat_list,..., + ut_x_list]=compute_decomposition_fixed_rank(x_mix, mask_list, gabmul_list, rank) + +%% [t_rrf,t_evdn, t_ut_x, s_vec_list, u_mat_list,ut_x_list]=compute_decomposition_fixed_rank(x_mix, mask_list, gabmul_list, rank) + +% This fucntion computes the eigenvalues decomposition fixed rank with (EVD) using +% random projection algorithms. see[1] +% +% Inputs: +% - x_mix: mixtures of signals with wideband and localized spectrograms +% -mask_list: list of mask +% -gabmul_list: list of Gabor multiplier associated to each mask +% - rank : matrix rank see [1] +% Outputs: +% -t_rrf: time for randomized range finder(rrf) +% -t_evdn: time for eigenvalue decomposition via Nystr�m (evdn) +% -t_ut_x: time for U^{T}*x_mix +% -rank_q: array contains list of rank estimated by arrf +% -s_vec_list: list of nonnegative and diagonal matrix obtained by evdn +% - u_mat_list list of orthononmal matrix obtained by evdn +% - ut_x_list: list of U^{T}*x_mix +% +% +% Reference: +% +% [1] Nathan Halko, Per-Gunnar Martinsson, Joel A. Tropp, "Finding structure +% with randomness: Probabilistic algorithms for constructing approximate +% matrix decompositions", 2011. +% +% Author: Marina KREME +%% + + +%% +n_areas = length(mask_list); + +sig_len = length(x_mix); +%% + +t_rrf = zeros(n_areas,1); +t_evdn = zeros(n_areas,1); +t_ut_x = zeros(n_areas,1); + + +s_vec_list = cell(n_areas,1); +u_mat_list = cell(n_areas,1); +ut_x_list = cell(n_areas,1); + +%% + + +for k =1: n_areas + mask_p = mask_list{k}; + fprintf('Random EVD of Gabor multiplier nummber %.f\n',k); + + [mask_area, mask_area_ratio] = get_mask_area(mask_p); + fprintf('#coefs in mask: %f \n',mask_area); + fprintf('#ratio of coefs in mask: %f %%\n',mask_area_ratio); + + + tic; + q_mat = randomized_range_finder(gabmul_list{k}, sig_len, rank); + t_rrf(k) = toc; + + fprintf('Q size: %.f %.f\n', size(q_mat,1),size(q_mat,2)); + + tic; + evdn = EVD_nystrom(gabmul_list{k}, q_mat); + t_evdn(k) = toc; + + s_vec_list{k} = diag(evdn.D); + u_mat_list{k} = evdn.U; + + + fprintf('Running times:\n') + fprintf('- randomized_range_finder: %f s\n',t_rrf(k)); + fprintf('- evd_nystrom: %f s \n\n', t_evdn(k)); + + + tic; + ut_x_list{k} = u_mat_list{k}'* x_mix; + t_ut_x(k) = toc; + +end + diff --git a/matlab/tfgm/tf_filtering/compute_estimate.m b/matlab/tfgm/tf_filtering/compute_estimate.m new file mode 100644 index 0000000000000000000000000000000000000000..89b35466aab126a25167d411b1975d58b4f6c014 --- /dev/null +++ b/matlab/tfgm/tf_filtering/compute_estimate.m @@ -0,0 +1,45 @@ +function x=compute_estimate(lambda_coef, x_mix, s_vec_list, u_mat_list, ut_x_list) + +%% x=compute_estimate(lambda_coef, x_mix, s_vec_list, u_mat_list, ut_x_list) +% This function computes the signal estimated by the algorithms proposed in [1] +% +% Inputs: +% - lambda_coef: hyperparameters +% - x_mix: mixtures of signals with wideband and localized spectrograms +% - s_vec_list:list of nonnegative and diagonal matrix +% - u_mat_list: list of orthononmal matrix +% - ut_x_list: list of u_mat^{T}*x_mix +% +% Output: +% x : estimated signal +% +% Reference: +% +% [1]Time-frequency fading algorithms based on Gabor multipliers,2020. +% +% +% Author: Marina KREME + + +%% + + +n_areas = length(s_vec_list); + +n = length(lambda_coef); +if n>1 + assert(n==n_areas); +else + lambda_coef = lambda_coef*ones(n_areas,1); +end + +x = x_mix; +for k= 1:n_areas + gamma_vec = lambda_coef(k)*s_vec_list{k}./(1-(1-lambda_coef(k))*s_vec_list{k}); + x =x-u_mat_list{k}*(gamma_vec.*ut_x_list{k}); +end + + +end + + diff --git a/matlab/tfgm/tf_filtering/compute_gamma.m b/matlab/tfgm/tf_filtering/compute_gamma.m new file mode 100644 index 0000000000000000000000000000000000000000..b5df28f4a34bc2e2983217bc153daa3593f3dd6c --- /dev/null +++ b/matlab/tfgm/tf_filtering/compute_gamma.m @@ -0,0 +1,8 @@ +function gamma_vec = compute_gamma(s_vec) +% compute gamma + +gamma_vec =@(lambda_coef) lambda_coef*s_vec./(lambda_coef*s_vec + 1- s_vec); + +end + + diff --git a/matlab/tfgm/tf_filtering/compute_lambda.m b/matlab/tfgm/tf_filtering/compute_lambda.m new file mode 100644 index 0000000000000000000000000000000000000000..b9cbfebe19aabde37e38e6f1d79c44f9cec20829 --- /dev/null +++ b/matlab/tfgm/tf_filtering/compute_lambda.m @@ -0,0 +1,60 @@ +function [lambda_est, t_est] = compute_lambda(x_mix, mask, dgt_params,..., + signal_params, dgt, s_vec_list, u_mat_list, ut_x_list,..., + gabmul_list, fig_dir, e_target) + +%% [lambda_est, t_est] = compute_lambda(x_mix, mask, dgt_params, signal_params, dgt, s_vec_list, u_mat_list, ut_x_list,gabmul_list, fig_dir, e_target) + +% This function calculates lambda in algorithmes proposed in [1] +% +% Inputs: +% -x_mix:mixtures of signals with wideband and localized spectrograms +% -mask: labeled mask +% -dgt_params : Discrete Gabor Transform parameters(hop, nbins,win, ect..) +% -signal_params:Signals parameters(sig_len, fs) +% -dgt: Gabor transform operator +% -s_vec_list:list of nonnegative and diagonal matrix +% - u_mat_list: list of orthononmal matrix +% - ut_x_list: list of u_mat^{T}*x_mix +% -gabmul_list: list of Gabor multiplier associated to each mask +% -fig_dir: figures directory +% -e_target: estimated energy in another region. see [1] +% Outputs: +% - lambda_est: lambda estimated +% - t_est: time to estimate lambda +% +% Reference: +% +% [1]Time-frequency fading algorithms based on Gabor multipliers,2020. +% +% Author: Marina KREME +%% + +%% +if nargin<=10 + e_target = estimate_energy_in_mask(x_mix, mask, dgt_params, ..., + signal_params, dgt,fig_dir); + +end +%% +n_areas = length(u_mat_list); +t_est = zeros(n_areas,1); +lambda_est = zeros(n_areas,1); + +for k_area = 1:n_areas + mask_k = (mask==k_area); + gab_mul = gabmul_list{k_area}; + e_target_k = e_target(k_area); + + + obj_fun_est = @(lambda_coef)obj_fun(lambda_coef, x_mix, s_vec_list, ..., + u_mat_list, ut_x_list, mask_k, gab_mul, dgt, e_target_k); + + tic; + sol_est = fminbnd(obj_fun_est, 0,1); + t_est(k_area) = toc; + lambda_est(k_area) = sol_est; +end +end + + + diff --git a/matlab/tfgm/tf_filtering/compute_lambda_oracle_sdr.m b/matlab/tfgm/tf_filtering/compute_lambda_oracle_sdr.m new file mode 100644 index 0000000000000000000000000000000000000000..f85f7832bea23b3e8c8660c765944def45c42fbb --- /dev/null +++ b/matlab/tfgm/tf_filtering/compute_lambda_oracle_sdr.m @@ -0,0 +1,33 @@ +function [lambda_oracle, t_oracle] = compute_lambda_oracle_sdr(n_areas, x_wb, x_rec) + +%% [lambda_oracle, t_oracle] = compute_lambda_oracle_sdr(n_areas,x_wb, x_rec) +% Function that calculates the estimated lambda using the true energy. see[1] +% +% Inputs: +% - n_areas: number of regions in mask +% - x_wb: signal with wideband spectrogram +% - x_rec: Estimated signal as a function of hyperpparametre lambda.see[1] +% +% Outputs: +% -lambda_oracle: estimates lambda +% - t_oracle:time to estimate lambda +% +% Reference: +% +% [1]Time-frequency fading algorithms based on Gabor multipliers,2020. +% +% Author: Marina KREME +%% +tic; +obj_fun_oracle = @(lambda_coef) norm(x_wb - x_rec(lambda_coef)); + +if n_areas>1 + lambda_oracle = fmincon(obj_fun_oracle, ones(n_areas,1)); +else + lambda_oracle = fminbnd(obj_fun_oracle, 0, 1); +end +t_oracle = toc; + +end + + diff --git a/matlab/tfgm/tf_filtering/estimate_energy_in_mask.m b/matlab/tfgm/tf_filtering/estimate_energy_in_mask.m new file mode 100644 index 0000000000000000000000000000000000000000..2232cd04e3fade15f017d2af892e7f1b037d0d68 --- /dev/null +++ b/matlab/tfgm/tf_filtering/estimate_energy_in_mask.m @@ -0,0 +1,95 @@ +function estimated_energy = estimate_energy_in_mask(x_mix, mask, dgt_params, signal_params, dgt,fig_dir) + +%%estimated_energy = estimate_energy_in_mask(x_mix, mask, dgt_params, signal_params, dgt,fig_dir) +% Functions that estimates energy in the mask +% +% Inputs: +% - x_mix:mixtures of signals with wideband and localized spectrograms +% - mask:labeled mask +% - dgt_params : Discrete Gabor Transform parameters(hop, nbins,win, ect..) +% - signal_params:Signals parameters(sig_len, fs) +% - dgt: Gabor transform operator +% - fig_dir: firgures directory +% Outputs: +% -estimated_energy:estimated energy +% +% +% Author: Marina KREME +%% +x_tf_mat = dgt(x_mix); +x_tf_mat(mask>0)= nan; +e_f_mean = nanmean(abs(x_tf_mat).^2, 2); +%% +n_areas = length(unique(mask))-1; +estimated_energy = zeros(n_areas,1); +e_mat = e_f_mean*ones(1, size(x_tf_mat,2)); +e_mat(mask==0) = 0; + +for k_area = 1:n_areas + mask_k = (mask==k_area); + estimated_energy(k_area) = sum(e_mat(:).*mask_k(:)); + +end + +%% + + +dynrange = 100; +c_max = nanmax(db(x_tf_mat(:))); +clim = [c_max - dynrange, c_max]; + + +fs = signal_params.fs; +figure; +plot_spectrogram(x_mix, dgt_params, signal_params, dgt, dynrange, clim) +%plotdgtreal(S_mix, dgt_params.hop, dgt_params.nbins, fs); +title('Mix'); +set(gca, 'FontSize', 20, 'fontName','Times'); +saveas(gcf,fullfile(fig_dir, 'mix.pdf')); + + + +% +figure; +plotdgtreal(sqrt(e_mat), dgt_params.hop, dgt_params.nbins, fs, 'clim', clim); +%title(['Mask filled with average energy (total: ', num2str(estimated_energy,8),')']); +set(gca, 'FontSize', 20, 'fontName','Times'); +saveas(gcf,fullfile(fig_dir, 'filled_mask.pdf')); + + +% + +x_tf_mat(mask>0) = sqrt(e_mat(mask>0)); +figure; +plotdgtreal(x_tf_mat, dgt_params.hop, dgt_params.nbins, fs, 'clim', clim); +%title(['Mix filled with average energy (total: ', num2str(estimated_energy,8),')']); +set(gca, 'FontSize', 20, 'fontName','Times'); +saveas(gcf,fullfile(fig_dir, 'filled_mask.pdf')); + + +% +figure; +plot(db(e_f_mean) / 2); +xlabel('Frequency index') +ylabel('Average energy') +grid on; +title('Average energy per frequency bin in mix'); +set(gca, 'FontSize', 20, 'fontName','Times'); +saveas(gcf,fullfile(fig_dir, 'average_energy.pdf')); + + +%% +e_f_mean_check = mean(abs(x_tf_mat).^2, 2); +figure; +plot(db(e_f_mean) / 2); hold on; +plot(db(e_f_mean_check) / 2, '--') +xlabel('Frequency index') +ylabel('Average energy') +title('Average energy per frequency bin in mix') +legend('Before filling', 'After filling') +grid on; +set(gca, 'FontSize', 20, 'fontName','Times'); +saveas(gcf,fullfile(fig_dir, 'average_energy_check.pdf')); + + +end diff --git a/matlab/tfgm/tf_filtering/filtering_out_Pareas.m b/matlab/tfgm/tf_filtering/filtering_out_Pareas.m new file mode 100644 index 0000000000000000000000000000000000000000..ece8365bf6a0d67fb1d46d61253a1f4c4a065c43 --- /dev/null +++ b/matlab/tfgm/tf_filtering/filtering_out_Pareas.m @@ -0,0 +1,82 @@ +function [x_rec, t_arrf, t_evdn, t_ut_x, rank_q, s_vec_list, u_mat_list,..., + lambda_vec_opt] = filtering_out_Pareas(x_mix, mask_labels, dgt, idgt, e_target, tolerance_arrf, proba_arrf) + +%% + +r = compute_r(sig_len, sig_len, proba_arrf); + +P = length(mask_labels); +P= 2; +t_arrf = zeros(P,1); +t_evdn = zeros(P,1); +t_ut_x = zeros(P,1); +rank_q = zeros(P,1); + +s_vec_list =cell(P,1); +u_mat_list = cell(P,1); + + + +lambda_vec_opt = zeros(P,1); + +%% +for p = 1:P +p=2; + %% + mask_p = mask_labels{p}; + + gabmul_p = gen_gabmul_operator(dgt, idgt, mask_p); + + figure; imagesc(mask_p); + + fprintf('Random EVD of Gabor multiplier number %.f\n',p) + fprintf('#coefs in mask: %.f environ %f %%\n\n', sum(mask_p(:)),sum(mask_p(:)/(size(mask_p,1)*size(mask_p,2))*100)); + %% + + tic; + q_mat = adaptative_randomized_range_finder(gabmul_p, sig_len, tolerance_arrf, r); + t_arrf(p) = toc; + + rank_q(p) = size(q_mat,2); + fprintf('Q size: %.f %.f\n', size(q_mat,1),size(q_mat,2)); + %% + tic; + evdn = EVD_nystrom(gabmul_p, q_mat); + t_evdn(p) = toc; + + u_mat = evdn.U; + s_vec = diag(evdn.D); + s_vec_list{p} = s_vec; + u_mat_list{p} = u_mat; + + %% + + fprintf('Running times:\n') + fprintf('- adaptive_randomized_range_finder: %f s\n',t_arrf(p)); + fprintf('- evd_nystrom: %f s \n\n', t_evdn(p)); + + + %% + ut_x = u_mat'*x_mix; + gamma_p =@(lambda_coef)(lambda_coef*s_vec)./(1- (1-lambda_coef)*s_vec); + + x_p=@(lambda_coef) x_mix-u_mat*(gamma_p(lambda_coef).*ut_x); + figure; + plot_spectrogram(x_p(1), dgt_params, signal_params, dgt) + +%% + obj_fun = @(lambda_coef) abs(e_target(p) - norm(mask_p.*dgt(x_p(lambda_coef)))); + sol = fminbnd(obj_fun, 0,1); + lambda_vec_opt(p) = sol; + +end +%% + + + + +%% + + +end + diff --git a/matlab/tfgm/tf_filtering/get_P_gabmul.m b/matlab/tfgm/tf_filtering/get_P_gabmul.m new file mode 100644 index 0000000000000000000000000000000000000000..081629c5a9180cbeadb822c4f84177d15b4439bf --- /dev/null +++ b/matlab/tfgm/tf_filtering/get_P_gabmul.m @@ -0,0 +1,34 @@ +function [gabmul_list, mask_list] = get_P_gabmul(final_mask_labeled, dgt, idgt) + +%% [gabmul_list, mask_list] = get_P_gabmul(final_mask_labeled, dgt, idgt) +% +% This function create Gabor multiplier associated to eack mask +% Inputs: +% - final_mask_labeled: labeling mask with merging of certain regions +% -dgt, idgt : Gabor tranform and its inverse operator +% Outputs: +% - gabmul_list: list of Gabor multipliers +% - mask_list: list of mask corresponding to each region +% +% +% Author: Marina KREME +% +%% +n_labels = length(unique(final_mask_labeled))-1; +gabmul_list = cell(n_labels,1); +mask_list = cell(n_labels,1); + +for k=1:n_labels + mask_k = (final_mask_labeled==k); + gabmul_k = gen_gabmul_operator(dgt, idgt, mask_k); + + gabmul_list{k} = gabmul_k; + mask_list{k} = mask_k; +end + + +end + + + + diff --git a/matlab/tfgm/tf_filtering/get_nareas.m b/matlab/tfgm/tf_filtering/get_nareas.m new file mode 100644 index 0000000000000000000000000000000000000000..f240d4ccd9bf981adb1fd4612c14af3962280602 --- /dev/null +++ b/matlab/tfgm/tf_filtering/get_nareas.m @@ -0,0 +1,47 @@ +function [mask_labeled, n_areas,t_subregions] = get_nareas(mask_bool,dgt, idgt, dgt_params,..., + signal_params, fig_dir, tol_subregions) + +%% [mask_labeled, n_areas,t_subregions] = get_nareas(mask_bool,dgt, idgt, dgt_params, signal_params, fig_dir, tol_subregions) +% +% This function creates regions +% +% Inputs: +% - mask_bool:binary mask +% -dgt, idgt:Gabor transform and its inverse operator +% -dgt_params:Discrete Gabor Transform parameters(hop, nbins,win, ect..) +% -signal_params:Signals parameters(sig_len, fs) +% -fig_dir: figures directory +% -tol_subregions :tolerance +% +% Outputs: +% - mask_labeled:mask labeled +% - n_areas: number of sub regions +% -t_subregions:time to create sub regions +% +% +% Author: Marina KREME + + +%% + +switch tol_subregions + case 1e-5 + tic; + mask_labeled = create_subregions(mask_bool, dgt, idgt, dgt_params,..., + signal_params, tol_subregions,fig_dir); + t_subregions = toc; + n_areas = length(unique(mask_labeled))-1; + case 0 + + n_areas =1; + mask_labeled = mask_bool>0; + t_subregions=0; + otherwise + fprintf("Incorrect value of tolerance\n"); + +end + + +end + + diff --git a/matlab/tfgm/tf_filtering/obj_fun.m b/matlab/tfgm/tf_filtering/obj_fun.m new file mode 100644 index 0000000000000000000000000000000000000000..369be32a77e7d21af1048083e15f6ad023627c3f --- /dev/null +++ b/matlab/tfgm/tf_filtering/obj_fun.m @@ -0,0 +1,35 @@ +function f_lambda = obj_fun(lambda_coef, x_mix, s_vec_list, ..., + u_mat_list, ut_x_list, mask, gab_mul, dgt, e_target) + +%% f_lambda = obj_fun(lambda_coef, x_mix, s_vec_list,u_mat_list, ut_x_list, mask, gab_mul, dgt, e_target) +% Objecitve function for finding optimal lambda value in algorithms +% proppsed in [1] +% +% Inputs: +% -lambda_coef: hyperparameters +% - x_mix: mixtures of signals with wideband and localized spectrograms +% - s_vec_list:list of nonnegative and diagonal matrix obtained after diagonalization +% - u_mat_list: list of orthononmal matrix obtained after diagonalization +% - ut_x_list: list of each u_mat'*x_mix +% - mask: mask +% - gab_mul:Gabor multiplier +% - dgt: Gabor transform operator +% - e_target: estimated energy in Omega region +% +% Output: +% - f_lambda: objective function +% +% +% +% Reference: +% [1]Time-frequency fading algorithms based on Gabor multipliers,2020. +% +% +% Author: Marina KREME +%% +x =compute_estimate(lambda_coef, x_mix, s_vec_list, u_mat_list, ut_x_list); +x_tf_masked = mask.*dgt(gab_mul(x)); +e_mask = norm(x_tf_masked, 'fro').^2; +f_lambda = abs(e_target - e_mask); + +end diff --git a/matlab/tfgm/tf_filtering/solver_tfgm.m b/matlab/tfgm/tf_filtering/solver_tfgm.m new file mode 100644 index 0000000000000000000000000000000000000000..26cd55b9018b369f1feb6bc3eeb58d45a45c9185 --- /dev/null +++ b/matlab/tfgm/tf_filtering/solver_tfgm.m @@ -0,0 +1,29 @@ +function x_est= solver_tfgm(x_mix, u_mat, s_vec, ut_x) +%% x_est= solver_tfgm(x_mix, u_mat, s_vec, ut_x) +% function that returns the solution of the problem below +% +% $x = \argmin ||Vx-Vx0||^{2}_{\bar{\Omega}}$ + \lambda*||V_g x||^{2}_{\Omega}$ +% with M_{Omega} = V_g^{*}1_{Omega}V_g : Gabor multiplier +% +% where \Omega is the hole area,V_g is discrete Gabor transform and x0 +% observations +% +% Inputs : +% - x_mix : mixtures of signals with wideband and localized spectrograms. +% - u_mat : matrix of eigenvectors +% - s_vec : eigenvalues vec +% - ut_x : matrix obtained by performing u_mat'*x_mix +% +% Output: +% - x_est: estimated signal +% +% Author : A. Marina KREME +% e-mail : ama-marina.kreme@lis-lab.fr/ama-marina.kreme@univ-amu.fr +% +%% + +gamma_vec = compute_gamma(s_vec); +x_est = @(x) x_mix - u_mat* (gamma_vec(x).*ut_x) ; + +end + diff --git a/matlab/tfgm/tf_filtering/solver_tfgm_interp.m b/matlab/tfgm/tf_filtering/solver_tfgm_interp.m new file mode 100644 index 0000000000000000000000000000000000000000..ca79151157990af16a8aa69cd170a415bbc73c2a --- /dev/null +++ b/matlab/tfgm/tf_filtering/solver_tfgm_interp.m @@ -0,0 +1,41 @@ +function x_interp= solver_tfgm_interp(X, mask, idgt) +%% x_interp= solver_tfgm_interp(X, mask, idgt) +% This function apply a linear interpolation along +% the frequency axis of the magnitude of observation time-frequency matrix +% and draws the related phase uniformly at random. +% +% Inputs: +% - X: time-frequency matrix +% - mask: binary mask +% - idgt: Inverse of Gabor transform operator +% Outputs: +% -x_interp: estimated signal +% +% +% Author: Marina KREME + +%% + +X_abs = abs(X); +X_ang = angle(X); + +mask_copy = mask; + +%% modulus interpolation +Y = X_abs.*(1-mask_copy); + +figure; imagesc(Y); title('before interp'); + +Z = (Y==0); + +Y(Z) = interp1(find(~Z),Y(~Z), find(Z),'linear'); +figure; imagesc(Y); title('after interp') + +%% + +X_ang(mask==1) = 2*pi*rand(sum(mask(:)),1); +X_interp = abs(Y).*exp(1i.*X_ang); +x_interp = compute_idgt(X_interp, idgt); + + +end \ No newline at end of file diff --git a/matlab/tfgm/tf_filtering/solver_tfgm_zero.m b/matlab/tfgm/tf_filtering/solver_tfgm_zero.m new file mode 100644 index 0000000000000000000000000000000000000000..9eef53133c043983b955f8b99a39721723f6bc9d --- /dev/null +++ b/matlab/tfgm/tf_filtering/solver_tfgm_zero.m @@ -0,0 +1,19 @@ +function x_zero= solver_tfgm_zero(X, mask, idgt) + +%% x_zero= solver_tfgm_zero(X, mask, idgt) +% Thid function reconstruct the signal after filling the masked regions by zeros. +% Inputs: +% - X: time-frequency matrix +% - mask: binary mask +% - idgt: Inverse of Gabor transform operator +% Outputs: +% -x_interp: estimated signal +% +% +% Author: Marina KREME + +%% +X(mask==1)=0; +x_zero = compute_idgt(X, idgt); + +end \ No newline at end of file diff --git a/matlab/tfgm/tf_tools/error_operator_norm.m b/matlab/tfgm/tf_tools/error_operator_norm.m new file mode 100644 index 0000000000000000000000000000000000000000..cdfe4651a2c68663eeef531c242a65779473ba25 --- /dev/null +++ b/matlab/tfgm/tf_tools/error_operator_norm.m @@ -0,0 +1,18 @@ +function eig_val = error_operator_norm(gab_mul, svd_res) +% compute error M -UDU.T + +u_mat = svd_res.U; +s = svd_res.D; +u_h = u_mat'; + +u_op = @(x) u_mat*x; +s_op = @(x) s*x; +u_h_op = @(x)u_h*x; + +a_est = @(x) real(u_op(s_op(u_h_op(x)))); + +err_op = @(x) gab_mul(x) - a_est(x) ; + +eig_val = abs(eigs(err_op, size(u_mat,1),1)); + +end \ No newline at end of file diff --git a/matlab/tfgm/tf_tools/gabormultiplier/compute_ambiguity_function.m b/matlab/tfgm/tf_tools/gabormultiplier/compute_ambiguity_function.m new file mode 100644 index 0000000000000000000000000000000000000000..ea700e1731532cc5409b4af6648fdad9e8b66746 --- /dev/null +++ b/matlab/tfgm/tf_tools/gabormultiplier/compute_ambiguity_function.m @@ -0,0 +1,23 @@ +function x = compute_ambiguity_function(x, dgt ,apply_fftshift) +%% x = compute_ambiguity_function(x, dgt ,fftshift_) +% is used to compute the ambiguity function. +% +% Inputs: +% - x : vector +% - dgt : Gabor transform operator +% -apply_fftshift: Boolean +% +%Author: Marina KREME +%% + +switch apply_fftshift + + case 'True' + x = dgt(fftshift(x)); + + case 'False' + x = dgt(x); + otherwise + fprintf('Incorrect value fftshift_\n') + +end \ No newline at end of file diff --git a/matlab/tfgm/tf_tools/gabormultiplier/gen_gabmul_operator.m b/matlab/tfgm/tf_tools/gabormultiplier/gen_gabmul_operator.m new file mode 100644 index 0000000000000000000000000000000000000000..e34720b8b8f704ec5eb16b4e389d92b1207db6f3 --- /dev/null +++ b/matlab/tfgm/tf_tools/gabormultiplier/gen_gabmul_operator.m @@ -0,0 +1,23 @@ +function [gabmul_op, varargout] = gen_gabmul_operator(dgt, idgt, mask) +%% GEN_GABMUL_OPERATOR computes a Gabor multiplier +% [gabmul_op, varargout] = gen_gabmul_operator(dgt, idgt, mask) +% +% Inputs: +% - dgt: Gabor transform operator +% - idgt: inverse Gabor transform operator +% - mask: binary known mask +% Output: +% - gabmul_op: gabor multiplier- handle function +% +% Author : A. Marina KREME +% e-mail : ama-marina.kreme@lis-lab.fr/ama-marina.kreme@univ-amu.fr +% Created: 2020-28-01 +%% + + + +gabmul_op = @(x)idgt(mask.*dgt(x)); +varargout{1} = mask; + + +end \ No newline at end of file diff --git a/matlab/tfgm/tf_tools/gabormultiplier/generate_rectangular_mask.m b/matlab/tfgm/tf_tools/gabormultiplier/generate_rectangular_mask.m new file mode 100644 index 0000000000000000000000000000000000000000..a026f3af0cf8e913ebdd4d12ef335959e3e64451 --- /dev/null +++ b/matlab/tfgm/tf_tools/gabormultiplier/generate_rectangular_mask.m @@ -0,0 +1,31 @@ +function mask = generate_rectangular_mask(nbins, hop, sig_len, t_lim, f_lim) +%% GENERATE_RECTANGULAR_MASK +% This function generates a rectangular mask +% mask = generate_rectangular_mask(nbins, hop, sig_len, t_lim, f_lim) +% Inputs: +% - nbins: numbers of channels (int) +% - hop : length of time shift (int) +% - sig_len: signal length (int) +% - t_lim : time value interval +% - f_lim : frequency value interval +% +% Outputs: +% - mask : mask +% Author : A. Marina KREME +%% + + +M = nbins/2 +1; +N = sig_len/hop; + +if size(f_lim,2)~=2 || size(t_lim,2)~=2 + error("Incorrect value. f_lim or t_lim must be an interval") +end + +mask = zeros(M,N); +f_lim = round(f_lim*size(mask,1)); +t_lim =round(t_lim*size(mask,2)); + +mask(f_lim(1):f_lim(2),t_lim(1):t_lim(2))=1; + +end diff --git a/matlab/tfgm/tf_tools/gabormultiplier/plot_ambiguity_function.m b/matlab/tfgm/tf_tools/gabormultiplier/plot_ambiguity_function.m new file mode 100644 index 0000000000000000000000000000000000000000..460137560b7d91cf838c3e7ca665d5482ce61c90 --- /dev/null +++ b/matlab/tfgm/tf_tools/gabormultiplier/plot_ambiguity_function.m @@ -0,0 +1,29 @@ +function plot_ambiguity_function(x, dgt , dgt_params, signal_params, dynrange) + +%% plot_ambiguity_function(x, dgt , dgt_params, signal_params, dynrange) + +% This function compute and plot ambiguity function for a given vector +% +% Inputs: +% - x: signal +% -dgt: Gabor transform operator +% - dgt_params: Signals parameters(sig_len, fs) +% - signal_params: Discrete Gabor Transform parameters(hop, nbins,win, ect..) +% - dynrange : dynamic range (optional) +% +% Author: Marina KREME +%% + + + +if nargin==4 + dynrange = 100; +end + +apply_fftshift ='True'; + +x = compute_ambiguity_function(x, dgt ,apply_fftshift); +plotdgtreal(x, dgt_params.hop, dgt_params.nbins, signal_params.fs,'dynrange', dynrange) + + +end diff --git a/matlab/tfgm/tf_tools/gabormultiplier/product_of2_multipliers.m b/matlab/tfgm/tf_tools/gabormultiplier/product_of2_multipliers.m new file mode 100644 index 0000000000000000000000000000000000000000..49c49eb72ddfb8fd3a1fc3f31a53f0a1165f16a9 --- /dev/null +++ b/matlab/tfgm/tf_tools/gabormultiplier/product_of2_multipliers.m @@ -0,0 +1,19 @@ +function mul1mul2= product_of2_multipliers(dgt, idgt, mask1, mask2) +% mul1mul2= product_of2_multipliers(direct_stft, adjoint_stft, mask1, mask2) +% +% This function generates the product of two multipliers +% associated with two masks. +% +% Inputs: +% - dgt: short-time Fourier transfrom operator +% - idgt: inverse short-time Fourier transfrom operator +% - mask1, mask2: binary known mask +% Output: +% - mul1mul2, mul2mul1: product of two gabor multipliers- handle function +% + + +mul1mul2 = @(x)idgt(mask1.*dgt(idgt(mask2.*dgt(x)))); + + +end \ No newline at end of file diff --git a/matlab/tfgm/tf_tools/generate_dgt_parameters.m b/matlab/tfgm/tf_tools/generate_dgt_parameters.m new file mode 100644 index 0000000000000000000000000000000000000000..bd9afbdca3cb48fdea6a5480a665a049b12c1a49 --- /dev/null +++ b/matlab/tfgm/tf_tools/generate_dgt_parameters.m @@ -0,0 +1,74 @@ +function dgt_params = generate_dgt_parameters(win_type, approx_win_len, hop, nbins, sig_len) +%% dgt_params = generate_dgt_parameters(win_type, approx_win_len, hop, nbins, sig_len) +% +% function that generates the dgt parameters.The functions used for +% the DGT are those of ltfat and not those of Matlab + +% Inputs: +% - win_type : str. It can be either a hanning (hann) or gauss window. +% - approx_win_len : window length +% - hop : length of time shift. +% - nbins: number of channels. +% -sig_len: length of input signal. +% +% Outputs: dgt_params - struct containing dgt parameters +% +% +% Author : A. Marina KREME +% e-mail : ama-marina.kreme@lis-lab.fr/ama-marina.kreme@univ-amu.fr +% Created: 2020-28-01 +%% + + + +win_type = lower(win_type); + +if ~ischar(win_type) + error('%s: The window type must be a string',upper(mfilename)); +end + + +ch1= strcmp('hann', win_type); +ch2 = strcmp('gauss', win_type); + +if ch1==0 && ch2==0 + error('%s: Incorrect window type. Please choose hann or gauss.',upper(mfilename)); +end +%% + + + +input_win_len = 2^(round(log2(approx_win_len))); + +if input_win_len ~= approx_win_len + warning('Input window length %.2f has been changed to %.2f.',approx_win_len, input_win_len); +end + +win_len = input_win_len; + +%% + +L = sig_len; + +switch win_type + case 'hann' + [win, info]= gabwin({'tight',{win_type, win_len}}, hop, nbins, L); + + case 'gauss' + tfr = (pi*win_len^2)/(4*sig_len*log(2)); + [win, info]= gabwin({'tight',{win_type, tfr}}, hop, nbins,L); + +end + +%% + +dgt_params.win_len = win_len; +dgt_params.hop = hop; +dgt_params.nbins= nbins; +dgt_params.win_type = win_type; +dgt_params.win = win; +dgt_params.info = info; + + +end + diff --git a/matlab/tfgm/tf_tools/generate_signal_parameters.m b/matlab/tfgm/tf_tools/generate_signal_parameters.m new file mode 100644 index 0000000000000000000000000000000000000000..a35b334d76d70846adb9b4a618b7a31c68c569f0 --- /dev/null +++ b/matlab/tfgm/tf_tools/generate_signal_parameters.m @@ -0,0 +1,28 @@ +function signal_params = generate_signal_parameters(fs, sig_len) +%% GENERATE_SIGNAL_PARAMETERS +% signal_params = generate_signal_parameters(fs, sig_len) +% function that generates signals parameters (fs and sig_len) +% +% Inputs: +% - fs: sampling frequency +% - sig_len : signal length +% Outputs: +% - signal_params: structure that contains the signal parameters, +% i.e. the sampling frequency and the length of the signal. +% +% Author : A. Marina KREME +% e-mail : ama-marina.kreme@lis-lab.fr/ama-marina.kreme@univ-amu.fr +% Created: 2020-28-01 +%% + + +if mod(sig_len,2)~=0 + sig_len = 2^(round(log2(sig_len))); +end + + +signal_params.fs=fs; +signal_params.sig_len = sig_len ; + + +end \ No newline at end of file diff --git a/matlab/tfgm/time_frequency_filtering/reconstruction.m b/matlab/tfgm/time_frequency_filtering/reconstruction.m new file mode 100644 index 0000000000000000000000000000000000000000..52f99865a639a7e5debacc93d0038a3cdcf018ad --- /dev/null +++ b/matlab/tfgm/time_frequency_filtering/reconstruction.m @@ -0,0 +1,9 @@ +function x = reconstruction(lambda_vec, u_mat_list, s_vect_list) + +x =x_mix; +for i=1:length(lambda_vec) + x_rec = recs{i}; + x = x+x_rec(lambda_vec(i))-x_mix; +end + +end \ No newline at end of file diff --git a/matlab/tfgm/time_frequency_filtering/tf_filtering_init.m b/matlab/tfgm/time_frequency_filtering/tf_filtering_init.m new file mode 100644 index 0000000000000000000000000000000000000000..4fadc40a49910805898ce920cbd8ff5a8edb58f4 --- /dev/null +++ b/matlab/tfgm/time_frequency_filtering/tf_filtering_init.m @@ -0,0 +1,38 @@ +function tf_filtering_init(x_mix, mask, dgt_params, signal_params, multiple_masks) + +%% +if multiple_masks=='True' + n_areas = unique(mask); + mask=mask; +else + n_areas=1; + mask= mask>0; +end +%% +gabmul_list =cell(length(n_areas),1); + +for i =1:length(n_areas) + gabmul_list{i} = gen_gabmul_operator(tight_direct_stft, tight_adjoint_stft, mask_); +end +end + +% def __init__(self, x_mix, mask, dgt_params, signal_params, multiple_masks): +% self.x_mix = x_mix +% self.dgt_params = dgt_params +% self.signal_params = signal_params +% if multiple_masks: +% n_areas = np.unique(mask).size - 1 +% self.mask = mask +% else: +% n_areas = 1 +% self.mask = mask > 0 +% self.gabmul_list = [GaborMultiplier(mask=(mask == i + 1), +% dgt_params=dgt_params, +% signal_params=signal_params) +% for i in range(n_areas)] +% self.s_vec_list = [None for i in range(n_areas)] +% self.u_mat_list = [None for i in range(n_areas)] +% self.uh_x_list = [None for i in range(n_areas)] +% self.t_arrf = [None for i in range(n_areas)] +% self.t_evdn = [None for i in range(n_areas)] +% self.t_uh_x = [None for i in range(n_areas)] diff --git a/matlab/tfgm/time_frequency_filtering/untitled.m b/matlab/tfgm/time_frequency_filtering/untitled.m new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/matlab/tfgm/utils/EVD_eigs.m b/matlab/tfgm/utils/EVD_eigs.m new file mode 100644 index 0000000000000000000000000000000000000000..03ac5836e88a2b5aaf46bf9b41ddab347fcdabec --- /dev/null +++ b/matlab/tfgm/utils/EVD_eigs.m @@ -0,0 +1,23 @@ +function svd_res = EVD_eigs(mul, sig_len, r) +%% SVD_RES = EVD_eigs(MUL, SIG_LEN, R) +% this function is used to perform the spectral value decomposition +% by pre-estimating the rank of the matrix to be diagonalized. +% It uses the MATLAB's "eigs" function for diagonalization. +% +% Inputs: +% - mul : operator to be diagonalized (Gabor multiplier ) +% - sig_len : signal length +% - r : integer - number of eigenvalues to keep +% +% Outputs: +% +% - U :orthonormal matrix +% - D : nonnegative and diagonal matrix +% +% Created: 2020-04-01 +%% + +[U,D] = eigs(mul, sig_len, r); +svd_res.U = U; +svd_res.D =D; +end \ No newline at end of file diff --git a/matlab/tfgm/utils/EVD_nystrom.m b/matlab/tfgm/utils/EVD_nystrom.m new file mode 100644 index 0000000000000000000000000000000000000000..bab9774e2b9a1a219718dae4fd7bf41f28456e70 --- /dev/null +++ b/matlab/tfgm/utils/EVD_nystrom.m @@ -0,0 +1,33 @@ +function svd_res = EVD_nystrom(mul, Q) +%% SVD_RES = EVD_HALKO(MUL, Q) +% this function is used to perform the spectral value decomposition +% by pre-estimating the rank of the matrix to be diagonalized. +% It uses the function "eigenvalue decomposition via nystrom[1]" for diagonalization. +% +% +% Inputs: +% - mul : operator to be diagonalized (Gabor multiplier ) +% - Q : orthonormal matrix +% +% Outputs: +% +% - U :orthononmal matrix +% - D : nonnegative and diagonal matrix +% +% +% REFERENCES: +% +% Nathan Halko, Per-Gunnar Martinsson, Joel A. Tropp, "Finding structure +% with randomness: Probabilistic algorithms for constructing approximate +% matrix decompositions", 2011. +% +% +% Created: 2020-04-01 +%% + +[U,D] = eigvalue_decomposition_via_nystrom(mul, Q); +svd_res.U = U; +svd_res.D =D; + + +end diff --git a/matlab/tfgm/utils/build_IS_tab.m b/matlab/tfgm/utils/build_IS_tab.m new file mode 100644 index 0000000000000000000000000000000000000000..79bc31f8a224fd83c0ec82ff8868dc47651853cf --- /dev/null +++ b/matlab/tfgm/utils/build_IS_tab.m @@ -0,0 +1,74 @@ +%% load data +fid = fopen('exp_solve_pd.csv', 'r'); +% read data +formatSpec = '%s %s %s %f %s %f'; +data = textscan(fid, formatSpec,... + 'headerlines', 1,... + 'delimiter',',',... + 'TreatAsEmpty','NA'); % lecture du fichier +fclose(fid); + +%% define data to be taken +% PERTUBATION +%data{1,1} +% 'beeps' 'bird' 'chirps' 'clicks' 'finger_snaps' 'modulations' +listp={'beeps','bird','chirps','clicks','finger_snaps','modulations'}; +% WIDEBAND SIGNALS +%data{1,2} +% 'car' 'train' 'plane' +listw={'car','train','plane'}; +% WINDOW +%data{1,3} +win = 'gauss 256'; %ou 'hann 512' +% 1 REGION or P REGIONS +%data{1,4} +%isnan 1 region sinon P region +% DATA TO BE READ +%data{1,5} +% 'is_zero' 'is_interp' 'is_oracle_sdr' 'is_tff' +% NUMERICAL VALUE +%data{1,6} --> les res numeriques + +%% generate matlab table +indw=strcmp(data{1,3},win); %window +indnan=isnan(data{1,4}); %1 or P regions + +% we read all configurations +tab=[]; +for i=listp + indb=strcmp(data{1,1},i); + for j=listw + tabtmp=[]; + indc=strcmp(data{1,2},j); + for k={'is_zero','is_interp','is_oracle_sdr','is_tff'} + inds=strcmp(data{1,5},k); + ind=indw&indb&indc&inds&indnan; + tabtmp=[tabtmp,data{1,6}(ind)]; + end + ind=indw&indb&indc&inds&~indnan; + tabtmp=[tabtmp,data{1,6}(ind)]; + tab=[tab;tabtmp]; + end +end + +%% generate latex table +fic='resIS.txt'; +fid=fopen(fic,'a+'); +l=1; +txt=[]; +for i=listp + for j=listw + for m=1:5 + txt=[txt,'&',num2str(tab(l,m),'%.1f')]; + if m==5 + txt=[txt,'\\']; + end + end + text=[i{1},'&',j{1},txt]; + fprintf(fid,'%s\n',text); + l=l+1; + txt=[]; + end + fprintf(fid,'%s\n','\hline'); +end +fclose(fid); \ No newline at end of file diff --git a/matlab/tfgm/utils/build_SDR_tab.m b/matlab/tfgm/utils/build_SDR_tab.m new file mode 100644 index 0000000000000000000000000000000000000000..d3515bcf3ba15d57cd281d54c1ae7d930914ac75 --- /dev/null +++ b/matlab/tfgm/utils/build_SDR_tab.m @@ -0,0 +1,74 @@ +%% load data +fid = fopen('exp_solve_pd.csv', 'r'); +% read data +formatSpec = '%s %s %s %f %s %f'; +data = textscan(fid, formatSpec,... + 'headerlines', 1,... + 'delimiter',',',... + 'TreatAsEmpty','NA'); % lecture du fichier +fclose(fid); + +%% define data to be taken +% PERTUBATION +%data{1,1} +% 'beeps' 'bird' 'chirps' 'clicks' 'finger_snaps' 'modulations' +listp={'beeps','bird','chirps','clicks','finger_snaps','modulations'}; +% WIDEBAND SIGNALS +%data{1,2} +% 'car' 'train' 'plane' +listw={'car','train','plane'}; +% WINDOW +%data{1,3} +win = 'gauss 256'; %ou 'hann 512' +% 1 REGION or P REGIONS +%data{1,4} +%isnan 1 region sinon P region +% DATA TO BE READ +%data{1,5} +% 'sdr_zero' 'sdr_interp' 'sdr_tff' 'sdr_oracle_sdr' +% NUMERICAL VALUE +%data{1,6} --> les res numeriques + +%% generate matlab table +indw=strcmp(data{1,3},win); %window +indnan=isnan(data{1,4}); %1 or P regions + +% we read all configurations +tab=[]; +for i=listp + indb=strcmp(data{1,1},i); + for j=listw + tabtmp=[]; + indc=strcmp(data{1,2},j); + for k={'sdr_zero','sdr_interp','sdr_oracle_sdr','sdr_tff'} + inds=strcmp(data{1,5},k); + ind=indw&indb&indc&inds&indnan; + tabtmp=[tabtmp,data{1,6}(ind)]; + end + ind=indw&indb&indc&inds&~indnan; + tabtmp=[tabtmp,data{1,6}(ind)]; + tab=[tab;tabtmp]; + end +end + +%% generate latex table +fic='resSDR.txt'; +fid=fopen(fic,'a+'); +l=1; +txt=[]; +for i=listp + for j=listw + for m=1:5 + txt=[txt,'&',num2str(tab(l,m),'%.2f')]; + if m==5 + txt=[txt,'\\']; + end + end + text=[i{1},'&',j{1},txt]; + fprintf(fid,'%s\n',text); + l=l+1; + txt=[]; + end + fprintf(fid,'%s\n','\hline'); +end +fclose(fid); \ No newline at end of file diff --git a/matlab/tfgm/utils/compute_dgt.m b/matlab/tfgm/utils/compute_dgt.m new file mode 100644 index 0000000000000000000000000000000000000000..f37e9dc88cb9e0dc330a9b8552e77e775ea8e252 --- /dev/null +++ b/matlab/tfgm/utils/compute_dgt.m @@ -0,0 +1,19 @@ +function tf_mat = compute_dgt(x, dgt) +%% tf_mat = compute_dgt(x, dgt) +% This function computes the time-frequency (TF) matrix from a signal +% +% Input: +% - x: signal. must be a vector +% - dgt :gabor transform operator +% Output: +% -tf_mat: TF matrix +% +% Author : A. Marina KREME +% e-mail : ama-marina.kreme@lis-lab.fr/ama-marina.kreme@univ-amu.fr +% Created: 2020-28-01 +%% +if size(x,2)~=1 + error('Input signal must be a vector of a column:%s',upper(mfilename)) +end +tf_mat = dgt(x); +end \ No newline at end of file diff --git a/matlab/tfgm/utils/compute_idgt.m b/matlab/tfgm/utils/compute_idgt.m new file mode 100644 index 0000000000000000000000000000000000000000..72243bc33715cca4728d72ca03680d2e059b8c0f --- /dev/null +++ b/matlab/tfgm/utils/compute_idgt.m @@ -0,0 +1,18 @@ +function x = compute_idgt(tf_mat, idgt) +%% x = compute_idgt(tf_mat, idgt) +% This function reconstruct a signal form its the time-frequency (TF) matrix +% +% Input: +% - tf_mat: TF matrix +% - idgt: inverse of gabor transform operator +% Output: +% -x: reconstructed signal +% +% Author : A. Marina KREME +% e-mail : ama-marina.kreme@lis-lab.fr/ama-marina.kreme@univ-amu.fr +% Created: 2020-28-01 +%% + +x = idgt(tf_mat); + +end \ No newline at end of file diff --git a/matlab/tfgm/utils/compute_r.m b/matlab/tfgm/utils/compute_r.m new file mode 100644 index 0000000000000000000000000000000000000000..2fa569feedafe3f05391ca5620de602ead03cf7a --- /dev/null +++ b/matlab/tfgm/utils/compute_r.m @@ -0,0 +1,28 @@ +function r = compute_r(m, n, prob) +%% COMPUTE_R: this function calculates a small integer r which is used to equilibrate the +% calculation cost and the reliability of the approximation error of +% |(I-QQ')A| < tol in Halko, 2011. +% +% Input: +% - m: number of lines in the input matrix +% - n: number of columns in the input matrix +% - prob: the probability with which one would like to achieve approximation Q of A. +% +% Output: +% - r: integer +% +% REFERENCES: +% +% Nathan Halko, Per-Gunnar Martinsson, Joel A. Tropp, "Finding structure +% with randomness: Probabilistic algorithms for constructing approximate +% matrix decompositions", 2011. +% +% Author : A. Marina KREME +% e-mail : ama-marina.kreme@lis-lab.fr/ama-marina.kreme@univ-amu.fr +% Created: 2020-28-01 +%% + + +r = ceil(-(log((1-prob)/min(m,n)))/log(10)); + +end \ No newline at end of file diff --git a/matlab/tfgm/utils/db.m b/matlab/tfgm/utils/db.m new file mode 100644 index 0000000000000000000000000000000000000000..dd0ccf488de1cde98e0ae9ec67e9aaa5939df726 --- /dev/null +++ b/matlab/tfgm/utils/db.m @@ -0,0 +1,10 @@ +function x_db = db(x) +%% x_db = db(x) +% Converts the elements of x to decibels (dB). +% Author: Marina KREME +%% +x_db = 20*log10(abs(x)); +end + + + diff --git a/matlab/tfgm/utils/generate_mask.m b/matlab/tfgm/utils/generate_mask.m new file mode 100644 index 0000000000000000000000000000000000000000..42e94e3605f2fc6ad3e5a22890f86049e69c29d8 --- /dev/null +++ b/matlab/tfgm/utils/generate_mask.m @@ -0,0 +1,44 @@ +function [mask,varargout] = generate_mask(tf_mat_wideband, tf_mat_loc, alpha, seuil, radius) + +%% GENERATE MASK +% [original_mask, mask_after_imclose, mask_after_imopen,..., +% mask] = generate_mask(tf_mat_wideband, tf_mat_loc, alpha, seuil, radius) + +% function that generates a binary mask +% +% Inputs: + +% - tf_mat_wideband: dgt of target signal +% - tf_mat_loc : dgt of perturbation signal +% - alpha: parameter to adjust the size of the mask +% - radius : it specifies the radius of morphological structuring element. +% - seuil: threshold value. +% +% Output: +% - mask: binary mask +% +% Author : A. Marina KREME +% e-mail : ama-marina.kreme@lis-lab.fr/ama-marina.kreme@univ-amu.fr +% Created: 2020-28-01 +%% + + +original_mask = or(abs(tf_mat_wideband)<alpha*abs(tf_mat_loc), abs(tf_mat_loc)>seuil); +varargout{1} = original_mask; + +%figure('name','mask initial'); imagesc(original_mask) + +%% + +se = strel('disk',radius); +mask_after_imclose = imclose(original_mask,se); + +varargout{2} = mask_after_imclose; +%figure('name','imclose'); imagesc(mask_after_imclose) +%% +mask_after_imopen = imopen(mask_after_imclose,se); +varargout{3} = mask_after_imopen; +%figure('name','mask imopen'); imagesc(mask_after_imopen) +mask =mask_after_imopen; +end + diff --git a/matlab/tfgm/utils/generate_mask_db.m b/matlab/tfgm/utils/generate_mask_db.m new file mode 100644 index 0000000000000000000000000000000000000000..8a8c10cb55c54a788ec77601f00dff50d9a8a0b0 --- /dev/null +++ b/matlab/tfgm/utils/generate_mask_db.m @@ -0,0 +1,46 @@ +function mask = generate_mask_db(x_loc, x_wb, gamma, dgt, delta_mix_db, delta_loc_db,radius, or_mask) +%% GENERATE MASK +% mask = generate_mask_db(dgt_X_wb, dgt_X_loc, gain_mix_db, gain_loc_db,radius, or_mask) +% function that generates a binary mask +% +%% + +signals = generate_mix_signal(x_wb, x_loc, gamma); +x_wb = signals.wideband; +x_loc = signals.localized; + +tf_mat_loc_db = db(abs(dgt(x_loc))); +tf_mat_wb_db = db(abs(dgt(x_wb))); + + +mask_mix = tf_mat_loc_db > tf_mat_wb_db + delta_mix_db; +mask_loc = tf_mat_loc_db > max(tf_mat_loc_db(:)) - delta_loc_db; + + + + +if or_mask==1 + mask_raw = or(mask_mix, mask_loc); +else + mask_raw = and(mask_mix, mask_loc); +end + +%figure('name','init'); imagesc(mask) +%% +se = strel('disk',radius,0); +mask = mask_raw; +for k=1:10 +%% +mask_close = imclose(mask,se); +%figure('name','imclose'); imagesc(mask) + +%% +mask = imopen(mask_close,se); +%figure('name','imopen'); imagesc(mask) + +end + + + + +end \ No newline at end of file diff --git a/matlab/tfgm/utils/generate_mix_signal.m b/matlab/tfgm/utils/generate_mix_signal.m new file mode 100644 index 0000000000000000000000000000000000000000..be2fb55cf5bd9d68fa7f5a6ab9179aee535e22eb --- /dev/null +++ b/matlab/tfgm/utils/generate_mix_signal.m @@ -0,0 +1,41 @@ +function signals = generate_mix_signal(x_wb, x_loc, gamma) +%% signals = generate_mix_signal(x_wb, x_loc, gamma) +% function that generates mixtures of two signals +% Inputs: +% - x_wb: signal with wideband spectrogram +% - x_loc: signal with localized spectrogram +% - gamma: constant belonging to interval ]0,1[. +% allows you to control the percentages of each signal. +% Outputs: +% - signals: struct containing wideband, localized and mixtures of two signals. +% +% +% Author : A. Marina KREME +% e-mail : ama-marina.kreme@lis-lab.fr/ama-marina.kreme@univ-amu.fr +% Created: 2020-28-01 +% +%% + + + +if length(x_wb)~= length(x_loc) + error('%s:Arrays are not equal',upper(mfilename)); +end + +x_wb= x_wb./norm(x_wb); +x_loc = x_loc./norm(x_loc); + + +if (gamma==0 || gamma==1) + error('%s: Incorrect gamma value. It must be in ]0,1[. Please check it',upper(mfilename)); +else + x_wb = gamma*x_wb; + x_loc = (1-gamma)*x_loc; + x_mix = x_wb + x_loc; +end + +signals.wideband = x_wb; +signals.localized = x_loc; +signals.mix = x_mix; + +end \ No newline at end of file diff --git a/matlab/tfgm/utils/get_stft_operators.m b/matlab/tfgm/utils/get_stft_operators.m new file mode 100644 index 0000000000000000000000000000000000000000..b42074d2927e1c87d15430a957bf59c777266a7e --- /dev/null +++ b/matlab/tfgm/utils/get_stft_operators.m @@ -0,0 +1,46 @@ +function [dgt, idgt, varargout] = get_stft_operators(dgt_params, signal_params, phase_conv) +%% GET_STFT_OPERATORS +% [dgt, idgt, pseudoinverse_dgt] = get_stft_operators(dgt_params, signal_params, phase_conv) + +% functions that generate the DGT operators. +% +% Inputs: +% - dgt_params: struct that contains the DGT parameters. See generate_dgt_parameters.m +% - signal_params: structure which contains the sampling frequency as well as the signal length +% - phase_conv : Compute a DGT using a frequency-invariant phase. +% +% Outputs: +% +% Author : A. Marina KREME +% e-mail : ama-marina.kreme@lis-lab.fr/ama-marina.kreme@univ-amu.fr +% Created: 2020-28-01 +%% + + +if nargin==2 + phase_conv= 'freqinv'; +end + + +L = signal_params.sig_len; + + +%% +win = dgt_params.win; +wd = gabdual(win, dgt_params.hop, dgt_params.nbins, L); + + +dgt = @(x)dgtreal(x, win, dgt_params.hop, dgt_params.nbins, L, phase_conv); +idgt = @(x)idgtreal(x, win, dgt_params.hop, dgt_params.nbins, L, phase_conv); + +pseudoinverse_dgt = @(x)idgtreal(x, wd, dgt_params.hop, dgt_params.nbins, L, phase_conv); + + +varargout{1} = pseudoinverse_dgt; + + + +end + + + diff --git a/matlab/tfgm/utils/itakura_saito_dist.m b/matlab/tfgm/utils/itakura_saito_dist.m new file mode 100644 index 0000000000000000000000000000000000000000..286d9c0aa0c9e4f7b3130308f563fb2e04b006d4 --- /dev/null +++ b/matlab/tfgm/utils/itakura_saito_dist.m @@ -0,0 +1,27 @@ +function IS = itakura_saito_dist(x_ref,x_est) +%% IS = itakura_saito_dist(x_ref,x_est) +% The Itakura?Saito distance (or Itakura?Saito divergence).It's measure +% of the difference between an original signal x_ref and an approximation +% x_est. see [1] +% Inputs: +% - x_ref : original signal +% - x_est : estimated signal +% Output: +% -IS: Itakura SAito measurement. +% +% +% Reference: +% +% [1] Itakura,F.,& Saito,S. (1968). Analysis synthesis telephony based +% on the maximum likelihood method. +% +% +% Author: Marina KREME +%% +z = x_ref./x_est; + +IS = sum(z - log(z)) - length(z); +end + + + diff --git a/matlab/tfgm/utils/itakura_saito_dist_spectrum.m b/matlab/tfgm/utils/itakura_saito_dist_spectrum.m new file mode 100644 index 0000000000000000000000000000000000000000..4a7d9a638e3aefada64e4f82d39b43106f4be6a2 --- /dev/null +++ b/matlab/tfgm/utils/itakura_saito_dist_spectrum.m @@ -0,0 +1,31 @@ +function IS_spectrum= itakura_saito_dist_spectrum(x_ref,x_est) + +%% IS_spectrum= itakura_saito_dist_spectrum(x_ref,x_est) +% The Itakura?Saito distance (or Itakura?Saito divergence).It's measure +% of the difference between an original spectrum and an approximation. see [1] +% Inputs: +% - x_ref : original signal +% - x_est : estimated signal +% Output: +% -IS: Itakura SAito measurement. +% +% +% Reference: +% +% [1] Itakura,F.,& Saito,S. (1968). Analysis synthesis telephony based +% on the maximum likelihood method. +% +% +% Author: Marina KREME +%% + + +x_spectre = abs(fft(x_ref)); +y_spectre = abs(fft(x_est)); +IS_spectrum =itakura_saito_dist(x_spectre,y_spectre); + +end + + + + diff --git a/matlab/tfgm/utils/plot_mask.m b/matlab/tfgm/utils/plot_mask.m new file mode 100644 index 0000000000000000000000000000000000000000..f2180c7adc23e5892ab6b6c9fb8bc1c30c4242f5 --- /dev/null +++ b/matlab/tfgm/utils/plot_mask.m @@ -0,0 +1,18 @@ +function plot_mask(mask, hop, nbins, fs) + +%% plot_mask(mask, hop, nbins, fs) +% % This function displays the mask +% +% Inputs: +% - mask: binary mask +% - hop : length of time shift (int) +% - nbins: numbers of channels (int) +% - fs : sampling frequency + +% Author : A. Marina KREME +%% + +%L = hop*size(mask,2); + +plotdgtreal(mask, hop, nbins, fs,'lin'); +%title(['Signal length = ' num2str(L)]); diff --git a/matlab/tfgm/utils/plot_spectrogram.m b/matlab/tfgm/utils/plot_spectrogram.m new file mode 100644 index 0000000000000000000000000000000000000000..3a4a29ea3808be5de974376645aed978523821fd --- /dev/null +++ b/matlab/tfgm/utils/plot_spectrogram.m @@ -0,0 +1,31 @@ +function plot_spectrogram(x, dgt_params, signal_params, dgt, dynrange, clim) +%% plot_spectrogram(x, dgt_params, signal_params, dgt, dynrange, clim) +% Function that displays the spectrogram of a signal +% +% Inputs: +% - x: signal +% - dgt_params: dgt parameters +% - signal_params: signal parameters +% - dgt : Gabor transform operator +% - dynrange : optional +% - clim: optional +% +% Author : A. Marina KREME +%% + +if size(x,2)==1 + x = compute_dgt(x,dgt); +end + + +if nargin==4 + dynrange=100; + c_max = max(db(x(:))); + clim = [c_max - dynrange, c_max]; +end + + + +plotdgtreal(x, dgt_params.hop, dgt_params.nbins, signal_params.fs,..., + 'dynrange', dynrange,'clim',clim) +end diff --git a/matlab/tfgm/utils/plot_win.m b/matlab/tfgm/utils/plot_win.m new file mode 100644 index 0000000000000000000000000000000000000000..4d817aad34bc98b2108e1bccaad4fa8657b1e505 --- /dev/null +++ b/matlab/tfgm/utils/plot_win.m @@ -0,0 +1,33 @@ +function plot_win(win, fs, sig_len, win_type) +%% plot_win(win, fs, sig_len, win_type) +% This function displays the analysis window +% +% Inputs: +% - win : analysis window +% - fs : sampling frequency +% - sig_len : signal lenght +% - win_type: window type (str) +% +% Author: Marina KREME +%% + +x_range = fftshift((1:length(win))./fs); +x_range(x_range > x_range(end)) = x_range(x_range > x_range(end)) - length(x_range)/fs; + +if nargin==3 + plot(x_range, fftshift(win),'LineWidth',2.5); +elseif ~ischar(win_type) + error('%s: The window type must be a string',upper(mfilename)); +else + plot(x_range, fftshift(win), 'LineWidth',2.5) + legend(win_type) + +end +xlabel('Time (s)') +grid('on') +title(['Signal length = ' num2str(sig_len)]); + + + + + diff --git a/matlab/tfgm/utils/sdr.m b/matlab/tfgm/utils/sdr.m new file mode 100644 index 0000000000000000000000000000000000000000..e94493dcd77fe9d230a9c0f6459438c921a3fa1d --- /dev/null +++ b/matlab/tfgm/utils/sdr.m @@ -0,0 +1,18 @@ +function SDR = sdr(x_ref, x_est) + +%% SDR = sdr(x_ref, x_est) +% Compute Signal to Distorsion Ratio (SDR) between target signal +% and estimated signal +% +% Inputs: +% - x_ref: target signal +% - x_est: estimated signal +% +% Output: +% -SDR: Signal to Distorsion Ratio in dB +% +% Author: Marina KREME +%% +SDR= 20*log10(norm(x_ref,2)/norm(x_ref-x_est,2)); + +end \ No newline at end of file diff --git a/matlab/tfgm/utils/snr.m b/matlab/tfgm/utils/snr.m new file mode 100644 index 0000000000000000000000000000000000000000..b6d265686e85ec9be6fad473b129cfbd2a1742c9 --- /dev/null +++ b/matlab/tfgm/utils/snr.m @@ -0,0 +1,18 @@ +function SNR = snr(x_signal, x_noise) + +%% SNR = snr(x_signal, x_noise) +% Compute SIgnal to Noise Ratio. It's used to compare the level +% of a desired signal to the level of background noise. +% +% Inputs: +% -x_signal: target signal +% - x_noise: noise signal +% +% Output: +% - SNR : SNR +% Author: Marina KREME +%% + +SNR = db(norm(x_signal)/norm(x_noise)); +end +