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