自适应滤波器(1)

自适应滤波器算法按照不同的优化准则,常见自适应滤波算法有:递推最小二乘算法(RLS),最小均方误差算法(LMS),归一化均方误差算法(NLMS),快速精确最小均方误差算法,子带滤波,频域的自适应滤波等等。

LMS算法的自适应滤波器

function [yn, W, en] = LMS(xn, dn, M, mu)

% 输入参数:

%   xn   输入的信号,为一行序列

%   dn   所期望的响应

%   M    滤波器的阶数

%   mu   收敛因子(步长)

% 输出参数:

%   W    滤波器系数矩阵 

%   en   误差序列

%   yn   滤波器输出

[m,n] = size(xn);

if m>1  % 如果输入信号为一列,则进行转置

    xn = xn';

end

if m>1 && n>1

    fprintf('输入信号有误!请检查输入信号是否为一行序列');

end

itr = n;    % 迭代次数等于输入信号的长度

en = zeros(1,itr);      % 初始化误差信号

W  = zeros(M,itr);    % 初始化权值矩阵,每一列代表一次迭代

% 迭代计算

for k = M:itr                   % k次迭代

    x = xn(k:-1:k-M+1);         % 滤波器M个抽头的输入

    y = x*W(:,k-1);             % 滤波器的输出

    en(k) = dn(k)-y;            % k次迭代的误差

    W(:,k) = W(:,k-1)+2*mu*en(k)*x';     % 滤波器权值计算的迭代式

end

yn = inf * ones(size(xn));      % 初值为无穷大作为绘图使用,无穷大处不会绘图

for k = M:n

    x = xn(k:-1:k-M+1);

    yn(k) = x*W(:,end);  % 最终输出结果

end

end

LMS分块的自适应

function [e, y, w] = myBlock_LMS(d,x,mu, M,L)

    % 输入:

    % d - 期望信号

    % x - 输入序列

    % mu - 步长

    % M - 滤波器阶数

    % L - 块大小

    % 输出:

    % e - 输出误差,近端语音估计

    % y - 输出系数,远端回声估计

    % w - 滤波器参数

    d_length = length(d);

    K = floor(d_length / L);    % 块的数量,确保整数

    y = zeros(d_length, 1);

    w = zeros(M,K+1);

    e = zeros(d_length,1);

    x_ = [zeros(M-1,1); x];

    % 根据""进行循环

    for k=1:K

        block_sum = 0;

        % 求一个块的和sum

        for i = 1 + L*(k-1):L*k

            X = x_(i:i+M-1);

            y(i) = w(:,k)' * X;  % 滤波器输出

            e(i) = d(i) - y(i);

            block_sum = block_sum + X * e(i);   % 权重更新

        end

        w(:,k+1) = w(:,k) + mu * block_sum;

    end

    % 将指针移动一步,使第n行对应于时间n

    w=w(:,2:K+1);

end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值