Hal says: "For exponential smoothing, a_avg will be a fraction. Let's pick a_avg to be 1/8. That's a right shift by 3 bits. I don't think there is anything magic about shifting, but that makes a particular case easy to spot and discuss."
Hi Hal, Yeah, I've been sitting here manually running some sample data and I haven't been happy with my efforts so far. I think I'll just stay with what I know for now: moving averages. I've got a number of places I can reduce memory usage when I run a bit shorter, so I think it'll work out. And I suspect I'm being far too conservative; i.e. averaging way too long If not, maybe there will be a good gain value that will be convenient to code the exponential average. Thanks for the help, Bob >________________________________ > From: Hal Murray <hmur...@megapathdsl.net> >To: Bob Stewart <b...@evoria.net>; Discussion of precise time and frequency >measurement <time-nuts@febo.com> >Cc: hmur...@megapathdsl.net >Sent: Wednesday, March 12, 2014 10:08 PM >Subject: Re: [time-nuts] PLL Math Question > > > >b...@evoria.net said: >> In the moving averages I'm doing, I'm saving the last bit to be shifted out >> and if it's a 1 (i.e. 0.5) I increase the result by 1. > >That's just rounding up at an important place. It's probably a good idea, >but doesn't cover the area I was trying to point out. Let me try again... > >Suppose you are doing: > x_avg = x_avg + (x - x_avg) * a_avg; > >For exponential smoothing, a_avg will be a fraction. Let's pick a_avg to be >1/8. That's a right shift by 3 bits. I don't think there is anything magic >about shifting, but that makes a particular case easy to spot and discuss. > >Suppose x_avg is 0 and x has been 0 for a while. Everything is stable. Now >change x to 2. (x - x_avg) is 2, the shift kicks it off the edge, so x_avg >doesn't change. (It went 2 bits off, so your round up doesn't catch it.) The >response to small steps is to ignore them. > >If you have noisy data, things probably work out OK. If you need to process >low level (very) low frequency changes (which seems desirable for a GPSDO) you >probably want some fractional bits. For me, the easy way to do that is to use > y = x * k >Let's use k = 16, a 4 bit left shift. >For the same step of x=2, y= 32, (y - y_avg) is 32, shifted right by 3 that's >4, so y_avg is 4. > >I'm sure this is all business-as-usual for the people who write control loops >in small CPUs using fixed point arithmethic. Of course, you have to worry >about shifting too far left (overflow) and things like that. > >If you have enough cycles, you can use floating point. :) > > >-- >These are my opinions. I hate spam. > > > > > > _______________________________________________ time-nuts mailing list -- time-nuts@febo.com To unsubscribe, go to https://www.febo.com/cgi-bin/mailman/listinfo/time-nuts and follow the instructions there.