46 lines
1.4 KiB
Python
46 lines
1.4 KiB
Python
#!/usr/bin/env python3
|
|
|
|
import math
|
|
|
|
# Adapt these constants to the step attenuator
|
|
BITS_OF_ATTENUATION = 7
|
|
LSB_ATTENUATOR_DB = 0.25
|
|
NUMBER_LINEAR_ATTENUATION_STEPS = 128
|
|
|
|
file = open("AMdepth.dat", "w")
|
|
|
|
def bindigits(n, bits):
|
|
s = bin(n & int("1"*bits, 2))[2:]
|
|
return ("{0:0>%s}" % (bits)).format(s)
|
|
|
|
for i in range(NUMBER_LINEAR_ATTENUATION_STEPS):
|
|
# calculate percentage of attenuation
|
|
percent = float(i) / (NUMBER_LINEAR_ATTENUATION_STEPS - 1)
|
|
# calculate attenuation in dB
|
|
if percent < 1:
|
|
required_dB = -20*math.log10(1 - percent)
|
|
else:
|
|
required_dB = 999
|
|
# round to attenuator steps
|
|
attenuator_dB = round(required_dB / LSB_ATTENUATOR_DB) * LSB_ATTENUATOR_DB
|
|
# convert to digital attenuator value
|
|
attenuator_step = int(attenuator_dB / LSB_ATTENUATOR_DB)
|
|
# constrain
|
|
if attenuator_step < 0:
|
|
attenuator_step = 0
|
|
elif attenuator_step >= pow(2, BITS_OF_ATTENUATION):
|
|
attenuator_step = pow(2, BITS_OF_ATTENUATION) - 1
|
|
output = bindigits(attenuator_step, BITS_OF_ATTENUATION)
|
|
file.write(output+"\n")
|
|
|
|
# Calculate actual attenuation
|
|
actual_dB = attenuator_step * LSB_ATTENUATOR_DB
|
|
actual_percent = 1 - pow(10, -actual_dB/20)
|
|
|
|
percent_desired = round(percent*100, 2)
|
|
percent_actual = round(actual_percent*100, 2)
|
|
|
|
print(f'Target modulation: {percent_desired:.2f}, target dB: {required_dB:.2f}, attenuator setting: {attenuator_step}, achieved dB: {actual_dB}, achieved modulation: {percent_actual:.2f}')
|
|
|
|
file.close()
|