- Downlink origin (at satellite) `dl_o`
- Downlink observed (at radio) `dl_x` (Davidoff uses dl*, but I can't get my math code to make the subscripted star)
- Uplink origin (at radio) `up_o` (Davidoff uses ulo, but 'ul' means 'underline' in my math markup)
- Uplink observed (at satellite) `up_x`
- Speed of light `c`
- Relative velocity of signal origin (in same units as `c`) `v_r`
- Band center for downlink `bc_d`
- Band center for uplink `bc_u`
then we can determine that
`dl_o = (dl_x)/(1-v_r/c)`
Now, in the tuning code of satpack, we already have both `dl_o` and `dl_x`. In fact, when the user tunes the radio, it is `dl_o` that the code changes, then feeds that value into the next set of frequency calculations and tunes the radio accordingly. The impression is that one is tuning the radio normally. However, we want to work out what frequency we should transmit on, that is `up_o`, based on this information. By the same reasoning as above,
`up_o = (up_x)/(1-v_r/c)`
All we have to do now is derive `up_o` from `dl_o`. To do this, we need to take into account the shifting that takes place due the transponder being inverting or non-inverting. First, remember that at the satellite we have the origin of the downlink and the observed frequency of the uplink: our formulas here should relate to `dl_o` and `up_x`.
According to this helpful pdf, for a non-inverting (or direct) transponder,
`dl_o = K1 + up_x`, where `K1 = bc_d - bc_u`, so
`dl_o = bc_d -bc_u + up_x`
`up_x = dl_o - bc_d + bc_u`
The result is that for non-inverting transponders, the equation is this:
`up_o = (dl_o - bc_d + bc_u)/(1-v_r/c)`
For inverting transponders, it states that `dl_o = bc_d + bc_u - up_x`, so
`up_x = bc_d + bc_u - dl_o`
`up_o = (bc_d + bc_u - dl_o) / (1 - v_r/c)`
These formulas pass one important dummy test. If `dl_o` is at the center of the downlink band, then `dl_o = bc_d`, and in both formulas this means that all that is left is `bc_u`, and so the uplink will aim for the center of the satellite's uplink passband, too. Put it another way, these formulas work for FM birds, and it doesn't matter if you stipulate that these are non-inverting or inverting.
Playing around with a spreadsheet, I can convince myself that these are right in the case that `bc_d > bc_u`, or Mode V/U. I'm not sure if there is additional work that's needed when `bc_u > bc_d`, such as in Mode U/V.
1. Martin Davidoff, The radio amateur's satellite handbook, 1st ed. (Newington CT: American Radio Relay League, 1998).