Mercurial > hg > smallbox
diff toolboxes/AudioInpaintingToolbox/Solvers/inpaintFrame_OMP_Gabor.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/Solvers/inpaintFrame_OMP_Gabor.m Thu Jul 21 14:27:47 2011 +0100 @@ -0,0 +1,93 @@ +function [y , Coeff]= inpaintFrame_OMP_Gabor(problemData,param) +% Inpainting method based on OMP using the Gabor dictionary +% generated by Gabor_Dictionary.m. The method jointly selects +% cosine and sine atoms at the same frequency +% +% Usage: y = inpaintFrame_OMP_Gabor(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 Gabor_Dictionary.m +% - param.wa - Analysis window +% +% Outputs: +% - y: estimated frame +% +% +% ------------------- +% +% 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). +% ======================================================== +% To do next: use a faster implementation of OMP + + +%% 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 and normalized dictionary +% build the dictionary matrix if only the dictionary generation function is given +if ~isfield(param,'D') + param.D = param.D_fun(param); +end +Dict=param.D(IObs,:); +W=1./sqrt(diag(Dict'*Dict)); +Dict=Dict*diag(W); +Dict1 = Dict(:,1:end/2); +Dict2 = Dict(:,end/2+1:end); +Dict1Dict2 = sum(Dict1.*Dict2); +n12 = 1./(1-Dict1Dict2.^2); +xObs=x(IObs); + +%% OMP iterations +residual=xObs; +maxNumCoef = param.sparsityDegree; +indx = []; +% currResNorm2 = sum(residual.^2); +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=residual'*Dict; + proj1 = proj(1:end/2); + proj2 = proj(end/2+1:end); + + alpha_j = (proj1-Dict1Dict2.*proj2).*n12; + beta_j = (proj2-Dict1Dict2.*proj1).*n12; + + err_j = sum(abs(repmat(residual,1,size(Dict1,2))-Dict1*sparse(diag(alpha_j))-Dict2*sparse(diag(beta_j))).^2); + [dum pos] = min(err_j); + + indx(end+1)=pos; + indx(end+1)=pos+size(Dict1,2); + a=pinv(Dict(:,indx(1:2*j)))*xObs; + residual=xObs-Dict(:,indx(1:2*j))*a; + currResNorm2=sum(residual.^2); +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 + +