How to segment data using overlapping window

조회 수: 56 (최근 30일)
mahrukh jamil
mahrukh jamil 2016년 10월 6일
댓글: Alistair Steyn-Ross 2023년 6월 21일
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?

채택된 답변

Guillaume
Guillaume 2016년 10월 6일
편집: Guillaume 2016년 10월 6일
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
mahrukh jamil
mahrukh jamil 2016년 10월 11일
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 2016년 10월 11일
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);

댓글을 달려면 로그인하십시오.

추가 답변 (2개)

LauraLee Austin
LauraLee Austin 2016년 10월 6일
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 2022년 6월 26일
Simply use buffer.m and define the length of the window and the overlapped part
with regards
Fars
  댓글 수: 1
Alistair Steyn-Ross
Alistair Steyn-Ross 2023년 6월 21일
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

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Multirate Signal Processing에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by