Softwarová implementace pulzně šířkové modulace (PWM) je triviální. Pokud ovšem požadujeme co nejvyšší frekvenci generovaného signálu (tj. co nejrovnoměrnější rozprostření jedniček a nul), například proto, aby následná analogová filtrace byla co nejúčinnější, úloha se stává zajímavou.
Mějme funkci, která dostane požadovaný počet jedniček a požadovaný celkový počet bitů.
def gen(t1, tb):
# t1 ... total 1's
# tb ... total bits
# r1 ... remaining 1's
# rb ... remaining bits
r1 = t1
o = []
for rb in range(tb, 0, -1):
if r1 > 0 and r1*tb >= t1*rb:
o.append(1)
r1 -= 1
else:
o.append(0)
return o
Funkci otestujeme.
def ltos(l): return "".join(str(x) for x in l) assert ltos(gen(0, 8)) == "00000000" assert ltos(gen(1, 8)) == "10000000" assert ltos(gen(2, 8)) == "10001000" assert ltos(gen(3, 8)) == "10010010" assert ltos(gen(4, 8)) == "10101010" assert ltos(gen(5, 8)) == "10101101" assert ltos(gen(6, 8)) == "10111011" assert ltos(gen(7, 8)) == "10111111" assert ltos(gen(8, 8)) == "11111111"
Funguje.
Žádné komentáře:
Okomentovat