Mercurial > hg > smallbox
diff toolboxes/AudioInpaintingToolbox/Solvers/inpaintFrame_consOMP.m @ 144:19e0af570914 release_1.5
Merge from branch "ivand_dev"
author | Ivan <ivan.damnjanovic@eecs.qmul.ac.uk> |
---|---|
date | Tue, 26 Jul 2011 15:14:15 +0100 |
parents | 56d719a5fd31 |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/toolboxes/AudioInpaintingToolbox/Solvers/inpaintFrame_consOMP.m Tue Jul 26 15:14:15 2011 +0100 @@ -0,0 +1,144 @@ +function y = inpaintFrame_consOMP(problemData,param) +% Inpainting method based on OMP with a constraint +% on the amplitude of the reconstructed samples an optional constraint +% on the maximum value of the clipped samples +% +% Usage: y = inpaintFrame_consOMP(problemData,param) +% +% +% Inputs: +% - problemData.x: observed signal to be inpainted +% - problemData.Imiss: Indices of clean samples +% - param.D - the dictionary matrix (optional if param.D_fun is set) +% - param.D_fun - a function handle that generates the dictionary +% matrix param.D if param.D is not given. See, e.g., DCT_Dictionary.m and Gabor_Dictionary.m +% - param.wa - Analysis window +% - param.Upper_Limit - if present and non-empty this fiels +% indicates that an upper limit constraint is active and its +% integer value is such that +% +% Outputs: +% - y: estimated frame +% +% Note that the CVX library is needed. +% +% ------------------- +% +% Audio Inpainting toolbox +% Date: June 28, 2011 +% By Valentin Emiya, Amir Adler, Michael Elad, Maria Jafari +% This code is distributed under the terms of the GNU Public License version 3 (http://www.gnu.org/licenses/gpl.txt). +% ======================================================== + +%% Load data and parameters + +x = problemData.x; +IObs = find(~problemData.IMiss); +p.N = length(x); +E2 = param.OMPerr^2; +E2M=E2*length(IObs); +wa = param.wa(param.N); + +% build the dictionary matrix if only the dictionary generation function is given +if ~isfield(param,'D') + param.D = param.D_fun(param); +end + + +% clipping level detection +clippingLevelEst = max(abs(x(:)./wa(:))); + +IMiss = true(length(x),1); +IMiss(IObs) = false; +IMissPos = find(x>=0 & IMiss); +IMissNeg = find(x<0 & IMiss); + +DictPos=param.D(IMissPos,:); +DictNeg=param.D(IMissNeg,:); + +% Clipping level: take the analysis window into account +wa_pos = wa(IMissPos); +wa_neg = wa(IMissNeg); +b_ineq_pos = wa_pos(:)*clippingLevelEst; +b_ineq_neg = -wa_neg(:)*clippingLevelEst; +if isfield(param,'Upper_Limit') && ~isempty(param.Upper_Limit) + b_ineq_pos_upper_limit = wa_pos(:)*param.Upper_Limit*clippingLevelEst; + b_ineq_neg_upper_limit = -wa_neg(:)*param.Upper_Limit*clippingLevelEst; +else + b_ineq_pos_upper_limit = Inf; + b_ineq_neg_upper_limit = -Inf; +end + +%% +Dict=param.D(IObs,:); +W=1./sqrt(diag(Dict'*Dict)); +Dict=Dict*diag(W); +xObs=x(IObs); + +residual=xObs; +maxNumCoef = param.sparsityDegree; +indx = []; +currResNorm2 = E2M*2; % set a value above the threshold in order to have/force at least one loop executed +j = 0; +while currResNorm2>E2M && j < maxNumCoef, + j = j+1; + proj=Dict'*residual; + [dum pos] = max(abs(proj)); + indx(j)=pos; + a=pinv(Dict(:,indx(1:j)))*xObs; + residual=xObs-Dict(:,indx(1:j))*a; + currResNorm2=sum(residual.^2); +end; + + +if isinf(b_ineq_pos_upper_limit) + %% CVX code + cvx_begin + cvx_quiet(true) + variable a(j) + %minimize( sum(square(xObs-Dict*a))) + minimize(norm(Dict(:,indx)*a-xObs)) + subject to + DictPos(:,indx)*(W(indx).*a) >= b_ineq_pos + DictNeg(:,indx)*(W(indx).*a) <= b_ineq_neg + cvx_end + if cvx_optval>1e3 + cvx_begin + cvx_quiet(true) + variable a(j) + minimize(norm(Dict(:,indx)*a-xObs)) + cvx_end + end +else + %% CVX code + cvx_begin + cvx_quiet(true) + variable a(j) + %minimize( sum(square(xObs-Dict*a))) + minimize(norm(Dict(:,indx)*a-xObs)) + subject to + DictPos(:,indx)*(W(indx).*a) >= b_ineq_pos + DictNeg(:,indx)*(W(indx).*a) <= b_ineq_neg + DictPos(:,indx)*(W(indx).*a) <= b_ineq_pos_upper_limit + DictNeg(:,indx)*(W(indx).*a) >= b_ineq_neg_upper_limit + cvx_end + if cvx_optval>1e3 + cvx_begin + cvx_quiet(true) + variable a(j) + minimize(norm(Dict(:,indx)*a-xObs)) + cvx_end + end +end + +%% Frame Reconstruction +indx(length(a)+1:end) = []; + +Coeff = sparse(size(param.D,2),1); +if (~isempty(indx)) + Coeff(indx) = a; + Coeff = W.*Coeff; +end +y = param.D*Coeff; + +return