52matlab技术网站,matlab教程,matlab安装教程,matlab下载

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 4581|回复: 0
打印 上一主题 下一主题

时域LMS和频域LMS算法比较

[复制链接]

123

主题

207

帖子

2994

积分

版主

Rank: 7Rank: 7Rank: 7

积分
2994
跳转到指定楼层
楼主
发表于 2018-4-28 16:50:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 matlab的旋律 于 2018-5-5 16:02 编辑

       LMS频域实现中, 将参考信号分割成N长(自适应滤波器的阶数)的块, 权系数的更新每N个样点进行一次, 而每次的更新是由N个误差信号样点累加结果控制的, 这既保证了与时域LMS算法有相同的收敛速度, 同时可以利用快速技术, 用序列的循环卷积来计算线性卷积, 从而大幅度地减少运算量。
      对每N点的输入序列,FLMS算法需要5个2*N点的FFT(包含IFFT)计算和2个2*N点的复数相乘。每个N点需要N/2*log2(N)个复数乘法, 对于实输人序列由于的对称特性, 以又可以将运算量减半。对于时域的LMS算法, 共需要个2*N^2实数乘法。每个复数乘法按4个实数乘法计算, 则FLMS的运算量与LMS的运算量的比值为:
                                                                                                                      f(N) = (5*log2(N) + 13) / N
下面直接给出LMS和FLMS的Matlab程序。
lms滤波函数:

function [h,y,e] = lmsFunc(x,d,u,N)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%lms滤波函数  edit by lxy /2017.04.28  /www.52matlab.com
%input x: 信号序列
%input d: 期望信号序列
%input u: 步长
%input N: 滤波器阶数
%output h: 估计的fir滤波器系数
%output y:  滤波后输出信号
%output e:  误差序列
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

M = length(x);
y = zeros(1,M);
h = zeros(1,N);
e = zeros(1,M);

for k = N:M
    procx = x(k:-1:k-N+1);
    y(k) = h*procx';
    e(k) = d(k) - y(k);
    h = h + 2*u*e(k)*procx;
end

flms滤波函数

function [h,y,e] = flmsFunc(x,d,u,N)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%flms滤波函数  edit by lxy /2017.04.28  /www.52matlab.com
%input x: 信号序列
%input d: 期望信号序列
%input u: 步长
%input N: 滤波器阶数
%output h: 估计的fir滤波器系数
%output y:  滤波后输出信号
%output e:  误差序列
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

M = length(x);
y = zeros(1,M);
h = zeros(1,N);
e = zeros(1,M);

for k = 1:fix(M/N) - 1
    procx = fft(x((k - 1)*N + 1: (k + 1)*N));
    H = fft([h,zeros(1,N)]);
    prcox1 = real(ifft(procx.*H));
    y(k*N + 1: (k + 1)*N) = prcox1(N + 1:2*N);
    e(k*N + 1: (k + 1)*N) = d(k*N + 1: (k + 1)*N) - y(k*N + 1: (k + 1)*N);
    E = fft([zeros(1,N),e(k*N + 1: (k + 1)*N)]);
    prcox2 = real(ifft(E.*conj(procx)));
    v = prcox2(1:N);
    h = h + 2*u*v;
end

使用脚本程序如下:

clear
close all
clc
dbstop if error

s = sin(0:0.1:100);
b = fir1(32,0.3);%生成fir滤波器
x  = awgn(s,5);%加白噪声
d = filter(b,1,s);%实际应用中的期望信号

u = 0.001;
N = 32;

[fh,fy,fe] = flmsFunc(x,d,u,N);%lms滤波
[th,ty,te] = lmsFunc(x,d,u,N);%flms滤波
subplot(3,1,1)
plot(x,'-k')
box on
title('原始信号')
axis tight
subplot(3,1,2)
plot(d,'-g')
box on
title('期望信号')
axis tight
subplot(3,1,3)
hold on
plot(ty,'-r')
plot(fy,'-g')
box on
legend('lms滤波信号','flms滤波信号')
title('lms与flms去噪信号')
hold off
axis tight

      从运行结果图以及算法数学推导过程可以得到,FLMS算法在收敛的情况下, 与LMS算法的收敛速度相近, 但在起始阶段的误差较大。FLMS算法在权数较大时其具有运算量较小的优点, 但是由于其对权数的调整是个样点累加的结果, 每次的调整量很大, 尤其在权向量的初始值为全0的情况下, 若步长选取过大, 特别容易导致算法的发散。在权数选取较大的实际应用中应综合LMS算法收敛平稳和FLMS算法计算量小的特点,在收敛算法的起始阶段考虑使用LMS算法, 而在算法收敛平稳时, 考虑用FLMS算法来减少运算量。可以设置一个误差平均能量的阈值, 当误差平均能量超过该阈值时用LMS算法而在低于该阈值时,可以考虑选用FLMS算法用较少的运算量来进行维持平稳状态。程序运行结果如下图所示:


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|52matlab技术网站 ( 粤ICP备14005920号-5 )

GMT+8, 2024-4-20 20:48 , Processed in 0.083325 second(s), 20 queries .

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表