Faltningsreverb i realtidsimplementering SMS45 Lp1 26 DSP-system i praktiken Jörgen Anderton - jorand-3@student.ltu.se Henrik Wikner - henwik-1@student.ltu.se
Introduktion Digitala reverb kan delas upp i två huvudgrupper, de som är algoritmbaserade och de som bygger på ett inspelat impulssvar. Algoritmbaserade reverb approximerar ett reverb genom en eller flera matematiska funktioner som appliceras på insignalen. Dessa kan realiseras genom FIR- eller IIR-filter eller en kombination av de båda. Den andra huvudgruppen tar sin utgångspunkt i ett reverb som redan finns. En kort och transientrik signal används som insignal till det existerande reverbet och en inspelning görs av utsignalen. Insignalen bör vara så lik en ideal impuls som möjligt och oftast används en startpistol eller bredbandigt brus under en mycket kort tidsperiod, en s.k. burst. Reverbet kan vara såväl ett existerande hårdvarureverb som en faktisk lokal. I det senare fallet spelar man in rummets klang med mikrofoner i godtycklig uppställning, det leder till att en och samma lokal kan generera en mängd olika impulssvar beroende på mikrofonernas typ och placering. Detta betyder också att det inte finns ett enkelt sätt att ändra på reverbets parametrar då lokalens (eller systemets) klang är inspelad under vissa, speciella förutsättningar u M [] n = h[] k x[ n k] k= Formel 1.Principen för ett FIR-filter, u är utsignal, h impulssvar, x insignal och M+1 längden på resp. vektor Det framtagna impulssvaret samplas sedan och appliceras på en insignal enligt principen för ett FIR-filter (se formel 1). Detta leder till den stora skillnaden mellan algoritm- och impulssvarsbaserade reverb, nämligen beräkningskraven. För att beräkna en sampel av utsignalen i ett impulssvarsreverb krävs att alla sampels i impulssvaret multipliceras med motsvarande sampel i insignalen. Eftersom den totala mängden beräkningar per sampel begränsas av ett realtidssystems klockfrekvens finns det ett direkt samband mellan den maximala längden på ett impulssvar och beräkningshastigheten hos systemet. Ett 2 s långt impulssvar, stereosamplat i 441 Hz ger två impulssvarsvektorer (vänster resp. höger) med 2 441 = 882 sampels i vardera vektor. Detta betyder att varje sampel i utsignalen kräver minst 2 882 = 1764 klockcykler per sampel. Detta kan jämföras med beräkningshastigheten hos den använda processorn i detta enskilda projekts DSP-kort, 16 MHz, med samma samplingsfrekvens som ovan, 441 Hz. Varje samplingsperiod ger då idealt 16 / 441 = 3628 beräkningar för båda kanalerna, dvs. 1/5 av det antal beräkningar som skulle behövas i det ovanstående exemplet. Vi måste alltså kraftigt minska antalet beräkningar för att kunna använda det tillgängliga DSP-kortet. DSP-kortet (Stud-1 från Rubico Systems) innehåller en processor från Analog Devices (ADSP-2191) med en klockfrekvens på 16 MHz och 16 kb minne. A/D- och D/Aomvandlingen av ljudet gjordes genom codecen AD1885, som innehåller 16-bits omvandlare från Analog Devices. SMS45 Faltningsreverb i realtidsimplementering 2
Metod Reverbet implementerades i ADSP-2191 stud-1 utvecklingskort i programmeringsspråket Assembler. För att få programmet så effektivt som möjligt gjordes alla beräkningar på en klockcykel vilket i sin tur innebar att koefficientvektorn och vektorn med gamla insignaler sparades i programminnet respektive dataminnet. Pga. koefficientvektorns storlek partionerades programminnet om så att ett block innehöll variabler och ett annat programkod. För att DSP:n ska hinna med att göra så många beräkningar som möjligt (vilket är viktigt för att få en så autentisk känsla som möjligt av reverbet) sattes samplingsfrekvensen till 225 Hz. Med den samplingsfrekvensen borde DSP:n teoretiskt klara av 7256 beräkningar per monosampel. Det första impulssvaret som användes var 5 sampel långt men det klarade inte DSP:n av. Detta märktes på ett skrapande ljud liknande overflowdistorsion. Därför valdes ett kortare impulssvar och test genomfördes i Matlab huruvida det räcker med 3 sampel. Det visade sig att det lät alldeles utmärkt även med 3 sampel varför den längden valdes att fortsättningsvis användas. För att kunna ändra längden på reverbet dvs. efterklangstiden på originalljudet måste längden på impulssvaret ändras. Det löstes genom att hoppa över vissa sampel ur originalimpulssvaret (se fig. 2-4). Man får då ett annat impulssvar och genom att vissa sampel hoppas över behövs sampel längre fram i originalimpulssvaret. Dock är magnituden för senare sampel så låg att de knappt spelar någon roll varvid ett kortare reverb uppfattas. Pga. att den faktiska beräkningshastigheten låg så pass mycket under den teoretiska bestämdes att DSP:n bara skulle processera en kanal. Annars hade bara ~15 sampel kunnat filtreras och troligtvis hade då reverbet inte låtit så mycket reverb. Filterkoeffienterna togs fram genom att läsa in ett inspelat impulssvar i Matlab och sedan sampla ner det med en faktor 2. Dvs. samplingsfrekvensen blir hälften så kort, 225 Hz. Därefter togs de 9 första värdena och skalades om för att passa 1.15-systemet. Sedan exporterades koefficenterna till en.dat-fil som importerades i programkoden. Tre olika filtreringsalgoritmer implementerades. En för varje reverbstorlek. För den största storleken lästes de 3 första samplen ur impulssvaret och multiplicerades med gamla insignaler. För mellanstorleken lästes varannat sampel in upp till de 6 första samplen och för den minsta storleken lästes var tredje sampel in ända till slutet av vektorn. SMS45 Faltningsreverb i realtidsimplementering 3
Resultat För att anpassa impulssvaret till beräkningshastigheten på en enklare DSP kan sampels som inte innehåller nödvändig information tas bort. Det resulterande, kortare impulssvaret blev i vårt fall 9 sampels långt (av totalt ca 2). Impulssvaret är en ögonblicksbild av en verklig lokal under vissa förutsättningar. Detta hindrar dock inte att man tolkar impulssvaret på olika sätt för att ge olika klang på utsignalen. Klangen hos ett reverb bestäms till största delen av de tidiga reflektioner som inträffar under de första 1 ms, vilket gör att vi kan skapa olika stora reverb av samma impulssvar så länge impulssvarsvektorn innehåller de sampels som motsvarar dessa tidiga reflektioner. Genom att decimera impulssvaret (hoppa över ett visst antal sampels) ges approximationer av reverb som kan ses som skalade versioner av originalimpulssvaret. De 3 beräkningar som är tillgängliga per sampel fördelas över olika stor del av impulssvaret enligt tabell 1 och figur 2-4. Antal samples ur impulssvaret Hoppstorlek mellan sampels Small 9 3 Medium 6 2 Large 3 1 Tabell 1. Tabell över de olika reverbstorlekarna och deras relation till originalimpulssvaret. Figur 1. Det nersamplade impulssvar varifrån koefficienterna tas. SMS45 Faltningsreverb i realtidsimplementering 4
.4 Impulssvar för Small.35.3.25 h[n ].2.15.1.5 5 1 15 2 25 3 35 [n] Figur 2. Impulssvar för det minsta reverbet där var tredje sampel används..45 Impulssvar för Medium.4.35.3.25 h[n].2.15.1.5 5 1 15 2 25 3 [n] Figur 3. Impulssvar för mellanreverbet där varannat sampel används. SMS45 Faltningsreverb i realtidsimplementering 5
.45 Impulssvar för Large.4.35.3.25 h[n].2.15.1.5 5 1 15 2 25 3 [n] Figur 4. Impulssvar för det största reverbet där varje sampel upp till 3 används. SMS45 Faltningsreverb i realtidsimplementering 6
Diskussion Man kan ifrågasätta huruvida det blir ett så välljudande reverb som möjligt när man hoppar över sampels som vi gjort i detta projekt. I fallet för det kortaste reverbet använder vi bara var tredje sampel och de som ligger emellan kan ju faktiskt vara viktigare. Detta innebär ju också i och för sig att man bara får ett annorlunda impulssvar som beter sig som vilket annat impulssvar som helst, men inte nödvändigtvis som en kortare version av det här projektets längsta reverb. Dessutom har vi i vårat impulssvar totalt 2 sampels. Vi använder de 9 första vilket är mindre än hälften. Kanske är de sista 11 viktigare än man tror. Ofta är det reverbsvansen som bestämmer hur autentiskt ett reverb låter. Detta är dock svårt att testa i realtid i DSP:n, men man kan kontrollera i Matlab om man vill födjupa sig mer inom området. En annan typ av implementation har diskuterats inom gruppen som innebär att man sparar fler insignalsvärden och istället för att hoppa över sampels bara i koefficentvektorn också hoppa över insignaler och t ex ta var tredje tidigare insginal och multiplicera med var tredje värde i koefficientvektorn. På så vis kan man möjligtvis uppnå ett längre reverb utan att kräva fler beräkningar. SMS45 Faltningsreverb i realtidsimplementering 7