自适应滤波方法——LMS算法

news2024/11/22 21:05:51

自适应滤波器

  • 自适应滤波器:一种能够根据输入信号自动调整自身参数的数字滤波器

  • 非自适应滤波器:具有静态滤波器系统的数字滤波器,静态系数构成了滤波器的传递函数

  • 对于一些应用(如系统辨识、预测、去噪等),无法事先知道需要操作的参数,必须使用自适应的系数进行处理,这种情况下通常使用自适应滤波器

  • 自适应滤波器处理语音信号时,不需要实现知道输入信号和噪声的统计特性,滤波器自身能够在工作过程中学习或估计信号的统计特性,并以此为依据调整自身参数,以达到某种准则/代价函数下的最优滤波效果

  • 自适应滤波器是处理非平稳信号的一种有效手段
    在这里插入图片描述

  • 下面从一个N阶的滤波器出发,逐步过渡到自适应滤波器

N阶滤波器

  • 一个N阶滤波器,参数为 w ( n ) \text{w}(n) w(n),包含N个独立的滤波器系数
  • 滤波器的输出为输入信号和滤波器系数的线性卷积:
    y ( n ) = ∑ i = 0 N − 1 w i ( n ) x ( n − i ) = w T ( n ) x ( n ) = x T ( n ) w ( n ) y(n)=\sum_{i=0}^{N-1}w_i(n)x(n-i)=\text{w}^T(n)\text{x}(n)=\text{x}^T(n)\text{w}(n) y(n)=i=0N1wi(n)x(ni)=wT(n)x(n)=xT(n)w(n)
  • 其中,
    • x ( n ) = [ x ( n ) , x ( n − 1 ) , . . . , x ( n − N + 1 ) ] T \text{x}(n)=[x(n),x(n-1),...,x(n-N+1)]^T x(n)=[x(n),x(n1),...,x(nN+1)]T
    • w ( n ) = [ w 0 ( n ) , w 1 ( n ) , . . . , w N − 1 ( n ) ] T \text{w}(n)=[w_0(n),w_1(n),...,w_{N-1}(n)]^T w(n)=[w0(n),w1(n),...,wN1(n)]T
    • 括号里的n表示不同的时刻
  • 定义期望输出为d(n),误差序列为: e ( n ) = d ( n ) − y ( n ) = d ( n ) − w T ( n ) x ( n ) e(n)=d(n)-y(n)=d(n)-\text{w}^T(n)\text{x}(n) e(n)=d(n)y(n)=d(n)wT(n)x(n)
  • 由于n时刻的误差是根据n时刻的滤波器系数进行定义的,因此该误差被称为“后验误差”

标准LMS算法

  • 根据最小化均方误差(MMSE)准则,最小化目标函数为
    J ( w ) = E [ ∣ e ( n ) ∣ 2 ] = E [ ∣ d ( n ) − w T ( n ) x ( n ) ∣ 2 ] J(\text{w})=E[|e(n)|^2]=E[|d(n)-\text{w}^T(n)\text{x}(n)|^2] J(w)=E[e(n)2]=E[d(n)wT(n)x(n)2]
  • 为了最小化均方误差函数,需计算 J ( w ) J(\text{w}) J(w)对w的导数,令导数为零:
    E [ x ( n ) x T ( n ) ] w ( n ) − E [ x ( n ) d ( n ) ] = R w − r = 0 E[\text{x}(n)\text{x}^T(n)]\text{w}(n)-E[\text{x}(n)d(n)]=R\text{w}-r=0 E[x(n)xT(n)]w(n)E[x(n)d(n)]=Rwr=0
  • 可得到: w o p t = R − 1 r \text{w}_{opt}=R^{-1}r wopt=R1r
  • w o p t \text{w}_{opt} wopt定义的滤波器为Wiener滤波器,Wiener滤波器是均方误差最小意义上的统计最优滤波器
  • Wiener滤波器的缺陷:
    • 不适用于非平稳过程,而语音就是非平稳信号
    • 数学期望的计算需要利用全部的历史数据,来估计当前的滤波器系数,这不是合理的选择
  • 由于涉及数学期望,在实际应用中,无法获得信号真实的自相关矩阵R,以及输入信号和期望输出之前的互相关向量r。因此,在实际应用中,利用瞬时误差的平方代替目标函数中的数学期望,再求取瞬时梯度: ▽ ( n ) = − 2 e ( n ) x ( n ) \triangledown (n)=-2e(n)\text{x}(n) (n)=2e(n)x(n),然后沿着负梯度方向更新滤波器系数:
    w ( n + 1 ) = w ( n ) + 2 μ x ( n ) e ( n ) \text{w}(n+1)=\text{w}(n)+2\mu \text{x}(n)e(n) w(n+1)=w(n)+2μx(n)e(n)
  • 上式为标准时序LMS算法的更新公式,为逐点更新,每当给定一个新的x(n)和d(n),滤波器系数就更新一次
  • 标准LMS算法的执行流程:
    • 初始化w(0)、x(0)
    • 对每一个新的输入值x(n),计算输出值y(n)
    • 利用期望输出d(n),计算误差值e(n),从而得到梯度
    • 更新滤波器系数,得到w(n+1)
    • 返回步骤2,直至结束,可得到输出序列和误差序列
  • 标准LMS算法
    • 基本思想是梯度下降
    • 优点是算法简单,易实现
    • 缺点是收敛速度慢,因为存在梯度噪声,所以跟踪性能比较差

block(分块)LMS算法

  • 用更多采样点,更新一次滤波器系数:
    w ( n + 1 ) = w ( n ) + 2 μ x ( n ) e ( n ) w ( n + 2 ) = w ( n + 1 ) + 2 μ x ( n + 1 ) e ( n + 1 ) . . . w ( n + L ) = w ( n + L − 1 ) + 2 μ x ( n + L − 1 ) e ( n + L − 1 ) \begin{aligned} \text{w}(n+1)&=\text{w}(n)+2\mu \text{x}(n)e(n) \\ \text{w}(n+2)&=\text{w}(n+1)+2\mu \text{x}(n+1)e(n+1) \\ ... \\ \text{w}(n+L)&=\text{w}(n+L-1)+2\mu \text{x}(n+L-1)e(n+L-1) \end{aligned} w(n+1)w(n+2)...w(n+L)=w(n)+2μx(n)e(n)=w(n+1)+2μx(n+1)e(n+1)=w(n+L1)+2μx(n+L1)e(n+L1)
  • 得: w ( n + L ) = w ( n ) + 2 μ ∑ m = 0 L − 1 x ( n + m ) e ( n + m ) \text{w}(n+L)=\text{w}(n)+2\mu \sum_{m=0}^{L-1} \text{x}(n+m)e(n+m) w(n+L)=w(n)+2μm=0L1x(n+m)e(n+m)
  • 分块更新,每L点更新一次滤波器系数
  • 注意,误差序列是通过同一个滤波器得到的: e ( n + m ) = d ( n + m ) − x T ( n + m ) w ( n ) e(n+m)=d(n+m)-\text{x}^T(n+m)\text{w}(n) e(n+m)=d(n+m)xT(n+m)w(n)
  • 为了后续推到方便,令L=N,也就是说收集到采样点个数等于滤波器阶数时,才进行滤波器系数更新
  • 与标准LMS相比,block LMS的更新频率降低了L倍,因此定义一个新的时间索引k来代替n, k = n L k=\frac{n}{L} k=Ln
  • 从而block LMS更新公式为: w ( k + 1 ) = w ( k ) + 2 μ ∑ m = 0 L − 1 x ( k L + m ) e ( k L + m ) \text{w}(k+1)=\text{w}(k)+2\mu \sum_{m=0}^{L-1} \text{x}(kL+m)e(kL+m) w(k+1)=w(k)+2μm=0L1x(kL+m)e(kL+m)
  • block LMS中,瞬时梯度为: ▽ ( k ) = − 2 ∑ m = 0 L − 1 x ( k L + m ) e ( k L + m ) \triangledown (k)=-2 \sum_{m=0}^{L-1} \text{x}(kL+m) e(kL+m) (k)=2m=0L1x(kL+m)e(kL+m)
  • block LMS的核心运算:
    • 输出序列为输入信号与滤波器系数的线性卷积: y ( n + m ) = x T ( n + m ) w ( n ) , m ∈ [ 0 , N − 1 ] y(n+m)=\text{x}^T(n+m)\text{w}(n),m \in [0,N-1] y(n+m)=xT(n+m)w(n)m[0,N1]
    • 瞬时梯度为输入信号与误差序列的线性相关: ▽ ( k ) = − 2 ∑ m = 0 L − 1 x ( k L + m ) e ( k L + m ) \triangledown (k)=-2 \sum_{m=0}^{L-1} \text{x}(kL+m) e(kL+m) (k)=2m=0L1x(kL+m)e(kL+m)
  • 利用FFT计算线性卷积的方法有Overlap-save method和Overlap-add method

Overlap-save method

  • 线性卷积与圆周卷积的关系:一般地,如果两个有限长序列的长度为 N 1 、 N 2 N_1、N_2 N1N2,且满足 N 1 ≥ N 2 N_1 \ge N_2 N1N2,则圆周卷积的 N 1 − N 2 + 1 N_1-N_2+1 N1N2+1个点,与线性卷积的结果一致

  • 线性相关与圆周相关的关系:一般地,如果两个有限长序列的长度为 N 1 、 N 2 N_1、N_2 N1N2,且满足 N 1 ≥ N 2 N_1 \ge N_2 N1N2,则圆周相关的 N 1 − N 2 + 1 N_1-N_2+1 N1N2+1个点,与线性相关的结果一致

  • 希望理解上述两个关系,可参考数字信号的基本运算——线性卷积(相关)和圆周卷积(相关)

  • 为了得到N个点的输出序列: y ( n + m ) = x T ( n + m ) w ( n ) , m ∈ [ 0 , N − 1 ] y(n+m)=\text{x}^T(n+m)\text{w}(n),m \in [0,N-1] y(n+m)=xT(n+m)w(n)m[0,N1],要保证至少有N个点的线性卷积和圆周卷积的结果相同,即 N 1 − N 2 + 1 ≥ N N_1-N_2+1 \ge N N1N2+1N

  • 由于 N 1 ≥ N 2 N_1 \ge N_2 N1N2,且滤波器阶数为N,因此 N 2 = N N_2=N N2=N,所以条件变为: N 1 ≥ 2 N − 1 N_1 \ge 2N-1 N12N1

  • 为了方便FFT的计算,令 N 1 = 2 N N_1=2N N1=2N

  • 根据下图,构造x(n)和w(n)
    在这里插入图片描述

  • 分别计算输入信号向量和滤波器向量的傅里叶变换
    X ( k ) = d i a g { F [ x ( k N − N ) , . . . , x ( k N − 1 ) , x ( k N ) , . . . , x ( k N + N − 1 ) ] } W ( k ) = F [ w T ( k ) , 0 , . . . , 0 ] T Y ( k ) = X ( k ) W ( k ) \begin{aligned} X(k)&=diag\{ F[x(kN-N), ..., x(kN-1), x(kN), ..., x(kN+N-1)] \} \\ W(k)&=F[\text{w}^T(k), 0, ..., 0]^T \\ Y(k)&=X(k)W(k) \end{aligned} X(k)W(k)Y(k)=diag{F[x(kNN),...,x(kN1),x(kN),...,x(kN+N1)]}=F[wT(k),0,...,0]T=X(k)W(k)

  • 每个Y(k)的长度为2N,输出序列y(k)的N点线性卷积等于Y(k)经过傅里叶逆变换的后N个点
    y ( k ) = [ y ( k N ) , y ( k N + 1 ) , y ( k N ) , . . . , y ( k N + N − 1 ) ] = last N samples of  F − 1 Y ( k ) \begin{aligned} y(k)&=[y(kN), y(kN+1), y(kN), ..., y(kN+N-1)] \\ &=\text{last N samples of }F^{-1}Y(k) \end{aligned} y(k)=[y(kN),y(kN+1),y(kN),...,y(kN+N1)]=last N samples of F1Y(k)

  • y(k)的计算流程如下:
    在这里插入图片描述

  • 接下来计算N个点的瞬时梯度之和: ▽ ( k ) = − 2 ∑ m = 0 L − 1 x ( k L + m ) e ( k L + m ) \triangledown (k)=-2 \sum_{m=0}^{L-1} \text{x}(kL+m) e(kL+m) (k)=2m=0L1x(kL+m)e(kL+m)

  • 对于线性相关运算,仍然是变换到频域,计算输入信号的共轭谱与误差序列的乘积

  • X(k)在上面已求得,接下来将误差序列 e ( k ) = [ e ( k N ) , e ( k N + 1 ) , . . . , e ( k N + N − 1 ) ] e(k)=[e(kN), e(kN+1), ..., e(kN+N-1)] e(k)=[e(kN),e(kN+1),...,e(kN+N1)]也扩展到2N的长度

  • 注意:计算卷积时,在w(n)的后面补N个0,计算相关时,在e(n)的前面补N个0

  • 误差序列的傅里叶变换 E ( k ) = F [ 0 , 0 , . . . , 0 , e T ( k ) ] T E(k)=F[0, 0, ..., 0, e^T(k)]^T E(k)=F[0,0,...,0,eT(k)]T

  • 瞬时梯度的傅里叶变换 ▽ ( k ) = X H ( k ) E ( k ) \bigtriangledown (k)=X^H(k)E(k) (k)=XH(k)E(k)

  • 每个 ▽ ( k ) \bigtriangledown (k) (k)的长度为2N,瞬时梯度之和的N点线性相关等于 ▽ ( k ) \bigtriangledown (k) (k)经过傅里叶逆变换的前N个点
    ▽ ⃗ ( k ) = [ ▽ ( k N ) , ▽ ( k N + 1 ) , ▽ ( k N ) , . . . , ▽ ( k N + N − 1 ) ] = first N samples of  F − 1 ▽ ( k ) \begin{aligned} \vec{\triangledown}(k)&=[\triangledown(kN), \triangledown(kN+1), \triangledown(kN), ..., \triangledown(kN+N-1)] \\ &=\text{first N samples of }F^{-1}\bigtriangledown(k) \end{aligned} (k)=[(kN),(kN+1),(kN),...,(kN+N1)]=first N samples of F1(k)

Frequency-Domain Adaptive Filter(FDAF)

  • 滤波器系数的更新也可以在频域完成 W ( k + 1 ) = W ( k ) + 2 μ F [ ▽ ⃗ T ( k ) , 0 , . . . , 0 ] T W(k+1)=W(k)+2\mu F[\vec{\triangledown}^T(k), 0, ..., 0]^T W(k+1)=W(k)+2μF[ T(k),0,...,0]T
  • 注意
    • 滤波器系数直接在频域更新,所以需要将梯度向量再次变换到频域
    • 由于滤波器系数在后面补N个0,所以梯度向量也需要在后面补N个0
  • FDAF的整体框架如下:
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/588786.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

固定翼无人机1:500地籍

引言 上几期,睿铂为大家推送了两篇相对精度验证的文章,其优秀的成果引来了业界人士不少的赞叹。同时,许多客户朋友又提出了更高的要求。目前,在地籍精度的项目中,使用多旋翼无人机挂载倾斜摄影相机作业,是能…

机器学习笔记 - 基于TensorFlow Lite的模型部署

一、简述 TensorFlow Lite 是一个移动端库,可用于在移动设备、微控制器和其他边缘设备上部署模型。 假设要执行图像分类任务。首先决定任务的模型。是要创建自定义模型;或者使用预训练模型,如 InceptionNet、MobileNet、NASNetLarge 等。又或者在预训练模型上应用迁…

【问题记录】解决vite多页应用路由改用history之后本地刷新404问题

当前包的版本信息: "vue": "^2.7.14", "vue-router": "^3.6.5" "vite": "^3.0.7", 首先,修改路由模式 首先,将之前多页项目中的某个页面路由模式改用 history ,…

C++服务器框架开发4——日志系统logger/.cpp与.cc

该专栏记录了在学习一个开发项目的过程中遇到的疑惑和问题。 其教学视频见:[C高级教程]从零开始开发服务器框架(sylar) 上一篇:C服务器框架开发3——协程与线程的简单理解/并发与并行 C服务器框架开发4——日志系统logger 目前进度.cpp与.cc 目前进度 …

ByConity与主流开源OLAP引擎(Clickhouse、Doris、Presto)性能对比分析

引言: 随着数据量和数据复杂性的不断增加,越来越多的企业开始使用OLAP(联机分析处理)引擎来处理大规模数据并提供即时分析结果。在选择OLAP引擎时,性能是一个非常重要的因素。 因此,本文将使用TPC-DS基准…

排序算法、HashMap原理以及单例模式

文章目录 1、二分查找2、冒泡排序3、选择排序4、插入排序5、希尔排序6、快速排序(面试写这个)7、ArrayList8、Iterator9、LinkedList10、HashMap10.1、基本数据结构底层数据结构,1.7和1.8有什么不同? 10.2、树化与退化为何要用红黑…

【LINUX】进程间信号

文章目录 前言铺垫信号 信号的产生1、终端按钮产生信号2、调用系统函数向进程发送信号3、软件条件产生信号4、硬件异常产生信号 信号的保存补充:位图数据结构信号的处理结语 前言 铺垫 1、日常中我们能经常感受到信号的存在:红灯停绿灯行、三更鸡鸣、妈…

60.网络训练中的超参调整策略—学习率调整2

4、inverse_time_decay inverse_time_decay(learning_rate, global_step, decay_steps, decay_rate,staircase=False, name=None)逆时衰减,这种方式和指数型类似。如图, 5、cosine_decay cosine_decay(learning_rate, global_step

K8s in Action 阅读笔记——【7】ConfigMaps and Secrets: configuring applications

K8s in Action 阅读笔记——【7】ConfigMaps and Secrets: configuring applications 7.1 Configuring containerized applications 在我们讨论如何将配置数据传递给在Kubernetes中运行的应用程序之前,让我们先看看通常如何配置容器化应用程序。 如果忽略了你可以…

002. java.lang.NumberFormatException: Infinite or NaN,怎么破?

你好,我是YourBatman:当我老了,也写代码;不为别的,只为爱好。 📚前言 如果你工作超5年,100%遇到过这个异常:java.lang.NumberFormatException: Infinite or NaN Infinite中文释义…

使用MockJS进行前端开发中的数据模拟

在前端开发中,有时我们需要在没有后端接口的情况下进行前端页面的开发和测试。这时,我们可以使用MockJS来模拟数据,以便进行开发和调试。MockJS是一个用于生成随机数据和拦截Ajax请求的JavaScript库,它能够帮助我们快速搭建起一个…

InVEST模型

学习目标: 1)采用InVEST模型,掌握产水(包括水源涵养)、碳存储(包括固碳)、土壤保持、水质(氮磷)、生境质量和热岛缓解等生态系统服务评估方法,开展人类活动影响、重大工…

MATLAB EXPO 2023会议记录|基于STM32的MATLAB电机控制方案

算法导出工作流视频:(99 封私信 / 82 条消息) Simulink 算法导出工作流 —— stm32电机控制示例(v2) - 知乎 (zhihu.com) Algorithm-Export Workflows for Custom Hardware 示例: Algorithm-Export Workflows for Custom Hardware - MATLAB & Simuli…

JavaScript拖拽API,ondragstart、ondragover、ondragenter、ondrop,使用详细(JavaScript常用原生拖拽API)

简述:JavaScript的拖拽api相必大家都不陌生,今天来分享下元素在拖动时触发的事件,顺便做下记录。 一、ondragstart事件 ondragstart事件在拖动元素时触发,通常用于设置拖动时的数据类型和数据。可以通过event.dataTransfer.setDa…

开发环境搭建-stm32CubeIDE进行标准库开发

stm32CubeIDE介绍 https://www.stmcu.com.cn/ecosystem/Cube/STM32CubeIDE stm32CubeIDE下载 点击上面的链接,登录即可下载。 搭建demo工程 新建工作空间 创建一个工程 选择芯片-STM32F103C8T6 点击“Next” 点击“Finish ” 添加标准库到项目工程文件目录下 配…

SM国密算法(二)-- OpenSSL库中分离算法

一、OpenSSL简介: OpenSSL 是用于传输层安全性 (TLS) 和安全套接字层 (SSL) 协议的一个强大、商业级和功能齐全的工具包。它也是一个通用的密码学库,包含有RSA、SM4、DES、AES等诸多加密算法。 OpenSSL GitHub地址 二、移植过程 1. 文件目录 下载在…

除蚂蚁文件数据恢复大师之外,还有哪些相似的软件?

数据丢失是一件常见的事情,许多人都会遇到这样的问题。为了解决这个问题,出现了许多数据恢复软件,其中包含蚂蚁文件数据恢复大师。但是,除了蚂蚁文件数据恢复大师之外,还有哪些类似的软件呢?本文为您整理了…

笔试强训总结3

作者:爱塔居 专栏:笔试强训 作者简介:大三学生,希望能同大家一起进步! 1.以下代码运行输出的是 public class Person{ private String name "Person"; int age0; } public class Child extends Person{ p…

selenium clear()无效的解决办法

做自动化时,在往输入框中send_keys前往往需要先清空一下这个输入框里的内容,避免输入框原本有内容或默认值,导致最终输入的结果不是预期的内容。 清空内容我们一般会用clear()方法 import time from selenium import webdriverdriver webd…

如何使用Python操作Excel文件?看这篇博客就够了!

前言 如何使用Python操作Excel文件?看这篇博客就够了! 在工作中,我们经常需要处理和分析数据。而Excel作为一种广泛使用的数据分析工具,被很多人所熟知。但是,对于一些非技术背景的用户来说,如何操作Exce…