Racket/EFRW: Skillnad mellan sidversioner
Från Täpp-Anders
Hoppa till navigeringHoppa till sök
Anders (diskussion | bidrag) Skapade sidan med '<pre> #lang racket ;; ===================================================== ;; Ä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.00...' |
Anders (diskussion | bidrag) Ingen redigeringssammanfattning |
||
| Rad 2: | Rad 2: | ||
#lang racket | #lang racket | ||
;; Denna kod är skriven av Täpp-Anders Sikvall, SM5UEI | |||
;; 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 du kan gärna skicka | |||
;; den till <anders@sikvall.se> om du gjort förbättringar. | |||
;; | |||
;; ===================================================== | ;; ===================================================== | ||
;; Ändmatad antenn – längdintervall + vilka band som träffas | ;; Ändmatad antenn – längdintervall + vilka band som träffas | ||
Versionen från 21 juni 2026 kl. 21.28
#lang racket
;; Denna kod är skriven av Täpp-Anders Sikvall, SM5UEI
;; 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 du kan gärna skicka
;; den till <anders@sikvall.se> om du gjort förbättringar.
;;
;; =====================================================
;; Ä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
)