【语音增强】组稀疏信号去噪:非凸正则化,凸优化研究(Matlab代码实现)

 💥💥💞💞欢迎来到本博客❤️❤️💥💥

🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。

⛳️座右铭:行百里者,半于九十。

📋📋📋本文目录如下:🎁🎁🎁

目录

💥1 概述

📚2 运行结果

2.1 算例1

2.2 算例2

2.3 算例3

🎉3 参考文献

🌈4 Matlab代码、数据、文章


💥1 概述

摘要:凸优化与稀疏促进的凸正则化是估计噪声中稀疏信号的标准方法。为了比凸正则化更强烈地促进稀疏性,通常也会采用非凸优化。在本文中,我们采取第三种方法。我们利用选择非凸正则化项,使得总成本函数(包括数据一致性和正则化项)是凸的。因此,稀疏性比标准的凸公式更受到促进,但不会牺牲凸优化的吸引力(唯一最小值,鲁棒算法等)。我们利用这个想法来改进最近开发的“重叠组收缩”(OGS)算法,用于去噪组稀疏信号。该算法应用于语音增强问题,结果在信噪比和感知质量方面都有利。

本文将组稀疏信号去噪问题建模为一个带有非凸(实际上是严格凹的)正则化项的凸优化问题。正则化项基于重叠的分组,以促进组稀疏性。正则化项的凹性比任何凸正则化项都更强烈地促进稀疏性。对于几个由变量a参数化的凹惩罚函数,已经展示了如何约束a以确保优化问题是严格凸的。数值实验证明了所提出的方法在语音增强方面的有效性。

📚2 运行结果

2.1 算例1

group-sparse thresholding, 1D data

 

 

2.2 算例2

group-sparse thresholding, 2D data (speech spectrogram)

2.3 算例3

group-sparse thresholding, 3D data

部分代码:

function [x, cost] = ogs2(y, K1, K2, lam, pen, rho, Nit)

% x = ogs2(y, K1, K2, lam)
% Overlapping Group Shrinkage/Thresholding (2D)
%
% Input
%   y      : observed signal (2D array)
%   lam    : regularization parameter (lam > 0)
%   K1, K2 : group size
%
% Output
%   x      : output signal
%
% Optional inputs
%   x = ogs2(y, K1, K2, lam, pen)
%   x = ogs2(y, K1, K2, lam, pen, rho)
%   x = ogs2(y, K1, K2, lam, pen, rho, Nit)
%
% where
%   pen  : penalty ('abs', 'log', 'atan', 'rat', 'mcp')
%   rho  : normalized non-convexity parameter, 0 <= rho <= 1
%   Nit  : number of iterations
%
% Note: if pen is 'abs' then rho is ignored.
%
% Use [x, cost] = ogs2(...) for cost function history. 


if nargin < 7
    Nit = 25;       % Default value
end
if nargin < 6
    rho = 1;        % Default value
end
if nargin < 5
    pen = 'atan';   % Default value
end

% Error checking
if rho == 0
    pen = 'abs';
elseif (rho < 0) || (rho > 1)
    error('Error: need 0 <= rho <= 1.')
end
 
a_max = 1/(lam*K1*K2);
a = rho * a_max;

switch pen
    case 'abs'
        phi = @(x) abs(x);
        wfun = @(x) abs(x);
        a = 0;
    case 'rat'
        phi = @(x) abs(x)./(1+a*abs(x)/2);
        wfun = @(x) abs(x) .* (1 + a*abs(x)/2).^2;
    case 'log'
        phi = @(x) 1/a * log(1 + a*abs(x));
        wfun = @(x) abs(x) .* (1 + a*abs(x));
    case 'atan'
        phi = @(x) 2/(a*sqrt(3)) *  (atan((1+2*a*abs(x))/sqrt(3)) - pi/6);
        wfun = @(x) abs(x) .* (1 + a*abs(x) + a^2.*abs(x).^2);
    case 'mcp'        
        phi = @(t) (abs(t) - a/2 * t.^2).*(abs(t) <= 1/a) + 1/(2*a)*(abs(t) > 1/a);
        wfun = @(x) abs(x) ./ max(1 - a*abs(x), 0); 
        % Note: divide by zero OK -> divide by inf -> multiply by zero
    otherwise
        disp('penalty must be abs, log, atan, rat, or mcp')
        x = []; cost = [];
        return
end


h1 = ones(K1, 1);
h2 = ones(K2, 1);
x = y;
cost = zeros(1, Nit);

for it = 1 : Nit
    r = sqrt( conv2(h1, h2, abs(x).^2, 'full') );
    cost(it) = 0.5 * sum(sum(abs(x-y).^2)) + lam * sum(sum(phi(r)));
    v = 1 + lam*conv2(h1, h2, 1./wfun(r), 'valid');
    x = y./v;
end

🎉3 参考文献

文章中一些内容引自网络,会注明出处或引用为参考文献,难免有未尽之处,如有不妥,请随时联系删除。

🌈4 Matlab代码、数据、文章

  • 18
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值