- 0 to 33% of max rms
- 33 to 66% of max rms
- above 66% of max rms
Help Segmenting signal processing
4 views (last 30 days)
Show older comments
Hi,
I have data. I have segmented the signal in windows and calculated rms. Can you please help in finding multiple minimum values for this signal?
[v, i] = min(rms);
Thank you!
0 Comments
Accepted Answer
Mathieu NOE
on 15 Mar 2022
hello
see my little demo below. I assumed that you would split the rms data in 3 groups corresponding to ranges
the 3 groups are the colored dots
code :
clearvars
% dummy data
n=300;
x=linspace(0,2*pi,n);
data = 0.25*ones(size(x));
data = max(data,-cos(x));
buffer = 10; % nb of samples in one buffer (buffer size)
overlap = 5; % overlap expressed in samples
%%%% main loop %%%%
m = length(data);
shift = buffer-overlap; % nb of samples between 2 contiguous buffers
for ci=1:fix((m-buffer)/shift +1)
start_index = 1+(ci-1)*shift;
stop_index = min(start_index+ buffer-1,m);
time_index(ci) = round((start_index+stop_index)/2); % time index expressed as sample unit (dt = 1 in this simulation)
rms_data(ci) = my_rms(data(start_index:stop_index)); %
end
x_rms = x(time_index);
figure(1),
plot(x,data,x_rms,rms_data,'r*');
%select index if they belong to ranges : 0 - 33% of max / 33 - 66% of max / above 66% of max
ind1 = find(rms_data<=max(rms_data)/3); % range : 0 - 33% of max
ind2 = find(rms_data>max(rms_data)/3 & rms_data<=max(rms_data)*2/3); % range : 33 - 66% of max
ind3 = find(rms_data>max(rms_data)*2/3); % range : above 66% of max
figure(1),
plot(x,data,'k',x_rms(ind1),rms_data(ind1),'g*',x_rms(ind2),rms_data(ind2),'b*',x_rms(ind3),rms_data(ind3),'r*');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function x_rms = my_rms(x)
x_rms = sqrt(mean(x.^2));
end
0 Comments
More Answers (2)
Mathieu NOE
on 17 Mar 2022
hello Nina
I was about to reply on your other post when it disappeared : did you delete it ?
For your info, this was the demo code I have been preparing for you , maybe still of interest :
clearvars
% dummy data
n=1000;
x=linspace(0,2*pi*3,n);
data = 0.25*ones(size(x));
data = max(data,-cos(x).*(1+x/10));
data(300:303) = 2; % add a spike (for fun)
%% parameters
min_contiguous_samples = 10; % consider "red" segments only if they are at least this length (and contiguous)
% running rms (buffered) parameters :
buffer = 100; % nb of samples in one buffer (buffer size)
overlap = buffer-1; % overlap expressed in samples
%% main loop %%%%
m = length(data);
shift = buffer-overlap; % nb of samples between 2 contiguous buffers
for ci=1:fix((m-buffer)/shift +1)
start_index = 1+(ci-1)*shift;
stop_index = min(start_index+ buffer-1,m);
time_index(ci) = round((start_index+stop_index)/2); % time index expressed as sample unit (dt = 1 in this simulation)
rms_data(ci) = my_rms(data(start_index:stop_index)); %
end
x_rms = x(time_index);
%select index if they belong to ranges : 0 - 33% of max / 33 - 66% of max / above 66% of max
ind1 = (rms_data<=max(rms_data)/2); % range : 0 - 50% of max
% ind2 = find(rms_data>max(rms_data)/2 & rms_data<=max(rms_data)*2/3); % range : 33 - 66% of max
ind2 = (rms_data>max(rms_data)/2); % range : 50 - 100% of max (why limit the upper value ??)
% now define start en end point of "red" segments
[begin2,ends2] = find_start_end_group(ind2);
length_ind2 = ends2 - begin2;
ind22= length_ind2>min_contiguous_samples; % check if their length is valid (above min_contiguous_samples value)
begin2 = begin2(ind22); % selected points
ends2 = ends2(ind22); % selected points
% define for plot the red / green rms data
x1 = x_rms(ind1);
rms_data1 = rms_data(ind1);
x2 = x_rms(ind2);
rms_data2 = rms_data(ind2);
% define the begin / ending x, y values of raw data
x2_begin = x_rms(begin2);
data_begin = interp1(x,data,x2_begin);
x2_ends = x_rms(ends2);
data_ends = interp1(x,data,x2_ends);
figure(1),
plot(x,data,'k',x1,rms_data1,'g.',x2,rms_data2,'r.',x2_begin,data_begin,'dc',x2_ends,data_ends,'dm','MarkerSize',12);
legend('signal','rms below 50%','rms above 50%','begin points','end points');
% store each "red" segment separately (in cell array)
figure(2), hold on
for ci = 1:length(begin2)
ind = (x>=x2_begin(ci) & x<=x2_ends(ci))
xx = x(ind);
yy = data(ind);
data_store{ci} = [xx(:) yy(:)]; % 2 columns : time / data
plot(xx,yy);
end
hold off
%%%% end of main file %%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [begin,ends] = find_start_end_group(ind)
% This locates the beginning /ending points of data groups
D = diff([0,ind,0]);
begin = find(D == 1);
ends = find(D == -1) - 1;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function x_rms = my_rms(x)
x_rms = sqrt(mean(x.^2));
end
0 Comments
Image Analyst
on 17 Apr 2022
In case you delete again, here is the current version of the question:
---------------------------------------------------------------------------------------------------
Hi,
I have data. I have segmented the signal in windows and calculated rms. Can you please help in finding multiple minimum values for this signal?
[v, i] = min(rms);
Thank you!
---------------------------------------------------------------------------------------------------
So to do that, you can do
[sortedRMS, indexes] = sort(rms, 'ascend');
the indexes will tell you the indexes for the RMS with the smallest rms value first, at indexes(1), and the largest rms value last, at indexes(end).
0 Comments
See Also
Categories
Find more on Matrix Indexing in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!