|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?我要加入
x
各位坛友,首先道一声假期快乐!本人现在正在处理一组信号,但是其受到50Hz工频的严重干扰,现在想通过自适应陷波器将50Hz工频滤除。开始采用的是LMS算法,选择了两个参考输入x1=sin(100*pi*t)和x2=cos(100*pi*t),经过自适应陷波器基本可以达到滤除工频的效果(但是没有完全滤除,只是降低了)。由于LMS算法有方法噪声、收敛较慢的特点,所以现在尝试采用RLS算法进行滤波。但问题是我依然按照选择上述两个参考输入的方法进行编程,但计算结果确实滤波没有任何效果,输出信号依然包含全部的工频成分。而且我对算法中遗忘因子的含义不甚了解,希望高手们多多指导,感激不尽!下面是我自己编的RLS算法滤波的程序,请大家多多帮助。
%读入原始信号
clear all;
sf=200;%采样频率
N=11999;%数据个数
n=0:N-1;
t=n/sf;%数据对应时间序列
c=['yx-15.txt'];%15.txt为数据文件
x=textread(c);
save filename x;%选择内存中的x变量保存为filename.mat文件
xx1=cos(100*pi*t);
xx2=sin(100*pi*t);
d=x; %期望响应d(n)=x(n)
w1=zeros(2,N); %权矢量w(i)初始化
w2=zeros(2,N);
y=zeros(1,N);
e=zeros(1,N);
z=zeros(1,N);
lambda=0.995; %遗忘因子lambda
delta=0.001;
p1=delta*eye(2,2);
p2=delta*eye(2,2); %T(-1)=10
for i=3:N %RLS算法
x1=xx1(i-1:-1:i-2)';
x2=xx2(i-1:-1:i-2)';
g1=(p1*x1)/(lambda+x1'*p1*x1);
g2=(p2*x2)/(lambda+x2'*p2*x2);
y(i)=w1(:,1)'*x1+w2(:,1)'*x2;
z(i)=d(i)-y(i);
w1(:,i)=w1(:,i-1)+g1*conj(z(i));
w2(:,i)=w2(:,i-1)+g2*conj(z(i));
p1=(p1-g1*x1'*p1)/lambda;
p2=(p2-g2*x2'*p2)/lambda;
end
plot(t,z);
xlabel('时间/s');ylabel('加速度/m/s2');
title('去除50Hz干扰频率的时程曲线');
grid on; |
|