自适应 LMS 算法 MATLAB

信息处理 matlab 自适应滤波器 最小二乘
2022-02-17 03:08:24

我在 MATLAB 中实现 LMS 自适应滤波器以从语音信号中分离宽带和窄带信号时遇到了一些麻烦。

我使用输入的延迟版本作为参考以及错误术语。

step = 0.01;
w = zeros(1, N); 
xDelayed = [zeros(1, 100) x']'; % delaying input

for n=1:length(x)
    e = x(n) - w(1)*xDelayed(n);
    w = w - step*e*xDelayed(n); 
end

它本质上是一个实现

w(n+1)=w(n)αe(n)x(n)

出于某种原因,我的整个 w (N long) 向量都是相同的值。更新:

M = 5;
N = length(sound)
w = zeros(M, N);
STEP_SIZE = 0.01;
d = sound;
x = sound_delayed(1:N);

for i=(M+1):N
   e(i) = d(i) -  x((i-(M)+1):i)*w(:,i);
   w(:,i+1) = w(:,i) + mu * e(i) * x((i-(M)+1):i)';
end
for i=(M+1):N
    yd(i) = x((i-(M)+1):i)*w(:,i);  
end
1个回答

您的代码中有几个问题。首先,看起来您混淆了迭代和向量索引。的计算e应使用当前(延迟)数据向量的所有值,并使用当前滤波器系数进行滤波。在更新方程中,你从一个向量中减去一个标量,这不是你想要的。同样,您应该使用当前数据向量的所有值(其长度必须等于所选过滤器长度)。

看看这个问题中的 Matlab 代码(编辑部分的第二个)。我还没有运行它,但看起来它正确处理了更新循环中的向量。