Satellite Aerial Link Budget

I’ve had a little luck transmitting to a satellite. I’m using packet as I can use the 2m Cebik Moxon aerial for both transmit and receive. To see if the ISS should be able to hear my signals I wrote a link budget program in Racket. There’s a few assumptions in it but it seems to confirm the ISS should have no problem hearing me on 2m. The program shows:

Transmit power (W)?
5
Frequency (MHz)?
145.825
Elevation (°)?
40
Transmit power:   5 W (36.99 dBm)
Frequency:        145.825 MHz
Satellite height: 403 km
Elevation angle:  40°

Satellite is 5396 km away
Signal at satellite is 9 dB above noise

This seems borne out as I do receive what seem to be digipeated packets just after I transmit them. But I can’t confirm on the ISS site that they are real and not just an echo from somewhere.

70cms doesn’t look as good:

Transmit power (W)?
5
Frequency (MHz)?
435.255
Elevation (°)?
40
Transmit power:   5 W (36.99 dBm)
Frequency:        435.255 MHz
Satellite height: 403 km
Elevation angle:  40°

Satellite is 5396 km away
Signal at satellite is -0 dB above noise

Increasing the power to 25W might work:

Transmit power (W)?
25
Frequency (MHz)?
435.255
Elevation (°)?
40
Transmit power:   25 W (43.98 dBm)
Frequency:        435.255 MHz
Satellite height: 403 km
Elevation angle:  40°

Satellite is 5396 km away
Signal at satellite is 7 dB above noise

I’m currently building the 70cms version and will try some FM voice contacts.

Here’s the link budget program:

#lang racket
; link budget for Cebik Moxon in attic
; Andy Fletcher Jan 9, 2019 

;
; definitions
;
(define (get_user_input prompt)
  (begin
    (displayln prompt)
    (string->number (read-line))))

(define (log10 n)
  (/ (log n) (log 10)))

(define (watts2dbm w)
  (* 10 (log10 (* w 1000))))

(define (degrees2radians d)
  (* (/ pi 180) d))

(define (square x)
  (* x x))

; distance to satellite in km
(define (satellite_distance e_degrees height)
  (let* ([e (degrees2radians e_degrees)]
         [earth_radius 6371]    ; kms
         [r (+ height earth_radius)] ; distance between geocentre and satellite
         )
    (sqrt (+ (square (* earth_radius (cos e))) (square r) (- (square earth_radius)) (- (* earth_radius (cos e)))))))

; free space path loss
(define (fspl f d)
  (- (+ (* 20 (log10 f)) (* 20 (log10 d)) 32.45)))

;
; execute
;
(let* (
       [ptx_watts (get_user_input "Transmit power (W)?")]
       [f         (get_user_input "Frequency (MHz)?")]
       [e_degrees (get_user_input "Elevation (°)?")]
       [h 403]               ; satellite height in kms
       [cable_loss -3.55]    ; measured dB
       [tx_gain 6.0]         ; Cebik Moxon modelled gain in dB
       [roof_loss -6.0]      ; assumed loss of signal going through the roof in dB
       [rx_gain 2.0]         ; assumed receive gain at satellite in dB
       [sat_max_sens 124.0]  ; assumed satellite maximum sensitivity in dBm
       [distance_to_satellite (satellite_distance e_degrees h)]
       [ptx (watts2dbm ptx_watts)]
       )
  (begin
    (printf "Transmit power:   ~a W (~a dBm)\n" ptx_watts (~r ptx #:min-width 1 #:precision 2))
    (printf "Frequency:        ~a MHz\n" f)
    (printf "Satellite height: ~a km\n" (~r h #:min-width 1 #:precision 0))
    (printf "Elevation angle:  ~a°\n" e_degrees)
    (printf "\nSatellite is ~a km away\n" (~r distance_to_satellite #:min-width 1 #:precision 0))
    (printf "Signal at satellite is ~a dB above noise\n"
            (~r  (+ ptx cable_loss tx_gain roof_loss (fspl f distance_to_satellite) rx_gain sat_max_sens) #:min-width 1 #:precision 0))))

Leave a Reply

Your email address will not be published. Required fields are marked *