ivan@138: function declipOneSoundExperiment(expParam) ivan@138: % A simple experiment to declip a signal. ivan@138: % ivan@138: % Usage: declipOneSoundExperiment(expParam) ivan@138: % ivan@138: % ivan@138: % Inputs: ivan@138: % - expParam is an optional structure where the user can define ivan@138: % the experiment parameters. ivan@138: % - expParam.clippingLevel: clipping level between 0 and 1. ivan@138: % - expParam.filename: file to be tested. ivan@138: % - expParam.destDir: path to store the results. ivan@138: % - expParam.solver: solver with its parameters ivan@138: % - expParam.destDir: path to store the results. ivan@138: % ivan@138: % ivan@138: % ------------------- ivan@138: % ivan@138: % Audio Inpainting toolbox ivan@138: % Date: June 28, 2011 ivan@138: % By Valentin Emiya, Amir Adler, Maria Jafari ivan@138: % This code is distributed under the terms of the GNU Public License version 3 (http://www.gnu.org/licenses/gpl.txt). ivan@138: ivan@138: if ~isdeployed ivan@138: close all ivan@138: addpath('../../Problems/'); ivan@138: addpath('../../Solvers/'); ivan@138: addpath('../../Utils/'); ivan@138: addpath('../../Utils/dictionaries/'); ivan@138: addpath('../../Utils/evaluation/'); ivan@138: % addpath('../../Utils/TCPIP_SocketCom/'); ivan@138: % javaaddpath('../../Utils/TCPIP_SocketCom'); ivan@138: dbstop if error ivan@138: end ivan@138: ivan@138: %% Set parameters ivan@138: if nargin<1 ivan@138: expParam = []; ivan@138: end ivan@138: if ~isfield(expParam,'filename') ivan@138: expParam.filename = 'male01_8kHz.wav'; ivan@138: end ivan@138: if ~isfield(expParam,'clippingLevel') ivan@138: expParam.clippingLevel = 0.6; ivan@138: end ivan@138: ivan@138: % Solver ivan@138: if ~isfield(expParam,'solver') ivan@138: warning('AITB:N','Frame length=256 is used to have faster computations. Recommended frame length is 512 at 8kHz.'); ivan@138: warning('AITB:overlap','Overlap factor=2 is used to have faster computations. Recommended value: 4.'); ivan@138: ivan@138: expParam.solver.name = 'OMP-G'; ivan@138: expParam.solver.function = @inpaintSignal_IndependentProcessingOfFrames; ivan@138: expParam.solver.param.N = 512; % frame length ivan@138: expParam.solver.param.N = 256; % frame length ivan@138: expParam.solver.param.inpaintFrame = @inpaintFrame_OMP_Gabor; % solver function ivan@138: expParam.solver.param.OMPerr = 0.001; ivan@138: expParam.solver.param.sparsityDegree = expParam.solver.param.N/4; ivan@138: expParam.solver.param.D_fun = @Gabor_Dictionary; % Dictionary (function handle) ivan@138: expParam.solver.param.OLA_frameOverlapFactor = 4; ivan@138: expParam.solver.param.OLA_frameOverlapFactor = 2; ivan@138: expParam.solver.param.redundancyFactor = 2; % Dictionary redundancy ivan@138: expParam.solver.param.wd = @wRect; % Weighting window for dictionary atoms ivan@138: expParam.solver.param.wa = @wRect; % Analysis window ivan@138: expParam.solver.param.OLA_ws = @wSine; % Synthesis window ivan@138: expParam.solver.param.SKIP_CLEAN_FRAMES = true; % do not process frames where there is no missing samples ivan@138: expParam.solver.param.MULTITHREAD_FRAME_PROCESSING = false; % not implemented yet ivan@138: end ivan@138: if ~isfield(expParam,'destDir'), ivan@138: expParam.destDir = '../../tmp/declipOneSound/'; ivan@138: end ivan@138: if ~exist(expParam.destDir,'dir') ivan@138: mkdir(expParam.destDir) ivan@138: end ivan@138: ivan@138: %% Read test signal ivan@138: [x fs] = wavread(expParam.filename); ivan@138: ivan@138: %% Generate the problem ivan@138: [problemData, solutionData] = generateDeclippingProblem(x,expParam.clippingLevel); ivan@138: ivan@138: %% Declip with solver ivan@138: fprintf('\nDeclipping\n') ivan@138: % [xEst1 xEst2] = inpaintSignal_IndependentProcessingOfFrames(problemData,param); ivan@138: solverParam = expParam.solver.param; ivan@138: [xEst1 xEst2] = expParam.solver.function(problemData,solverParam); ivan@138: ivan@138: %% Compute and display SNR performance ivan@138: L = length(xEst1); ivan@138: N = expParam.solver.param.N; ivan@138: [SNRAll, SNRmiss] = SNRInpaintingPerformance(... ivan@138: solutionData.xClean(N:L-N),problemData.x(N:L-N),... ivan@138: xEst2(N:L-N),problemData.IMiss(N:L-N)); ivan@138: fprintf('SNR on missing samples:\n'); ivan@138: fprintf('Clipped: %g dB\n',SNRmiss(1)); ivan@138: fprintf('Estimate: %g dB\n',SNRmiss(2)); ivan@138: ivan@138: ivan@138: % Plot results ivan@138: xClipped = problemData.x; ivan@138: xClean = solutionData.xClean; ivan@138: figure ivan@138: hold on ivan@138: plot(xClipped,'r') ivan@138: plot(xClean) ivan@138: plot(xEst2,'--g') ivan@138: plot([1;length(xClipped)],[1;1]*[-1,1]*max(abs(xClipped)),':r') ivan@138: legend('Clipped','True solution','Estimate') ivan@138: ivan@138: % Normalized and save sounds ivan@138: normX = 1.1*max(abs([xEst1(:);xEst2(:);xClean(:)])); ivan@138: L = min([length(xEst2),length(xEst1),length(xClean),length(xEst1),length(xClipped)]); ivan@138: xEst1 = xEst1(1:L)/normX; ivan@138: xEst2 = xEst2(1:L)/normX; ivan@138: xClipped = xClipped(1:L)/normX; ivan@138: xClean = xClean(1:L)/normX; ivan@138: wavwrite(xEst1,fs,[expParam.destDir 'xEst1.wav']); ivan@138: wavwrite(xEst2,fs,[expParam.destDir 'xEst2.wav']); ivan@138: wavwrite(xClipped,fs,[expParam.destDir 'xClipped.wav']); ivan@138: wavwrite(xClean,fs,[expParam.destDir 'xClean.wav']); ivan@138: ivan@138: ivan@138: return