필터 지우기
필터 지우기

Moving window percentile computation using Conv

조회 수: 74 (최근 30일)
Poulomi
Poulomi 2024년 9월 23일 15:08
편집: Bruno Luong 2024년 9월 23일 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.

채택된 답변

Mathieu NOE
Mathieu NOE 2024년 9월 23일 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

추가 답변 (1개)

Matt J
Matt J 2024년 9월 23일 15:55
  댓글 수: 8
Poulomi
Poulomi 2024년 9월 23일 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 2024년 9월 23일 21:02
편집: Bruno Luong 2024년 9월 23일 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"

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

카테고리

Help CenterFile Exchange에서 Descriptive Statistics에 대해 자세히 알아보기

제품


릴리스

R2024a

Community Treasure Hunt

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

Start Hunting!

Translated by