Voorbeeld echo-tijd berekening
Voorbeeld echo-tijd berekening
Hier een opgave uit de (nog te verschijnen) tekst "Een echo-effect is een kamfilter", voor leerlingen VWO die de NLT-module Sound Design doen:
Een (digitaal) signaal bestaat uit een mix van twee sinusgolven. Die zijn precies even hard en hebben frequenties van 105 Hz en 210 Hz. Door een echo toe te voegen wil je bereiken dat de hoge sinus twee keer zo hard klinkt als de lage.
(a) Welke echo-tijd heb je daar voor nodig?
(b) Schrijf code waarmee je dit echo-effect kunt uitvoeren.
(c) Hoe kun je met de computer controleren of je code het gewenste resultaat geeft? Gebruik twee methodes.
Om de juiste echo-tijd te vinden moet een vergelijking worden opgesteld die alleen maar numeriek (dus met de computer) kan worden opgelost. Dat doe je door de computer de grafiek van een functie te laten tekenen die zo is gedefinieerd dat de oplossing van de vergelijking bestaat uit de verzameling van punten waarin de grafiek de horizontale as snijdt (de nulpunten).
Op het oog zie je die punten direct en je kunt hun positie op de horizontale as ook wel redelijk schatten. Maar dat is iets anders dan de nulpunten met grote nauwkeurigheid automatisch vinden en opslaan! En dat laatste doe je in WaveWizard met de hierboven besproken functie "Geef indices zoek-interval".
De opgave geeft leerlingen een preset met onderstaand code-voorbeeld voor het vinden van de nulpunten van een voorbeeldfunctie. Die code kunnen ze aanpassen door een andere formule in te voeren en zo de juiste echo-tijd te vinden.
De voorbeeldpreset: voor welke waarde(n?) van x is x*log(x) - x^0,5 = 0?
De computer vindt één waarde: x = 3,4526548.
De nauwkeurigheid van het antwoord is regelbaar door het zoek-interval kleiner te maken.
Hieronder de grafiek van de functie f(x) = x*log(x) - x^0,5. Het nulpunt wordt aangegeven door een stip waarvan de x-coördinaat wordt gespecificeerd als de uitkomst van de "Geef indices zoek-interval". dat is dus die waarde x = 3,4526548.
Conclusie. Hier wordt een echo-effect gerealiseerd door een analyzer in de code op te nemen die eerst de juiste instelling van het effect (hier de echo-tijd) uitrekent. In dit voorbeeld bekijkt de analyzer een
wiskundige functie en leidt daar de waarde van een instelling uit af. Veel vaker komt het voor dat de analyzer gesampelde geluiden bestudeert en verwerkt. Ook daarvan zal ik nog voorbeelden geven.
Code:
!**************************************
! Preset vergelijking numeriek oplossen
!**************************************
!---------------------------------------------------------
! Voor welke waarde van x is x*log(x) - x^0,5 = 0 ?
!---------------------------------------------------------
Declareer x1; x2; s; domein; N
Naam Buffer F1 = X
Naam Buffer F2 = f
Wis buffers
Wis buffer (F1...F32, S1, S2, S3) X | f
x1 = 0,001 ! linker domeingrens
x2 = 10 ! rechter domeingrens
N = 10^4 ! aantal functiewaarden, maximaal 140.000
!---------------------------------------------------------
! het domein [x1,x2] is een lineaire functie X[n] = s*n+x1
! van het aantal functiewaarden, x1 en x2:
!---------------------------------------------------------
domein = x2 - x1
s = domein/N ! stapgrootte
Bewerk signaal
n0 0
n1 N
Bewerking X[n] = s*n + x1
!---------------------------------------------------------
! Evalueer x*log(x) - x^0,5 met de x-waarden van X[n]:
!---------------------------------------------------------
Bewerk signaal
n0 0
n1 N
Bewerking f[n] = X[n]*log(X[n]) - X[n]^0,5
!---------------------------------------------------------
! Zoek de nulpunten van f[X[n]]:
!---------------------------------------------------------
Geef indices zoek-interval
Zoekbuffer f[0]
indices naar Doelbuffer F3[0]
zoek x in a <= x <= b -0,0001; 0,0001
aantal N
! Melding in Memo:
! 'Geef indices zoek-interval: Indices = 1'.
! 'Indices' is een systeemvariabele waarin het
! aantal gevonden waarden wordt opgeslagen die
! voldoen aan zoekcriterium.
! In dit geval is er 1 functiewaarde gevonden:
! [COLOR="Red"]X[F3[0]][/COLOR] = 3,4526548 gevonden x-waarde
! f[F3[0]] = -7,49841879361668E-5 gevonden "nulpunt"
!---------------------------------------------------------
! Print de nulpunt-candidaten van f[X[n]:
!---------------------------------------------------------
FOR k = 0 TO Indices - 1
Print X[F3[k]] ! x-waarden
Print f[F3[k]] ! f(x)-waarden
NEXT k
!---------------------------------------------------------
Wis Grafiekvenster
Grafiekpapier
Linkerbovenhoek x; y (pix) 0; 0
Breedte; Hoogte (pix) 1200; 600
Domein x1; x2 x1; x2
Bereik y1; y2 -2; 7
Rooster x; y 1; 1
Pen
Kleur rood
Dikte 3
Modus continu
Grafiek van functie met 1 variabele
f[x] x*log(x) - x^0,5
Domein x1; x2
Modus continu
Stap s
Pen
Kleur zwart
Dikte 8
Modus continu
Punt [COLOR="Red"]X[F3[0]][/COLOR]; 0