自适应滤波器

  • 自适应滤波器简介
    • LMS
    • NLMS
    • RLS
  • MATLAB程序
  • 运行结果

自适应滤波器简介

工程应用中为了保证绝对的稳定性,一般使用FIR滤波器来设计自适应滤波器。
自适应滤波器的原理框图如下图所示,其中x(n)为输入信号,wn为FIR滤波器的系数,d(n)为期望信号,e(n)为误差信号。

自适应滤波器的运行涉及两个基本过程:滤波过程自适应过程。滤波过程即输入信号与滤波器系数的卷积过程,用来对一系列输入数据产生输出响应;自适应过程是通过特定的算法以不断缩小响应信号与期望信号的均方误差为目的,来实现对滤波器参数的自适应调节。具体的运行步骤如下:
(1)在自适应滤波器运行之前,已知输入信号 x(n)和期望信号 d(n);
(2)自适应滤波器运行时,FIR滤波器中每次卷积得到的结果d^(n)与d(n)做差即得到一个误差信号e(n);
(3)更新算法使用x(n)和e(n)作为输入,输出Δwn来修正FIR滤波器的参数。
(4)重复b和c的步骤,直到误差信号的均方值小于某一设定的数值,这样就说明得到的FIR滤波器可以应用于实时处理系统中了。

自适应滤波器相关的算法包括最小均方(LMS)算法、归一化最小均方(NLMS)算法、递归最小二乘(RLS)算法等。

LMS

LMS算法的权重更新公式为:(u(n)相当于上面的x(n))

其中初始化参数为:权重向量w可以初始化为零向量,步长μ可以根据运行情况调整。
LMS算法的优点是计算量较小,其缺点是瞬时跟踪能力较弱,抗干扰能力较差。

NLMS

NLMS算法的权重更新公式为:

其中初始化参数为:权重向量w可以初始化为零向量,步长μ可以根据运行情况调整。
NLMS算法的优点是对于能量较大、不是很平稳的信号也有较快的收敛性和较好的平稳性,缺点是相比于LMS增加了额外的乘法计算。

RLS

RLS算法的权重更新公式为:



其中初始化参数为:权重向量w可以初始化为零向量,P(0)=δ-1Iδ的值根据输入信号信噪比的不同或实际运行情况进行调整。
RLS算法的优点是收敛速率比一般的LMS算法快一个数量级,且算法的抗干扰效果特别好,在有噪声条件下收敛情况很好,其缺点是迭代方式较复杂、计算量很大。

MATLAB程序

MATLAB程序演示了LMS和RLS算法,并进行了收敛速度与稳定性对比。

程序中设置了参考滤波器wo的参数为:
wo=[-0.1 0.2 0.7 0.4 -0.2 -0.1 0.12 -0.25 0 0 0 0];

在使用LMS或RLS算法逐渐收敛的过程中,滤波器参数从初始的零向量逐渐趋近wo向量。

clc
clear
close alldotnumber=1000000;% 数据点数%构造原始数据
u=wgn(dotnumber,1,0);% wgn(m,n,p)产生一个m行n列的高斯白噪声的矩阵,p以dBW为单位指定输出噪声的强度
noise=wgn(dotnumber,1,-60);
b=1;a=[1 -0.9];
u=filter(b,a,u);% filter(b,a,X) X为输入数据,其中b是分子系数向量,a是分母系数向量  a=1是FIR滤波器
u(dotnumber+1:end)=[];% end是数组的结尾,将从dotnumber+1:end的数据删除
h=[-0.1 0.2 0.7 0.4 -0.2 -0.1 0.12 -0.25].';% 取非共轭转置,下面加点代表非共轭
wo=[h;zeros(4,1)];% 抽头权向量是12阶,后面补零%构造参考输出
d=filter(h,1,u);% filter(b,a,X) X为输入数据,其中b是分子系数向量,a是分母系数向量  a=1是FIR滤波器
d(dotnumber+1:end)=[];% end是数组的结尾,将从dotnumber+1:end的数据删除
d=d+noise;% 加上测量误差%初始化
len=12;
w=zeros(len,1);% 设置权值初始值为0
w_error=zeros(dotnumber,1);% 用于记录误差
e=zeros(dotnumber,1);
vector_u=zeros(len,1);% 抽头输入向量为12行的列向量%% RLS_1
%初始化RLS参数
delta=0.001;% 高SNR时取较小的正常数  小数值收敛快   % 低SNR时取较大的正常数
P=1/delta*eye(len);% eye(n):返回n*n单位矩阵
ramda=1;% ramda=1  无限记忆   当ramda小于1时最终达不到稳态,而且整体误差较大
p_i=eye(1,12);% eye(m,n):返回m*n单位矩阵
k=eye(1,12);
for n=1:dotnumbervector_u=[u(n);vector_u(1:end-1)];% 抽头输入向量p_i=P*vector_u;% 先计算pi用以减少后面的计算k=p_i/(ramda+vector_u.'*p_i);% 更新增益向量ksai(n)=d(n)-w'*vector_u;% 更新先验估计误差saiw=w+k*sai(n);% rls 更新抽头权值wP=(1/ramda).*P-(1/ramda)*k*vector_u.'*P;% 更新逆相关矩阵Pw_error(n)=norm(w-wo)^2;% 计算误差并记录% norm(A)  返回向量A的2范数,即等价于norm(A,2)。即各元素平方和开根号
end
figure;
plot(10*log10(w_error));%% RLS_2
%清空上次的计算
w=zeros(len,1);
w_error=zeros(dotnumber,1);
e=zeros(dotnumber,1);
vector_u=zeros(len,1);%清空上次的RLS参数
delta=2;
P=1/delta*eye(len);
ramda=1;
p_i=eye(1,12);
k=eye(1,12);
for n=1:dotnumbervector_u=[u(n);vector_u(1:end-1)];p_i=P*vector_u;k=p_i/(ramda+vector_u.'*p_i);sai(n)=d(n)-w'*vector_u;w=w+k*sai(n);%rlsP=(1/ramda).*P-(1/ramda)*k*vector_u.'*P;w_error(n)=norm(w-wo)^2;
end
hold on;
plot(10*log10(w_error));%% LMS_1
%清空上次的计算
w=zeros(len,1);
w_error=zeros(dotnumber,1);
e=zeros(dotnumber,1);
vector_u=zeros(len,1);%初始化LMS参数
mu=0.003;
for n=1:dotnumbervector_u=[u(n);vector_u(1:end-1)];y=vector_u.'*w;e(n)=d(n)-y;w=w+mu*e(n)*vector_u;%lmsw_error(n)=norm(w-wo)^2;
end
hold on;
plot(10*log10(w_error));%% LMS_2
%清空上次的计算
w=zeros(len,1);
w_error=zeros(dotnumber,1);
e=zeros(dotnumber,1);
vector_u=zeros(len,1);%初始化LMS参数
mu=0.001;
for n=1:dotnumbervector_u=[u(n);vector_u(1:end-1)];y=vector_u.'*w;e(n)=d(n)-y;w=w+mu*e(n)*vector_u;%lmsw_error(n)=norm(w-wo)^2;
end
hold on;
plot(10*log10(w_error));
legend('RLS 0.001','RLS 2.000','LMS 0.003','LMS 0.001');%改变delta
xlabel('采样点数(迭代次数)');ylabel('系统误差 /dB');
title('自适应滤波器仿真');

运行结果

从结果图中可以看到:对于LMS,步长μ越大,收敛速度越快,但同时在达到厚脸极限时也会造成较大的系统误差;RLS相比于LMS,收敛后得到的系统误差更小且波动性更小。

数字信号处理(4)- 自适应滤波器相关推荐

  1. 数字信号处理matlab设计滤波器

    目 录 1  设计目的.内容及要求 1 1.1 设计目的 1 1.2 设计内容 1 1.3 设计思考 2 1.4 设计要求 2 2 设计方案与设计原理 3 2.1 设计思路 3 2.2 采样定理 3 ...

  2. 数字信号处理——巴特沃斯滤波器设计

    设计思路 这里采用间接法设计数字滤波器(先设计模拟滤波器再设计数字滤波器) 滤波器理解: 1.数字滤波器可以用H(z),h(n)or系统差分方程来表示,对应的就是一个系统,信号输入该系统即可改变其所含 ...

  3. 数字信号处理(FIR滤波器的设计与原理及基础知识)

    FIR滤波器的设计与原理及基础知识 有限长单位脉冲响应(FIR)滤波器的设计方法 线性相位FIR滤波器的特点: 幅度特性: 窗函数设计法 窗口函数对理想特性的影响: 梳状滤波器 有限长单位脉冲响应(F ...

  4. Matlab | 数字信号处理:FIR滤波器结构的实现

    ========================================== 博主github:https://github.com/MichaelBeechan 博主CSDN:https:/ ...

  5. 数字信号处理相关4(FPGA实现FIR滤波器)

    来自:https://blog.csdn.net/u014783685/article/details/74466107 1.FIR滤波器总体设计 本设计是基于FPGA实现一个8阶的FIR数字低通滤波 ...

  6. VLSI数字信号处理系统——第十章流水线结构的并行自适应递归滤波器

    VLSI数字信号处理系统--第十章流水线结构的并行自适应递归滤波器 作者:夏风喃喃 参考: (1) VLSI数字信号处理系统:设计与实现 (美)Keshab K.Parhi/著 (2) socvist ...

  7. 数字信号处理5:FIR滤波器设计

    文章目录 1. 滤波器初识 2. 最直观的滤波方式:频域滤波 3. 傅里叶变换中的加窗 4. FIR滤波器设计 5. 总结 之前的一系列博客中,详细分解了从卷积到FFT的相关知识,不过那些属于理论,是 ...

  8. 数字信号处理实验4:用窗口法设计FIR滤波器

    杭电_数字信号处理课程设计_实验4 一.实验目的 了解一个实际滤波器设计过程,加深掌握用窗口法设计FIR滤波器的原理和窗函数对滤波器性能的影响. 二.实验要求及内容 实验题目: 1.用改进余弦窗设计一 ...

  9. FPGA数字信号处理(二)并行FIR滤波器Verilog设计

    该篇是FPGA数字信号处理的第二篇,选题为DSP系统中极其常用的FIR滤波器.本文将简单介绍FIR滤波器的原理,详细介绍使用Verilog HDL设计并行FIR滤波器的流程和方法.接下来几篇会介绍串行 ...

  10. FPGA数字信号处理(十六)单级CIC滤波器Verilog设计

    该篇是FPGA数字信号处理的第16篇,选题为多速率信号处理系统中常用的CIC滤波器.本文将详细介绍使用Verilog HDL设计单级CIC滤波器的方法.接下来几篇会介绍多级CIC滤波器的Verilog ...

最新文章

  1. [UT]Unit Test理解
  2. php写网页6,thinkphp6输出原始html内容 - 旗云号
  3. 一、华为云ModelArts环配置
  4. Visual Studio 2019 preview中体验C# 8.0新语法
  5. 学过物理的人才能看懂的笑话,你能看明白几个?
  6. MyBatis 多表联合查询及优化
  7. 微信第三方平台公众号授权
  8. 高通模式9008模式linux,重磅干货!高通9008模式与数据提取
  9. 存储区域网络(SAN)概念和设计基础
  10. socket可读,可写的条件
  11. SageMath常用函数
  12. Ubuntu查找文件
  13. react 微信公众平台实现支付功能
  14. 华为服务器克隆linux,华为RH2288H V3服务器磁盘阵列配置RAID
  15. GitBook快速教程 2.2 目录页和普通页
  16. ZK指纹机二次开发中控F18
  17. Linux安装 CentOS 7
  18. 开天机型系统镜像及软件资源网盘链接
  19. gta4 oracle_GTA4车辆与现实车辆名字对照
  20. QModelIndex

热门文章

  1. 老男孩python课后作业_老男孩python基础知识练习题(一)上
  2. 【转载】Goldendict下优质词典简介及安装 (2016-07-29 23:33:20)
  3. 零基础快速自学SQL,1天足矣!
  4. iOS模拟器找不到证书?
  5. 2022年超高清视频行业研究报告
  6. 如何将华为备忘录转移到小米便签
  7. Spark机器学习解析
  8. java 生成高清缩略图_java生成高清缩略图
  9. C语言程序设计--新生入学登记系统
  10. 【Godot】项目结构设计