自适应滤波器原理——变步长LMS(VSS LMS)

针对μ值,人们研究了许多变步长LMS 算法(Variable Step-Size LMS),一般是在滤波器工作的开始阶段采用较大的μ值,以加快收敛速度,而在后阶段采用较小的μ值,可以减小稳态误差。这类算法的关键是确定在整个过程中μ值如何变化或μ值在何种条件满足下才改变。

 式中α和\gamma为参数。

另外VSS LMS还对μ进行了约束,\mu _{max}为上界学习率,\mu _{min}为下界学习率,\mu _{max}一般设置为\mu _{max}=\frac{1}{var(x)*M},var是求方差,x是输入信号(麦克风信号),M是滤波器阶数:

  • 优点:收敛速度快,
  • 缺点:算法的稳定性和跟踪能力上较易受输入噪声的影响

MATLAB程序如下:

% 学习率的上下界
% 以上信息可从论文中获取,这些值是在下述论文中定义的
% R. H. Kwong and E. W. Johnston, "A variable step size LMS algorithm," in IEEE Transactions on Signal Processing, vol. 40, no. 7, pp. 1633-1642, July 1992.

function [e, y, w] = myVSS_LMS(d, x, M)
% Inputs:
% d  - 麦克风语音
% x  - 远端语音
% mu - 步长,0.05
% M  - 滤波器阶数,也称为抽头数
%
% Outputs:
% e - 输出误差
% y  - 输出系数
% w - 滤波器参数

    d_length = length(d);
    if (d_length <= M)  
        print('error: 信号长度小于滤波器阶数!');
        return; 
    end
    if (d_length ~= length(x))  
        print('error: 输入信号和参考信号长度不同!');
        return; 
    end
    
    % 定义VSS-LMS算法的初始参数
    
    input_var = var(x);     % 输入的方差
    % 如果mu_max和mu_min之间的差异不够大,LMS和VSS LMS算法的误差曲线都是相同的
    mu_max = 1/(input_var*M); % 上界=1/(filter_length * input variance)
    mu_min = 0.0004;        % 下界=LMS算法的学习率
    mu_VSS(1)=1;    % VSS算法的mu初始值
    alpha  = 0.97;
    gamma = 4.8e-4;
    
    xx = zeros(M,1);
    w1 = zeros(M,1);    % 滤波器权重
    y = zeros(d_length,1);  % 近端语音
    e = zeros(d_length,1);  % 误差

    for n = 1:d_length
        xx = [xx(2:M);x(n)];    % 纵向拼接 或者[x(n); xx(1:end-1)]
        y(n) = w1' * xx;        % (40,1)'*(40,1)=1; (73113,1)
        e(n) = d(n) - y(n);
        w1 = w1 + mu_VSS(n) * e(n) * xx;   % 更新权重系数 (40,1)
        w(:,n) = w1;        % (40, 73113)
        
        mu_VSS(n+1) = alpha * mu_VSS(n) + gamma * e(n) * e(n) ;% 使用VSS算法更新mu值
       % 检查论文中给出的mu的约束条件
        if (mu_VSS(n+1)>mu_max)
            mu_VSS(n+1)=mu_max; % max
        elseif(mu_VSS(n+1)<mu_min)
            mu_VSS(n+1)= mu_min;
        else
            mu_VSS(n+1) = mu_VSS(n+1) ;
        end
    end
    % 和上面类似
%     for n = M:d_length
%         xx = x(n:-1:n-M+1);    % 纵向拼接  (40~1)-->(41~2)-->(42~3)....
%         y(n) = w1' * xx;        % (40,1)'*(40,1)=1; (73113,1)
%         e(n) = d(n) - y(n);
%         w1 = w1 + mu * e(n) * xx;   % (40,1)
%         w(:,n) = w1;        % (40, 73113)
%     end
end

参考链接:

https://www.cnblogs.com/LXP-Never/p/11773190.html

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
步长LMS算法(Variable Step-Size LMS Algorithm)是一种自适应滤波算法,可以用于信号处理和机器学习中的预测问题。它的主要特点是在每次迭代中自适应地调整步长参数,以便更好地适应信号的动态化。 以下是一个简单的MATLAB实现: ```matlab function [y, e, w] = var_step_lms(x, d, mu0, rho, M) % x: 输入信号向量 % d: 目标信号向量 % mu0: 初始步长大小 % rho: 步长缩放因子 % M: 滤波器阶数 % y: 输出信号向量 % e: 误差信号向量 % w: 滤波器系数向量 N = length(x); % 输入信号长度 w = zeros(M, 1); % 初始化滤波器系数向量 mu = mu0 * ones(1, N); % 初始化步长大小向量 y = zeros(1, N); % 初始化输出信号向量 e = zeros(1, N); % 初始化误差信号向量 for n = M:N x_n = x(n:-1:n-M+1); % 当前时刻的输入信号向量 y(n) = w' * x_n; % 当前时刻的输出信号 e(n) = d(n) - y(n); % 当前时刻的误差信号 mu(n+1) = rho * mu(n) + (1 - rho) * abs(e(n)) / (x_n' * x_n); % 根据误差信号和步长缩放因子计算当前时刻的步长大小 w = w + mu(n+1) * e(n) * x_n; % 更新滤波器系数 end end ``` 其中,`x`和`d`分别是输入信号和目标信号的向量,`mu0`是初始步长大小,`rho`是步长缩放因子,`M`是滤波器阶数。函数的输出包括输出信号向量`y`、误差信号向量`e`和滤波器系数向量`w`。在每次迭代中,根据当前的误差信号和步长缩放因子计算当前时刻的步长大小,并利用当前时刻的输入信号和滤波器系数计算输出信号和误差信号,最后更新滤波器系数。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值