hz.tools/rf: go bindings for frequency operations

Paul Tagliamonte 2023-02-22 project

The hz.tools/rf library contains the abstract concept of frequency, and some very basic helpers to interact with frequency ranges (such as helpers to deal with frequency ranges, or frequency range math) as well as frequencies and some very basic conversions (to meters, etc) and parsers (to parse values like 10MHz). This ensures that all the hz.tools libraries have a shared understanding of Frequencies, a standard way of representing ranges of Frequencies, and the ability to handle the IO boundary with things like CLI arguments, JSON or YAML.

The git repo can be found at github.com/hztools/go-rf, and is importable as hz.tools/rf.

    // Parse a frequency using hz.tools/rf.ParseHz, and print it to stdout.
        freq := rf.MustParseHz("-10kHz")

        fmt.Printf("Frequency: %s\n", freq+rf.MHz)
    // Prints: 'Frequency: 990kHz'

    // Return the Intersection between two RF ranges, and print
    // it to stdout.
        r1 := rf.Range{rf.KHz, rf.MHz}
        r2 := rf.Range{rf.Hz(10), rf.KHz * 100}

        fmt.Printf("Range: %s\n", r1.Intersection(r2))
    // Prints: Range: 1000Hz->100kHz

These can be used to represent tons of things - ranges can be used for things like the tunable range of an SDR, the bandpass of a filter or the frequencies that correspond to a bin of an FFT, while frequencies can be used for things such as frequency offsets or the tuned center frequency.