天天看點

【數字信号去噪】基于matlab遺傳算法優化變分模态分解VMD數字信号去噪(目标函數為樣本熵)【含Matlab源碼 1982期】

一、遺傳算法優化VMD參數簡介

1 變分模态分解

VMD分解算法實際上是一個變分問題的求解過程, 它是将原信号分解為K個模态函數uk (t) , 使得每個模态函數的估計帶寬之和最小, 則相應的限制變分模型可表達為

【數字信号去噪】基于matlab遺傳算法優化變分模态分解VMD數字信号去噪(目标函數為樣本熵)【含Matlab源碼 1982期】

式中:{uk}={u1, …, uk}表示的是分解得到的K個子模态;{wk}={w1, …, wk}表示的是各分量的頻率中心。為了将上述限制性變分問題轉變為非限制性變分問題, 引入二次懲罰項因子α和拉格朗日乘子λ (t) , 則擴充的拉格朗日表達式為

【數字信号去噪】基于matlab遺傳算法優化變分模态分解VMD數字信号去噪(目标函數為樣本熵)【含Matlab源碼 1982期】

式中:α為懲罰參數;λ為拉格朗日乘子。采用乘法算子交替方向法 (Alternate direction method of multipliers, ADMM) [10]解決變分問題, 通過疊代更新ukn+1、wkn+1以及λn+1得到上述函數的最優解。ukn+1的取值問題可表達為

【數字信号去噪】基于matlab遺傳算法優化變分模态分解VMD數字信号去噪(目标函數為樣本熵)【含Matlab源碼 1982期】

利用Parseval傅立葉等距變換, 上式可變為

【數字信号去噪】基于matlab遺傳算法優化變分模态分解VMD數字信号去噪(目标函數為樣本熵)【含Matlab源碼 1982期】

2) 根據式 (4) 、式 (5) 在頻域内更新uk、wk;

  1. 更新λ, 其中
  2. 【數字信号去噪】基于matlab遺傳算法優化變分模态分解VMD數字信号去噪(目标函數為樣本熵)【含Matlab源碼 1982期】
  3. 2 遺傳算法VMD參數優化

    利用VMD算法進行信号分解時需要設定參數, 研究發現在進行分解時, 模态數K和懲罰參數α對分解的結果影響較大。實際擷取的信号是複雜多變的, 模态數K和懲罰參數α難以确定, 是以選擇合适的參數組合是利用VMD算法進行信号分解的關鍵。

如果設定一個參數不變, 優化另一個參數, 通過這種方式讨論對去噪效果的影響, 就忽略了兩個參數互相作用的結果, 陷入局部優化的僵局。遺傳算法 (GA) 是一種智能優化算法, 具有較強的全局非線性優化能力[12], 是以引入遺傳算法, 借助于适應度函數對目标函數在解空間進行全局并行随機搜尋, 快速準确地擷取優化參數。

利用遺傳算法求解優化問題時, 主要需要經過6個步驟, 編碼、初始群體生成、适應度值評價檢測、選擇、交叉、變異, 使得種群進化為新一代更好适應性的種群。圖1是建立适應度函數的優化結果。

二、部分源代碼

%% 基于遺傳算法(genetic algorithm, GA))優化變分模态分解(variational mode decomposition,VMD)參數

clc
clear
close all
addpath('toolf')
warning off

% 讀取資料
[file,path,indx]  = uigetfile({'*.xlsx';'*.xls';'*.txt';'*.*'},'File Selector');
if indx == 1||indx==2
    data=xlsread(strcat(path, file));
elseif indx == 3
    data=load(strcat(path, file));
else
    disp('請選擇資料集進行實驗');
    return;
end

%采樣頻率
fs=12800;
% 讀取前1000長度的信号
len=1000;
s=data(1:len);
% 采樣時間
t = (0:len-1)/fs;

%% 設定遺傳算法參數
popsize =8;   % 種群大小
iter =30;   % 最大疊代次數
dim = 2;   % 變量個數
lb = [100 3];   % alpha範圍 K範圍   下限
ub = [2000 7];  % 上限
pc=0.8;       %交叉機率,0和1之間
pm=0.2;      %變異機率,0和1之間

%% 遺傳算法GA優化VMD參數

tic ,  % 開始計時

GA_VMD(popsize,iter,dim,lb,ub,pc,pm,0);  % 0表示不儲存IMF,1,導出IMF并儲存

toc,  % 結束計時
function ret = Cross(pcross, lenchrom, chrom, sizepop, bound)

    for i = 1:sizepop

        pick = rand(1, 2);

        while prod(pick) == 0
            pick = rand(1, 2);
        end

        index = ceil(pick .* sizepop);

        pick = rand;

        while pick == 0
            pick = rand;
        end

        if pick > pcross
            continue;
        end

        flag = 0;

        while flag == 0

            pick = rand;

            while pick == 0
                pick = rand;
            end

            pos = ceil(pick .* sum(lenchrom));
            pick = rand;
            v1 = chrom(index(1), pos);
            v2 = chrom(index(2), pos);
            chrom(index(1), pos) = pick * v2 + (1 - pick) * v1;
            chrom(index(2), pos) = pick * v1 + (1 - pick) * v2;
            flag1 = test(lenchrom, bound, chrom(index(1), :));
            flag2 = test(lenchrom, bound, chrom(index(2), :));

            if flag1 * flag2 == 0
                flag = 0;
            else
                flag = 1;
            end

        end

    end

    ret = chrom;
end
function ret = Mutation(pmutation, lenchrom, chrom, sizepop, pop, bound)

    for i = 1:sizepop

        pick = rand;

        while pick == 0
            pick = rand;
        end

        index = ceil(pick * sizepop);

        pick = rand;

        if pick > pmutation
            continue;
        end

        flag = 0;

        while flag == 0

            pick = rand;

            while pick == 0
                pick = rand;
            end

            pos = ceil(pick * sum(lenchrom));
            v = chrom(i, pos);
            v1 = v - bound(pos, 1);
            v2 = bound(pos, 2) - v;
            pick = rand;

            if pick > 0.5
                delta = v2 * (1 - pick^((1 - pop(1) / pop(2))^2));
                chrom(i, pos) = v + delta;
            else
                delta = v1 * (1 - pick^((1 - pop(1) / pop(2))^2));
                chrom(i, pos) = v - delta;
            end

            flag = test(lenchrom, bound, chrom(i, :));
        end

    end

    ret = chrom;      

三、運作結果

【數字信号去噪】基于matlab遺傳算法優化變分模态分解VMD數字信号去噪(目标函數為樣本熵)【含Matlab源碼 1982期】
【數字信号去噪】基于matlab遺傳算法優化變分模态分解VMD數字信号去噪(目标函數為樣本熵)【含Matlab源碼 1982期】
【數字信号去噪】基于matlab遺傳算法優化變分模态分解VMD數字信号去噪(目标函數為樣本熵)【含Matlab源碼 1982期】

四、matlab版本及參考文獻

繼續閱讀