aris@218: function solver=CVX_add_const_Audio_declipping(Problem, solver, idxFrame) aris@218: aris@218: %% CVX additional constrains aris@218: % Clipping level: take the analysis window into account aris@218: % clipping level detection aris@218: aris@218: signal = Problem.b1; aris@218: signalFull = Problem.b(:,idxFrame); aris@218: Dict = Problem.A; aris@218: DictFull = Problem.B; aris@218: Clipped = ~Problem.M(:,idxFrame); aris@218: W=1./sqrt(diag(Dict'*Dict)); aris@218: aris@218: idxCoeff = find(solver.solution~=0); aris@218: aris@218: solution = solver.solution; aris@218: aris@218: wa = Problem.wa(Problem.windowSize); % analysis window aris@218: aris@218: aris@218: clippingLevelEst = max(abs(signal./wa(~Clipped)')); aris@218: aris@218: idxPos = find(signalFull>=0 & Clipped); aris@218: idxNeg = find(signalFull<0 & Clipped); aris@218: aris@218: DictPos=DictFull(idxPos,:); aris@218: DictNeg=DictFull(idxNeg,:); aris@218: aris@218: aris@218: wa_pos = wa(idxPos); aris@218: wa_neg = wa(idxNeg); aris@218: b_ineq_pos = wa_pos(:)*clippingLevelEst; aris@218: b_ineq_neg = -wa_neg(:)*clippingLevelEst; aris@218: if isfield(Problem,'Upper_Limit') && ~isempty(Problem.Upper_Limit) aris@218: b_ineq_pos_upper_limit = wa_pos(:)*Problem.Upper_Limit; aris@218: b_ineq_neg_upper_limit = -wa_neg(:)*Problem.Upper_Limit; aris@218: else aris@218: b_ineq_pos_upper_limit = Inf; aris@218: b_ineq_neg_upper_limit = -Inf; aris@218: end aris@218: aris@218: aris@218: j = length(idxCoeff); aris@218: aris@218: if isinf(b_ineq_pos_upper_limit) aris@218: %% CVX code aris@218: cvx_begin aris@218: cvx_quiet(true) aris@218: variable solution(j) aris@218: minimize(norm(Dict(:,idxCoeff)*solution-signal)) aris@218: subject to aris@218: DictPos(:,idxCoeff)*(W(idxCoeff).*solution) >= b_ineq_pos aris@218: DictNeg(:,idxCoeff)*(W(idxCoeff).*solution) <= b_ineq_neg aris@218: cvx_end aris@218: if cvx_optval>1e3 aris@218: cvx_begin aris@218: cvx_quiet(true) aris@218: variable solution(j) bmailhe@243: minimize(norm(Dict(:,idxCoeff)*solution-signal)) aris@218: cvx_end aris@218: end aris@218: else aris@218: %% CVX code aris@218: cvx_begin aris@218: cvx_quiet(true) aris@218: variable solution(j) aris@218: minimize(norm(Dict(:,idxCoeff)*solution-signal)) aris@218: subject to aris@218: DictPos(:,idxCoeff)*(W(idxCoeff).*solution) >= b_ineq_pos aris@218: DictNeg(:,idxCoeff)*(W(idxCoeff).*solution) <= b_ineq_neg aris@218: DictPos(:,idxCoeff)*(W(idxCoeff).*solution) <= b_ineq_pos_upper_limit aris@218: DictNeg(:,idxCoeff)*(W(idxCoeff).*solution) >= b_ineq_neg_upper_limit aris@218: cvx_end aris@218: if cvx_optval>1e3 aris@218: cvx_begin aris@218: cvx_quiet(true) aris@218: variable solution(j) bmailhe@243: minimize(norm(Dict(:,idxCoeff)*solution-signal)) aris@218: cvx_end aris@218: end aris@218: end aris@218: aris@218: solver.solution(idxCoeff) = solution; aris@218: aris@218: