我尝试在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秒。我想分享模型,但我没有看到一个附件按钮。如果有人教我如何,我会。
帮帮忙,谢谢。
1条答案
按热度按时间xuo3flqw1#
LMS更新Simulink块中有源代码(duh)