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%)
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%)
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 |