Dr.Godfried-Willem RAES

Kursus Experimentele Muziek: Boekdeel 1: Algoritmische kompositie

Hogeschool Gent : Departement Muziek & Drama


<Terug naar inhoudstafel kursus>    

1158

Golfvorm naar bitstroom omzetting

De hier gegeven procedures kunnen worden gebruikt om sample-data, bevat in een array om te zetten naar een spektraal gezien equivalent pulsbreedte gemoduleerd signaal dat slechts uit 1 enkel bit bestaat.

SUB Shape2Pwm (Shape!(), Pwm%(), NrTicks%)

  • We gaan uit van de afgeleide van de golfvorm (de delta-waarden) voor de berekening van de PWM-konversie. De resolutie (in bits) van het PWM signaal dat zal berekend worden is een funktie van de parameter NrTicks%. Voor een 8-bit PWM konversie moet NrTicks% = 256.
  • i% = 1: j% = 0

    sigma! = 0

    REDIM Ar!(0 TO 0)

    DO

    delta! = Shape!(i%) - Shape!(i% - 1)

    tek% = SGN(delta!)

    sigma! = sigma! + ABS(delta!)

    i% = i% + 1

    IF tek% = oldtek% THEN

    Ar!(j%) = Ar!(j%) + delta!

    oldtek% = tek%

    ELSE

    j% = j% + 1

    REDIM PRESERVE Ar!(0 TO j%)

    Ar!(j%) = delta!

    oldtek% = tek%

    END IF

    LOOP UNTIL i% > UBOUND(Shape!)

  • Ar!() bevat nu positieve en negatieve tijdsduurwaarden. De totale duur is sigma!. Wanneer we alle waarden in Ar!() delen door sigma! Dan verkrijgen we een normalisatie naar tijd = 1. Hier voeren we een 'rescale' en normalizatie naar tijd = NrTicks% uit:
  • NormConst! = NrTicks% / sigma!

    newsize% = 0

    FOR i% = 0 TO UBOUND(Ar!)

    Ar!(i%) = Ar!(i%) * NormConst!

    tek% = SGN(Ar!(i%))

    nrpulses% = INT(ABS(Ar!(i%)))

    IF nrpulses% THEN

    oldj% = newsize%

    newsize% = newsize% + nrpulses%

    REDIM PRESERVE Pwm%(0 TO newsize%):

  • This gives best result but the size of pwm%() will always be smaller or equal than the requested NrTicks%. To avoid this, we can fix the size of Pwm% to NrTicks, by dimensioning Pwm% prior to loop entering the loop, giving a larger error, but always predictable size... The end of the bitstream may then contain unjustified zero's
  • SELECT CASE tek%

    CASE -1

    FOR j% = oldj% TO oldj% + nrpulses% - 1

    Pwm%(j%) = 0

    NEXT j%

    CASE 1

    FOR j% = oldj% TO oldj% + nrpulses% - 1

    Pwm%(j%) = 1

    NEXT j%

    END SELECT

    END IF

    NEXT i%

    ERASE Ar!

    END SUB

    Het zal duidelijk zijn dat we na uitvoering van de hierboven gegeven procedure een array verkrijgen waarin elke positie ingenomen wordt door een integer die slechts de waarden 1 of 0 kan aannemen. In dit formaat springen we dus bijzonder kwistig om met geheugenruimte.

    Hetzelfde Pwm%() array is immers bij machte om 16 kanalen aan PWM gekodeerde informatie te omvatten, wanneer we elke bitpositie in de integers met een kanaal laten overeenkomen.

    Een optimaal gekompakteerde wijze om PWM-data voor een enkel kanaal op te slaan kan gebruik makend van het string-formaat. De procedure-kode voor de omzetting ziet er dan uit alsvolgt:

    FUNCTION Pwm2BitStream$ (Pwm%(), bit%)

  • This function returns a string corresponding to the binary pwm-stream coded in the bitposition given in bit%. bit% should be 0 to 15 , thus allowing 16 channels in a single pwm%() array.
  • BitStream$ = ""

    mask% = 2 ^ bit%

    DO

    FOR i% = 0 TO 7

    kode% = 0

    IF j% + i% > UBOUND(Pwm%) THEN EXIT FOR

    IF Pwm%(j% + i%) AND mask% THEN

    kode% = kode% OR (2 ^ i%)

    END IF

    NEXT i%

    BitStream$ = BitStream$ + CHR$(kode%)

    j% = j% + 8

    LOOP

    Pwm2BitStream$ = BitStream$

    END FUNCTION

    Zoals we zagen of zullen zien in hoofdstuk 2, waarin we de elektronische hardware behandelen, lenen PWM signalen zich erg goed voor de realisatie van uiterst eenvoudige digitaal naar analoog omzetters. Een simpele integrator en enige filtering volstaat om zo'n pwm-signaal terug in een analoge golfvorm om te toveren... Deze techniek ligt trouwens aan de basis van de meeste monofone geautomatiseerde blaasinstrumenten die we bouwden.


    Filedate: 980129/ last update: 2009-03-30

    Terug naar inhoudstafel kursus: <Index Kursus> Naar homepage dr.Godfried-Willem RAES Robots