
|
Calculating Task Periodic Rate
I'm having a complete brain seizure here with what should be a simple math problem. I need to set the periodic rate of an embedded task so that it performs certain things at a particular rate.
E.g if the task has to perform 4 things at, say, 6Hz, 3Hz, 2Hz and 4Hz how do I calculate taht the task must run at 12Hz?? (Accuracy is not super important here)
-- No, this is not homework. A student could probably figure this out in less time than it has taken me to type the question in...
Brain dead today
Friday, June 18, 2004
You have to find the lowest common multiple. Take multiples of each number until you find one that all share.
DJ
Friday, June 18, 2004
6Hz, 3Hz, 2Hz and 4Hz
Step 1
6 = 2x3
3 = 3
2 = 2
4 = 2^2
Step 2
n = 2^2 x 3
And a note: if a process has a highest frequency F in its spectrum, you need to sample it at 2xF in order to be able to capture all events and reconstruct the original signal (Nyquist criteria/Shannon sampling theorem)
Dino
Friday, June 18, 2004
Take multiples (starting with 1) of the highest resolution number (6):
6x1%4 = 4, so 6x1 doesn't work.
6x2%4 = 0, so 6x2 (=12) works.
Derek
Friday, June 18, 2004
Example:
24 and 90
24 = 2^3 x 3
90 = 2 x 3^2 x 5
N = 2^3 x 3^2 x 5 = 360
Dino
Friday, June 18, 2004
Oops, I forgot to try all the other numbers from the problem (4, 3, 2). Continuing:
6x1%4 = 4, so no need to keep trying 6x1
6x2%4 = 0
6x2%3 = 0
6x2%2 = 0
...so 6x2 works.
Derek
Friday, June 18, 2004
dorks.
muppet is now from madebymonkeys.net
Friday, June 18, 2004
The direct method for finding lowest common multiple is to use the prime factorization, i.e,
2, 3, 4, 6, have prime factorizations of:
2^1, 3^1, 2^2, 2^1*3^1.
Take the primes:
2 and 3
Take the highest exponents present:
2^2, 3^1
multiply = 12.
Ryan Anderson
Friday, June 18, 2004
But then you have the prime factorization first.
I think the best way is via the greatest common denominator, and the use the equation gcd(a, b) * lcm(a, b) = a * b to calculate the lcm.
I'd use Euler's method to calculate the gcd. In Python, but close enough to pseudocode for everyone to understand:
def gcd(a, b):
if b == 0:
return a
else:
return gcd(b, a % b)
def lcm(a, b):
return a*b/gcd(a, b)
For more than two numbers, note that
lcm(a, b, c) = lcm(lcm(a, b), c) (and the same for more numbers)
For four numbers, you could use:
lcm(a, b, c, d) = lcm(lcm(a, b), lcm(c, d))
In your example with the functions defined above, Python gives
lcm(lcm(6, 3), lcm(2, 4)) = 12
vrt3
Saturday, June 19, 2004
(errata: That's Euclidean algorithm, not Euler's method)
vrt3
Saturday, June 19, 2004
Thanks guys. vrt3 that's pretty much how I'm going to do it since GCD is simple to implement (I have to use c++) and I need to be able to change the number of rates and the rate values on the fly.
Brain dead today
Saturday, June 19, 2004
Recent Topics
Fog Creek Home
|