我一直在使用自适应滤波方法进行最小化方法,但无法为LMS实现找到正确的方法。
考虑到每个脉冲信号有500个样本,我实现了以下内容。对于第一个脉冲信号(500个样本),从脉冲信号的低通滤波器生成参考信号,然后使用生成的误差作为参考噪声信号。下一个脉冲信号
P=load('Pulse_signal.mat');
a2=P.a(334:4500,:);
for i=1:500:length(a2)-500
if(i<500)
input=a2(i:i+499,:);
detected(i:i+499,:)=input;
d = fdesign.lowpass('Fp,Fst,Ap,Ast',1.5,8,0.5,20,500);
Hd1 = design(d);
filtered = filtfilt(Hd1.Numerator,1,input);
[w,y,e,W]=simple_LMS1(filtered,input,0.08,5);
e2(i:i+499,:)=e;
y2(i:i+499,:)= y;
else
input=a2(i:i+499,:);
detected(i:i+499,:)=input;
[w,y,e,W]=simple_LMS1(e,input,0.08,8);
e2(i:i+499,:)=e;
y2(i:i+499,:)= y;
end;
end
plot(detected);hold on;plot(e2,'-r');hold on;plot(y2,'-k');
simple_LMS1 fucntion
function [w,y,e,W] = simple_LMS1(x,d,mu_step,M)
N = length(x);
y = zeros(N,1);
w = zeros(M,1);
e = zeros(N,1);
W = zeros(M,N);
for n = 1:N
if n <= M % assume zero-samples for delayed data that isn't available
k = n:-1:1;
x1 = [x(k); zeros(M-numel(k),1)];
else
x1 = x(n:-1:n-M+1); % M samples of x in reverse order
end
y(n) = w'*x1;
e(n) = d(n) - y(n);
w = w + mu_step*e(n)'*x1;
W(:,n) = w;
end
问题:输出(或多或少类似于输入)在误差信号和滤波信号之间交替移动,如下图所示。output
我的实现本身有问题吗?
答案 0 :(得分:0)
代码中似乎没有几件事情。对于前500个样本,您有一个滤波信号及其输入。您正试图从过滤后的信号中找到输入。也就是说,您正试图反转低通滤波器操作。那是你想要做的吗?
在LMS过滤器中,您不会在调用之间保存过滤器状态和过滤器权重。您实质上是在每500个样品后重新设置过滤器并重新开始。这将在每500个样本后显示输出中的不连续性。这就是你所观察到的。我仍然不知道你试图为500以上的样本实现什么逻辑。你试图找到一个过滤器,它从前500个样本的误差中创建输入?