Moving average filter for large dataset
2 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
Hello everyone.
I have a large dataset with for eg. 3500 Hz (i.e 3500 samples every second) for lets say 10 minutes. so in total I have 3500*60*10 = 2100000 samples.
example question: X = 2100000x1 double.
and now I want to perform moving average for 1 minute (i.e 60*3500 = 210000 samples).
I have worked out the solution using conv. code is written below.
Y = conv(X, ones(1,210000)/210000, 'valid');
This does exactly what I want, but it is taking too long to compute (~3-4 minutes).
Are there any other methods which are faster?
Thanks.
2 comentarios
Adam
el 2 de Sept. de 2019
Editada: Adam
el 2 de Sept. de 2019
Your code takes just a few seconds to run for me if I create a vector of random data of that size. Also
Y = movmean( X, 210000, 'Endpoints', 'discard' );
is also almost instantaneous and gives the same result.
Note: movmean is only available from R2016a
Respuestas (1)
Dimitris Kalogiros
el 2 de Sept. de 2019
Editada: Dimitris Kalogiros
el 2 de Sept. de 2019
Hi Ajay
You can try an iir filter like this
clear; clc;
%supose x contains your data.
% here , for simplicity, x is a constant with some gaussian noise
x= 5+randn(1,3500*60*10);
% output of iir filter (moving average)
y=zeros(1,length(x));
% time constant
L=1/(60*3500);
% filtering process
for n=2:length(x)
y(n)=(y(n-1)+L*x(n))/(1+L);
end
% plots of output and input
figure;
plot(x, '-b'); hold on;
plot(y, '-r', 'LineWidth', 2); zoom on; grid on;
legend('x: input', 'y: output');
Ver también
Productos
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!