running mean of circular data (angles)

Hi there
Im trying to do a running mean of a quite large wind-direction data-set but I'm having trouble finding solutions that work. Does anyone know of a simple solution?
Thanks in advance

 Accepted Answer

You could look at the excellent "Circular Statistics Toolbox"

5 Comments

if i have the matlaba 2015, what can i do ?
You can still use that File Exchange contribution. Just download it and install it and add the directory to your MATLAB path.
Thanks good man
  1. how can i use mean angle?
  2. M = xlsread('Dic2019','Dic2019mat')
  3. ten_minute_avarege = meanangle(reshape(M, 10, []), 'omitnan')
  4. xlswrite('datosexcel1.xlsx', ten_minute_avarege, 'Hoja1', 'A1');
I am not aware of any meanangle() function that has 'omitnan' as an option.

Sign in to comment.

More Answers (2)

Jakob Sievers
Jakob Sievers on 5 Oct 2011
The Circular Statistics Toolbox doesnt appear to have a running mean function though. I have used its circ_mean function to make my own running mean but it takes hours to complete its calculation due to the size of the dataset (basically a long vector containing 10 million points).
Does anyone have any other suggestions?

4 Comments

Could you say more about what the problem is? What's actually going wrong, that can't be solved with unwrap? Do you know how to do a running mean on non-circular data?
Well. I looked though the running mean function that I usually use, but it uses a trick looking like this: cumsum(angles)./wl where wl is the window length being meaned over, and im not sure how to transfer this fast method into a circular-data setting. So what I did was to do a "for" loop which continuously uses the circ_mean function from the above mentioned toolbox. Since I have this long dataset it takes around 5 hours to calculate it and im sure it can be done more easily. Im just not sure how.
What I did with your suggestion was:
angles2=unwrap(angles);
angles2_rm=runmean(angles2,100); %(where 100 is the window)
and then im thinking using the mod function to get back into circular mode:
mod(angles2_rm,360)
but it doesnt look right.
Note that unwrap assumes your angles are in radians. If you're using degrees (and from the 360 in your code I think you are), multiply your data by pi/180 before using unwrap. You can convert back afterwards if necessary by multiplying by 180/pi.
Also, perhaps there's a problem with runmean. Maybe you could explain a little more about what this function does, or if it's very short even copy it into your question. (Not into a comment or answer though.)
Hi David
I just talked with a colleague who said that a 30min mean would be sufficient, meaning that I can make a simple running mean that runs in a 20 seconds or so myself using the circ_mean as described above. Thanks for the help though!

Sign in to comment.

Community Treasure Hunt

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

Start Hunting!