浅谈自适应滤波器---(快速RLS算法)

article/2025/10/9 20:47:56

在上一篇博客中(浅谈自适应滤波器)我给大家介绍了关于自适应滤波器的一些入门级的知识,并分析了常规RLS算法单次迭代的计算量级为O[N2],当阶数N增大时相应的计算量显著增大,为了将计算量级降低到O[N],人们提出了很多快速的RLS算法,其中快速横向递归最小二乘算法(FTRLS)最具有吸引力,得到了广泛的应用。
本次将为大家介绍该算法的由来并给出相应的算法,在推导FTRLS算法时,需要同时求解前向和后向线性预测问题,以及另外两个横向滤波器:联合过程估计器和辅助滤波器;实际上快速横向RLS算法可以视为这四个并行工作的滤波器,它们之间互相交换参量,相互作用最后得到RLS的快速实现方法。
FTRLS算法信号流图
该图显示了这四个滤波器的关系。


向前预测关系式

对于一个N阶的预测器,其瞬时后验前向预测误差可以表示为
1
后验和先验前向预测误差之间的关系有下式给出(所谓的先验是指利用k-1时刻的滤波系数矢量估计k时刻的输出,而后验是指利用k时刻的滤波系数矢量估计k时刻的输出)
2
其中gamma(k-1,N)称为k-1时刻N阶的转换因子(表示公式中的希腊字母“gamma”,下同)。
最小加权最小二乘误差的时间更新方程如下
3
还有转换因子的更新方程
4
接下来就是前向预测抽头系数向量更新方程
5
其中Phi(k,N+1)的更新方程为
6

后向预测关系式

同样后验和先验的后向预测误差关系表达式为
7
最小加权最小二乘误差的时间更新方程如下
8
后向预测抽头系数向量更新方程
9
其中Phi(k,N)的更新方程为
10
则Phi(k,N+1)中的最后一个元素可以表示为
11
最后就是关于gamma(k,N)更新方程
12

联合过程估计

该过程实现了输入信号与期望信号的联合估计,其先验误差可写成
13
其先验误差与后验误差的关系为
14
联合过程估计其抽头系数的时间更新关系式为
15
至此算法所需的计算表达式已全部给出,下面给出的是经过整理完整的算法描述。
16


Matlab仿真

首先给出m代码

%FTF快速横向滤波算法
clc;
clear all;
close all;
%************************生成仿真信号**************************************
Fs = 10000;                                                     %设置采样频率
t = 0:1/Fs:3.5;  
t = t';
Size_t = size(t,1);
F1 = 2;
F2 = 10;
F3 = 20;
F4 = 1000;
Signal = sin(2*pi*F1*t) + 0.5*sin(2*pi*F2*t) + 0.25*sin(2*pi*F3*t); %生成信号
noise_amp = 1;                                           %定义噪声的标准差
noise1 = noise_amp*randn(Size_t,1);                        %生成高斯白噪声
noise2 = noise_amp*randn(Size_t,1);
noise3 = 5*sin(2*pi*F4*t);noise = noise2;
Signal_noise = Signal + 0.2*noise;                           %加入高斯白噪声
Signal_noise(2:end) = Signal_noise(2:end) + 0.15*noise(1:end-1);
Signal_noise(3:end) = Signal_noise(3:end) + 0.1*noise(1:end-2);subplot(2,1,1);
plot(t,Signal);
title('原始信号');
subplot(2,1,2);
plot(t,Signal_noise);
title('加入干扰噪声的信号');
%*************************************************************************
N = 3;                     %定义FIR滤波器阶数
Signal_Len = Size_t;       %定义信号数据的个数
lambda = 1;                %定义遗忘因子
delta = 0.01;    
y_out = zeros(Signal_Len,1);
Eta_out = zeros(Signal_Len,1);
w_out = zeros(Signal_Len,N);
for i = 1:Signal_Lenif i==1w_f_last = zeros(N,1);w_b_last = zeros(N,1);w_last = zeros(N,1);Phi_last = zeros(N,1);gamma_last = 1;xi_f_last = delta;xi_b_last = delta;x_N_1 = zeros(N+1,1);end%输入数据if i<= Nx_N_1(1:i) = noise(i:-1:1,1);else        x_N_1 = noise(i:-1:(i-N),1);end    d = Signal_noise(i);%算法主体e_f = x_N_1' * [1;-w_f_last];                                          %(1)epsilon_f = e_f * gamma_last;                                          %(2)xi_f = lambda * xi_f_last + e_f * epsilon_f;                           %(3)w_f = w_f_last + Phi_last * epsilon_f;                                 %(4)Phi_N_1 = [0;Phi_last] + e_f/(lambda * xi_f_last)*[1;-w_f_last];       %(5)Phi_N_1_N_1 = Phi_N_1(end);gamma_N_1 = (lambda * xi_f_last)/xi_f * gamma_last;                    %(6)e_b = lambda * xi_b_last * Phi_N_1_N_1;                                %(7)gamma = 1/(1/gamma_N_1 - Phi_N_1_N_1*e_b);                             %(8)epsilon_b = e_b * gamma;                                               %(9)xi_b = lambda * xi_b_last + epsilon_b * e_b;                           %(10)Phi = Phi_N_1 - Phi_N_1_N_1 * [-w_b_last;1];                           %(11)Phi = Phi(1:end-1);                                                    w_b = w_b_last + Phi * epsilon_b;                                      %(12)x = x_N_1(1:N);y = w_last'* x;                                                  e = d - y;                                                             %(13)epsilon = e * gamma;                                                   %(14)w = w_last + Phi * epsilon;                                            %(15)%变量更替xi_f_last = xi_f;w_f_last = w_f;gamma_last = gamma;xi_b_last = xi_b;Phi_last = Phi;w_b_last = w_b;w_last = w;%滤波结果存储y_out(i) = y;Eta_out(i) = e;w_out(i,:) = w';
end
figure;
subplot(2,1,1);
plot(y_out);
title('滤波器输出');
subplot(2,1,2);
plot(Eta_out);
title('输出误差');figure;
plot(t(1:Signal_Len),w_out(:,1),'r',t(1:Signal_Len),w_out(:,fix(N/2)+1),'b',t(1:Signal_Len),w_out(:,N),'y');
title('自适应滤波器系数');

运行一下得到如下的效果图
FTRLS_1
FTRLS_2
FTRLS_3
对照我在上一篇博客里给出的常规RLS结果,可以发现一个直观的结果就是滤波的效果比常规的稍微差一些,但比LMS的还是要好很多,同时单次迭代的计算量和LMS的相当,事实上可以通过改变代码里面的一些参数滤波的效果又会得到进一步的改善,因为此快速算法是在假定运算精度无穷高的情况下得到的,而在Matlab仿真时计算的精度是有限的(即使是double型,也是有限的)因此会与理论的有偏差,这些只有通过实验才能确切的感受到。


到此为止,我们就可以利用上面我给大家介绍的算法做一些比较高大上的项目了,我最近一直在思考怎么来把这些理论运用到实际的工程当中,想来想去还真的想出了一个比较靠谱的点子,这要得益于本人本科时在科创方面的豪投入,我手里正好有一块闲置很久的TMS320F2812开发板,最关键的是上面有现成的ADC输入和DAC输出接口,我准备利用它来做一个能够消除声学回声的扩音器系统。这实际上就是典型应用中的信号增强部分,我在后面的博客中会对这个项目进行跟进,向大家展示自适应滤波器的强大魅力。


http://chatgpt.dhexx.cn/article/N47ZkG6Z.shtml

相关文章

图像处理自适应滤波

图像处理基础(2)&#xff1a;自适应中值滤波器(基于OpenCV实现) 标签&#xff1a; opencv滤波器 2017-02-08 19:44 986人阅读 评论(0) 收藏 举报 分类&#xff1a; DIP&#xff08;8&#xff09; 版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载…

自适应滤波器及其应用 - 自适应噪声抵消器

传统IIR和FIR滤波器在处理输入信号的过程中滤波器参数固定&#xff0c;当环境发生变化时&#xff0c;滤波器无法实现原先设定的目标。自适应滤波器根据当前自身的状态和环境调整滤波器权系数。 1 自适应滤波器理论 其中&#xff0c;x(n)是输入信号&#xff0c;y(n)是输出信号&…

自适应数字滤波器

文章目录 前言一、自适应滤波器的特点和构成二、最陡下降法三、最小均方算法(LMS)总结 前言 本文的主要内容是自适应数字滤波器的介绍&#xff0c;包含其特点与构成、最陡下降法、最小均方算法以及最小二乘算法等内容。 一、自适应滤波器的特点和构成 自适应滤波器的特点&…

浅谈自适应滤波器---(自适应陷波器)

陷波器顾名思义就是对特定频率的信号有着很强的衰减的滤波器&#xff0c;也即阻带带宽极窄的带阻滤波器。在传统的数字陷波器设计中&#xff0c;为了能使某一频率信号得到足够大的衰减&#xff0c;通常的做法就是把阶数选的足够高来达到很大的衰减&#xff1b;但同时计算量也变…

自适应滤波器及LMS自适应算法的理解

分享一篇以前写现代信号处理的课程论文。 ————————————————————

自适应中值滤波器和自适应局部(均值)滤波器的设计 python+matlab各实现

要求是&#xff1a;自适应中值滤波器和自适应均值滤波器的设计&#xff0c;分别使用python和matlab去实现 一.原理 1.自适应中值滤波器 2.自适应局部滤波器&#xff0c;也叫自适应均值滤波器 二.设计流程 1.自适应中值滤波器 ①生成椒盐噪声 利用rand()函数生成[0,1]的随…

自适应滤波去噪

自适应滤波器具有在未知环境下良好的运作并跟踪输入统计量随时间变化的能力。尽管对于不同的应用有不同的实现结构&#xff0c;但是他们都有一个基本的特征&#xff1a;输入向量X(n)和期望响应d(n)被用来计算估计误差e(n)&#xff0c;即e(n)d(n)-X(n)&#xff0c;并利用此误差信…

自适应滤波(LMS,RLS)

1.背景及相关知识介绍 自适应滤波存在于信号处理、控制、图像处理等许多不同领域&#xff0c;它是一种智能更有针对性的滤波方法&#xff0c;通常用于去噪。 图中x&#xff08;j&#xff09;表示 j 时刻的输入信号值&#xff0c;y&#xff08;j&#xff09;表示 j 时刻的输出信…

自适应滤波

自适应阵列处理是一种空间滤波技术&#xff0c;它包含空间阵列和自通应处理两个部分。根据空时等效性原理&#xff0c;从理论上来讲&#xff0c;时域的各种统计自适应信号处理技术均可应用于空域的自适应阵列处理 自适应滤波已在时域处理中广为应用&#xff0c;其实现可以来用…

matlab编程实现自适应均值滤波和自适应中值滤波

matlab编程实现自适应滤波器 一、自适应均值滤波器1. 原理部分&#xff1a;2. 程序代码3. 结果对比 二、自适应中值滤波1. 原理部分2.程序代码3. 结果对比 一、自适应均值滤波器 1. 原理部分&#xff1a; 加入噪声&#xff1a; 原理&#xff1a; 将图片灰度化&#xff0c;然后…

自适应滤波器之横向滤波器

本文对横向滤波器作以介绍&#xff0c;如有表述不当之处欢迎批评指正。欢迎任何形式的转载&#xff0c;但请务必注明出处。 目录 1. 横向滤波器1.1. 概念1.2. 举例 2. 参考文献 1. 横向滤波器 1.1. 概念 横向滤波器&#xff08;transversal filter&#xff09;&#xff0c;也…

自适应中值滤波及实现

前言 无意中看到了一篇比较老的论文&#xff0c;Adaptive median filters: new algorithms and results。感兴趣的可以下载下来看看。主要就是提出了一种自适应中值滤波算法&#xff0c;这个算法是很经典的中值滤波算法的改进版本&#xff0c;自动选择滤波器的大小&#xff0c…

浅谈自适应滤波器

在通常的滤波场合中&#xff0c;从频域的角度进行滤波&#xff0c;其相关的理论已经相当的成熟&#xff0c;只要给出相应的设计指标就可以很方便的设计出满足要求的滤波器。然而在更一般的情况下&#xff0c;人们所需要的滤波器工作的环境是时变的&#xff0c;这就导致事先已经…

自适应滤波原理

在网上&#xff0c;看到一篇不错的自适应滤波原理讲解的文章&#xff0c;原文网址为&#xff1a;自适应滤波原理简介 全文包括&#xff1a; 1. 自适应滤波器简介 2. 自适应干扰抵消原理 3. 自适应滤波原理 4. 最小均方&#xff08;LMS&#xff09;算法 5. Matlab实现 一、自适…

自适应滤波算法综述

我要讲的几种方法 绪论自适应滤波的基本原理自适应滤波算法自适应滤波算法种类最小均方误差算法&#xff08;LMS&#xff09;递推最小二乘算法&#xff08;RLS&#xff09;变换域自适应滤波算法仿射投影算法其他 自适应滤波算法性能评价 自适应滤波的Matlab仿真正弦信号加噪的L…

Java反射机制你还不会?那你怎么看Spring源码

文章目录 1.Java代码在计算机中经历的阶段&#xff1a;三个阶段2.Java识别类和对象信息的两种方式3.什么是反射4.获取Class对象的方式5.Class对象的功能6.通过反射操作类中的成员变量、构造函数、方法7.案例8.反射的优缺点 1.Java代码在计算机中经历的阶段&#xff1a;三个阶段…

Java 反射 理解

Java 反射 定义 Java的反射&#xff08;reflection&#xff09;机制是指在程序的运行状态中&#xff0c;可以构造任意一个类的对象&#xff0c;可以了解任意一个对象所属的类&#xff0c;可以了解任意一个类的成员变量和方法&#xff0c;可以调用任意一个对象的属性和方法。 简…

Java反射机制的原理和用途

看了好多关于Java反射机制的文章&#xff0c;大多都太过官方&#xff0c;消化起来比较稍显费劲&#xff0c;本篇&#xff0c;我会依据自己的理解去阐述什么是Java的反射机制&#xff0c;反射用在什么地方&#xff0c;以及怎么来使用&#xff1f; 开篇前&#xff0c;我们还是要了…

Java反射详解及作用

参考视频链接: 哔哩哔哩视频. 1. 反射概述 能够分析类能力的程序叫做反射(reflective)&#xff0c;对于任何一个Class类&#xff0c;反射可以在运行时直接得到这个类的全部成分&#xff0c;包括构造器&#xff0c;成员方法&#xff0c;成员变量。获得的构造器对象为Construct…

JAVA反射机制分析-------spring的通过反射创建bean实例对象以及属性注入的原理解析

JAVA反射机制 java反射机制是在运行状态中&#xff0c;对于任意一个类&#xff0c; 能够知道这个类的所有属性和方法&#xff1b;对于任意一个对象,都能够调用他的任意一个方法和属性。这种动态获取的信息以及动态调用对象的方法的功能称为JAVA语言的反射机制。 巧妙的利用ja…