0
点赞
收藏
分享

微信扫一扫

【信号去噪】基于萤火虫算法优化svslms实现信号去噪matlab源码

RockYoungTalk 2022-01-05 阅读 97

 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.

博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,有科研问题可私信交流。

举报

相关推荐

0 条评论