-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathwaveletdesignemd.m
76 lines (62 loc) · 2.51 KB
/
waveletdesignemd.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
clc; close all; clear all;
load('100m.mat');
ecg=val(1,:);
ecg1=(ecg)/1244;
figure(1);
plot(ecg1);
x = decimate(ecg1,12);
figure(2);
plot(x);grid on; hold on;
c = x(:)'; % copy of the input signal (as a row vector)
N = length(x);
%-------------------------------------------------------------------------
% loop to decompose the input signal into successive IMF
imf = []; % Matrix which will contain the successive IMF, and the residue
% while (1) % the stop criterion is tested at the end of the loop
%-------------------------------------------------------------------------
% inner loop to find each imf
h = c; % at the beginning of the sifting process, h is the signal
SD = 1; % Standard deviation which will be used to stop the sifting process
% while SD > 0.3
% while the standard deviation is higher than 0.3 (typical value)
% find local max/min points
N = length(h);
d = diff(h); % approximate derivative
maxmin = []; % to store the optima (min and max without distinction so far)
for i=1:N-2
if d(i)==0 % we are on a zero
maxmin = [maxmin, i];
elseif sign(d(i))~=sign(d(i+1)) % we are straddling a zero so
maxmin = [maxmin, i+1]; % define zero as at i+1 (not i)
end
end
grid on;
if size(maxmin,2) < 2 % then it is the residue
break
end
% divide maxmin into maxes and mins
if maxmin(1)<maxmin(2) % first one is a max not a min
maxes = maxmin(1:2:length(maxmin));
mins = maxmin(2:2:length(maxmin));
else % is the other way around
maxes = maxmin(2:2:length(maxmin));
mins = maxmin(1:2:length(maxmin));
end
% % make endpoints both maxes and mins
maxes = [1 maxes N];
mins = [1 mins N];
%
%
% %-------------------------------------------------------------------------
% % spline interpolate to get max and min envelopes; form imf
maxenv = spline(maxes,h(maxes),1:N);
minenv = spline(mins, h(mins),1:N);
plot(minenv,'b+-');
hold on;
plot(maxenv,'k*--');
hold on;
m = (maxenv + minenv)/2; % mean of max and min enveloppes
plot(m, 'r.-');
hold on;
title('templates: blue+1=max; black*=min; red.=avg; blue=ecg');
xlabel('time(msec)'); ylabel('amplitude(mV)');