请选择 进入手机版 | 继续访问电脑版

Hello Mat

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3189|回复: 6

8-EMD端点效应优化(最大相关波形延拓法)(MATLAB视频)

[复制链接]

806

主题

951

帖子

3万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
30251
发表于 2018-9-1 22:21:09 | 显示全部楼层 |阅读模式
8-EMD端点效应优化(最大相关波形延拓法)(MATLAB视频)
百度网盘链接:https://pan.baidu.com/s/1bYIuE0r10SEVqMSWDSTZhg
具体链接在halcom.cn论坛,联系人QQ:3283892722
该论坛是一个学习交流平台,我会逐一的和大家分享学习。
欢迎大家录制视频,你可在论坛进行打赏分享。
视频专用播放器:http://halcom.cn/forum.php?mod=viewthread&tid=258&extra=page%3D1\

  1. % 最大相关波形延拓法
  2. clc,clear,close all % 清理命令区、清理工作区、关闭显示图形
  3. warning off         % 消除警告
  4. format short        % 数据类型
  5. tic                 % 运算计时
  6. %% 初始化信号
  7. [t, signal] = gen_signal(5e3, 1e3);
  8. figure(1), plot(t,signal,'linewidth',1)
  9. xlabel('t');  ylabel('实际信号');  grid on;
  10. %% 最大相关波形延拓法
  11. %% 极值点和过零点位置提取
  12. [indmin, indmax, indzer] = extr(signal, t); % 极值点和过零点位置提取
  13. figure(2), plot(t,signal,'linewidth',1);
  14. hold on
  15. plot(t(indmin), signal(indmin), 'm.-')
  16. plot(t(indmax), signal(indmax), 'r.-')
  17. plot(t(indzer), signal(indzer), 'g.-')
  18. xlabel('t');  ylabel('实际信号');  grid on;
  19. legend('原始信号','极小值','极大值','过零点')
  20. axis tight;
  21. hold off;
  22. %% 最大相关波形延拓法
  23. flag=0;  % =0就是左端点沿拓;=1就是右端点沿拓
  24. signal_corr = maxCorr_find_Si(signal, t, 0);
  25. newdata = signal_corr;
  26. welddata_left = weld( signal, newdata, indmax, 0 );

  27. flag=1;  % =0就是左端点沿拓;=1就是右端点沿拓
  28. signal_corr = maxCorr_find_Si(signal, t, 1);
  29. newdata = signal_corr(end:-1:1);
  30. welddata_right = weld( signal, newdata, indmax, 1 );
  31. welddata = [welddata_left, signal(indmax(1):indmax(end)), welddata_right];

  32. figure(3),hold on
  33. plot(1:length(welddata_left), welddata_left,'r.-');
  34. plot(length(welddata_left)+1: length(welddata_left)+length(signal(indmax(1):indmax(end))),signal(indmax(1):indmax(end)),'b-');
  35. plot(length(welddata)-length(welddata_right)+1:length(welddata),welddata_right,'r.-');
  36. xlabel('t');  ylabel('实际信号');  grid on;
  37. axis tight;
  38. hold off;
复制代码
关键性函数如下:
  1. function signal_corr = maxCorr_find_Si(signal, t, flag)
  2. % 最大相关波形延拓法
  3. if(flag==0)
  4.     k=1;
  5.     [indmin, indmax, indzer] = extr(signal, t); % 极值点和过零点位置提取
  6.     for j=1:length(indmax)
  7.         if(indmax(j)>indzer(1))
  8.             break;
  9.         end
  10.     end
  11.     w0 = signal( indzer(1):indmax(j+1) );
  12.     h0 = signal(indmax(j)) - signal(1);
  13.     for i=2:length(indmax)
  14.         signal = signal + h0-signal(indmax(i));
  15.         [indmini, indmaxi, indzeri] = extr(signal, t); % 极值点和过零点位置提取
  16.         if(isempty(indzeri))
  17.             break;
  18.         else
  19.             for j=1:length(indmaxi)
  20.                 if(indmaxi(j)>indzeri(1))
  21.                     break;
  22.                 end
  23.             end
  24.             w = signal( indzeri(1):indmaxi(j+1) );
  25.             w = imresize(w, size(w0));
  26.             xx = corrcoef( w0, w );
  27.             Corr1(k,1) = xx(1,2);
  28.             w1 = signal( indmaxi(i-1):indmaxi(i) );
  29.             w1 = imresize(w1, size(w0));
  30.             Corr2(k,:) = w1;
  31.             k=k+1;
  32.         end
  33.     end
  34.     [maxP, index] = max(Corr1);
  35.     signal_corr = Corr2(index,:);
  36. elseif(flag==1)
  37.     k=1;
  38.     signal = signal(end:-1:1);
  39.     [indmin, indmax, indzer] = extr(signal, t); % 极值点和过零点位置提取
  40.     for j=1:length(indmax)
  41.         if(indmax(j)>indzer(1))
  42.             break;
  43.         end
  44.     end
  45.     w0 = signal( indzer(1):indmax(j+1) );
  46.     h0 = signal(indmax(j)) - signal(1);
  47.     for i=2:length(indmax)
  48.         signal = signal + h0-signal(indmax(i));
  49.         [indmini, indmaxi, indzeri] = extr(signal, t); % 极值点和过零点位置提取
  50.         if(isempty(indzeri))
  51.             break;
  52.         else
  53.             for j=1:length(indmaxi)
  54.                 if(indmaxi(j)>indzeri(1))
  55.                     break;
  56.                 end
  57.             end
  58.             w = signal( indzeri(1):indmaxi(j+1) );
  59.             w = imresize(w, size(w0));
  60.             xx = corrcoef( w0, w );
  61.             Corr1(k,1) = xx(1,2);
  62.             w1 = signal( indmaxi(i-1):indmaxi(i) );
  63.             w1 = imresize(w1, size(w0));
  64.             Corr2(k,:) = w1;
  65.             k=k+1;
  66.         end
  67.     end
  68.     [maxP, index] = max(Corr1);
  69.     signal_corr = Corr2(index,:);
  70. end
复制代码





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
算法QQ  3283892722
群智能算法链接http://halcom.cn/forum.php?mod=forumdisplay&fid=73
回复

使用道具 举报

0

主题

4

帖子

73

积分

注册会员

Rank: 2

积分
73
QQ
发表于 2020-4-18 16:42:32 | 显示全部楼层
请问这个左右端点的延拓是要分开进行吗?还是就按照您的整个程序就可以成功呢?
回复 支持 反对

使用道具 举报

41

主题

67

帖子

1152

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1152
发表于 2020-4-19 12:16:23 | 显示全部楼层
算法小白3 发表于 2020-4-18 16:42
请问这个左右端点的延拓是要分开进行吗?还是就按照您的整个程序就可以成功呢?

从代码看,是的
回复 支持 反对

使用道具 举报

0

主题

4

帖子

73

积分

注册会员

Rank: 2

积分
73
QQ
发表于 2020-4-23 10:16:20 | 显示全部楼层
GTX_AI 发表于 2020-4-19 12:16
从代码看,是的

function [indmin, indmax, indzer] = extr(x,t);
% [indmin, indmax, indzer] = EXTR(x,t) finds extrema and zero-crossings
%
% inputs : - x : analyzed signal
%          - t (optional) : sampling times, default 1:length(x)
%
% outputs : - indmin = indices of minima
%           - indmax = indices of maxima
%           - indzer = indices of zero-crossings
if(nargin==1)
  t=1:length(x);
end
m = length(x);
x1=x(1:m-1);
x2=x(2:m);
indzer = find(x1.*x2<0);
if any(x == 0)
  iz = find( x==0 );
  indz = [];
  if any(diff(iz)==1)
    zer = x == 0;
    dz = diff([0 zer 0]);
    debz = find(dz == 1);
    finz = find(dz == -1)-1;
    indz = round((debz+finz)/2);
  else
    indz = iz;
  end
  indzer = sort([indzer indz]);
end
  
d = diff(x);
n = length(d);
d1 = d(1:n-1);
d2 = d(2:n);
indmin = find(d1.*d2<0 & d1<0)+1;
indmax = find(d1.*d2<0 & d1>0)+1;
if any(d==0)
  
  imax = [];
  imin = [];
  
  bad = (d==0);
  dd = diff([0 bad 0]);
  debs = find(dd == 1);
  fins = find(dd == -1);
  if debs(1) == 1
    if length(debs) > 1
      debs = debs(2:end);
      fins = fins(2:end);
    else
      debs = [];
      fins = [];
    end
  end
  if length(debs) > 0
    if fins(end) == m
      if length(debs) > 1
        debs = debs(1:(end-1));
        fins = fins(1:(end-1));
      else
        debs = [];
        fins = [];
      end      
    end
  end
  lc = length(debs);
  if lc > 0
    for k = 1:lc
      if d(debs(k)-1) > 0
        if d(fins(k)) < 0
          imax = [imax round((fins(k)+debs(k))/2)];
        end
      else
        if d(fins(k)) > 0
          imin = [imin round((fins(k)+debs(k))/2)];
        end
      end
    end
  end
  
  if length(imax) > 0
    indmax = sort([indmax imax]);
  end
  if length(imin) > 0
    indmin = sort([indmin imin]);
  end
  
end  

谢谢哦,但是您能帮我看下这个报错是啥意思嘛?我弄了半天也没懂,上面是extr函数,非常感谢!


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

806

主题

951

帖子

3万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
30251
 楼主| 发表于 2020-4-25 17:13:36 | 显示全部楼层
算法小白3 发表于 2020-4-23 10:16
function  = extr(x,t);
%  = EXTR(x,t) finds extrema and zero-crossings
%

检查变量的维度是否一致,单独调试一下就知道了。
算法QQ  3283892722
群智能算法链接http://halcom.cn/forum.php?mod=forumdisplay&fid=73
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Python|Opencv|MATLAB|Halcom.cn  

GMT+8, 2020-6-2 11:50 , Processed in 0.152991 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表