適応フィルター原理 - ブロック LMS アルゴリズム (BLMS)

LMS アルゴリズムの安定性をさらに向上させるために、LMS に基づいてブロック処理 LMS (Block LMS) が提案されています。LMS アルゴリズムは、サンプリング ポイントが来るたびにフィルターの重みを調整します。つまり、サンプル ポイントが来るたびに重みが 1 回更新されるため、重みの更新頻度が速すぎて、収束が遅く不安定になります。 BLMSアルゴリズムは、ニューラル ネットワークのバッチ サイズと同様に、K サンプリング ポイントごとにフィルターの重みを更新し、データのセット (L サンプル) を収集し、誤差の平均値を計算して、それを更新します。 L 個のサンプルの場合、重みは 1 回更新されます。

 ブロック適応フィルタの概略図

入力データ シーケンスは、シリアル/パラレル変換器によって長さ L のいくつかのデータ ブロックに分割されます。次に、これらのデータ ブロックが長さ M のフィルターに 1 つずつ送信され、データ サンプルの各ブロックが収集された後、フィルターのタップ重みが更新され、フィルターの適応プロセスがブロックごとに実行されます。時間領域における従来の適応フィルタリング アルゴリズムのように、値ごとに実行されるわけではありません。

具体的なアルゴリズムは次のとおりです。

L 個のサンプリング ポイントを蓄積した後、フィルター係数を再度更新します

 上記の式をすべて加算し、中央の式を左右にキャンセルして、ブロック LMS フィルターの重みの更新式を取得できます。

このうちμはステップサイズ係数であり、導出の便宜上、通常はL=Nとし、ブロックLMSを1回更新することは、LMSをL回更新することと同等である。新しい時間インデックス k を使用して、ブロック LMS 係数の更新を表します。ここで、kL=n の場合、上記の式は次のように記述できます。

式を別の方法で書くと、次のようになります。

 

  • メリット: LMS に比べて計算量が大幅に少ない
  • 短所:収束速度はLMSアルゴリズムと同じ

MATLAB コードは次のとおりです。

% 参考:https://github.com/Morales97/ASP_P2/blob/4a6a17f6fe/algorithms/block_lms.m
function [e, y, w] = myBlock_LMS(d,x,mu, M,L)
    % 输入:
    % d - 麦克风语音
    % x - 远端语音
    % mu - 步长
    % M - 滤波器阶数
    % L - 块大小
    %
    % Outputs:
    % 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

参考リンク:

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

おすすめ

転載: blog.csdn.net/qq_42233059/article/details/131343840