1 模型
1.1 萤火虫算法


1.2 lms自适应滤波


2 部分代码
clc
clear all
close all;;
g = 10; % 统计仿真次数为g
N = 1024; % 输入信号采样点数N
M = 128; % 时域抽头LMS算法滤波器阶数
A = 2;
tt = 1:N;
ss = A*sin(0.05*pi*tt); % 输入单频信号s
xn = awgn(ss,15); % 加入均值为零的高斯白噪声,信噪比为3dB
figure(1);
plot(tt,real(ss),'b-'); % 信号s时域波形
hold on
plot(tt,real(xn),'r-'); % 信号s 时域波形
legend('信号s时域波形','信号s加噪声后的时域波形');
xlabel('n');
ylabel('s');
%% 萤火虫算法优化svslms
d=2;
Lb=[0 1]; % 萤火虫活动范围的下限
Ub=[0.1 10]; % 萤火虫活动范围的上限
u0=Lb+(Ub-Lb).*rand(1,d);%u0相当于cs的nest(i,:)
n=30;
MaxGeneration=100; %MaxGeneration
alpha=0.5;
betamin=0.4;
gamma=1;
NumEval=n*MaxGeneration;
% M = d; % 时域抽头LMS算法滤波器阶数
% Calcualte dimension
% Initial values of an array
zn=ones(n,1)*100;
fitness_min=100;
% ------------------------------------------------
% generating the initial locations of n fireflies
[ns,Lightn]=init_ffa(n,d,Lb,Ub,u0); %
% Iterations or pseudo time marching
for k=1:MaxGeneration, %%%%% start iterations
k
% This line of reducing alpha is optional
alpha=alpha_new(alpha,MaxGeneration);
% Evaluate new solutions (for all n fireflies)
for i=1:n,
[zn(i),YY(i,:)]=gso_svslms2(g,N,M,ns(i,:),ss,xn);
Lightn(i)=zn(i);
end
% Display the shape of the objective function
% Ranking fireflies by their light intensity/objectives
[Lightn,Index]=sort(zn);
ns_tmp=ns;
for i=1:n,
ns(i,:)=ns_tmp(Index(i),:);
end
%% Find the current best
nso=ns;
Lighto=Lightn;
nbest=ns(1,:);
Lightbest=Lightn(1);
if fitness_min>min(Lightn)
[ yy(k),indx] = min(Lightn);
ss_min=YY(indx,:);
fitness_min=Lightbest;
else
yy(k) = fitness_min;
end
% For output only
fbest=Lightbest;
% Move all fireflies to the better locations
[ns]=ffa_move(n,d,ns,Lightn,nso,Lighto,nbest,Lightbest,alpha,betamin,gamma,Lb,Ub);
end %%%%% end of iterations
%% svslms
pp_svslms = zeros(g,N-M); % 将每次独立循环的误差结果存于矩阵pp中,以便后面对其平均
% u = 0.0002;
b=0.002;
a=20;
for q = 1:g
y_svslms = zeros(1,N); % 设置初值 输出信号y
y_svslms(1:M) = xn(1:M); % 将输入信号xn的前k个值作为输出y的前k个值
w_svslms = zeros(1,M); % 设置抽头加权初值
e_svslms = zeros(1,N); % 误差信号
for i = (M+1):N % 用LMS算法迭代滤波
XN_svslms = xn((i-M+1):(i));
y_svslms(i) = w_svslms*XN_svslms';
e_svslms(i) = ss(i)-y_svslms(i);
u_svslms(i)=b*(1/(1+exp(-a*abs((e_svslms(i)))))-0.5);
w_svslms=w_svslms+2*u_svslms(i)*e_svslms(i)*XN_svslms; %更新滤波器权值系数
end
pp_svslms(q,:) = (e_svslms(M+1:N)).^2;
end
%% 结果
figure(2);
plot(yy, 'r', 'linewidth', 2)
xlabel ('迭代次数'); ylabel( '函数值');
title( '萤火虫优化自适应lms滤波迭代曲线');
figure(3);
plot(tt,ss, 'linewidth',2); % 信号s时域波形
hold on;
plot(tt,y_svslms,'g-', 'linewidth', 2)
plot(tt,ss_min,'r-', 'linewidth', 2); % 信号s 时域波形
legend('信号s时域波形','svslms输出时域波形','萤火虫算法优化svslms算法后输出时域波形');
xlabel('n');
ylabel('s');
3 仿真结果



4 参考文献
[1]杜太行, 李静秋, 江春冬. 改进萤火虫算法优化粒子滤波的信号源定位[J]. 中国测试, 2017(11):96-101.









