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.