diff toolboxes/AudioInpaintingToolbox/Experiments/DeclippingExperiment/declipOneSoundExperiment.m @ 138:56d719a5fd31 ivand_dev

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