自适应滤波的MATLAB实现
1.LMS算法的仿真程序:%lms 算法
clear all
close all
hold off%系统信道权数
sysorder = 5 ;%抽头数
N=1000;%总采样次数
inp = randn(N,1);%产生高斯随机系列
n = randn(N,1);
= butter(2,0.25);
Gz = tf(b,a,-1);%逆变换函数
h= ;%信道特性向量
y = lsim(Gz,inp);%加入噪声
n = n * std(y)/(10*std(n));%噪声信号
d = y + n;%期望输出信号
totallength=size(d,1);%步长
N=60 ; %60节点作为训练序列
%算法的开始
w = zeros ( sysorder , 1 ) ;%初始化
for n = sysorder : N
u = inp(n:-1:n-sysorder+1) ;% u的矩阵
y(n)= w' * u;%系统输出
e(n) = d(n) - y(n) ;%误差
if n < 20
mu=0.32;
else
mu=0.15;
end
w = w + mu * u * e(n) ;%迭代方程
end
%检验结果
for n = N+1 : totallength
u = inp(n:-1:n-sysorder+1) ;
y(n) = w' * u ;
e(n) = d(n) - y(n) ;%误差
end
hold on
plot(d)
plot(y,'r');
title('系统输出') ;
xlabel('样本')
ylabel('实际输出')
figure
semilogy((abs(e))) ;% e的绝对值坐标
title('误差曲线') ;
xlabel('样本')
ylabel('误差矢量')
figure%作图
plot(h, 'k+')
hold on
plot(w, 'r*')
legend('实际权矢量','估计权矢量')
title('比较实际和估计权矢量') ;
axis()
2.NLMS算法的仿真程序:
%lms 算法
clear all
close all
hold off%系统信道权数
sysorder = 5 ;%抽头数
N=1000;%总采样次数
inp = randn(N,1);%产生高斯随机系列
n = randn(N,1);
= butter(2,0.25);
Gz = tf(b,a,-1);%逆变换函数
h= ;%信道特性向量
y = lsim(Gz,inp);%加入噪声
n = n * std(y)/(10*std(n));%噪声信号
d = y + n;%期望输出信号
totallength=size(d,1);%步长
N=60 ; %60节点作为训练序列
%算法的开始
w = zeros ( sysorder , 1 ) ;%初始化
for n = sysorder : N
u = inp(n:-1:n-sysorder+1) ;% u的矩阵
y(n)= w' * u;%系统输出
r(n)=u'*u;%自相关矩阵
e(n) = d(n) - y(n) ;%误差
fai=.0001;%修正参数,为防止u'*u过小导致步长值太大而设置的
if n < 20
mu=0.32;
else
mu=0.15;
end
w = w + mu * u * e(n)/(r(n)+fai) ;;%迭代方程
end
%检验结果
for n = N+1 : totallength
u = inp(n:-1:n-sysorder+1) ;
y(n) = w' * u ;
e(n) = d(n) - y(n) ;%误差
end
hold on
plot(d)
plot(y,'r');
title('系统输出') ;
xlabel('样本')
ylabel('实际输出')
figure
semilogy((abs(e))) ;% e的绝对值坐标
title('误差曲线') ;
xlabel('样本')
ylabel('误差矢量')
figure%作图
plot(h, 'k+')
hold on
plot(w, 'r*')
legend('实际权矢量','估计权矢量')
title('比较实际和估计权矢量') ;
axis()
3.RLS算法的仿真程序:
% RLS算法
randn('seed', 0) ;
rand('seed', 0) ;
NoOfData = 8000 ; % Set no of data points used for training
Order = 32 ; % 自适应滤波权数
Lambda = 0.98 ; % 遗忘因子
Delta = 0.001 ; % 相关矩阵R的初始化
x = randn(NoOfData, 1) ;%高斯随机系列
h = rand(Order, 1) ; % 系统随机抽样
d = filter(h, 1, x) ; % 期望输出
% RLS算法的初始化
P = Delta * eye ( Order, Order ) ;%相关矩阵
w = zeros ( Order, 1 ) ;%滤波系数矢量的初始化
% RLS Adaptation
for n = Order : NoOfData ;
u = x(n:-1:n-Order+1) ;%延时函数
pi_ = u' * P ;%互相关函数
k = Lambda + pi_ * u ;
K = pi_'/k;%增益矢量
e(n) = d(n) - w' * u ;%误差函数
w = w + K * e(n) ;%递归公式
PPrime = K * pi_ ;
P = ( P - PPrime ) / Lambda ;%误差相关矩阵
w_err(n) = norm(h - w) ;%真实估计误差
end ;
% 作图表示结果
figure ;
plot(20*log10(abs(e))) ;%| e |的误差曲线
title('学习曲线') ;
xlabel('迭代次数') ;
ylabel('输出误差估计') ;
figure ;
semilogy(w_err) ;%作实际估计误差图
title('矢量估计误差') ;
xlabel('迭代次数') ;
ylabel('误差权矢量') ;
4.自适应均衡器的仿真程序:
% Illustration of the conventional RLS algorithm
close all;
W=2.9;
Nexp=10;
N=2000;
Nmc=1; % Number of ensemble realizations
M=11;%抽头系数
lambda=0.99;%遗忘因子
varv=0.001;%噪声方差
h=zeros(3,1);%h的初始化
er=zeros(N,Nmc);%er的初始化
h(1)=0.5*(1+cos(2*pi*(1-2)/W));
h(2)=0.5*(1+cos(2*pi*(2-2)/W));
h(3)=0.5*(1+cos(2*pi*(3-2)/W));
% 学习曲线
hc=';
n0=7;
t=(1:N)';
for i=1:Nmc
y=sign(rand(N,1)-0.5);%输入信号
v=sqrt(varv)*randn(N,1);%噪声信号
x=filter(hc,1,y)+v;%信号混合
x=;%x矩阵
yd=zeros(N+M-1,1); %延迟信号初始化
e=yd;
yd(n0+M-1:N+M-1)=y(1:N-n0+1);
% CRLS 算法
% Initialization
lambda=0.98;
P=(10^-3)*eye(M,M);
c=zeros(M,1);
g=c;
glambda=g;
% 迭代范围
for n=M:M+N-1
xn=flipud(x(n-M+1:n));
glambda=P*xn;
alphal=lambda+conj(glambda')*xn;
g=glambda/lambda;a(n)=1-conj(g')*xn;
P=(P-g*conj(glambda'))/lambda;
P=(P+P')/2;
e(n)=yd(n)-conj(c')*xn;
c=c+g*conj(e(n));
end
end
eplot=e(M:M+N-1).^2;
subplot(2,1,1), plot(t,abs(eplot))
ylabel('|e(n)|^2');
xlabel('n');
subplot(2,1,2), plot(t,a(M:M+N-1));
ylabel('\alpha(n)');
xlabel('n');
5.自适应陷波器的仿真程序:
N=400; %总采样长度
t=0:N-1; %时间的变化范围
s=sin(2*pi*t/20); %输入信号
A=0.5; %干扰信号的幅值
fai=pi/3;%干扰信号的相移
n=A*cos(2*pi*t/10+fai);%干扰信号
x=s+n;%信号混合
subplot(2,2,1);%作第一子图
plot(t,s);
subplot(2,2,2); %作第二子图
plot(t,x);
x1=cos(2*pi*t/10);
x2=sin(2*pi*t/10);
%初始化
w1=0.1;
w2=0.1;
e=zeros(1,N);
y=0;
u=0.05;%迭代步长
for i=1:N
y=w1*x1(i)+w2*x2(i);
e(i)=x(i)-y;%误差信号
w1=w1+u*e(i)*x1(i);%迭代方程
w2=w2+u*e(i)*x2(i);%迭代方程
end
subplot(2,2,3); %作第三子图
plot(t,e);
subplot(2,2,4); %作第四子图
plot(t,s-e); 我正准备用自适应滤波去噪,看看,谢谢! 太感谢了,敢问高人有形态学滤波的程序吗?matlab的急求!!拜托了!
回复 楼主 的帖子
请问什么情况下用自适应滤波呢?能不能简单讲一下您自己对这种方法的理解呢?谢谢! 请问什么情况下用自适应滤波呢?同问 貌似是在哪位大侠的论文上的程序吧???我最小值急需这篇论文楼主可不可以把原稿发下给我啊???感激涕零啊... 我的邮箱dqh111@126.com嘿嘿
:loveliness: 楼主黑感谢哈 这些程序不错,分享了呵呵谢谢 程序都很简洁易懂啊,谢谢
页:
[1]