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
参考リンク: