How to segment data using overlapping window

57 views (last 30 days)
Hello, I have an ECG data of 20mins length (2x307200). I want to apply a 20 sec window(5120) with an overlap of 64samples. I want 20 sec segments so i can extract features from it. I tried to write a loop for window but it doesn't give me right answer. Can somebody help me.
ECG_data=[time; ECG];
N_max=length(ECG_data);
n_window=5120;
overlap_win=64;
count=1;
for n_start = 1:overlap_win:(N_max-n_window)
New_data(count,:) = ECG_data(n_start_1:(n_start+ n_window));
do something..
mean(count,:)=mean(new_data);
count=count+1;
end
The number of samples in each window is limited to 4720 sample(thats 18 sec) even though i need 20sec(5120). What am I doing wrong here? it something to do with the termination of window?? Also how can i retain the time information after applying window?

Accepted Answer

Guillaume
Guillaume on 6 Oct 2016
Edited: Guillaume on 6 Oct 2016
Something that's really not clear is that your ECG_data has two rows, yet within your loop you're using linear indexing, which is not consistent. The end result, when n_start is 1 is that New_data(1, :) is [time(1), ECG(1), time(2), ECG(2), ...].
Assuming you only want the second row (ECG) of ECG_data in new_data, a very simple way to create it in one go, without a loop is with:
Matlab R2016b or later only:
new_data = ECG((0:64:307200)' + (1:5120));
Any version of matlab:
new_data = ECG(bsxfun(@plus, (0:64:307200)', 1:5120));
You can do the same with time if needed
  8 Comments
mahrukh jamil
mahrukh jamil on 11 Oct 2016
Thanks. thats seems like a nice explanation. I am gonna try it. but my question is now that i want all the samples covered, so what i plan to do is take some more samples from the next data (data ECG_2) enough to make it complete. I would need some help on it. if i define a condition that when the window don't find enough samples, take it from the next data. i could concatenate both data ( ECG1 and ECG2 ) apply my window, and than remove the remaining data that is not needed. would that be a right approach? But how would i define how many samples to take from next data? Also I don't understand how the overlap of window is affecting on the number of windows? if there is no overlap than no of window= length of data/length of window;
Guillaume
Guillaume on 11 Oct 2016
Note: I made a mistake in the above, there's a -1 that snuck in a few places. I've corrected that now.
As it is the number of windows is:
no_of_windows = max(1 + floor((size(data, 2) - windowlength) / windowstep), 0);
The numbers of columns to add to make sure the last samples are included is:
col_to_add = mod(windowlength - size(data, 2), windowstep);

Sign in to comment.

More Answers (2)

LauraLee Austin
LauraLee Austin on 6 Oct 2016
It was not clear to me how/where you wanted the overlap. Below is my quick stab at what I think you might be looking for. It is not efficient.
ECG_data=[time; ECG];
N_max=length(ECG_data);
n_window=5120;
overlap_win=64;
max_count = ceil((length(ECG_data)-n_window)/(n_window-overlap_win))+1;
new_data = zeros(max_count,n_window);
n_start=1;
for count = 1:max_count
n_end = n_start + n_window - 1;
if n_end > N_max
new_data(count,1:N_max-n_start+1) = ECG(n_start:N_max);
else
new_data(count,:) = ECG(n_start:n_end);
end
n_start = n_end-overlap_win;
% do something..
end
ECG_mean=mean(new_data');

Fars Samann
Fars Samann on 26 Jun 2022
Simply use buffer.m and define the length of the window and the overlapped part
with regards
Fars
  1 Comment
Alistair Steyn-Ross
Alistair Steyn-Ross on 21 Jun 2023
Great suggestion. The 'buffer' function handles overlap, underlap, and no overlap. It's a compiled function (in Signal Processing toolbox) so should run very fast. The built-in documentation illustrates with an informative example:
x = 1:18; % Example input data to be buffered
y = buffer(x, 8, 4); % Create overlapping buffer matrix

Sign in to comment.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!