归一化LMS滤波在Simulink中的Matlab函数实现

thtygnil  于 2023-03-08  发布在  Matlab
关注(0)|答案(1)|浏览(278)

我尝试在Simulink的Matlab函数中实现归一化最小均方滤波器,如下所示:

Matlab函数中的代码如下所示:

function b = lms_update(ref,cor,adapt,N,mu)
% ref = reference signal, noise signal itself, for filter to produce
% cor = corrupted signal, total signal, to be filtered

% initialization
persistent x w

if isempty(x),x=zeros(N,1);end   % input buffer
if isempty(w),w=zeros(N,1);end % filter weights

epsil = 2.2204460492503131e-016; % epsilon for divided-by-zero

% read new input sample
x(1:N-1,1) = x(2:N,1);
x(N,1)     = cor;

if adapt
    % compute filter output
    xf = flip(x); % flip x
    
    y = w'*xf;

    e = ref - y;

    % update filter weights
    w = w + mu*e*xf/(xf'*xf + epsil);
end

b = w';

“所需或ref”是给定频率下的正弦输入,“input或cor”是“所需”与Simulink LMS滤波器输出之间的差值。
然后,结果如下所示:

它的工作原理是,它试图过滤,但有一个恒定的相位。
我希望Matlab函数执行以下操作:

结果是:

我的代码基本上遵循LMS更新块的帮助。唯一不同的是我翻转了x持久变量,因为所有在网上可用的离线Matlab代码都是这样做的,而帮助没有提到它。
我使用的系数数量是20,运行模拟在0.001秒。我想分享模型,但我没有看到一个附件按钮。如果有人教我如何,我会。
帮帮忙,谢谢。

xuo3flqw

xuo3flqw1#

persistent x_buf w_buf

if isempty(x_buf),x_buf=zeros(1,L);end   % input buffer
if isempty(w_buf),w_buf=zeros(1,L);end % filter weights

x_buf(2:L) = x_buf(1:L-1);
x_buf(1)   = ref;

y = w_buf*x_buf';
e = ref - y;

engyPlusEps = sum(x_buf .* x_buf) + eps(ref);

for idx = 1:L
    w_tmp      = alpha * w_buf(idx);
    w_adj      = e * (x_buf(idx)/engyPlusEps) * mu;
    w_buf(idx) = w_tmp + w_adj;
end

w = w_buf;

LMS更新Simulink块中有源代码(duh)

相关问题