Clear Filters
Clear Filters

Moving window percentile computation using Conv

74 views (last 30 days)
Poulomi
Poulomi on 23 Sep 2024 at 15:08
Edited: Bruno Luong on 23 Sep 2024 at 21:06
Hi
How to calculate 90th percentile of signal on a moving window set by conv. function. I have came across several posts on moving average calculations, such as here: https://www.mathworks.com/matlabcentral/answers/59561-how-can-i-calculate-a-centered-moving-average-with-window-size-7
But couldn't find any function to determine percentiles.

Accepted Answer

Mathieu NOE
Mathieu NOE on 23 Sep 2024 at 15:42
hello
maybe this ? NB it does not need conv but requires Statistics and Machine Learning Toolbox
% dummy data
t= 0:0.25:100;
y = sin(2*pi*t./max(t))+rand(size(t));
%% main code (you choose the amount of samples and overlap)
buffer_size = 50; % in samples
overlap = 25; % overlap expressed in samples
[new_time,data_pc] = my_fn(t,y,buffer_size,overlap,90); %90th percentile of buffered signal
figure(1),
plot(t,y,new_time,data_pc,'*-r');
%%%%%%%%%% function %%%%%%%%%%%%%%
function [new_time,data_out] = my_fn(t,y,buffer_size,overlap,p)
% NB : buffer size and overlap are integer numbers (samples)
% data (in , out) are 1D arrays (vectors)
shift = buffer_size-overlap; % nb of samples between 2 contiguous buffers
samples = numel(y);
nb_of_loops = fix((samples-buffer_size)/shift +1);
for k=1:nb_of_loops
start_index = 1+(k-1)*shift;
stop_index = min(start_index+ buffer_size-1,samples);
x_index(k) = round((start_index+stop_index)/2);
data_out(k) = prctile(y(start_index:stop_index),p); %
end
new_time = t(x_index); % time values are computed at the center of the buffer
end

More Answers (1)

Matt J
Matt J on 23 Sep 2024 at 15:55
  8 Comments
Poulomi
Poulomi on 23 Sep 2024 at 20:52
Actually, this is not working for my case. Series remained constant for 4 or more data points all together, which is eroneous. I wish to get a centered moving window -5 to +5 time point, with 90th percentile within that 11-hr time point.
Bruno Luong
Bruno Luong on 23 Sep 2024 at 21:02
Edited: Bruno Luong on 23 Sep 2024 at 21:06
Matt's solution picks the 10th largest elements of the neighborhood of 11 elements current index + (-5:5). This is 90.91 % (=10/11), granted not exactly 90% as requested.
If you need something different you need to explain. Not many people here can see why " Series remained constant for 4 or more data points all together, which is eroneous"

Sign in to comment.

Categories

Find more on Descriptive Statistics in Help Center and File Exchange

Products


Release

R2024a

Community Treasure Hunt

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

Start Hunting!