cube-kl/firmware/scripts/wspr_params.py

47 lines
1.2 KiB
Python

#!/usr/bin/env python3
from fractions import Fraction
from math import floor
PLL_FREQ = 800.0 * 10**6
SYMBOL_COUNT = 4
# http://www.g4jnt.com/wspr_coding_process.pdf
FREQ_SHIFT = Fraction(12000,8192) # What the fractional fuck?
# 7.040000 - 7.040200
BASE_FREQ = 7.040100 * 10**6
# Maximum c
MAX_DENOM = 0x0FFFFF
def main():
print("struct si5351_params WSPR_SYMBOLS[%d] = {" % SYMBOL_COUNT)
for i in range(0, SYMBOL_COUNT):
symbol_freq = Fraction(BASE_FREQ) + Fraction(i) * FREQ_SHIFT
divider = Fraction(PLL_FREQ) / symbol_freq
divider = divider.limit_denominator(MAX_DENOM)
a = floor(divider.numerator / divider.denominator)
b = divider.numerator % divider.denominator
c = divider.denominator
print("\t// %f: %d + %d / %d" % (symbol_freq, a, b, c))
actual = PLL_FREQ / (a + b/c)
print("\t// actual: %f" % actual)
# See https://www.silabs.com/documents/public/application-notes/AN619.pdf
p1 = 128 * a + floor(128 * b/c) - 512
p2 = 128 * b - c * floor(128 * b/c)
p3 = c
print("\t{%d, %d, %d}," % (p1, p2, p3))
print("};")
if __name__ == '__main__':
main()