草庐IT

Matlab自适应滤波算法 LMS小白通俗易懂版

Gengng01 2023-10-22 原文

Matlab自适应滤波算法

在学习自适应算法的过程中,入门阶段,学习了LMS算法、NLMS算法,并用Matlab对算法进行了复现。

LMS

最小均方(LMS)是一种搜索算法,它通过对目标函数进行适当修改,以便简化梯度向量的计算,由于其计算简单,LMS算法及与之相关的其他算法,已经广泛应用于自适应滤波的各种的应用中。

先写一下官方给的算法公式


I n i t i a l i z e : Initialize: Initialize:
x ( 0 ) = w ( 0 ) = [ 0   0   0   ⋅ ⋅ ⋅ ⋅ ⋅   0   0   0 ] T x(0)=w(0)=[0\,0\,0 \,·····\,0\,0\,0]^T x(0)=w(0)=[000⋅⋅⋅⋅⋅000]T

f o r    i = 1 : k for \,\,i = 1:k fori=1:k
e ( k ) = d ( k ) − x T ( k ) w ( k ) \quad e(k) = d(k)-x^T(k)w(k) e(k)=d(k)xT(k)w(k)
w ( k + 1 ) = w ( k ) + 2 μ e ( k ) x ( k ) \quad w(k+1) = w(k)+2\mu e(k)x(k) w(k+1)=w(k)+2μe(k)x(k)
e n d end end


介绍算法变量

注意 x x x不是原信号, x x x是来自于原信号中与权重长度一致的与权重进行运算的数据

w w w为权重,首先需要对输入信号和权重进行初始化
x ( 0 ) = w ( 0 ) = [ 0   0   0   ⋅ ⋅ ⋅ ⋅ ⋅   0   0   0 ] T x(0)=w(0)=[0\,0\,0 \,·····\,0\,0\,0]^T x(0)=w(0)=[000⋅⋅⋅⋅⋅000]T
k k k是迭代次数
d ( k ) d(k) d(k)为期望信号的第 k k k个值
e e e是存储每一次迭代误差的一个向量, e ( k ) e(k) e(k)为第k次迭代的理想信号与经过滤波器(输入信号与权重相乘)的输入信号的结果做差
e ( k ) = d ( k ) − x T ( k ) w ( k ) e(k) = d(k)-x^T(k)w(k) e(k)=d(k)xT(k)w(k)
计算出对应的迭代误差后,使用该误差结合一个更新步长 μ \mu μ对权重进行更新
w ( k + 1 ) = w ( k ) + 2 μ e ( k ) x ( k ) w(k+1) = w(k)+2\mu e(k)x(k) w(k+1)=w(k)+2μe(k)x(k)

梳理完算法的结构对算法进行复现

  • 第一步生成一个理想信号
t = 0.1:0.1:100; %时间轴
signal_len = length(t);%信号长度
d = sin(t);%理想信号
plot(t,d)
xlabel('时间')
ylabel('幅度')
title('理想信号')

  • 第二步生成一个随机高斯白噪声
t = 0.1:0.1:100; %时间轴
noise = 0.1*randn(1,signal_len);%噪声

plot(t,noise)
xlabel('时间')
ylabel('幅度')
title('噪声')

  • 第三步生成含有噪声的信号
t = 0.1:0.1:100; %时间轴
signal_len = length(t);%信号长度
d = sin(t);%理想信号

noise = 0.1*randn(1,signal_len);%噪声
d_noise =  d+noise;%要过滤的信号-加了噪声的信号

plot(t,d_nosie)
xlabel('时间')
ylabel('幅度')
title('含噪信号')

  • 第四步初始化需要的变量
filter_len = 50;  %滤波器长度
W = zeros(1,filter_len); %初始化滤波器
x = zeros(1,filter_len); %初始化卷积输入
After_filter = zeros(1,signal_len);%用于存储滤波之后的信号
e = zeros(1,signal_len); %初始化误差
mull = 0.03; %步长

除了算法公式中给到的 x x x w w w之外还要定义一个训练步长以及滤波器长度,以及存储误差的变量。

  • 第五步编写算法主体
for k =1:signal_len
    x = [d_noise(k) x(1:filter_len-1)]; %线性卷积的输入
    After_filter(k) = W*x';
    e(k) =d(k) - After_filter(k);%计算误差
    W = W + 2*mull*e(k)*x; %计算误差更新权重
end

解释一下改句的运行原理,LMS算法中的输入信号实际上是用于和滤波器也就是权重进行卷积的信号需要将理想信号中的数据进行部分截取然后再翻转

 x = [d_noise(k) x(1:filter_len-1)]; %线性卷积的输入

这里先介绍一下Matlab的合并语法,如果将两个向量间隔一个空格放到一个中括号里实际上就是对这两个数据在横向上进行拼接。

然后模拟一下线性卷积的输入循环,下图展示了改代码机制是如果对原信号进行边位移边反转还能截取固定长度的功能,这块要是不清楚的话,可以去看下卷积的原理。

  • 第六步绘图
    将理想信号含噪信号误差信号以及去噪信号放到一起进行输出
subplot(411)
plot(d)
title('LMS')
xlabel('理想信号')

subplot(412)
plot(d_noise)
xlabel('含噪原信号')

subplot(413)
plot(e)
xlabel('误差')

subplot(414)
plot(After_filter)
xlabel('去噪信号')

完整代码

clc;%清除工作区
clear;%清除命令窗口

t = 0.1:0.1:100; %时间轴
signal_len = length(t);%信号长度
d = sin(t);%理想信号

noise = 0.1*randn(1,signal_len);%噪声
d_noise =  d+noise;%要过滤的信号-加了噪声的信号

filter_len = 50;  %滤波器长度
W = zeros(1,filter_len); %初始化滤波器
x = zeros(1,filter_len); %初始化卷积输入
After_filter = zeros(1,signal_len);%用于存储滤波之后的信号
e = zeros(1,signal_len); %初始化误差
mull = 0.03; %步长


for k =1:signal_len
    x = [d_noise(k) x(1:filter_len-1)]; %线性卷积的输入
    After_filter(k) = W*x';
    e(k) =d(k) - After_filter(k);%计算误差
    W = W + 2*mull*e(k)*x; %计算误差更新权重
end

figure(1)
subplot(411)
plot(t,d)
title('LMS')
xlabel('理想信号')

subplot(412)
plot(t,d_noise)
xlabel('含噪原信号')

subplot(413)
plot(t,e)
xlabel('误差')

subplot(414)
plot(t,After_filter)
xlabel('去噪信号')

总结

在论文对比中需要用到MSE指标等,并需要进行蒙特卡洛实验。同时下一步会继续更新NLMS算法。
如果需要,可以关注我们的微信公众号《浩浩的科研笔记》可以下载,有问题留言。

有关Matlab自适应滤波算法 LMS小白通俗易懂版的更多相关文章

  1. Matlab imread()读到了什么 (浅显 当复习文档了) - 2

    matlab打开matlab,用最简单的imread方法读取一个图像clcclearimg_h=imread('hua.jpg');返回一个数组(矩阵),往往是a*b*cunit8类型解释一下这个三维数组的意思,行数、数和层数,unit8:指数据类型,无符号八位整形,可理解为0~2^8的数三个层数分别代表RGB三个通道图像rgb最常用的是24-位实现方法,即RGB每个通道有256色阶(2^8)。基于这样的24-位RGB模型的色彩空间可以表现256×256×256≈1670万色当imshow传入了一个二维数组,它将以灰度方式绘制;可以把图像拆分为rgb三层,可以以灰度的方式观察它figure(1

  2. 区块链之加解密算法&数字证书 - 2

    目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非

  3. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  4. MIMO-OFDM无线通信技术及MATLAB实现(1)无线信道:传播和衰落 - 2

     MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO

  5. ruby - 有人可以解释一下在 Ruby 中注入(inject)的真实、通俗易懂的用法吗? - 2

    我正在学习Ruby,遇到了inject。我正处于理解它的风口浪尖,但当我是那种需要真实世界的例子来学习一些东西的人时。我遇到的最常见的例子是人们使用inject来添加一个(1..10)范围的总和,我不太关心这个。这是一个任意的例子。在实际程序中我会用它做什么?我正在学习,所以我可以继续使用Rails,但我不必有一个以Web为中心的示例。我只需要一些我可以全神贯注的目标。谢谢大家。 最佳答案 inject有时可以通过它的“其他”名称reduce更好地理解。它是一个对Enumerable进行操作(迭代一次)并返回单个值的函数。它有许多有

  6. 100个python算法超详细讲解:画直线 - 2

    1.问题描述使用Python的turtle(海龟绘图)模块提供的函数绘制直线。2.问题分析一幅复杂的图形通常都可以由点、直线、三角形、矩形、平行四边形、圆、椭圆和圆弧等基本图形组成。其中的三角形、矩形、平行四边形又可以由直线组成,而直线又是由两个点确定的。我们使用Python的turtle模块所提供的函数来绘制直线。在使用之前我们先介绍一下turtle模块的相关知识点。turtle模块提供面向对象和面向过程两种形式的海龟绘图基本组件。面向对象的接口类如下:1)TurtleScreen类:定义图形窗口作为绘图海龟的运动场。它的构造器需要一个tkinter.Canvas或ScrolledCanva

  7. 建模分析 | 平面2R机器人(二连杆)运动学与动力学建模(附Matlab仿真) - 2

    目录0专栏介绍1平面2R机器人概述2运动学建模2.1正运动学模型2.2逆运动学模型2.3机器人运动学仿真3动力学建模3.1计算动能3.2势能计算与动力学方程3.3动力学仿真0专栏介绍?附C++/Python/Matlab全套代码?课程设计、毕业设计、创新竞赛必备!详细介绍全局规划(图搜索、采样法、智能算法等);局部规划(DWA、APF等);曲线优化(贝塞尔曲线、B样条曲线等)。?详情:图解自动驾驶中的运动规划(MotionPlanning),附几十种规划算法1平面2R机器人概述如图1所示为本文的研究本体——平面2R机器人。对参数进行如下定义:机器人广义坐标

  8. ABB-IRB-1200运动学分析MATLAB RVC工具分析+Simulink-Adams联合仿真 - 2

    一、机器人介绍        此处是基于MATLABRVC工具箱,对ABB-IRB-1200型号的微型机械臂进行正逆向运动学分析,并利Simulink工具实现对机械臂进行具有动力学参数的末端轨迹规划仿真,最后根据机械模型设计Simulink-Adams联合仿真。 图1.ABBIRB 1200尺寸参数示意图ABBIRB 1200提供的两种型号广泛适用于各作业,且两者间零部件通用,两种型号的工作范围分别为700 mm 和 900 mm,大有效负载分别为 7 kg 和5 kg。 IRB 1200 能够在狭小空间内能发挥其工作范围与性能优势,具有全新的设计、小型化的体积、高效的性能、易于集成、便捷的接

  9. ruby - 在 Ruby 中实现 Luhn 算法 - 2

    我一直在尝试用Ruby实现Luhn算法。我一直在执行以下步骤:该公式根据其包含的校验位验证数字,该校验位通常附加到部分帐号以生成完整帐号。此帐号必须通过以下测试:从最右边的校验位开始向左移动,每第二个数字的值加倍。将乘积的数字(例如,10=1+0=1、14=1+4=5)与原始数字的未加倍数字相加。如果总模10等于0(如果总和以零结尾),则根据Luhn公式该数字有效;否则无效。http://en.wikipedia.org/wiki/Luhn_algorithm这是我想出的:defvalidCreditCard(cardNumber)sum=0nums=cardNumber.to_s.s

  10. Ruby 斐波那契算法 - 2

    下面是我写的一个计算斐波那契数列中的值的方法:deffib(n)ifn==0return0endifn==1return1endifn>=2returnfib(n-1)+(fib(n-2))endend它工作到n=14,但在那之后我收到一条消息说程序响应时间太长(我正在使用repl.it)。有人知道为什么会这样吗? 最佳答案 Naivefibonacci进行了大量的重复计算-在fib(14)fib(4)中计算了很多次。您可以将内存添加到您的算法中以使其更快:deffib(n,memo={})ifn==0||n==1returnnen

随机推荐