Mercurial > hg > smallbox
diff toolboxes/AudioInpaintingToolbox/Experiments/DeclippingExperiment/declippingExperiment.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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/toolboxes/AudioInpaintingToolbox/Experiments/DeclippingExperiment/declippingExperiment.m Thu Jul 21 14:27:47 2011 +0100 @@ -0,0 +1,211 @@ +function declippingExperiment(expParam) +% Declip several sounds with different clipping levels, using several +% solvers. +% +% Usage: declippingExperiment(expParam) +% +% +% Inputs: +% - expParam is an optional structure where the user can define +% the experiment parameters. +% - expParam.clippingScale: clipping values to test, as a vector +% of real numbers in ]0,1[. +% - expParam.soundDir: path to sound directory. All the .wav files +% in this directory will be tested. +% - expParam.destDir: path to store the results. +% - expParam.solvers: list of solvers with their parameters +% +% +% ------------------- +% +% 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 + addpath('../../Problems/'); + addpath('../../Solvers/'); + addpath('../../Utils/'); + addpath('../../Utils/dictionaries/'); + addpath('../../Utils/evaluation/'); +% addpath('../../Utils/TCPIP_SocketCom/'); +% javaaddpath('../../Utils/TCPIP_SocketCom'); + dbstop if error + close all +end + +if nargin<1 + expParam = []; +end +if ~isfield(expParam,'clippingScale'), + expParam.clippingScale = 0.4:0.2:0.8; +end +if ~isfield(expParam,'soundDir'), + expParam.soundDir = '../../Data/testSpeech8kHz_from16kHz/'; + expParam.soundDir = '../../Data/shortTest/'; + warning('AITB:soundDir','soundDir has only one sound to have faster computations. Recommended soundDir: ../../Data/testSpeech8kHz_from16kHz/'); +end +if ~isfield(expParam,'destDir'), + expParam.destDir = '../../tmp/declip/'; +end + +%% Set parameters + +if ~isfield(expParam,'solvers'), + % Choose the solver methods you would like to test: OMP, L1, Janssen + 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.'); + nSolver = 0; + + nSolver = nSolver+1; + expParam.solvers(nSolver).name = 'OMP-C'; + expParam.solvers(nSolver).function = @inpaintSignal_IndependentProcessingOfFrames; + expParam.solvers(nSolver).param.N = 512; % frame length + expParam.solvers(nSolver).param.N = 256; % frame length + expParam.solvers(nSolver).param.inpaintFrame = @inpaintFrame_OMP; % solver function + expParam.solvers(nSolver).param.OMPerr = 0.001; + expParam.solvers(nSolver).param.sparsityDegree = expParam.solvers(nSolver).param.N/4; + expParam.solvers(nSolver).param.D_fun = @DCT_Dictionary; % Dictionary (function handle) + expParam.solvers(nSolver).param.OLA_frameOverlapFactor = 4; + expParam.solvers(nSolver).param.OLA_frameOverlapFactor = 2; + expParam.solvers(nSolver).param.redundancyFactor = 2; % Dictionary redundancy + expParam.solvers(nSolver).param.wd = @wRect; % Weighting window for dictionary atoms + expParam.solvers(nSolver).param.wa = @wRect; % Analysis window + expParam.solvers(nSolver).param.OLA_ws = @wSine; % Synthesis window + expParam.solvers(nSolver).param.SKIP_CLEAN_FRAMES = true; % do not process frames where there is no missing samples + expParam.solvers(nSolver).param.MULTITHREAD_FRAME_PROCESSING = false; % not implemented yet + + nSolver = nSolver+1; + expParam.solvers(nSolver).name = 'consOMP-C'; + expParam.solvers(nSolver).function = @inpaintSignal_IndependentProcessingOfFrames; + expParam.solvers(nSolver).param.N = 512; % frame length + expParam.solvers(nSolver).param.N = 256; % frame length + expParam.solvers(nSolver).param.inpaintFrame = @inpaintFrame_consOMP; % solver function + expParam.solvers(nSolver).param.OMPerr = 0.001; + expParam.solvers(nSolver).param.sparsityDegree = expParam.solvers(nSolver).param.N/4; + expParam.solvers(nSolver).param.D_fun = @DCT_Dictionary; % Dictionary (function handle) + expParam.solvers(nSolver).param.OLA_frameOverlapFactor = 4; + expParam.solvers(nSolver).param.OLA_frameOverlapFactor = 2; + expParam.solvers(nSolver).param.redundancyFactor = 2; % Dictionary redundancy + expParam.solvers(nSolver).param.wd = @wRect; % Weighting window for dictionary atoms + expParam.solvers(nSolver).param.wa = @wRect; % Analysis window + expParam.solvers(nSolver).param.OLA_ws = @wSine; % Synthesis window + expParam.solvers(nSolver).param.SKIP_CLEAN_FRAMES = true; % do not process frames where there is no missing samples + expParam.solvers(nSolver).param.MULTITHREAD_FRAME_PROCESSING = false; % not implemented yet + + nSolver = nSolver+1; + expParam.solvers(nSolver).name = 'OMP-G'; + expParam.solvers(nSolver).function = @inpaintSignal_IndependentProcessingOfFrames; + expParam.solvers(nSolver).param.N = 512; % frame length + expParam.solvers(nSolver).param.N = 256; % frame length + expParam.solvers(nSolver).param.inpaintFrame = @inpaintFrame_OMP_Gabor; % solver function + expParam.solvers(nSolver).param.OMPerr = 0.001; + expParam.solvers(nSolver).param.sparsityDegree = expParam.solvers(nSolver).param.N/4; + expParam.solvers(nSolver).param.D_fun = @Gabor_Dictionary; % Dictionary (function handle) + expParam.solvers(nSolver).param.OLA_frameOverlapFactor = 4; + expParam.solvers(nSolver).param.OLA_frameOverlapFactor = 2; + expParam.solvers(nSolver).param.redundancyFactor = 2; % Dictionary redundancy + expParam.solvers(nSolver).param.wd = @wRect; % Weighting window for dictionary atoms + expParam.solvers(nSolver).param.wa = @wRect; % Analysis window + expParam.solvers(nSolver).param.OLA_ws = @wSine; % Synthesis window + expParam.solvers(nSolver).param.SKIP_CLEAN_FRAMES = true; % do not process frames where there is no missing samples + expParam.solvers(nSolver).param.MULTITHREAD_FRAME_PROCESSING = false; % not implemented yet + + nSolver = nSolver+1; + expParam.solvers(nSolver).name = 'consOMP-G'; + expParam.solvers(nSolver).function = @inpaintSignal_IndependentProcessingOfFrames; + expParam.solvers(nSolver).param.N = 512; % frame length + expParam.solvers(nSolver).param.N = 256; % frame length + expParam.solvers(nSolver).param.inpaintFrame = @inpaintFrame_consOMP_Gabor; % solver function + expParam.solvers(nSolver).param.OMPerr = 0.001; + expParam.solvers(nSolver).param.sparsityDegree = expParam.solvers(nSolver).param.N/4; + expParam.solvers(nSolver).param.D_fun = @Gabor_Dictionary; % Dictionary (function handle) + expParam.solvers(nSolver).param.OLA_frameOverlapFactor = 4; + expParam.solvers(nSolver).param.OLA_frameOverlapFactor = 2 + expParam.solvers(nSolver).param.redundancyFactor = 2; % Dictionary redundancy + expParam.solvers(nSolver).param.wd = @wRect; % Weighting window for dictionary atoms + expParam.solvers(nSolver).param.wa = @wRect; % Analysis window + expParam.solvers(nSolver).param.OLA_ws = @wSine; % Synthesis window + expParam.solvers(nSolver).param.SKIP_CLEAN_FRAMES = true; % do not process frames where there is no missing samples + expParam.solvers(nSolver).param.MULTITHREAD_FRAME_PROCESSING = false; % not implemented yet + + nSolver = nSolver+1; + expParam.solvers(nSolver).name = 'Janssen'; + expParam.solvers(nSolver).function = @inpaintSignal_IndependentProcessingOfFrames; + expParam.solvers(nSolver).param.inpaintFrame = @inpaintFrame_janssenInterpolation; % solver function + expParam.solvers(nSolver).param.N = 512; % frame length + expParam.solvers(nSolver).param.N = 256; + expParam.solvers(nSolver).param.OLA_frameOverlapFactor = 4; + expParam.solvers(nSolver).param.OLA_frameOverlapFactor = 2 + expParam.solvers(nSolver).param.wa = @wRect; % Analysis window + expParam.solvers(nSolver).param.OLA_ws = @wSine; % Synthesis window + expParam.solvers(nSolver).param.SKIP_CLEAN_FRAMES = true; % do not process frames where there is no missing samples + expParam.solvers(nSolver).param.MULTITHREAD_FRAME_PROCESSING = false; % not implemented yet +end + +SNRClip = zeros(0,0,0); +fprintf('Folder %s\n',expParam.soundDir); +if ~exist(expParam.destDir,'dir') + mkdir(expParam.destDir) +end +soundFiles = dir([expParam.soundDir '*.wav']); + +for kf = 1:length(soundFiles) + soundfile = [expParam.soundDir soundFiles(kf).name]; + fprintf(' File %s\n',soundfile); + %% Read test signal + [x fs] = wavread(soundfile); + + for kClip = 1:length(expParam.clippingScale) + clippingLevel = expParam.clippingScale(kClip); + fprintf(' Clip level %g\n',clippingLevel); + + %% Generate the problem + [problemData, solutionData] = generateDeclippingProblem(x,clippingLevel); + + for nSolver = 1:length(expParam.solvers) + %% Declip with solver + solverParam = expParam.solvers(nSolver).param; + [xEst1 xEst2] = expParam.solvers(nSolver).function(problemData,solverParam); + + %% compute performance + L = length(xEst1); + N = solverParam.N; + [SNRAll, SNRmiss] = ... + SNRInpaintingPerformance(... + solutionData.xClean(N:L-N),... + problemData.x(N:L-N),... + xEst2(N:L-N),... + problemData.IMiss(N:L-N)); + SNRClip(kf,kClip,nSolver) = SNRmiss(2); + + % normalize and save both the reference and the estimates! + normX = 1.1*max(abs([xEst1(:);xEst2(:);solutionData.xClean(:)])); + + L = min([length(xEst2),length(xEst1),length(solutionData.xClean),length(problemData.x)]); + xEst1 = xEst1(1:L)/normX; + xEst2 = xEst2(1:L)/normX; + xClipped = problemData.x(1:L)/normX; + xClean = solutionData.xClean(1:L)/normX; + wavwrite(xEst1,fs,sprintf('%s%s%s%g.wav',expParam.destDir,soundFiles(kf).name(1:end-4),'Est1',clippingLevel)); + wavwrite(xEst2,fs,sprintf('%s%s%s%g.wav',expParam.destDir,soundFiles(kf).name(1:end-4),'Est2',clippingLevel)); + wavwrite(xClipped,fs,sprintf('%s%s%s%g.wav',expParam.destDir,soundFiles(kf).name(1:end-4),'Clipped',clippingLevel)); + wavwrite(xClean,fs,sprintf('%s%s%s%g.wav',expParam.destDir,soundFiles(kf).name(1:end-4),'Ref',clippingLevel)); + + fprintf('\n'); + clear a xEst1 xEst2 xClipped xClean IClipped + save([expParam.destDir 'clippingExp.mat']); + end + end +end + +%% Plot results +averageSNR = squeeze(mean(SNRClip,1)); +disp(averageSNR) +figure, +plot(averageSNR) +legend(arrayfun(@(x)x.name,expParam.solvers,'UniformOutput',false)); +xlabel('Clipping level') +ylabel('SNR') +return