|
本帖最后由 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
|