Racket/EFRW

Från Täpp-Anders
Hoppa till navigeringHoppa till sök
#lang racket

;; Täpp-Anders Sikvall, SM5UEI
;; <sm5uei@sikvall.se>
;;
;; Public Domain
;;
;; Koden den är fri att använda för den som vill och återanvända 
;; och pyssla vidare med den som du vill. Jag blir glad om 
;; jag omnämns i vidareutvecklingar och gör du förbättringar så
;; skicka de gärna till mig.
;;
;; =====================================================
;; Ändmatad antenn – längdintervall + vilka band som träffas
;; =====================================================

(define c 299.792458)   ; m×MHz

;; Svenska band, kommentera bort de band du inte är intresserad av att köra!
(define bands
  '((1.810  2.000   "160m")
    (3.500  3.800   "80m")
    (5.3515 5.3666  "60m")
    (7.000  7.200   "40m")
;    (10.100 10.150  "30m")
    (14.000 14.350  "20m")
    (18.068 18.168  "17m")
    (21.000 21.450  "15m")
    (24.890 24.990  "12m")
    (28.000 29.700  "10m")
    (50.000 52.000  "6m")))

;; Returnerar lista med band som L är dåliga för en given längd
(define (bad-bands L tol)
  (filter-map
   (λ (band)
     (define fmin (first band))
     (define fmax (second band))
     (define name (third band))
     (define fmin-forb (* fmin (- 1 tol)))
     (define fmax-forb (* fmax (+ 1 tol)))
     (for/or ([n (in-range 1 400)])
       (define f-res (/ (* n c) (* 2.0 L)))
       (and (>= f-res fmin-forb) (<= f-res fmax-forb)
            name)))
   bands))

(define (bad-length? L tol)
  (not (null? (bad-bands L tol))))

(define (good-lengths min-L max-L step tol)
  (for/list ([L (in-range min-L (+ max-L 0.0001) step)]
             #:when (not (bad-length? L tol)))
    L))

(define (group-into-ranges goods step)
  (if (null? goods)
      '()
      (let loop ([lst (sort goods <)]
                 [ranges '()]
                 [start (first goods)]
                 [prev (first goods)])
        (cond
          [(null? lst) (reverse (cons (list start prev) ranges))]
          [else
           (define current (first lst))
           (if (<= (- current prev) (+ step 0.0001))
               (loop (rest lst) ranges start current)
               (loop (rest lst)
                     (cons (list start prev) ranges)
                     current
                     current))]))))

(define (print-range r vf end-corr)
  (define elec-start (first r))
  (define elec-end   (second r))
  (define phys-start (* elec-start vf end-corr))
  (define phys-end   (* elec-end   vf end-corr))
  (define s1 (~r elec-start #:precision 1))
  (define s2 (~r elec-end   #:precision 1))
  (define p1 (~r phys-start #:precision 1))
  (define p2 (~r phys-end   #:precision 1))
  (if (equal? s1 s2)
      (printf "~a m (elektrisk)  →  ~a m (fysisk)\n" s1 p1)
      (printf "~a–~a m (elektrisk)  →  ~a–~a m (fysisk)\n" s1 s2 p1 p2)))

;; ====================== HUVUDFUNKTION ======================
(define (print-suggestions
         #:min-L     [min-L     10.0]
         #:max-L     [max-L     70.0]
         #:step      [step      0.01]
         #:tol       [tol       0.03]
         #:vf        [vf        0.96]
         #:end-corr  [end-corr  0.97])
  
  (define goods (good-lengths min-L max-L step tol))
  (define ranges (group-into-ranges goods step))

  (printf "=== Bra längdintervall för ändmatad antenn ===\n")
  (printf "Intervall: ~a–~a m   Steg: ~a m   Tolerans: ~a%\n" 
          min-L max-L step (* tol 100))
  (printf "VF: ~a   End-effect: ~a (~a% förkortning)\n\n"
          vf end-corr (round (* (- 1 end-corr) 100)))

  (if (null? ranges)
      (printf "Inga bra längder hittades.\n")
      (begin
        (for ([r ranges])
          (print-range r vf end-corr))
        (printf "\nTotalt ~a bra intervall (~a punkter).\n" 
                (length ranges) (length goods))))

  (printf "\n"))
  
;; =====================================================
;; KÖR PROGRAMMET
;; =====================================================

(print-suggestions 
  #:min-L 7        ;; Kortaste antenntråden att kika på
  #:max-L 50       ;; Längsta antenntråden att kika på
  #:step 0.01      ;; Steglängd i meter
  #:tol 0.03       ;; Hur nära resonans tillåter vi (3% = 0.03)
  #:vf 0.96        ;; Hastighetsfaktorn för plastad koppartråd
  #:end-corr 0.97  ;; Ändkorrigerinsfaktor
  )