1. Welcome to TechPowerUp Forums, Guest! Please check out our forum guidelines for info related to our community.

small maths question

Discussion in 'Programming & Webmastering' started by ste2425, Mar 19, 2013.

  1. ste2425

    ste2425

    Joined:
    May 27, 2008
    Messages:
    3,369 (1.51/day)
    Thanks Received:
    366
    Location:
    Huddersfield, uk
    Hi all

    Sadly maths is not my strongest point so this may seem like a very basic question but hey ho....

    I have a range of values from 0-1023 how can i scale them down to 0-127?

    Its on a pic board from a pot ive sorted my ADC out, it combines the high and low byte and that's the value range it gives me.

    If possible it would be nice to know the equation of how you did it rather then just times by X etc. Then i can use it to control other parameters also.

    Many thanks guys n gals
  2. RCoon

    RCoon Forum Gypsy

    Joined:
    Apr 19, 2012
    Messages:
    6,293 (7.75/day)
    Thanks Received:
    2,743
    Location:
    Gypsyland, UK
    Found this on the interwebz

    Let's say you want to scale a range [min,max] to [a,b]. You're looking for a (continuous) function that satisfies
    f(min) = a
    f(max) = b

    In your case, a would be 1 and b would be 30, but let's start with something simpler and try to map [min,max] into the range [0,1].

    Putting min into a function and getting out 0 could be accomplished with
    f(x) = x - min ===> f(min) = min - min = 0

    So that's almost what we want. But putting in max would give us max - min when we actually want 1. So we'll have to scale it:
    x - min max - min
    f(x) = --------- ===> f(min) = 0; f(max) = --------- = 1
    max - min max - min

    which is what we want. So we need to do a translation and a scaling. Now if instead we want to get arbitrary values of a and b, we need something a little more complicated:
    (b-a)(x - min)
    f(x) = -------------- + a
    max - min

    You can verify that putting in min for x now gives a, and putting in max gives b.

    You might also notice that (b-a)/(max-min) is a scaling factor between the size of the new range and the size of the original range. So really we are first translating x by -min, scaling it to the correct factor, and then translating it back up to the new minimum value of a.
    ste2425 says thanks.
  3. Kreij

    Kreij Senior Monkey Moderator Staff Member

    Joined:
    Feb 6, 2007
    Messages:
    13,881 (5.12/day)
    Thanks Received:
    5,615
    Location:
    Cheeseland (Wisconsin, USA)
    ... or given the numbers (scale) in the OP, you could just divide by 8 and toss the remainder (truncate don't round).
    This is the same as doing 3 shift rights in a digital circuit or if working with binary (integer) data. Y = X >> 3
    Last edited: Mar 19, 2013
    hellrazor, ste2425 and FordGT90Concept say thanks.
  4. W1zzard

    W1zzard Administrator Staff Member

    Joined:
    May 14, 2004
    Messages:
    14,630 (3.94/day)
    Thanks Received:
    11,360
    shift is what you want to use as it's the fastest
    ste2425 says thanks.
  5. Kreij

    Kreij Senior Monkey Moderator Staff Member

    Joined:
    Feb 6, 2007
    Messages:
    13,881 (5.12/day)
    Thanks Received:
    5,615
    Location:
    Cheeseland (Wisconsin, USA)
    When working with integer data, don't most of the (good) compilers do this anyway even if you code using arithmetic operator instead of byte/word level shift operations?
  6. W1zzard

    W1zzard Administrator Staff Member

    Joined:
    May 14, 2004
    Messages:
    14,630 (3.94/day)
    Thanks Received:
    11,360
    yup

Currently Active Users Viewing This Thread: 1 (0 members and 1 guest)

Share This Page