⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gamp.m

📁 基于遗传算法改进的稀疏分解算法
💻 M
字号:
clc
clear
load  signal_library;
%此程序用来分解样本信号
iterative_number  =   10;  
swatch_parameter   =   zeros(10,5*iterative_number);
for  Num_swatch  =  0:9
    eval(  ['bat      =   signal_swatch' int2str(Num_swatch) ';' ]);  
    
           %生成的原子个数
    [a,N]             =   size(bat');
    % 进行稀疏分解
    signal            =   bat';
    signal_reconstruct=   ones(1,N);
    % 稀疏分解基本参数设定
    a_base            =   2;
    j_min             =   0;
    j_max             =   ceil(log2(N));
    u_base            =   1/2;
    p_min             =   0;
    v_base            =   pi;
    k_min             =   0;
    w_base            =   pi/6;
    i_min             =   0;
    i_max             =   12;
    %参数列表:a_base j_min j_max u_base p_min v_base k_min w_base i_min i_max

    %重构信号与残差信号初始化
    signal_reconstruct=   (1/N)*sum(signal)*signal_reconstruct;
    signal_r          =   signal           -       signal_reconstruct;

    %确定在不同s的取值下,原子能量分布的范围,这是遗传算法中的一个重要参数 
    s_r=zeros(1,j_max+1);

    for n=j_min:j_max
        t             =   0:N-1;
        scale         =   a_base^n;
        t             =   t/scale;
        g             =   (1/sqrt(scale))*exp(-pi*t.*t);
        g             =   g/sqrt(sum(g.*g));
        number        =   0;
        for m=1:N
            if abs(g(m))>0.03
                number=number+1;
            end
        end
        s_r(n+1)=number;
    end
   
    for n=1:iterative_number
        % 遗传算法的子程序
        [proj,scale,translation,freq,phase]               =   genetic_algorithm(signal_r,N,a_base,j_min,j_max,u_base,p_min,v_base,k_min,w_base,i_min,i_max,s_r);
        swatch_parameter(Num_swatch+1,(n-1)*5+1:n*5)                 =   [proj,scale,translation,freq,phase];
        %利用选择的最优原子重构信号
        t       =       0:N-1;
        t       =       (t-translation)/scale;
        g       =       (1/sqrt(scale))*exp(-pi*t.*t).*cos(freq*t+phase);
        g       =       g/sqrt(sum(g.*g));
        signal_reconstruct       =        signal_reconstruct+proj*g;
        signal_r                 =        signal_r-proj*g;
    end
    %将重构信号存入数据库中
    s           =       ['re_signal_swatch' int2str(Num_swatch) '= signal_reconstruct;'];
    eval(s);
end

%此程序用来分解测试信号
 
test_parameter     =     zeros(100,5*iterative_number);
for  Num_test  =  0:99
    eval(  ['bat      =   signal_test' int2str(Num_test) ';' ]);  

    %生成的原子个数
    [a,N]             =   size(bat');
    % 进行稀疏分解
    signal            =   bat';
    signal_reconstruct=   ones(1,N);
    % 稀疏分解基本参数设定
    a_base            =   2;
    j_min             =   0;
    j_max             =   ceil(log2(N));
    u_base            =   1/2;
    p_min             =   0;
    v_base            =   pi;
    k_min             =   0;
    w_base            =   pi/6;
    i_min             =   0;
    i_max             =   12;
    %参数列表:a_base j_min j_max u_base p_min v_base k_min w_base i_min i_max

    %重构信号与残差信号初始化
    signal_reconstruct=   (1/N)*sum(signal)*signal_reconstruct;
    signal_r          =   signal           -       signal_reconstruct;

    %确定在不同s的取值下,原子能量分布的范围,这是遗传算法中的一个重要参数 
    s_r=zeros(1,j_max+1);

    for n=j_min:j_max
        t             =   0:N-1;
        scale         =   a_base^n;
        t             =   t/scale;
        g             =   (1/sqrt(scale))*exp(-pi*t.*t);
        g             =   g/sqrt(sum(g.*g));
        number        =   0;
        for m=1:N
            if abs(g(m))>0.03
                number=number+1;
            end
        end
        s_r(n+1)=number;
    end
   
    for n=1:iterative_number
        % 遗传算法的子程序
        [proj,scale,translation,freq,phase]             =  genetic_algorithm(signal_r,N,a_base,j_min,j_max,u_base,p_min,v_base,k_min,w_base,i_min,i_max,s_r);
        test_parameter(Num_test+1,(n-1)*5+1:n*5)        =  [proj,scale,translation,freq,phase];
        %利用选择的最优原子重构信号
        t       =       0:N-1;
        t       =       (t-translation)/scale;
        g       =       (1/sqrt(scale))*exp(-pi*t.*t).*cos(freq*t+phase);
        g       =       g/sqrt(sum(g.*g));
        signal_reconstruct       =        signal_reconstruct+proj*g;
        signal_r                 =        signal_r-proj*g;
    end
    %将重构信号存入数据库中
    s           =       ['re_signal_test' int2str(Num_test) '= signal_reconstruct;'];
    eval(s);
end

%存储重构数据
save  reconstruct_library

















⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -