20. 11. 2015

Pulzně šířková modulace

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.