• 【信号处理】Matlab实现希尔伯特-黄变换


    1 内容介绍

    1998年,Norden E. Huang(黄锷:中国台湾海洋学家)等人提出了经验模态分解方法,并引入了Hilbert谱的概念和Hilbert谱分析的方法,美国国家航空和宇航局(NASA)将这一方法命名为Hilbert-Huang Transform,简称HHT,即希尔伯特-黄变换。

    HHT主要内容包含两部分,第一部分为经验模态分解(Empirical Mode Decomposition,简称EMD),它是由Huang提出的;第二部分为Hilbert谱分析(Hilbert Spectrum Analysis,简称HSA)。简单说来,HHT处理非平稳信号的基本过程是:首先利用EMD方法将给定的信号分解为若干固有模态函数(以Intrinsic Mode Function或IMF表示,也称作本征模态函数),这些IMF是满足一定条件的分量;然后,对每一个IMF进行Hilbert变换,得到相应的Hilbert谱,即将每个IMF表示在联合的时频域中;最后,汇总所有IMF的Hilbert谱就会得到原始信号的Hilbert谱。

    2 部分代码

    clear all;

    close all

    signal=load('Signal.txt');

    N=length(signal);

    fs=1840;          % 采样频率

    wp=[50 150]*2/fs;                  %对原始信号进行滤波处理

    ws=[30 200]*2/fs;

    rp=1;

    rs=15;

    [num wn]=cheb2ord(wp,ws,rp,rs);

    [b,a]=cheby2(num,rs,wn);

    s=filter(b,a,signal);

    S=s';             % 将滤波后信号赋值给S

    YSS=S;             % 滤波信号为始信号

    ts=(1/fs);        % 采样时间

    t=0:ts:ts*(N-1);  

    %画图---滤波后信号

    figure(1)

    plot(t,s);   

    set(gcf,'color',[1,1,1]);

    grid on;   

    xlabel('Time(ms)');

    ylabel('amplitude(mv)');

    title('时域图');

    legend('115kHz');

    axis([0,0.5,-inf,inf]);

    % 设置程序中需要用到的标志位

    overf=0;     % 是否结束信号分解过程

    overimf=0;     % IMF的结束标志

    %信号处理部分

    SD=1;                               % 设置程序中需要的SD、初值

    HH=0.01*ones(1,N);                  % 设置程序中需要的HH初值

    % 进行第一次信号筛选过程

    [H,overf,mline]=dob(S,t,ts);         % 调用子程序

    p=0;                                % 设置IMF组件的个数初值

    % 主程序

    % 第一部分:对信号进行IMF处理

    condition=1;              

    while (overf==0)                                                             % 如果不满足信号分解结束过程

         [sumnum,zeronum]=computernumber(H);                                     % 调用子程序

         SD=computerSD(H,HH);                                                    % 调用子程序

         if ((zeronum==sumnum)|(abs(zeronum-sumnum)==1))&(mline(1:N)==0)    

               overimf=1;                      

               condition=11;

         elseif   (0.2<=SD)&(SD<=0.3)                                             % 如果H(n)满足IMF条件,退出筛选过程

               overimf=1;

               condition=11;

         else 

             condition=condition+1;

         end 

         

         if condition<=20  

            overimf=0;

         else

            overimf=1;

         end

         

    % 对IMF进行Hilbert处理

         if overimf==1                                 % 如果分解值满足IMF条件

             

             condition=1;                              % 重新设置condition的值,以便为下一次筛选做准备

             

             p=p+1;                                    % 累加IMF个数

             I(p,:)=H;                                 % 将筛选的IMF赋给I,作为第p个组件,I的每行为一个IMF 

             SS=YSS;                                   % 将滤波后信号(原始信号)赋给SS

             for i=1:p                                 % 用原始信号减去所有筛选出来的IMF组件

                 II=I(i,:);

                 SS=SS-II;

             end

             S=SS;                                       % 原始信号与IMF相减后的余项

    % 判断余项是否可以作为最后一项信号分解组件

             L=length(S);     

             m=0;                                         % 以下是获得余项的导数序列       

               for i=1:L-1     

                   m=m+1;

                   q(m)=S(i)-S(i+1);                      % 对余项进行求导

               end

    % 检查余项是否是单调或常数

               if q<0                                      % 余项是单调递增

                   overf=1;

               elseif q>0                                  % 余项是单调递减

                   overf=1;

               elseif q==0                                 % 余项是恒量

                   overf=1;

               else

                   overf=0;

                   [H,overf,mline]=dob(S,t,ts);              % 不满足分解结束条件,则将余项作为原信号继续进行分解

               end

               

         else                                              % 如果分解值不满足IMF条件,则将该分解值作为原始信号重复主程序内的步骤

             S=H;                                          % 将本次分解得到的信号作为原始信号

             HH=H;                                         % 将本次分解得到的H赋给HH,用来计算SD

             [H,overf,mline]=dob(S,t,ts);                   % 调用子程序

         end

     end

    % 绘制所有IMF组件图

    if p==0                                   % 如果信号不包括任何IMF组件

          figure(2)

           

          plot(t,H);

          grid on;

          xlabel('Time(ms)');

          ylabel('Original Signal');

          axis([0,0.5,0,inf]);

    elseif (p>0)                              % 如果信号包括 p 个IMF组件

             figure(2);

             set(gcf,'color',[1 1 1]);

             for i=2:p+1

                  subplot(p+1,1,i-1);

                  plot(t,I(i-1,:));

                  grid on;

                  xlabel('Time(ms)');

                  ylabel('IMF');

                  grid on;

             end

             xlabel('Time');

             ylabel('C');

             subplot(p+1,1,p);

             plot(t,S);

             grid on;

             xlabel('Time(ms)');

             ylabel('Residual');

             axis([0,0.5,0,inf]);

    end

      

    % 绘制二维/三维时-频图

    % 组件为p时

    [w,theray,Magy,w_s,energy]=doHilbert(I,ts,t);       % 调用子程序 w--原始的频率,w--p经过平滑后的频率

     p=length(Magy(:,1));                         % Magy的行数

     q=length(Magy(1,:));                         % Magy的列数

    % 以下部分是获取幅值的最大值和最小值

      for i=1:p

            HMax(i)=Magy(i,1);

            HMin(i)=Magy(i,1);

            for j=2:q

              if Magy(i,j)>HMax(i)

                  HMax(i)=Magy(i,j);

              end

              if Magy(i,j)

                  HMin(i)=Magy(i,j);

              end

          end

      end

      Max=HMax(1);

      Min=HMin(1);

        for i=2:p

          if HMax(i)>=Max

            Max=HMax(i);

          end

          if HMin(i)<=Min

            Min=HMin(i);

          end

        end    

    % 第i(0

    for i=1:p

        maxpoint(i)=Magy(i,1);

        for j=2:1:q

            if (Magy(i,j))>maxpoint(i)

               maxpoint(i)=Magy(i,j)^2;

               maxpoint_t(i)=t(j);

           end

        end

    end

    for i=1:q

        Magy_all(i)=sum(Magy(:,i).^2);

    end

        maxpoint=Magy_all(1);

    for i=2:1:q

            if (Magy_all(i))>maxpoint

                maxpoint=Magy_all(i);

                maxpoint_t=t(i);

             

            end

    end

       maxpoint

       maxpoint_t

      

    % 绘制二维hilbert图

    % 所有组件的Hilbert图:时间-频率-fuzhi图 

    figure(3);

      set(gcf,'color',[1 1 1]);

      e1=subplot(1,1,1);                                                    % 设置句柄 e1

             for i=p:-1:1

               for j=1:q-1

                     h(i,j)=plot(t(j),w(i,j)/(2*pi));                        %  绘制每个点

                     grid on;

                     %set(h(i,j),'linestyle','.');  

                     set(h(i,j),'color',(Magy(i,j)-Min)/(Max-Min)*[1 1 1]);  % 以黑色为底色,幅值越大越白

                     set(e1,'color',[0 0 0]);                                % 设置底色为黑色

                     hold on

              end

          end

      hold off

      xlabel('time(ms)');

      ylabel('amplitude');

      title('希尔波特谱图');

      set(gca, 'color', 'white');      % 去掉坐标轴的背景色

      set(gcf, 'color', 'white') ;      % 去掉图像的背景色

      axis([0 0.5 -0 300]);

      

    % 所有组件的:时间-能量图(瞬时能量谱)

    figure(4)

    plot(t,Magy_all,'-');                                    

    grid on;

    set(gcf,'color',[1 1 1]);

    xlabel('time(ms)');

    ylabel('energy');

    title('瞬时能量谱');

    axis([0,0.5,0,inf]);

    grid on;

      % :频率-能量图(希尔伯特谱)

     e_max=energy(1);                      %求中心频率及其对应的最大能量

     for i=2:length(w_s)

         if energy(i)>e_max

             e_max=energy(i);

             f_c=w_s(i)/(2*pi);

         end

     end

    e_max

    f_c 

    figure(5)

     plot(w_s/(2*pi),energy);

     grid on;

     hold on;

     set(gcf,'color',[1 1 1]);

     xlabel('frequence(kHz)');

     ylabel('energy');

     title('希尔伯特能量谱');

     axis([0,230,0,inf]);

           

    %  绘制三维的hilbert图

          figure(6);

          set(gcf,'color',[1 1 1]);

          for i=1:p

              plot3(t(1:N-1),w(i,1:N-1)/(2*pi),Magy(i,1:N-1).^2,'-','color',[1 0 0]*(i/p));

              hold on

    3 运行结果

    4 参考文献

    [1]王明阳, 柳征, 周一宇. 基于希尔波特-黄变换的冲击无线电信号检测[J]. 信号处理, 2006, 22(4):4.

    博主简介:擅长智能优化算法神经网络预测信号处理元胞自动机图像处理路径规划无人机雷达通信无线传感器等多种领域的Matlab仿真,相关matlab代码问题可私信交流。

    部分理论引用网络文献,若有侵权联系博主删除。

  • 相关阅读:
    一种灵活的智能合约协作方式
    Vue/React 项目部署到服务器后,刷新页面出现404报错
    免费 DIY 之旅问题
    拒绝摆烂:我怎么从一个普通的弱电工人变成大厂网络工程师?
    C# SolidWorks 二次开发 API-Solidworks文件关系与打开文件的方式
    前端框架Vue学习 ——(六)Vue组件库Element
    用全域安全防范美国NSA对西工大的网络攻击
    笔记本电脑没有声音?几招恢复声音流畅!
    SQL:CASE WHEN THEN ELSE END语句
    Python和PHP有什么区别
  • 原文地址:https://blog.csdn.net/matlab_dingdang/article/details/126907419