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.