Azzera filtri
Azzera filtri

Moving window percentile computation using Conv

14 visualizzazioni (ultimi 30 giorni)
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.

Risposta accettata

Mathieu NOE
Mathieu NOE il 23 Set 2024
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

Più risposte (1)

Matt J
Matt J il 23 Set 2024
  8 Commenti
Poulomi
Poulomi il 23 Set 2024
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 il 23 Set 2024
Modificato: Bruno Luong il 23 Set 2024
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"

Accedi per commentare.

Categorie

Scopri di più su Descriptive Statistics in Help Center e File Exchange

Prodotti


Release

R2024a

Community Treasure Hunt

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

Start Hunting!

Translated by