浅谈自适应滤波器---(快速RLS算法)
在上一篇博客中(浅谈自适应滤波器)我给大家介绍了关于自适应滤波器的一些入门级的知识,并分析了常规RLS算法单次迭代的计算量级为O[N2],当阶数N增大时相应的计算量显著增大,为了将计算量级降低到O[N],人们提出了很多快速的RLS算法,其中快速横向递归最小二乘算法(FTRLS)最具有吸引力,得到了广泛的应用。
本次将为大家介绍该算法的由来并给出相应的算法,在推导FTRLS算法时,需要同时求解前向和后向线性预测问题,以及另外两个横向滤波器:联合过程估计器和辅助滤波器;实际上快速横向RLS算法可以视为这四个并行工作的滤波器,它们之间互相交换参量,相互作用最后得到RLS的快速实现方法。
该图显示了这四个滤波器的关系。
向前预测关系式
对于一个N阶的预测器,其瞬时后验前向预测误差可以表示为
后验和先验前向预测误差之间的关系有下式给出(所谓的先验是指利用k-1时刻的滤波系数矢量估计k时刻的输出,而后验是指利用k时刻的滤波系数矢量估计k时刻的输出)
其中gamma(k-1,N)称为k-1时刻N阶的转换因子(表示公式中的希腊字母“gamma”,下同)。
最小加权最小二乘误差的时间更新方程如下
还有转换因子的更新方程
接下来就是前向预测抽头系数向量更新方程
其中Phi(k,N+1)的更新方程为
后向预测关系式
同样后验和先验的后向预测误差关系表达式为
最小加权最小二乘误差的时间更新方程如下
后向预测抽头系数向量更新方程
其中Phi(k,N)的更新方程为
则Phi(k,N+1)中的最后一个元素可以表示为
最后就是关于gamma(k,N)更新方程
联合过程估计
该过程实现了输入信号与期望信号的联合估计,其先验误差可写成
其先验误差与后验误差的关系为
联合过程估计其抽头系数的时间更新关系式为
至此算法所需的计算表达式已全部给出,下面给出的是经过整理完整的算法描述。
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('自适应滤波器系数');
运行一下得到如下的效果图
对照我在上一篇博客里给出的常规RLS结果,可以发现一个直观的结果就是滤波的效果比常规的稍微差一些,但比LMS的还是要好很多,同时单次迭代的计算量和LMS的相当,事实上可以通过改变代码里面的一些参数滤波的效果又会得到进一步的改善,因为此快速算法是在假定运算精度无穷高的情况下得到的,而在Matlab仿真时计算的精度是有限的(即使是double型,也是有限的)因此会与理论的有偏差,这些只有通过实验才能确切的感受到。
到此为止,我们就可以利用上面我给大家介绍的算法做一些比较高大上的项目了,我最近一直在思考怎么来把这些理论运用到实际的工程当中,想来想去还真的想出了一个比较靠谱的点子,这要得益于本人本科时在科创方面的豪投入,我手里正好有一块闲置很久的TMS320F2812开发板,最关键的是上面有现成的ADC输入和DAC输出接口,我准备利用它来做一个能够消除声学回声的扩音器系统。这实际上就是典型应用中的信号增强部分,我在后面的博客中会对这个项目进行跟进,向大家展示自适应滤波器的强大魅力。
浅谈自适应滤波器---(快速RLS算法)相关推荐
- 自适应稳定快速RLS算法---(SFTRLS算法)
在上一篇的博客文章中(浅谈自适应滤波器-(快速RLS算法)),我给出了关于RLS的快速算法(简称FTRLS),但是它有一个缺点就是不够稳定,虽然我给出的例子里是稳定的,这主要是Matlab默认的计算精 ...
- 浅谈淘宝搜索排序算法【转自淘宝搜索博客】
浅谈淘宝搜索排序算法 作者:鬼脚七 前言: 目前网上有很多介绍淘宝搜索排序的文章,大多是淘宝卖家们根据自己经验摸索整理出来的,里面提到的很多办法也很正确.只是搜索排序算法不是固定 ...
- 浅谈网络爬虫中广度优先算法和代码实现
前几天给大家分享了网络爬虫中深度优先算法的介绍及其代码实现过程,没来得及上车的小伙伴们可以戳这篇文章--浅谈网络爬虫中深度优先算法和简单代码实现.今天小编给大家分享网络爬虫中广度优先算法的介绍及其代码 ...
- 面试浅谈之十大排序算法
面试浅谈之十大排序算法 HELLO,各位博友好,我是阿呆
- AI+教育 I 69天流利说APP学习浅谈自适应学习
本文梳理了目前"AI+教育"场景的典型产品,然后基于我在英语流利说APP学习的"懂你英语"."地道发音2.0"等课程的学习体验,对自适应学习 ...
- 浅谈 CAP 和 Paxos 共识算法
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:郑勰,腾讯 CSIG 网络产品部后台开发工程师 什么是 CA ...
- 硬货 | 浅谈 CAP 和 Paxos 共识算法
点击上方"朱小厮的博客",选择"设为星标" 后台回复"加群"获取公众号专属群聊入口 什么是 CAP 关于 CAP 理论的背景介绍已经很多,这 ...
- 浅谈LCA的几种算法
LCA,Lowest Common Ancestor,最近的公共祖先.在一棵树中对于两个节点u , v找出节点T,使得T同时为u,v的祖先.显然这样的T点肯定存在且有可能有多个,其中深度最大的那个点肯 ...
- 南宁网络推广浅谈能使文章快速收录的技巧有哪些?
在网站优化的过程中,南宁网络推广指出,对于很多站长们来说都是很在意文章的收录情况,因为文章的收录在一些方面也代表着网站的好与坏,那么有关能提升文章收录的技巧有哪些呢?下面南宁网络推广就带大家一起来了解 ...
最新文章
- 北大吴思教授:人脑视觉机制有望开启下一代深度神经网络
- 读写锁ReadWriteLock和缓存实例
- c语言中int*point 其中point是指针变量名,2012年计算机等级二级C语言章节习题及答案(9)...
- Pycharm安装PyQT5调用QTDesigner
- 30道经典SQL面试题讲解(1-10)
- VBS 访问WMI读取IP地址,并将其设置为静态IP
- JAVA Excel下载学习
- Matlab 四阶龙格库塔法求解二元常微分方程组
- 雨听 | iOS快捷指令之免费观看全网免费视频
- 如何获取服务器的 CA 证书?
- VUE 对@click的认识
- Oracle-log file sync等待事件分析
- python生成中文字符画_在线汉字转为字符字,字符字生成器,在线生成字符字
- 北京大学开设电子游戏选修课,火“爆”到没地方坐
- [C]qsort的使用和实现
- PTA单链表 - 20. 单值化(去重)
- Scrapy爬取网页并保存到数据库中
- php手写签名保存,PHP+JS实现PC端+移动端PDF手写签名合并
- Port Forwarding(端口转发)简单介绍
- 命令行pdf转jpg