# How to create a moving average filter to a specific signal

37 views (last 30 days)
Yian Chen on 28 Nov 2021
Commented: Image Analyst on 28 Nov 2021
Hi
I wanna apply a moving average filter to my temperature dataset, it is a 92-day daily temperature dataset. How can I create the filter?
Thanks a lot!

Chunru on 28 Nov 2021
Edited: Chunru on 28 Nov 2021
n = 7; % filter order
y = filter(ones(n, 1)/n, 1, x);
plot(x); hold on;
plot(y);
legend('Original', 'MovAve')
To get rid of delay:
figure
y = filtfilt(ones(n, 1)/n, 1, x);
plot(x); hold on;
plot(y);
legend('Original', 'MovAve')
Chunru on 28 Nov 2021
See above for removing delay using filtfilt (doc it for more details).

Image Analyst on 28 Nov 2021
Look at the movmean() function.
##### 2 CommentsShowHide 1 older comment
Image Analyst on 28 Nov 2021
@Yian Chen I don't see any zeros, and you might want to use more than 3 elements:
plot(y, 'b.-', 'LineWidth', 2, 'MarkerSize', 20);
grid on;
xlabel('Index', 'FontSize',fontSize)
% Filter it
windowWidth = 9
smoothy = movmean(y, windowWidth);
hold on;
plot(smoothy, 'r.-', 'LineWidth', 2, 'MarkerSize', 20);
legend('Original', 'Smoothed')
You could also try sgolayfilt() to smooth it. You can choose an order like 2 or 3 to follow the original data better than movmean() which uses a linear fit. An order of 2 or 3 will fit a quadratic or cubic to the data in each window position.