§1 §2 §3 §4 §5 §6
Inleiding Spectrum en sonogram Laagdoorlaat- en Banddoorlaatfilter Frequentieresponsie en pulsresponsie van een filter "Klankwet" Tijdvariant filter
§ Inleiding In Hoofdstuk 3 en 4 hebben we kennis gemaakt met verschillende bewerkingen van signalen. Bijvoorbeeld in opdracht 3.8 heb je signalen versterkt en gemixt en in H4 maakten we een geluid steeds harder (infaden) door het te vermenigvuldigen met een stuursignaal dat lineair toeneemt. Bewerkingen waarbij de tijd de onafhankelijke variabele is worden in de signaaltheorie meestal simpelweg aangeduid als bewerkingen in het tijddomein. In dit hoofdstuk gaan we het vooral hebben over bewerkingen waarbij niet de tijd, maar de frequentie de onafhankelijke variabele is, kortom met bewerkingen in het frequentiedomein. Als je een bewerking verricht op een signaal in het ene domein, dan is die natuurlijk ook merkbaar en uitdrukbaar in het andere (Opdracht 5.7). Maar wel is het vaak zo dat een bepaald geluidseffect in één domein veel duidelijker waarneembaar of gemakkelijker te maken of eenvoudiger uit te leggen is dan in het andere. In dit hoofdstuk gaan we het vooral hebben over filters en gebruiken die voornamelijk om de klankkleur van een geluid te veranderen. Klankkleur is echt zo'n term die behoort tot het frequentiedomein, want de klankkleur van een geluid hangt bijna volledig af van de contour van het spectrum. Als de spectraallijnen van de hogere frequenties van een toon duidelijk langer zijn dan die van de lagere, dan klinkt een geluid scherp of schetterend. Overheersen de lagere frequenties in het spectrum, dan klinkt een toon dof. De spectrum-contour kan ook glooien als een heuvellandschap. Bij veel muziekinstrumenten en vooral bij spraak is dat het geval. Bijvoorbeeld de "AA"-klank geeft pieken op andere plaatsen in het spectrum dan de "OO". Zo'n glooiing of piek moet je niet verwarren met een spectraallijn; het gaat om de contour, de trend die de lengten van de spectraallijnen te zien geven. Met filters kun je de contour van het spectrum elke gewenste vorm geven en daarmee de klank ingrijpend veranderen. Ook spraaksynthese met de computer is ondenkbaar zonder filters.
1
§2 Spectrum en sonogram Opdracht 5.1 Analyse van toon akoestische gitaar 5.1a Open bestand Gitaar hoge E. wav en speel het af. 5.1b Bepaal op twee manieren de toonhoogte, zoals je deed in Opdracht 4.8c en d. Antwoord: methode I: periodetijd bepalen a.d.h.v. aantal samples over meerdere perioded met linker en rechter muisklik in grafiek spoor S1. Bijv: het fragment (Links = 1459, Rechts = 2396) omvat 7 periodes, dus T = (2396 − 1459) / 7 = 133,86 Ts → f = 329,45 Hz. methode II: gevonden waarde invoeren in Scoop-venster bij Trigger Frequentie. Het antwoord van methode I wordt bevestigd. 5.1c Je zou de twee methodes die je zojuist toepaste kunnen aanduiden als echte tijddomeinmethodes. Nu gaan we daar een frequentiedomein-methode aan toevoegen. Kijk in het venster van de Scoop / Spectrum Analyzer eens naar het spectrum. Schuif YFac naar ongeveer 20. Als je op Speel af klikt, zie je dat het spectrum bestaat uit een aantal afzonderlijke lijnen die op en neer gaan, maar ook geleidelijk steeds korter worden, naarmate de toon zachter wordt. Om een beter beeld te krijgen van die spectraallijnen zet je een vinkje bij Hann-Venster. Verder activeer je Gem en klikt op de Reset-knop daarnaast. Klik opnieuw op Speel af. De contouren van de spectraallijnen blijven zichtbaar nadat de toon al is uitgedempt. Het grote voordeel van de Spectrum Analyzer is dat je steeds het spectrum ziet dat hoort bij het geluid dat je op dat moment hoort. Zoals in H2 al werd opgemerkt, berekent WaveWizard 20 keer per seconde het spectrum en beeldt dat af. Deze opname van een gitaartoon duurt 15 seconde en er worden dus 15 X 20 = 300 beelden geproduceerd. Soms wil je graag al die beelden tegelijk zien om een overzicht te krijgen van het tijdsverloop van het spectrum. Daarop is precies te zien hoe elke spectraallijn langer en korter wordt. Zo'n afbeelding van het spectraal verloop noemen we een sonogram. Ook met WaveWizard kun je sonogrammen maken. Met de code hieronder maak je een sonogram van de gitaartoon zoals die nu op spoor S1 staat. (Je kunt de functie ook bereiken in menu Analyse → Sonogram): WAVE->Sonogram(1): Buffer en index (s1, s2, s3) lengte fragment (ook 'sec') FFT-venster (in bits: 8...16) Venstergrootte (ook 'sec') vensterverplaatsing (ook 'sec') weergave in decibel ('dB') of lineair ('lin') kleur van laagste amp ('R', 'G' of 'B') kleur van laagste amp ('R', 'G' of 'B') helderheid Hann-window ('j' of 'n') Animatie ('j' of 'n')
S1[0] 5 sec 13 8000 0,01 sec dB R B 100 j n
Fig. 5.1 geeft weer wat je op het beeldscherm te zien krijgt. In het sonogram wordt elke spectraallijn weergegeven door één beeldpunt. Hoe langer de spectraallijn die je met de Spectrum Analyzer ziet, des te helderder het corresponderende punt in het sonogram. Op elke horizontale lijn wordt één spectrum weergegeven. Net als in de spectrum-plaatjes van de Spectrum Analyzer wordt de frequentie weergegeven langs de horizontale as. De afzonderlijke plaatjes van de Spectrum Analyzer worden in het sonogram in verticale richting weergegeven - dus de verticale as stelt de tijd voor. Het sonogram kun je dus beschouwen als een tijdfrequentie-afbeelding. Realiseer je goed dat je in het sonogram precies dezelfde informatie ziet als in de hele reeks snel afwisselende spectraalplaatjes van de Spectrum Analyzer. Een groot verschil met de Spectrum Analyzer is, dat het sonogram veel meer details laat zien: de frequentie-resolutie is maar liefst 8 maal zo hoog. Je kunt dat onmiddellijk zien aan de onderling afstanden tussen de spectraallijnen.
2
5.1d
5.1e
5.1f
5.1g
5.1h
Beweeg de muis naar de meest linkse spectraallijn en plaats die precies in het midden. Welke frequentie lees je af in het vakje linksboven het sonogram (zie Fig. 5.1)? Vergelijk die waarde met je antwoord van 5.1b. Antwoord: 328 Hz Beweeg de muis naar de tiende spectraallijn van links, bepaal ook daarvan de frequentie en deel die door 10. Vergelijk die waarde met je antwoord van 5.1b. Antwoord: 329,5 Hz Wat betekent het dat de spectraallijnen van de hogere frequenties in verticale richting korter zijn dan die van de lagere? Hoe komt dat tot uitdrukking in de klank?
Antwoord: in verticale richting wordt de tijd weergegeven. De hogere spectraalcomponenten klinken minder lang door dan de lagere. De klank wordt daardoor steeds doffer. In het sonogram is te zien dat er gedurende de eerste seconden links van de eerste spectraallijn nogal wat "onregelmatige" trillingsactiviteit is. Waarmee correspondeert die in het geluid dat je hoort? Antwoord: je hoort dat de andere snaren zacht meeklinken en ook de resonantie van de klankkast is hoorbaar. Hoe ziet het sonogram eruit van: (1) een sinustoon die steeds zachter wordt; (2) een sinustoon waarvan de frequentie lineair toeneemt (zie bijv. Opdracht 2.11a); (3) ruis die na 1 sec begint en 2 seconden duurt. Verifieer je antwoorden door de geluiden van (1), (2) en (3) te maken en de sonogrammen ervan af te beelden. Antwoord: (1) verticale rechte neemt naar boven toe in helderheid af. (2) rechte begint links onder en eindigt rechts boven. Helderheid constant.
3
5.1i
5.1j
(3) het sonogram is een ruisband over het hele frequentiegebied met verticale breedte van 2 sec. Open Raaf.wav. Je hoort dat de toonhoogte van de raafstem niet constant is, maar steeds eerst snel omhoog en dan wat langzamer weer omlaag gaat. Hoe vind je dat terug in het sonogram? Antwoord: de boventonen van de raafstem zijn zichtbaar als krommen in verticale richting die eerst snel naar rechts en dan wat langzamer weer naar links buigen. Als je goed luistert, dan hoor je tussen de roepen van de raaf door ook de galm van het bos! Is die galm ook terug te vinden in het sonogram? Antwoord: de roepen zelf zijn zichtbaar als lichtende horizontale stroken met daarin de boventonen. In de stiltes tussen de roepen is het niet helemaal donker, vooral niet rond de sterkste boventonen, daar is een soort "uitsmering in de tijd" te zien die geleidelijk vervaagt. Daaraan is ook ook de tijdrichting van het sonogram af te lezen!
§3 Laagdoorlaat- en Banddoorlaatfilter Electronische filters bestaan al zeker zo'n jaar of tachtig. Je kunt een filter construeren met elementaire electronische componenten die je ook in de natuurkundeles tegenkomt, zoals weerstanden, spoelen en condensators. Daarmee kun je een spectrum-contour op heel uiteenlopende manieren wijzigen: in het ene frequentiegebied kunnen spectraallijnen worden versterkt en in het andere gebied worden onderdrukt. Juist dat onderdrukken leidde al snel tot de term filter. Misschien is het goed om te onthouden dat een filter nooit een heel frequentiegebied volledig kan afstoppen, maar hoogstens onderdrukken. ♣ Verderop introduceren we de filterfunctie (frequentieresponsie) V(f) en die kan voor afzonderlijke waarden van f wel nul zijn. Akoestisch voorbeeld: een reflectie is een frequentieafhankelijke geluidsbewerking en dus een filter; door interferentie kan wel een sinustoon van zekere frequentie volledig nul worden, maar niet een heel frequentiegebied. Wel kun je die onderdrukking zo sterk maken dat je in het onderdrukte frequentiegebied echt geen enkele toon meer hoort. Vaak worden filters simpelweg genoemd naar de manier waarop ze op de spectrale contour inwerken, zoals we in de volgende opdrachten zullen zien. We onderscheiden verschillende type filters, waarvan met name het laagdoorlaat- en het banddoorlaatfilter veel voorkomen. In Fig. 5.2 zie je van beide types een aantal voorbeelden.
4
5
Opdracht 5.2 Bandbreedte van spraak vaststellen d.m.v. een Laagdoorlaatfilter 5.2a Open bestand Weerbericht.wav. (dit is een opname van de FM-radio). Bekijk in het Scoop / Spectrum Analyzer venster het spectrum en maak een sonogram, ditmaal met een wat andere instelling: WAVE->Sonogram(1): Buffer en index (s1, s2, s3) lengte fragment (ook 'sec') FFT-venster (in bits: 8...16) Venstergrootte (ook 'sec') vensterverplaatsing (ook 'sec') weergave in decibel ('dB') of lineair ('lin') kleur van laagste amp ('R', 'G' of 'B') kleur van laagste amp ('R', 'G' of 'B') helderheid Hann-window ('j' of 'n') Animatie ('j' of 'n')
5.2b
S1[0] 15 sec 11 2000 0,01 sec dB R B 100 j n
Hoe groot is het actieve frequentiegebied in het sonogram? Hoe is de verstaanbaarheid? Antwoord: ongeveer 18 kHz. Verstaanbaarheid: uitstekend. We gaan nu het hogere gedeelte van deze frequentieband zeer sterk onderdrukken met behulp van een filter. We zetten het resultaat op spoor S3. Voer de volgende code uit: WAVE->Butterworth Laagdoorlaat(1): Input s1[0] Output s3[0] Afsnijfrequentie (Hz) 5000 Flanksteilheid (1,2,3...50) 10 Duur (ook 'sec') 13 sec Volume (0...100) 1 Additief ('j' of 'n') n
5.2c
5.2d
Gebruik het Scoop / Spectrum Analyzer venster om het gefilterde en het ongefilterde geluid met elkaar te vergelijken en maak daarbij ook gebruik van Gem en eerst op de Reset-knop daarnaast voordat je het geluid afspeelt. Daarna maak je ook een sonogram van S3. (Let op! vul nu bij WAVE->Sonogram(1)achter Inputbuffer 's1' of 's2' of 's3') in: s3). Hoe groot is nu het actieve frequentiegebied in het sonogram? Hoe is de verstaanbaarheid? Antwoord: ongeveer 5 kHz. Verstaanbaarheid: goed. Herhaal de vorige opdracht enkele malen met steeds lagere waarden voor Afsnijfrequentie (Hz). Stel de waarde vast waarbij de spraak niet meer te verstaan is (realiseer je dat je inmiddels al goed weet wat er gezegd wordt; je gaat dan al gauw onbewust de ontbrekende informatie invullen!) Verklaar de termen Laagdoorlaatfilter (Low Pass filter) en Afsnijfrequentie (cut off frequency). Antwoord: Rechts van de afsnijfrequentie worden frequenties steeds sterker onderdrukt. Het gebied links ervan wordt (zo goed als) ongehinderd doorgelaten. Daar zitten de lage frequenties.
♣ Butterworth filter S. Butterworth publiceerde in 1930 een artikel waarin hij liet zien hoe je structuren van elementaire trillingskringen (condensatoren, spoelen en weerstanden) kunt ontwerpen waarvan de filterwerking in de doorlaatband zeer vlak is. Het is een type filter dat zich goed leent voor implementatie op een computer.
Opdracht 5.3 Spraak opdelen in frequentiebanden d.m.v. een Banddoorlaatfilter In de vorige opdracht filterde je een spraaksignaal steeds zodanig dat er altijd lage tonen over bleven. We gaan nu onderzoeken wat voor effect het heeft op de verstaanbaarheid, als we juist ook die lagere
6
frequenties gaan onderdrukken. We maken daarbij gebruik van een zg. banddoorlaatfilter (Check even of op spoor S1 nog steeds dat weerbericht staat). WAVE->Butterworth Banddoorlaat(1): Input s1[0] Output s2[0] Centrumfrequentie (Hz) 3000 Bandbreedte (Hz) 2000 Duur (ook 'sec') 13 sec Flanksteilheid (< 50) 12 Volume (0...100) 1 Additief ('j' of 'n') n
5.3a
5.3b
5.3c
Gebruik weer het Scoop / Spectrum Analyzer venster om het gefilterde en het ongefilterde geluid met elkaar te vergelijken en maak daarbij ook gebruik van Gem en eerst op de Resetknop daarnaast voordat je het geluid afspeelt. Daarna maak je ook een sonogram van S2. Geef het frequentiegebied aan dat wordt doorgelaten en check of dit overeenstemt met de in de code opgegeven Bandbreedte (Hz). Hoe is de verstaanbaarheid? Probeer het geluid kort te karakteriseren. Antwoord: doorlaatband: 2 - 4 kHz. Meeste woorden onverstaanbaar. De klinkers zijn niet goed identificeerbaar en hebben allemaal ongeveer dezelfde klankkleur die je moeilijk kunt imiteren met je stem, en die in de buurt ligt van "ee", "eu", "ui". Herhaal het filterproces met Centrumfrequentie 5000 en zet Output s3[0]. Beantwoord dezelfde vragen als bij a. Antwoord: doorlaatband: 4 - 6 kHz. Totaal onverstaanbaar. De klinkers zijn niet identificeerbaar; het geluid heeft iets weg van een krekelkoor. Maak op spoor S3 een mix van spoor S2 en spoor S3 (daarbij wordt dus het geluid dat nu op spoor S3 staat overschreven). Zorg ervoor dat de amplitude van de mix ongeveer dezelfde als die van de huidige signalen op S2 en S3 (dus 0,5(S2 + S3) → S3). Gebruik de onderstaande code. WAVE->Definieer of bewerk signaal(1): Output Buffer en startindex definitie of bewerking n0 (startwaarde van n) n1 (eindwaarde van n)
? ? ? ?
Geef het frequentiegebied van de mix aan. Antwoord: WAVE->Definieer of bewerk signaal(1): Output Buffer en startindex s3[0] definitie of bewerking (s2[n] + s3[n]) * 0,5 n0 (startwaarde van n) 0 n1 (eindwaarde van n) 13 sec
5.3d
Doorlaatband: 2 - 6 kHz. Stel het filter zodanig in dat je een Laagdoorlaatfilter krijgt met een afsnijfrequentie van 4000 Hz. Filter daarmee S1 en zet het resultaat op S2. Mix daarna S2 en S3. Zet het resultaat op S2. Zorg er weer voor dat de amplitude ongeveer hetzelfde is. Geef ook de doorlaatband van de mix aan. Antwoord: WAVE->Butterworth Banddoorlaat(1): Input s1[0] Output s2[0] Centrumfrequentie (Hz) 2000 Bandbreedte (Hz) 4000 Duur (ook 'sec') 13 sec Flanksteilheid (< 50) 12 Volume (0...100) 1 Additief ('j' of 'n') n WAVE->Definieer of bewerk signaal(1): Output Buffer en startindex s3[0] definitie of bewerking (s2[n] + s3[n]) * 0,5 n0 (startwaarde van n) 0
7
n1 (eindwaarde van n)
13 sec
Doorlaatband: 0 - 6 kHz.
Opdracht 5.4 Hoogdoorlaatfilter maken m.b.v. Banddoorlaatfilter Als je weet (zie H3) dat de hoogst mogelijke frequentie in een discreet signaal gelijk is aan 0,5 Fs, dan kun je het banddoorlaatfilter ook gebruiken om een Hoogdoorlaatfilter te maken. Stel het filter zodanig in dat je een Hoogdoorlaatfilter krijgt met een afsnijfrequentie van 6000 Hz (alle frequenties die lager zijn worden onderdrukt). Zie Fig. 5.3. Om het geluid te testen, zet je eerst ruis op spoor S1 met de volgende code: WAVE->Ruis wit, uniform(1): Buffer Min Max Vanaf samplenummer (ook 'sec') Aantal samples (ook 'sec') Startgetal Toevalsgenerator
s1 -8000 8000 0 30 sec 0
Antwoord: Noem Centrumfrequentie(s) fc en de Afsnijfrequentie fa. De bandbreedte fb is dan 0,5 Fs − fa en de Centrumfrequentie is fc = 0,5fb + fa. In dit geval: fb = 22050 − 6000 = 16050 en fc = 8025 + 6000 = 14025. Er komt dan: WAVE->Butterworth Banddoorlaat(1): Input s1[0] Output s2[0] Centrumfrequentie (Hz) 14025 Bandbreedte (Hz) 16050 Duur (ook 'sec') 30 sec Flanksteilheid (< 50) 12 Volume (0...100) 1 Additief ('j' of 'n') n
8
Opdracht 5.5 "Wrijven over een kristallen glas" Vervorm een ruisfragment (dat 30 seconde duurt) tot een "fluittoon" van 1000 Hz door gebruik te maken van het Banddoorlaatfilter, waarvan Bandbreedte "smal" is. Hoe smal, dat moet je zelf maar uitmaken. Ook de Flanksteilheid is belangrijk voor de klank: hoe groter het getal dat je invoert, des te steiler de flanken van de doorlaatband. Bij een zekere bandbreedte gaat de klank lijken op de toon die je hoort als je met een vinger over de rand van een kristallen glas wrijft. Bij weer een andere instelling krijg je een stoomfluit. Experimenteer met Bandbreedte en Flanksteilheid! Antwoord: De centrumfrequentie is 1000 Hz. Hoe smaller de band daaromheen, hoe meer de ruis gaat lijken op een sinustoon. WAVE->Ruis wit, uniform(1): Buffer Min Max Vanaf samplenummer (ook 'sec') Aantal samples (ook 'sec') Startgetal Toevalsgenerator
s1 -8000 8000 0 30 sec 0
Bijvoorbeeld een kristallen glas: WAVE->Butterworth Banddoorlaat(1): Input s1[0] Output s2[0] Centrumfrequentie (Hz) 1000 Bandbreedte (Hz) 20 Duur (ook 'sec') 30 sec Flanksteilheid (< 50) 12 Volume (0...100) 1 Additief ('j' of 'n') n
§4 Frequentieresponsie en pulsresponsie van een filter Bij de laatste twee opdrachten heb je ruis door een filter gehaald. Van de ruis die je eerst aanmaakt en vervolgens door het filter stuurt, leerde je in H2 (kijk Opdracht 2.12 nog even door!) het langetermijnspectrum kennen. Dat bleek een constante functie van de frequentie te zijn, vandaar die aanduiding wit. Ook is duidelijk dat de ruisklank die uit het filter komt heel anders klinkt en er ook in het spectrum ook heel anders uit ziet. Als je in de Spectrum Analyzer klikt op Gem, dan is er geen horizontale rechte meer te bespeuren. De ruis heeft door het filterproces z'n witheid verloren: het filter heeft het ene frequentiegebied sterker of zwakker doorgelaten dan het andere en de grafiek stijgt en daalt. Juist omdat de ruis een constant lange-termijn spectrum heeft, kan dat spectrumplaatje van de gefilterde ruis dus niets anders zijn dan een weergave van de werking van het filter zèlf! Dat is een van de vele redenen waarom witte ruis zo interessant is: je kunt er filters mee "doorlichten"! We noemen zo'n afbeelding van het filterspectrum meestal de frequentieresponsie. Die vertelt hoeveel de amplitude van elke frequentie door het filter wordt versterkt of verzwakt en is dus niets anders dan een continue functie van de frequentie. We kunnen de frequentieresponsie dus kort aanduiden als V(f). Als je een sinustoon met amplitude A en frequentie f1 door een filter haalt met frequentieresponsie V(f), dan zal de output van het filter een sinustoon zijn die eveneens een frequentie f1 heeft en een amplitude A·V(f1). Uiteraard vraag je je af wat dan het functievoorschrift is van de filters waarmee je zo juist hebt gewerkt. Die zijn, eerlijk gezegd, nogal ingewikkeld. Daarom laten we ze maar weg. In Deel B gaan we van een eenvoudiger type filter wèl de frequentieresponsie afleiden. ♣ Wat hier de frequentieresponsie wordt genoemd is in feite slechts een deel daarvan. De frequentieresponsie van een filter vertelt hoe het filter reageert op een sinusgolf van willekeurige frequentie, amplitude 1 en fase 0. Die responsie komt tot uitdrukking in zowel een amplitude- als een 9
fase-verandering. De frequentieresponsie is dus een functie van de reële variabele f en heeft een complex bereik. Wat we hier V(f) noemen is de magnitude daarvan. Toch is meestal die magnitude (amplitude) het belangrijkst. Dat blijkt bijv. ook uit de nogal merkwaardige naamgeving van zg. All Pass filters. Die laten de amplitudes van elke frequentiecomponent van een signaal onveranderd door en wijzigen uitsluitend de fase. Een audiotoepassing daarvan vind je in de fijnstemmer van de Sample-Lusgenerator. Ook in sommige galmalgoritmen spelen All Pass filters een belangrijke rol. ♣ De frequentieresponsie is altijd een continue functie, ook bij discrete signalen en discrete filters. Als de frequentieresponsie discreet zou zijn, dan zou dat betekenen dat het filter slechts "antwoord heeft" op een eindige set frequenties. Vergelijk dat continue frequentiegedrag van het filter met de mogelijkheid om met een computer een sinustoon op te wekken met elke willekeurige frequentie. Een discrete sinusgolf met bijv. frequentie Fs / 10π Hz is een niet-periodiek, discreet signaal, maar daar is verder niks raars aan; immers er wordt aan de Nyquist-voorwaarde (H3) voldaan en de klank is die van een perfecte sinustoon, zoals we inmiddels al vaak hebben kunnen vaststellen (Bijv. een sinsutoon van 440 Hz als Fs = 44100). Het discreet-zijn van een signaal of een filter betekent dus niet dat het frequentie-bereik dat ook is.
Ook een puls heeft een constant spectrum! Het zal je duidelijk zijn dat die bibberige, oranje grafiek die de Spectrum Analyzer laat zien als je op Gem klikt slechts een benadering is van V(f), immers we hebben slechts een kort ruisfragment gebruikt en daarmee beschikken we slechts over een benadering van dat constante langetermijnspectrum van witte ruis. Toch is het een heel goed mogelijk om een perfecte afbeelding van V(f) te maken, zonder dat je de formule van V(f) kent! Wat je daar voor nodig hebt is een signaal dat, net als witte ruis, een constant spectrum heeft. Het enige signaal, buiten witte ruis, dat die eigenschap bezit is de puls. Een puls maak je door op een leeg spoor simpelweg één sample ongelijk aan nul te zetten! In de volgende opdracht gaan we dat doen en bekijken de resultaten met de Spectrum Analyzer. Vervolgens sturen we de puls door het banddoorlaatfilter van Opdracht 5.3, we vergelijken de klank met die van de gefilterde ruis en maken we een heel strak plaatje van de frequentieresponsie V(f). Opdracht 5.6 Verband tussen pulsresponsie en frequentieresponsie 5.6a We zetten op spoor S1[0] een puls met een amplitude 8000. Dat kan op meerdere manieren. In Lijst kun je simpelweg op veld S1[0] de waarde 8000 invoeren. Maar je kunt rechtstreeks via het Commandovenster een of meerdere getallen in een buffer schrijven: WAVE->Data S1[0] 5.6b
5.6c
5.6d
8000
Ga naar Scoop / Spectrum Analyzer. Zet in het Spectrum-vak Yfac maximaal (= 100). Selecteer spoor S1. Klik op Speel af. Kijk goed! Wat zie je op de scoop? Wat zie je op de Spectrum Analyzer? Antwoord: Beeld op Scoop: heel kort wordt de puls afgebeeld als een verticaal paaltje. Beeld op Spectrum Analyzer: alle spectraallijnen lichten heel kort op en zijn even lang. Klik op Stop. Klik in het Spectrum-vak op Max. Klik op de reset-knop daarnaast en vervolgens op Speel af. Nu worden de maxima van alle spectraallijnen onthouden en weergegeven in wit. Conclusie: de puls heeft inderdaad een constant spectrum! Nu gaan we de puls door het banddoorlaatfilter van Opdracht 5.3 halen. Ga terug naar hoofdscherm, drop de onderstaande code (merk op dat Duur nu slechts 1 sec is) en voer die uit. WAVE->Butterworth Banddoorlaat(1): Input s1[0] Output s2[0] Centrumfrequentie (Hz) 3000
10
Bandbreedte (Hz) Duur (ook 'sec') Flanksteilheid (< 50) Volume (0...100) Additief ('j' of 'n')
5.6e 5.6f
2000 1 sec 12 1 n
Kijk naar het signaal op spoor S2. In de inleiding van dit hoofdstuk las je: "Klankkleur is echt zo'n term die behoort tot het frequentiedomein. Van een filter kun je dat ook wel zeggen, maar toch heeft een filter ook altijd een tijd-effect." Hier op spoor S2 zie je wat het tijd-effect van dit filter is. We filterden een ultra-kort geluid, nl. een puls; en het resultaat op spoor S2 blijkt te bestaan uit honderden samples!! Die vormen samen een kort geluidje dat we simpelweg de pulsresponsie van het filter noemen. Luister er eens goed naar! Ga terug naar Scoop / Spectrum Analyzer, selecteer spoor S2 en herhaal 5.6c. Wat beeldt de witte grafiek van Max nu af? Zet nu ruis (duur 20 sec) op spoor S1 en filter die met bovenstaand banddoorlaatfilter (dit maal met duur 20 sec!) en zet het resultaat op spoor S3. Gebruik Gem. voor S3 en vergelijk de spectra van S2 en S3. De resultaten kunnen we heel kort samenvatten:
De frequentieresponsie V(f) van een filter is het spectrum van de pulsresponsie. ♣ Iets technischer uitgedrukt: de frequentieresponsie is de Fouriergetransformeerde van de pulsresponsie. De volledige code voor Opdracht 5.6 is dus: sporen uitwissen: WAVE->Wis geselecteerde buffers(3): Wis buffer (F1...F32, s1, s2, s3)
s1
|
puls aanmaken op spoor s1, index 0: WAVE->Data s1[0] 8000
puls filteren en resultaat opslaan op spoor s2: WAVE->Butterworth Banddoorlaat(1): Input s1[0] Output s2[0] Centrumfrequentie (Hz) 3000 Bandbreedte (Hz) 2000 Duur (ook 'sec') 1 sec Flanksteilheid (< 50) 12 Volume (0...100) 1 Additief ('j' of 'n') n
Overschrijf spoor s1 met ruis, duur 20 sec : WAVE->Ruis wit, uniform(1): Buffer Min Max Vanaf samplenummer (ook 'sec') Aantal samples (ook 'sec') Startgetal Toevalsgenerator
s1 -8000 8000 0 20 sec 0
Filter de ruis en zet resultaat op spoor s3: WAVE->Butterworth Banddoorlaat(1): Input s1[0] Output s3[0] Centrumfrequentie (Hz) 3000 Bandbreedte (Hz) 2000 Duur (ook 'sec') 20 sec Flanksteilheid (< 50) 12 Volume (0...100) 1 Additief ('j' of 'n') n
11
s2
|
s3
♣ Je kunt met de Spectrum Analyzer slechts spectra maken met een vrij lage resolutie: het hoorbare frequentie gebied (0 ... ½Fs) wordt gerepresenteerd door maar 512 frequenties, dus de frequentieresolutie is ½Fs / 512 = 43,066 Hz. Maar je kunt ook gebruik maken van de menu-functie Analyse → FFT (Fast Fourier Transform), waarin je het aantal te berekenen spectraallijnen kunt opgeven als macht van 2, met een maximum van 216. Daarmee bereik je een frequentieresolutie < 1 Hz. Ook kun je daarmee zowel het amplitude- en fasespectrum als het imaginaire en reële deel van het spectrum in aparte F-buffers bekijken en bewerken. Hieronder is te zien hoe je het amplitudespectrum van de impulsresponsie van spoor s2 berekent, opslaat in floatbuffer f1[0] en als grafiek weergeeft. WAVE->FFT(1): Input Buffer (ook 16-bits bufs) Output Buffer reele deel Output Buffer imaginaire deel Output Buffer Amplitude spectrum Output Buffer Fase spectrum Venstergrootte (in bits) Hann window? ('j' of 'n') Grafiek aanpassen? ('j' of 'n') Grafiek Hoogste Freq Grafiek Laagste Freq Log-weergave ('j' of 'n')
s2[0] 32 31 1 30 15 n j 6000 1000 n
Teken grafiek van V(f): WAVE->Teken grafiek van F-buffers F1
Opdracht 5.7 herken de pulsresponsie aan de frequentieresponsie en omgekeerd In de inleiding van dit hoofdstuk las je: "het tijddomein en het frequentiedomein zijn niet twee verschillende werelden. Integendeel. Ze vertellen beiden iets over dezelfde trillingsverschijnselen, maar ze doen dat elk op hun eigen manier, in hun eigen taal." De pulsresponsie en de frequentieresponsie zijn een goed voorbeeld daarvan. Het zijn twee verschillende weergaven van één en hetzelfde "antwoord" van het filter op een puls. Vergelijk het eens met een sinustoon: in het venster van de Scoop / Spectrum Analyzer kun je de frequentie aflezen zowel in het scoopplaatje als in het spectrum. Als je in het scoopplaatje een zeer korte periodetijd ziet, dan weet je dat het een hoge toon is. Diezelfde informatie verschaft het spectrum, doordat de spectraallijn verder naar rechts op de frequentie-as is weergegeven. Je hebt in de vorige opdrachten verschillende filters bekeken. Je weet nu hoe je van een filter de pulsresponsie en de frequentieresponsie kunt bepalen. Maar daar gebruik van bij het aanvullen van de volgende bewering: dat een filter een frequentieresponsie heeft met zeer steile flanken kun je ook zien aan de impulsresponsie van dat filter; die duurt dan namelijk zeer ....... (vul in: lang of kort). Illustreer dit met WaveWizardcode.
Pulsresponsies alom! Pulsresponsie is een woord dat misschien een beetje geleerd en wetenschappelijk klinkt, maar het gaat om iets heel alledaags. De pulsresponsie is bijvoorbeeld het geluidje dat je hoort als je ergens tegenaan tikt. Je kunt de pulsresponsie beschouwen als het "eigengeluid" of de "eigentrilling" van een trillingssysteem. Een paar voorbeelden. • In Opdracht 4.6 werd je gevraagd om het geluid te maken dat je hoort als je tegen je wang tikt. Die tik is een puls en je wang is de buitenkant van een akoestisch filter, nl. je mond- en keelholte. Door je mond in een bepaalde stand te zetten ondergaat het geluid van je stembanden een bepaalde verandering van klankkleur. Elke klinker heeft z'n eigen klank en z'n eigen mondstand. Elke
12
•
•
•
•
mondstand is dus weer een ander filter. De klank die je hoort bij een bepaalde stand kun je heel snel testen door een tikje tegen je wang. Je hoort dan een heel kort, maar duidelijk waarneembaar en identificeerbaar klankje. Naast zo'n enkele puls kun je ook gelijk een hele reeks pulsen maken die op regelmatige tijdsafstanden van elkaar staan: een puls-toon (zie Opdracht 5.9). Dat is ook zo ongeveer wat je stembanden doen als je spreekt of zingt. Je kunt dat goed horen als je Weerbericht.wav afspeelt met een heel lage waarde voor Fs (bijv. 5000 Hz); heel duidelijk hoor je dan het op elkaar klappen van de stembanden - het zijn kleine ontploffinkjes: doffe, gefilterde pulsen. Bij elke klinker (= mondstand = filter) klinken die weer anders. Een vioolbouwer besteedt enorm veel tijd aan het uitgutsen en bijslijpen van met name het bovenblad van een viool. Want de vorm daarvan is in hoge mate bepalend voor de uiteindelijke klank. Ook zo'n bovenblad is een filter dat z'n trillingseigenschappen prijs geeft door er een tik op te geven. Vandaar dat je dat een vioolbouwer ook voortdurend ziet doen: hij houdt het bovenblad tegen z'n oor, tikt er met z'n nagel tegen, luistert naar de klank en bepaalt dan waar en hoeveel er nog moet worden weggeslepen. Er bestaan ook heel grote akoestische filters: concertzalen, kerken, trappenhuizen, bosranden, de grand canyon. Ook die hebben pulsresponsies die je vooral waarneemt als galm en echo's. Om de pulsresponsie van een concertzaal vast te stellen wordt vaak een ballonnetje doorgeprikt of een alarmpistool afgeschoten. Knallen zijn immers redelijk goede benaderingen van pulsen. Ook de aardkorst is een (mechanisch) filter. Over de samenstelling van de bodem, over de dikte en hardheid van verschillende aardlagen kun je veel te weten komen door een ontploffing te veroorzaken en de trillingspatronen die daardoor ontstaan te registreren - de pulsresponsie dus. Over mechanische filters gesproken, als je een tweedehands auto gaat kopen, is het verstandig om zelf even de rol van puls te spelen door je volle gewicht op de zijkant te werpen en dan zo abrupt mogelijk los te laten en te checken of je de auto al dan niet "sponzig" op en neer ziet deinen. Als dat het wèl geval is, dan zie je aan de duur van de pulsresponsie in welke mate de schokbreker versleten is!
Opdracht 5.8 Filter "doorfluiten" In Hoofdstuk 2 , Opdracht 2.11 maakte je al kennis met wat ze in audio-studio's "doorfluiten" noemen: de geluidseigenschappen van een apparaat testen met een sinustoon die steeds hoger wordt. Ook een filter kun je op die manier testen. Laat m.b.v. de Spectrum Analyzer zien dat dit inderdaad de frequentieresponsie van het filter oplevert! Ga daarbij uit van dezelfde code als Opdracht 2.11, die we hieronder nog eens weergeven: WWiz->Sinus stijgend(1): laagste frequentie (in Hz) hoogste frequentie (in Hz) tijd in sec (0,001 - 750,0) starttijdstip in sec (0,001 - 750,0) volume (0 - 32000) buffer (S1, S2 of S3) Additief ('j' of 'n')
5.8a
50 10000 60 0 8000 s1 n
Gebruik dit signaal om weer datzelfde filter van Opdracht 5.6d te testen. Beschrijf hoe je dat aanpakt. Antwoord: de volledige code: WWiz->Sinus stijgend(1): laagste frequentie (in Hz) hoogste frequentie (in Hz) tijd in sec (0,001 - 750,0) starttijdstip in sec (0,001 - 750,0) volume (0 - 32000) buffer (S1, S2 of S3) Additief ('j' of 'n') WAVE->Butterworth Banddoorlaat(1): Input s1[0] Output s2[0] Centrumfrequentie (Hz) 3000 Bandbreedte (Hz) 2000
13
50 10000 60 0 8000 s1 n
Duur (ook 'sec') Flanksteilheid (< 50) Volume (0...100) Additief ('j' of 'n')
5.8b
60 sec 12 1 n
Voer de code uit. Het gefilterde signaal staat op spoor S2. Ga naar Scoop / Spectrum Analyzer. Selecteer spoor S2. Activeer Max. Speel het geluid af. Resultaat: de Spectrum Analyzer genereert in 60 sec een plaatje van de frequentieresponsie. Bereken hoe lang het duurt voordat je bij het afspelen van spoor S2 een toon van constant volume hoort. Antwoord: Het Banddoorlaatfilter laat frequenties door in de band 2000 - 4000 Hz. De sinustoon stijgt in 60 sec van 50 tot 10000 Hz. De frequentiefunctie is f(t) = af + b met b = 50 en a = (10000 − 50) / 60 = 165,83. Vanaf f(t) = 2000 begin je een toon te horen: 165,83t + 50 = 2000 dus t = 11.8 sec. Aangezien de flanken van het filter een beetje schuin lopen, hoor je de toon al eerder langzaam sterker worden.
Vier belangrijke testsignalen Inmiddels hebben we drie bijzondere signalen leren kennen die zeer nuttige spectrale eigenschappen hebben, zodat we er gemakkelijk het effect van een filter mee kunnen testen. We zetten ze nog eens op een rij en voegen er dan nog een vierde aan toe. 1. Sinustoon is de enige trilling die in het spectrum slechts als één enkele spectraallijn wordt afgebeeld. ♣ ook het spectrum van een constante functie bestaat uit één enkele spectraallijn, uiteraard bij 0 Hz. Door een sinustoon langzaam te verhogen kun je het specrale gedrag van een filter letterlijk aftasten en zo een beeld krijgen van hoe een filter op elke frequentie reageert. In de studio noemen ze dat het "doorfluiten" van een filter. 2. Ruis heeft een constant spectrum en kun je net zo lang laten doorklinken als je wilt. De klank van gefilterde ruis kun je beschouwen als de "klank van het filter". 3. Puls heeft eveneens een constant spectrum en wordt dus in het spectrum zichtbaar als een horizontale rechte. Een puls geeft direct de meest perfecte indruk, zowel in geluid (= pulsresponsie) als in spectrumgrafiek (= frequentieresponsie) van het effect van een filter. Alleen jammer dat de pulsresponsie vaak maar heel kort is, zodat je maar heel weinig tijd hebt om de filterwerking goed te horen. Daarom heb je al gauw de neiging om die pulsresponsie een aantal keren achter elkaar af te spelen. Datzelfde effect krijg je door een hele "trein" van pulsen door het filter te sturen. Daarmee krijg je dan een pulstoon. 4. Een pulstoon is het enige signaal dat zichzelf als spectrum heeft! Dat wil zeggen: de afbeeldingen die je ziet op de Scoop en op de Spectrum Analyzer zijn gelijkvormig: je ziet in beide afbeeldingen een aantal paaltjes die allemaal even hoog zijn en op onderling gelijke afstanden staan. Je kunt aan het spectrum van een pulstoon dus niet zien of je te maken hebt met een pulstoon of met een mix van sinustonen die even hard zijn en waarvan alle onderlinge frequentieafstanden gelijk zijn! Je mag dus gerust zeggen: een pulstoon = mix van sinustonen met gelijke amplitudes!! Daarom geeft ook een pulstoon een heel goed beeld van het effect van een filter. Dat gaan we onderzoeken in de volgende opdracht. Door een toongenerator een pulstoon te laten maken en die vervolgens door een filter te halen bereik je dat de klankkleur van een toon volledig van het filter laat afhangen.
Opdracht 5.9 Gefilterde pulstoon 5.9a Een pulstoon maak je met WaveWizard het simpelst met de Sample-Lusgenerator. Drop de volgende code. (Kijk even naar die "rare" frequentie: Fs / 64 Hz. Die loopt mooi in de pas met de meetfrequenties van de spectrum analyzer, zodat de spectraallijnen heel duidelijk worden afgebeeld. Meer daarover in Deel B.) WAVE->Wis geselecteerde buffers(1): Wis buffer (F1...F32, s1, s2, s3)
s1
14
dither-noise op spoor s2: WAVE->Ruis wit, uniform(2): Buffer Min Max Vanaf samplenummer (ook 'sec') Aantal samples (ook 'sec') Startgetal Toevalsgenerator
s1 -3 3 0 15 sec 0
dither-noise Heel goedkope of slecht afgeschermde geluidskaarten (bijv. in laptops) hebben soms moeite om een pulstoon onvervormd weer te geven!! Je hoort dan gehakkel en gesputter. Wat je daar aan kunt doen is eerst onhoorbaar zachte ruis (zoals hierboven) op een spoor te zetten en daar dan de pulstoon bij mixen met Additief j (zoals hieronder). Deze zachte ruis noemen we dither-noise. (Meestal wordt dither toegevoegd aan een analoog signaal alvorens te gaan sampelen om ongewenste kwantisatie-effecten tegen te gaan. Maar ook voor discrete signalen werkt dither soms heel heilzaam, zoals bij het opwekken van pulstonen.) WAVE->Sample-Lus(1): Freq (in Hz) of periode (in Ts) Amplitude Golfvorm Output: Spoor en startindex Toonduur (ook 'sec') Fijnstemmer ('j' of 'n') Attack Decay Sustain Release ADSR type ('lin' of 'exp') Filtercoefficient A1 Filtercoefficient A2 Additief ('j' of 'n')
5.9b
5.9c
5.9d
5.9e
Fs / 64 Hz 8000 puls s1[0] 10 sec n 2000 4000 0,5 5000 exp 1 0 j
Check met de spectrum analyzer dat de spectraallijnen van de pulstoon allemaal even lang zijn en op onderling gelijke afstanden staan. Haal de pulstoon weer door hetzelfde filter als in de vorige opdracht. Hoe zie je de frequentieresponsie nu afgebeeld in de spectrum analyzer? Antwoord: het spectrum van de gefilterde pulstoon bestaat uit spectraallijnen waarvan de lengten de contour van de (continue) frequentieresponsie weergeven. Verander de frequentie van de pulstoon achtereenvolgens in Fs/256, en Fs/1024 en beschrijf het effect daarvan op wat je hoort en ziet. Antwoord: hoe lager een (periodieke) toon, des te dichter de spectraallijnen (in onderling gelijke afstanden) op elkaar liggen en des te beter de contour van de frequentieresponsie zichtbaar wordt. Kun je nu verklaren waarom lage pulstonen het filter beter "tot z'n recht laten komen" dan hoge? Antwoord: Hoe lager de pulstoon, des te groter de periodetijd (= de afstand tussen de pulsen) en des te beter de puls en z'n constante spectrum worden benaderd en des te beter de contour van de frequentieresponsie wordt benaderd. ♣ spraak van lage stemmen is in principe beter verstaanbaar dan die van hoge, omdat lage tonen de frequentieresponsies van spraakklanken beter benaderen. Bij hoge tonen (sopraan) kunnen soms resonantiepieken die dichtbij elkaar liggen wegvallen. Formuleer je antwoord op de vorige vraag ook eens door gebruik te maken van de term "sampling in het frequentiedomein". Antwoord: als je een pulstoon door een filter haalt, dan krijg je een discrete, gesampelde versie van de continue frequentieresponsie.
15
§5 "Klankwet" We hebben inmiddels gezien dat we de klankkleur van de tonen die een toongenerator opwekt heel sterk kunnen veranderen door de tonen te filteren. Meestal gaan ze daar ook "warmer" en natuurlijker door klinken. Dat is ook niet zo verwonderlijk, want filters zijn zelf iets heel natuurlijks: niet alleen ons eigen spraakkanaal (mond- en keelholte), maar ook de meeste muziekinstrumenten en alle akoestische ruimtes zijn filters! Van de andere kant moeten we wel toegeven dat bijvoorbeeld die gefilterde pulstoon uit de vorige opdracht ondanks dat filteren nog steeds een beetje"electronisch" klinkt. De vraag is nu hoe dat komt. Wat heeft de gefilterde pulstoon niet wat bijvoorbeeld die snaartoon van de akoestische gitaar uit Opdracht 5.1 wel heeft? Dat gaan we eerst eens uitpluizen. Daarna formuleren we een eenvoudige "klankwet".
Opdracht 5.10 Vergelijk akoestische-gitaartoon met twee computer-imitaties Open nog eens bestand Gitaar hoge E. wav en speel het af. Nu gaan we van deze gitaartoon twee verschillende imitaties maken. We krijgen dan de volgende spoor-indeling: S1 opname van toon van akoestische gitaar zoals in Opdracht 5.1; S2 Imitatie (1) met Sample-Lus; Lus-filter niet actief S3 Imitatie (2) met Sample-Lus; Lus-filter wel actief WAVE->Wis geselecteerde buffers(2): Wis buffer (F1...F32, s1, s2, s3)
s2
WAVE->Sample-Lus(1): Freq (in Hz) of periode (in Ts) Amplitude Golfvorm Output: Spoor en startindex Toonduur (ook 'sec') Fijnstemmer ('j' of 'n') Attack Decay Sustain Release ADSR type ('lin' of 'exp') Filtercoefficient A1 Filtercoefficient A2 Additief ('j' of 'n')
329,45 Hz 20000 parabool s2[0] 15 sec n 1 9000 0 0 exp 1 0 j
WAVE->Sample-Lus(1): Freq (in Hz) of periode (in Ts) Amplitude Golfvorm Output: Spoor en startindex Toonduur (ook 'sec') Fijnstemmer ('j' of 'n') Attack Decay Sustain Release ADSR type ('lin' of 'exp') Filtercoefficient A1 Filtercoefficient A2 Additief ('j' of 'n')
329,45 Hz 20000 parabool s3[0] 15 sec n 1 9000 0 0 exp 0,5 0,5 j
|
s3
// Lus-filter niet actief
// Lus-filter wel actief
5.10a Ga naar Scoop / Spectrum Analyzer. Zet vinkjes voor Hann-venster en Amplitude in dB. Schuif de slider bij Yfac naar ongeveer 1,7, zodat ook de 50 dB-lijn zichtbaar is. Selecteer spoor S1 en speel af, verschillende malen achter elkaar, luister goed naar de klank van de zachter wordende toon en observeer hoe daarbij het spectrum verloopt. Doe hetzelfde met de tonen op S2 en S3. Welk van de twee imitaties lijkt in klank het meest op de akoestische gitaar? Waarom?
16
Antwoord: de toon op spoor S2 wordt alleen maar zachter, die op spoor S3 wordt niet alleen zachter, maar ook heel snel doffer, net als de akoestische toon. S3 lijkt dus het meest op de akoestische toon. 5.10b Wat zijn de overeenkomsten in het spectrale tijdverloop tussen de beste imitatie en de akoestische toon? Antwoord: de contour van het spectrum van S2 verandert niet, die van S3 wel. Daar dempen de hoge frequentie veel sneller dan bij S2. 5.10c In Fig. # zie je de sonogrammen van de drie tonen. Hoe zijn die overeenkomsten in het spectrale tijdverloop hier zichtbaar? Antwoord: bij de doffer wordende tonen van S1 en S3 zijn de lagere frequenties veel langer zichtbaar dan de hogere.
17
zacht en dof, hard en helder We hebben nu vastgesteld dat het zachter worden van de gitaartoon gepaard gaat met een verandering van klankkleur: hoe zachter, hoe doffer. Dit blijkt een algemene regel, een soort "klankwet" die je ook kunt omkeren: hoe harder, hoe helderder. Neem bijvoorbeeld een blaasinstrument. Als je heel zacht blaast op een hoorn, dan gaan je lippen in het mondstuk bijna sinusvormig heen en weer; je hoort een zachte, "ronde" toon. Naarmate je harder gaat blazen wordt de lipbeweging abrupter en ook de amplitude neemt toe. Daardoor wordt de klank ook helderder. Ga je nog harder blazen dan wordt de amplitude op gegeven moment zo groot dat je lippen elkaar bij elke trillingsperiode eventjes aanraken: ze beginnen een "klapperend" geluid te maken. Koperblazers noemen dat cuivré: het "schetteren". Ook houtblaasinstrumenten zoals klarinet en saxofoon kun je laten schetteren, door zo hard te blazen dat het riet tegen het mondstuk komt. ♣ de hobo en de fagot hebben een dubbelriet, waarvan de twee segmenten eveneens tegen elkaar kunnen klappen, dubbelrietblazers kunnen dus ook een cuivré maken. Het bijzondere van blaasinstrumenten is dus die "overdrive": eerst wordt de toon "lineair" helderder met het toenemen van de amplitude, en dan ineens is daar dan ook nog dat "schetterpunt" dat de briljantie nog eens een extra boost geeft. Ook voor alle snaarinstrumenten gaat de klankwet op; bijv. als je een pianotoets hard aanslaat is de klank ook beduidend briljanter dan wanneer je zacht aanslaat. We weten nu tevens het antwoord op de vraag die we aan het begin van deze paragraaf stelden: een computertoon is gedoemd om "electronisch" te klinken zo lang je niet aan die elementaire klankwet voldoet. Die pulstoon van Opdracht 5.9 had wel een duidelijke volume-contour, zodat de toon eerst geleidelijk harder en daarna weer zachter werd, maar ondertussen bleef de spectrale contour constant. Er was dus geen verandering van klankkleur; het harder en zachter worden ging niet gepaard met resp. het helderder en doffer worden van de toon. Precies hetzelfde kun je zeggen van de toon die in Opdracht 5.10 op spoor S2 stond. Maar die van spoor S3 voldeed wèl aan de klankwet! Die klonk dan ook direct een stuk natuurlijker, ook al moet je nog een hele weg gaan voordat je de computer een echt realistische snaarsimulatie kunt laten maken... Er zijn heel veel manieren waarop je met de computer die klankwet kunt implementeren. Je hebt er inmiddels al twee gezien: 1. in Opdracht 2.7 pasten we FM toe om een toon te maken die steeds helderder werd (daar bleef het volume constant, maar met WAVE->Definieer of bewerk signaal kun je het volume vooralsnog zo aanpassen dat aan de klankwet wordt voldaan). 2. in de vorige opdracht voldeden we aan de klankwet door die twee filtergetallen A1 en A2 gelijk te maken aan 0,5. Zoals de naam al zegt: in de Sample-Lusgenerator wordt een toon opgewekt door steeds de gofvorm van één periode te herhalen. Als A2 groter dan nul is, wordt het ingebouwde laagdoorlaatfilter actief, zodat nu de golfvorm steeds weer opnieuw dat filter passeert. Daardoor wordt de klank steeds doffer. Je kunt goed horen dat dit laagdoorlaatfilter geen steile flank kan hebben, want de toon doet er heel veel periodes over om dof te worden. Vandaar ook dat hoge tonen (= veel periodes per seconde) veel sneller dof worden dan lage: ze gaan per seconde veel vaker door het filter. Bij echte snaren hoor je dat ook! Vandaar dat dit filter zo natuurlijk aandoet! Hieronder presenteren we een derde methode die veel algemener, krachtiger en flexibeler is: nl het tijdvariante filter. Daarmee kun je, naast die klankwet, nog zo veel meer leuke dingen doen dat we er slotparagraaf van dit hoofdstuk volledig aan wijden.
§6 Tijdvariant filter Het mooiste voorbeeld van een filter is spraak. Zoals gezegd: met elke mondstand correspondeert een filter dat een duidelijk waarneembare, eigen klank heeft en ook een eigen frequentie- en pulsresponsie.
18
Spreken gaat gepaard met een voortdurend veranderen van de stand van je mond. Dus ook de filtereigenschappen van je mond- en keelholte zijn dan in een voortdurende staat van verandering - en daarmee natuurlijk ook de frequentie- en pulsresponsie. We noemen zo'n voortdurend veranderend filter simpelweg een tijdvariant filter. De synthese van spraak en zang met de computer of met analoge electronische apparatuur zou gedoemd zijn te mislukken zijn als je filters niet tijdvariant zou kunnen maken. En gelukkig is dat goed mogelijk. Een van de vele redenen van het succes van de synthesizer in de popmuziek was het tijdvariante filter, waar je zulke spectaculaire "zwiep-"geluiden mee kunt maken, variërend van huilende wind tot spraak-achtige klanken, zoals je dadelijk zelf zult vaststellen. De belangrijkste filterinstelling van zowel het Butterworth Laagdoorlaat- als het Butterworth Banddoorlaatfilter is de frequentie, dus resp. Afsnijfrequentie en Centrumfrequentie. Je maakt de frequentie tijdvariant door achter die velden een formule in te voeren waarin het symbool n voorkomt, precies zoals je dat gewend bent bij Definieer of bewerk signaal. WAVE->Butterworth Laagdoorlaat(1): Input ... Output ... Afsnijfrequentie (Hz) tijdvariant (formule met n) Flanksteilheid (1,2,3...50) ... Duur (ook 'sec') ... Volume (0...100) ... Additief ('j' of 'n') ... WAVE->Butterworth Banddoorlaat(1): Input ... Output ... Centrumfrequentie (Hz) tijdvariant (formule met n) Bandbreedte (Hz) ... Duur (ook 'sec') ... Flanksteilheid (< 50) ... Volume (0...100) ... Additief ('j' of 'n') ...
Hoe je de frequentie als functie van tijd verandert kun je zelf bepalen. De manier om een lineaire of een exponentiële frequentieverandering te maken is uiteraard precies dezelfde als de stuursignalen die we in het vorige hoofdstuk gebruikten om de amplitude tijdvariant te maken. Maar je kunt de frequentieverandering, net als de amplitudeverandering, natuurlijk ook periodiek maken door in de formule een sinusfunctie op te nemen.
Opdracht 5.11 Stuursignalen voor Afsnijfrequentie van Laagdoorlaatfilter 5.11a Geef in onderstaand laagdoorlaatfilter de formule voor de Afsnijfrequentie als die in 20 sec lineair moet toenemen van 1000 Hz tot 7000 Hz. Filteren daarmee de witte ruis. WAVE->Ruis wit, uniform(1): Buffer Min Max Vanaf samplenummer (ook 'sec') Aantal samples (ook 'sec') Startgetal Toevalsgenerator WAVE->Butterworth Laagdoorlaat(1): Input Output Afsnijfrequentie (Hz) Flanksteilheid (1,2,3...50) Duur (ook 'sec') Volume (0...100) Additief ('j' of 'n')
s1 -8000 8000 0 20 sec 0 s1[0] s2[0] ???? 12 20 sec 1 n
Antwoord: stuursignaal f[n] = an + b, voor 0 ≤ n ≤ 20 Fs.
19
f[0] = 1000 dus b = 1000. f[20Fs] = 20Fs a + 1000 = 7000, zodat a = 6000 / 20Fs = 300 Ts . Dus: Afsnijfrequentie (Hz)
300*Ts*n + 1000
5.11b Probeer je eerst een voorstelling te maken van het sonogram van de gefilterde ruis. Voer dan de volgende code uit: WAVE->Sonogram(1): Buffer en index (s1, s2, s3) lengte fragment (ook 'sec') FFT-venster (in bits: 8...16) Venstergrootte (ook 'sec') vensterverplaatsing (ook 'sec') weergave in decibel ('dB') of lineair ('lin') kleur van laagste amp ('R', 'G' of 'B') kleur van laagste amp ('R', 'G' of 'B') helderheid Hann-window ('j' of 'n') Animatie ('j' of 'n')
S2[0] 17,5 sec 12 2000 0,02 sec dB R B 100 j n
5.11c Fig. 5.5 is het sonogram dat je krijgt als je witte ruis door onderstaand filter haalt. Je moet wel de formule voor de Afsnijfrequentie een beetje aanvullen, waarbij je de gegevens uit het sonogram gebruikt. WAVE->Butterworth Laagdoorlaat(1): Input Output Afsnijfrequentie (Hz) Flanksteilheid (1,2,3...50) Duur (ook 'sec') Volume (0...100) Additief ('j' of 'n')
s1[0] s2[0] ??...sin(2*pi*n*Ts)...?? 16 20 sec 1 n
Antwoord: Afsnijfrequentie (Hz)
5000 + 2000 * sin(2*pi*n*Ts)
20
Opdracht 5.12 Detectie van boventonen d.m.v. tijdvariant banddoorlaatfilter 5.12a Met de onderstaande code maak je een zaagtandgolf op spoor S1 van 400 Hz die 30 seconde duurt: WAVE->Sample-Lus(1): Freq (in Hz) of periode (in Ts) Amplitude Golfvorm Output: Spoor en startindex Toonduur (ook 'sec') Fijnstemmer ('j' of 'n') Attack Decay Sustain Release ADSR type ('lin' of 'exp') Filtercoefficient A1 Filtercoefficient A2 Additief ('j' of 'n')
400 Hz 8000 zaag s1[0] 30 sec n 0 0 1 0 lin 1 0 n
5.12b Ga naar Scoop / Spectrum Analyzer en bekijk het spectrum. Maak daarna een sonogram met de volgende instellingen: WAVE->Sonogram(1): Buffer en index (s1, s2, s3) lengte fragment (ook 'sec') FFT-venster (in bits: 8...16) Venstergrootte (ook 'sec') vensterverplaatsing (ook 'sec') weergave in decibel ('dB') of lineair ('lin') kleur van laagste amp ('R', 'G' of 'B') kleur van laagste amp ('R', 'G' of 'B') helderheid Hann-window ('j' of 'n') Animatie ('j' of 'n')
S1[0] 30 sec 13 8000 0,05 sec dB R B 100 j n
Meet met de muis in het sonogram de de frequenties van de eerste tien spectraallijnen en geef een formule waarin je die frequenties in relatie brengt met de frequentie die he bij Sample-Lus hebt ingevoerd. Antwoord: de frequentie van de n-de spectraallijn fn = nf1. 5.12c Haal nu de toon door onderstaand banddoorlaatfilter zo dat de Centrumfrequentie lineair oploopt van 0 Hz tot 4200 Hz. WAVE->Butterworth Banddoorlaat(1): Input s1[0] Output s2[0] Centrumfrequentie (Hz) ?? Bandbreedte (Hz) 200 Duur (ook 'sec') 30 sec Flanksteilheid (< 50) 4 Volume (0...100) 1 Additief ('j' of 'n') n
21
Antwoord: f[0] = 0 --> b = 0 f[30 sec] = a(30 sec) = 4200 --> a = 4200 / (30 Fs) = 140 Ts WAVE->Butterworth Banddoorlaat(1): Input s1[0] Output s2[0] Centrumfrequentie (Hz) 140 * Ts * n Bandbreedte (Hz) 200 Duur (ook 'sec') 30 sec Flanksteilheid (< 50) 4 Volume (0...100) 1 Additief ('j' of 'n') n
5.12c Maak met dezelfde instellingen ook een sonogram van het gefilterde signaal op S2 (vergeet niet om nu s2[0] in te vullen bij Input!). Duidelijk is de zien en te horen dat de tonen elkaar een klein beetje in tijd overlappen: als de ene nog niet helemaal is uitgeklonken begint de volgende al op te komen. Heb je daar een verklaring voor? Antwoord: de snelheid waarmee de tonen harder en zachter worden hangt af van de flanksteilheid van het filter. Hoe lang en hoeveel de tonen gelijktijdig klinken hangt afvan de bandbreedte. 5.12d Stel het banddoorlaatfilter zo in dat je op elk moment drie of vier tonen tegelijk hoort. Antwoord: de frequentie-afstand tussen de spectraallijnen is 400 Hz, dus de bandbreedte moet 1200 Hz zijn.
Klankwet en tijdvariant filter WaveWizard heeft twee verschillende filters voor je in de aanbieding waarmee je op een gemakkelijke manier gestalte kunt geven aan de klankwet. Beide filters hebben precies dezelfde filterwerking, alleen de aansturing ervan is verschillend. Ze hebben de volgende namen: • WAVE->Low Pass met F0-contour • WAVE->Low Pass, amplitude-afhankelijk Net zoals het tijdvariante Laagdoorlaat en Banddoorlaatfilter waar je in de vorige opdrachten mee hebt gewerkt, is ook bij deze twee filters alleen de afsnijfrequentie tijdveranderlijk. Ze heten Low Pass (laagdoorlaat), maar je kunt er op de afsnijfrequentie een piek mee maken waarvan je de bandbreedte kunt instellen. Dus het is eigenlijk een combinatie van laagdoorlaat en banddoorlaat: het signaal wordt eerst gefilterd met het laagdoorlaatgedeelte en dan met het banddoorlaatgedeelte (leg uit waarom je in principe exact hetzelfde filterresultaat krijgt als je de volgorde zou omkeren Antwoord: zie begin §4: (herhaald) filteren is (herhaald) vermenigvuldigen in het frequentiedomein en vermenigvuldigen is commutatief). De banddoorlaat kun je trouwens ook helemaal buiten werking stellen. Beide versies zijn bedoeld als simulatie van het filter dat de synthesizer indertijd zo populair maakte, zie H4. Dat ze Low Pass en Band Pass combineren, levert vette klanken (vanwege Low Pass), holle, resonerende klanken (vanwege Band Pass) en zwiepklanken (vanwege tijdveranderlijkheid van beide) op. Het mooie van de computerversie is dat je de flanksteilheid nog veel sterker kunt maken dan die van bijv. de MiniMoog. Dus nog vetter, nog holler en nog meer zwiep. We kijken nu even naar de twee types afzonderlijk: WAVE->Low Pass met F0-contour Hier regel je de afsnijfrequentie (F0) met een contour die erg lijkt op een gewone ADSR-contour. Je kunt de werking ervan schematisch weergeven zoals in Fig. 5.6. Als je nu met Sample-Lus een toon maakt en je kopieert de instellingen van de volume-contour ADSR naar de F0-contour van het filter dan zal de afsnijfrequentie de amplitude van de Sample-Lus volgen:
22
als het geluid harder wordt, dan neemt de afsnijfrequentie toe en zal de toon helderder worden! De werking daarvan is schematisch weergegegven in fig.5.6.
WAVE->Low Pass, amplitude-afhankelijk Dit is een veel universeler filter dat in principe hetzelfde doet, maar dan volledig geautomatiseerd. Er zit geen contour-generator ingebouwd, zoals bij het eerste filter, maar de contour van het inputsignaal wordt door het filter zelf bepaald! Zoiets noemen ze een Amplitude Follower of Amplitude Tracker. Hiermeer kun je een geluid met een willekeurig volumeverloop zodanig filteren dat de afsnijfrequentie steeds het volume volgt. Dus: hoe harder hoe helderder, zoals de klankwet vereist. Toch heb je volledig controle over het filter, want je kunt de gevoeligheid ervan regelen door een maximale en minimale afsnijfrequentie te koppelen aan het volume-verloop. We demonstreren dit filter in de volgend opdracht.
Opdracht 5.13 Windvlagen Het geluid van de wind is ruis-achtig, maar het is zeker geen witte ruis met een constante amplitude. Wel kun je het goed omschrijven als gefilterde, gekleurde, ruis. Daarom is witte ruis een goed beginpunt. Om witte ruis te maken kun je natuurlijk gebruik maken van WAVE->Ruis wit, uniform, maar het gaat ook met WAVE->Sample-Lus(1), en dat is wel handig omdat we dan gelijk een volumecontour kunnen maken met een fade in (= 5 sec) en een fade out (= 8 sec). We nemen als totale duur van het geluid: 28 seconde. 5.13a Vul in de onderstaande code de vraagtekens in: WAVE->Sample-Lus(1): Freq (in Hz) of periode (in Ts) Amplitude Golfvorm Output: Spoor en startindex Toonduur (ook 'sec') Fijnstemmer ('j' of 'n') Attack Decay Sustain
0,1 Hz 8000 ruis S1[0] ?? n ?? 4000 0,5
23
Release ADSR type ('lin' of 'exp') Filtercoefficient A1 Filtercoefficient A2 Additief ('j' of 'n')
?? exp 1 0 n
Antwoord: Toonduur (ook 'sec') Attack Release
20 sec 5000 8000
5.13b Hoeveel periodes wekt de Sample-Lusgenerator hier op? Antwoord: 2 (f = 0,1 Hz → T = 10 sec en toonduur = 20 sec = 2T.) 5.13c Nu gaan we proberen om de ruis op spoor S1 een "vlagerig" karakter te geven. Daarvoor moeten we een stuursignaal g[n] definiëren. 1. De vlagen blijven maar komen en in het aanzwellen en weer zachter worden zit wel een regelmaat, maar er is geen sprake van een exacte periodiciteit. Dat effect kun je goed benaderen door een mix van sinustonen met frequenties die met elkaar "uit de pas" lopen d.w.z: als je ze op elkaar deelt, komt er geen klein, geheel getal uit. De vlagen duren, laten we zeggen, ergens tussen 2 en 5 sec. Dus de sinussen die we nodig hebben zijn subsoon (dat zijn stuursignalen trouwens meestal) Bijvoorbeeld: f1 = 0,2 Hz en f2 = 0,53 Hz. 2. De amplitudes A1 en A2 kiezen we (N.B. we zijn een geluid aan het ontwerpen en kunnen alle waarden vrij kiezen!) We kiezen A1 = 1 en A2 = 0,6. 3. We gaan er van uit dat het gedurende de 20 seconde van het geluid nooit helemaal stil is, dus het stuursignaal g[n] moet een functie zijn die overal > 0 is. Omdat de som van de twee sinussen negatieve waarden heeft, moeten we dus een constante C bij de mix optellen. Hiermee krijgen we het stuursignaal:
g[n] = C +A1sin(2πf1nTs) +A2 sin(2πf2nTs) We vermenigvuldigen nu S1 met g[n] en slaan het resultaat op in S2. Een voorbeeld zie je in Fig. 5.8, maar jouw oplossing kan er natuurlijk ook heel anders uitzien! Vul de onderstaande code in: WAVE->Definieer of bewerk signaal(1): Output Buffer en startindex definitie of bewerking n0 (startwaarde van n) n1 (eindwaarde van n)
24
?? ?? ?? ??
Antwoord: A1 = 1; A2 = 0,6, dus als g[n] > 0 moet zijn, dan moet C > A1 + A2 zijn. We kiezen C = 1,8. In de bewerking definiëren we g[n] en vermenigvuldigen daar gelijk S1 mee. WAVE->Definieer of bewerk signaal(1): Output Buffer en startindex s2[0] definitie of bewerking S1[n]*(1,8+sin(2*pi*0,2*n*Ts)+0,6*sin(2*pi*0,53*n*Ts)) n0 (startwaarde van n) 0 n1 (eindwaarde van n) 28 sec
5.13d Beluister het resultaat van spoor via Scoop / Spectrum Analyzer. Maak ook een sonogram van het geluid: WAVE->Sonogram(1): Buffer en index (s1, s2, s3) lengte fragment (ook 'sec') FFT-venster (in bits: 8...16) Venstergrootte (ook 'sec') vensterverplaatsing (ook 'sec') weergave in decibel ('dB') of lineair ('lin') kleur van laagste amp ('R', 'G' of 'B') kleur van laagste amp ('R', 'G' of 'B') helderheid Hann-window ('j' of 'n') Animatie ('j' of 'n')
S2[0] 28 sec 13 6000 0,03 sec lin 0 300 50 j n
5.13e We hebben nu op spoor S2 vlagen van witte ruis. Om daar een windgeluid van de maken gebruiken we WAVE->Low Pass, amplitude-afhankelijk. Stel het filter als volgt in: WAVE->Low Pass, amplitude-afhankelijk(1): input s2[0] output s3[0] volume (0...100) 1 duur 28 sec F0 600 F1 2500 gamma 1 Reso-piekbreedte (Hz) 500 Low Pass steilheid (1...10) 1 Additief ('j' of 'n') n
5.13f
Luister naar het resultaat en maak ook een sonogram. Wat het filter doet is het volgende. Het bepaalt van het signaal dat je gaat filteren eerst het volume-verloop en gebruikt dat tijdens het filteren als stuursignaal voor de afsnijfrequentie. In dit voorbeeld hebben we een geluid gemaakt waarvan we het volume-verloop zelf hebben bepaald, dus we kunnen daarmee goed testen of het filter ook inderdaad in staat is om het volume-verloop goed te schatten. Het stuursignaal dat het filter aanmaakt moet natuurlijk een functie zijn die overal groter of gelijk is aan nul, want het volume kan nooit negatief zijn. Tijdens het filteren volgt de afsnijfrequentie dit stuursignaal: als het volume nul is, dan is de afsnijfrequentie gelijk aan F0. Je kunt zelf bepalen hoe groot F0 moet zijn. Dit betekent dat er zelfs bij de zachtste geluiden nog wel een bepaalde frequentieband kan worden doorgelaten, tenzij je F0 natuurlijk op 0 zet. Als het volume van het geluid maximaal is (het filter bepaalt uiteraard ook de maximum amplitude van het geluid) dan is de afsnijfrequentie gelijk aan F1, waarvan je de waarde eveneens kunt instellen. Hoe alle tussenliggende volumes gekoppeld worden aan het frequentiegebied tussen F0 en F1, hangt af van gamma. Als gamma gelijk is aan 1, dan is die koppeling een lineaire functie. Hoe de wind gaat klinken bepaal je dus door het instellen van F0 en F1. Maar er is ook nog iets anders, dat we gemakshalve de "huilfactor" of de "huilerigheid" van de wind noemen. Als de wind een duidelijk waarneembare en na-zingbare fluittoon produceert, dan heb je een hoge huilfactor. Je kunt die instellen met Reso-piekbreedte. Dit is precies hetzelfde als de bandbreedte bij een banddoorlaatfilter. De naam "Reso", gebruiken we graag omdat je met die bandbreedte allerlei resonantieverschijnselen kunt maken. Ook dat huilen van de wind is zo'n resonantie of oscillatie, die ontstaat doordat de wind tegen iets scherps blaast, denk aan de
25
metalen lipplaat van een orgelpijp of dwarsfluit. Je hebt al gezien dat hoe smaller de bandbreedte, des te sterker de resonantie en des te duidelijker de toon-waarneming. Probeer eens wat verschillende waarden voor Reso-piekbreedte! En probeer ook Fig. 5.8 eens na te maken!
26