29.07.2013 Views

(brug shift+retur for ny linie)> - Barnkob

(brug shift+retur for ny linie)> - Barnkob

(brug shift+retur for ny linie)> - Barnkob

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Martin Bruun Werner<br />

Esben Møller <strong>Barnkob</strong><br />

Højttaler Equalizering og<br />

Beskyttelsesalgoritme<br />

Bachelorprojekt, juni 2009


Martin Bruun Werner<br />

Esben Møller <strong>Barnkob</strong><br />

Højttaler Equalizering og<br />

Beskyttelsesalgoritme<br />

Bachelorprojekt, juni 2009


Højttaler Equalizering og Beskyttelsesalgoritme<br />

Rapporten er udarbejdet af:<br />

Martin Bruun Werner<br />

Esben Møller <strong>Barnkob</strong><br />

Vejleder(e):<br />

Finn T. Agerkvist, Institut <strong>for</strong> Elektroteknologi<br />

Ørsted•DTU<br />

Center <strong>for</strong> Elteknologi (CET)<br />

Danmarks Tekniske Universitet<br />

Elektrovej<br />

Bygning 325<br />

2800 Kgs. Lyngby<br />

Denmark<br />

www.oersted.dtu.dk/cet<br />

Tel: (+45) 45 25 35 00<br />

Fax: (+45) 45 88 61 11<br />

E-mail: cet@oersted.dtu.dk<br />

Udgivelsesdato:<br />

Klasse:<br />

Udgave:<br />

Bemærkninger:<br />

Rettigheder:<br />

2<br />

26. juni 2009<br />

1 (offentlig)<br />

1. udgave<br />

Denne rapport er indleveret som led i opfyldelse af kravene <strong>for</strong><br />

opnåelse af graden Bachelor i teknisk videnskab (BScE) på Danmarks<br />

Tekniske Universitet.<br />

Rapporten repræsenterer 20 ECTS point.<br />

Martin Bruun Werner, Esben Møller <strong>Barnkob</strong>, 2009


ABSTRACT<br />

The current trend in loudspeaker designs is to make drivers and enclosures smaller and<br />

smaller. This means that the low frequency response is compromised and this can fairly<br />

easily be compensated <strong>for</strong> by equalization. However this increases the mechanical and<br />

thermal load of the drivers. To avoid damaging the driver the equalization must be monitored<br />

and adjusted according to the signal level and frequency content. Such algorithms<br />

are implemented in devices such as mobile phones as well as advanced loudspeaker systems<br />

such as Beolab 5.<br />

This project gives an insight in modeling of closed-box loudspeakers, to deduce transfer<br />

functions <strong>for</strong> low-frequency pressure and driver excursion. An equalizing filter is designed<br />

based on the low-frequency pressure transfer function, and a mechanical protection algorithm<br />

is designed based on the driver excursion transfer function. The pressure transfer<br />

function is a 2 nd order high-pass filter, which can be described with two parameters; the<br />

loudspeaker resonance frequency and the total quality factor. The equalizing filter is<br />

trans<strong>for</strong>med into a digital recursive filter using the bilinear trans<strong>for</strong>mation. The driver<br />

excursion is modeled by a 2 nd order low-pass filter, described by the same two parameters.<br />

By monitoring the driver excursion, the equalizing filter can be dynamically reconfigured<br />

to limit driver excursion. Both filters are implemented on two various plat<strong>for</strong>ms. For PC<br />

use, a DSP plug-in <strong>for</strong> the media player Foobar2000 is developed, which can be configured<br />

to fit different closed-box loudspeakers, through a graphical user interface. For standalone<br />

use, the plug-in is ported to run on an Analog Devices ADSP-21369 DSP evaluation board.<br />

Application of this project enables small, closed-box loudspeakers, to have a normalized<br />

amplitude response similar to a larger loudspeaker. Applying the principles to a 3 L<br />

closed-box speaker equipped with a 5.25” woofer, the cutoff frequency can be extended<br />

two octaves, while still allowing music to play at 80 dB SPL, 1 meter from the stereo setup.<br />

3


RESUMÉ<br />

Den nuværende trend inden<strong>for</strong> højttalerdesign er, at lave højttalerenheder og tilhørende<br />

kabinetter mindre og mindre. Det sker på bekostning af det lavfrekvente respons, hvilket<br />

der <strong>for</strong>holdsvist enkelt kan kompenseres <strong>for</strong> ved hjælp af equalizing. Dog medfører dette<br />

større mekanisk og termisk belastning af højttalerenhederne. For at undgå skader på enheden<br />

skal kompenseringen <strong>for</strong>etages under konstant korrektion alt efter signalets frekvensindhold<br />

og niveau. Sådanne beskyttelsesalgoritmer er allerede implementeret i mobiltelefoner<br />

såvel som avancerede højttalersystemer som <strong>for</strong> eksempel Beolab 5.<br />

Dette projekt giver et indblik I modelleringen af lukket-kabinet højtalere med henblik på<br />

at udlede overføringsfunktioner <strong>for</strong> det lavfrekvente tryk og membranens udsving. Et equalizerfilter<br />

designes på baggrund af den lavfrekvente overføringsfunktion <strong>for</strong> trykket, og<br />

en mekanisk beskyttelsesalgoritme designes på baggrund af overføringsfunktionen <strong>for</strong><br />

membranens mekaniske udsving. Overføringsfunktionen <strong>for</strong> trykket er givet ved et 2. ordens<br />

højpas-filter, som beskrives gennem højttalerens resonansfrekvens og totale Qfaktor.<br />

Equalizerfilteret trans<strong>for</strong>meres til et digitalt rekursivt filter ved <strong>brug</strong> af den bilineære<br />

trans<strong>for</strong>mation. Membranens udsving modelleres med et 2. ordens højpas-filter,<br />

som beskrives gennem de samme to parametre. Ved at overvåge membranens udsving kan<br />

equalizerfilteret ændres efter behov, så udsvinget begrænses. De to filtre implementeres<br />

på to <strong>for</strong>skellige plat<strong>for</strong>me. Der er udviklet et plug-in til musikafspilleren Foorbar2000 til<br />

<strong>brug</strong> på PC, hvor equalizerfilteret, gennem et grafisk <strong>brug</strong>erinterface, kan konfigureres så<br />

det passer til <strong>for</strong>skellige lukket-kabinet højttalere. Derudover er det porteret til et Analog<br />

Devices ADSP-21369 DSP evaluation board.<br />

I praksis gør projektet det muligt at give små lukket-kabinet højttalere et normaliseret<br />

amplituderespons svarende til en større højttaler. Anvendes equalizerfilteret på en 3 L<br />

lukket-kabinet højttaler, udstyret med en 5,25” enhed, kan man sænke knækfrekvensen to<br />

oktaver og stadig afspille musik med op til 80 dB SPL, 1 meter fra højttalerne.<br />

5


INDHOLDSFORTEGNELSE<br />

Abstract .................................................................................................................................................... 3<br />

Resumé ..................................................................................................................................................... 5<br />

Liste over figurer .................................................................................................................................. 9<br />

Symbolliste ........................................................................................................................................... 11<br />

1 Indledning ......................................................................................................................................... 15<br />

1.1 Baggrund ................................................................................................................................................... 15<br />

1.2 Problem<strong>for</strong>mulering ............................................................................................................................. 15<br />

1.3 Afgrænsning og <strong>for</strong>udsætninger ...................................................................................................... 16<br />

1.4 Læsevejledning ....................................................................................................................................... 16<br />

2 Teori - højttaler ............................................................................................................................... 19<br />

2.1 Højttaleropbygning ............................................................................................................................... 19<br />

2.2 Højttaler modellering ........................................................................................................................... 21<br />

2.3 Overføringsfunktion <strong>for</strong> volumenhastighed ............................................................................... 23<br />

2.4 Småsignalsparametre ........................................................................................................................... 29<br />

2.5 Overføringsfunktion <strong>for</strong> tryk ............................................................................................................. 30<br />

2.6 Overføringsfunktion <strong>for</strong> mekanisk udsving ................................................................................ 32<br />

2.7 Mekanisk begrænsning ........................................................................................................................ 33<br />

2.8 Kort om termisk begrænsning .......................................................................................................... 34<br />

3 Teori - signalbehandling .............................................................................................................. 35<br />

3.1 Laplace trans<strong>for</strong>mation ....................................................................................................................... 36<br />

3.2 Z-trans<strong>for</strong>mation .................................................................................................................................... 40<br />

3.3 Bilineær trans<strong>for</strong>mation...................................................................................................................... 42<br />

3.4 Rekursive filtre ........................................................................................................................................ 46<br />

4 Filter design ...................................................................................................................................... 49<br />

4.1 Design af filter i s-domænet ............................................................................................................... 49<br />

4.2 Bilineær trans<strong>for</strong>mation...................................................................................................................... 54<br />

4.3 Omskrivning til rekursivt filter ........................................................................................................ 55<br />

5 Implementering .............................................................................................................................. 57<br />

5.1 Foobar2000 .............................................................................................................................................. 57<br />

5.2 DSP evaluation board ........................................................................................................................... 66<br />

7


Indholds<strong>for</strong>tegnelse<br />

6 Test ...................................................................................................................................................... 73<br />

6.1 Bestemmelse af parametre ................................................................................................................ 73<br />

6.2 Afprøvning ................................................................................................................................................ 76<br />

7 Konklusion ........................................................................................................................................ 79<br />

7.1 Resultater .................................................................................................................................................. 79<br />

7.2 Perspektiver ............................................................................................................................................. 79<br />

7.3 Videre arbejde ......................................................................................................................................... 80<br />

Referencer ............................................................................................................................................ 83<br />

A Kildekode <strong>for</strong> foobar2000 .......................................................................................................... 85<br />

B Kildekode <strong>for</strong> evaluation board ............................................................................................... 96<br />

C Målte højttalerparametre ......................................................................................................... 115<br />

8


LISTE OVER FIGURER<br />

Figur 2-1: Tværsnit af højttaler. a) Tilbageskydning. b) Hvileposition. c)<br />

Fremskydning .......................................................................................................................................... 20<br />

Figur 2-2: Trykkilde og volumenhastighedskilde ................................................................................ 21<br />

Figur 2-3: Kraftkilde og hastighedskilde ................................................................................................. 22<br />

Figur 2-4: Elektrisk kredsløb <strong>for</strong> svingspolen ....................................................................................... 23<br />

Figur 2-5: Mekanisk diagram <strong>for</strong> højttaler .............................................................................................. 24<br />

Figur 2-6: Analogt mekanisk kredsløb ...................................................................................................... 24<br />

Figur 2-7: Analogt akustisk kredsløb ........................................................................................................ 25<br />

Figur 2-8: Kombineret analogt kredsløb (Thévenin) ......................................................................... 26<br />

Figur 2-9: Kombineret analogt kredsløb (Norton) .............................................................................. 26<br />

Figur 2-10: Analogt kredsløb <strong>for</strong> luftmodstands-impedansen ....................................................... 27<br />

Figur 2-11: Kombineret analogt kredsløb <strong>for</strong> uendelig baffle ........................................................ 27<br />

Figur 2-12: Kombineret analogt kredsløb (Lavfrekvent tilnærmelse) ....................................... 28<br />

Figur 2-13: a) Lang svingspole. b) Kort svingspole ............................................................................ 33<br />

Figur 3-1: Illustrerer filterdesign <strong>for</strong>løbet .............................................................................................. 36<br />

Figur 3-2: Illustration af Laplace trans<strong>for</strong>mationen. Laplace trans<strong>for</strong>mationen<br />

konverterer et signal i tidsdomænet x(t) til et signal i s-domænet X(s) ......................... 38<br />

Figur 3-3: Sammenhæng mellem s-planet og z-planet, illustreret ved poler og<br />

nulpunkter. Vertikale linjer i s-planet svarer til cirkler i z-planet ..................................... 42<br />

Figur 3-4: Realisering af et analogt filter med et digitalt filter ....................................................... 43<br />

Figur 3-5: Outputtet til samplenummer k, y[k], udregnes af værdierne fra<br />

inputsignalet f[k], f[k – 1] og f[k – 2], samt de tidligere værdier fra<br />

outputsignalet y[k – 1] og y[k – 2]. Figurerne er vist <strong>for</strong> k = 25. ......................................... 48<br />

Figur 4-1: Amplituderespons <strong>for</strong> vilkårlig højttalerenhed H(s) ..................................................... 50<br />

Figur 4-2: Inverteret amplituderespons G(s) ......................................................................................... 50<br />

Figur 4-3: Amplituderespons med <strong>for</strong>stærkning 1 .............................................................................. 51<br />

Figur 4-4: Amplituderespons <strong>for</strong> vilkårlig højttalerenhed med ændret<br />

knækfrekvens........................................................................................................................................... 52<br />

Figur 4-5: Amplituderespons <strong>for</strong> overdæmpet system (QTC<strong>ny</strong> = 0,2) ............................................ 53<br />

9


Liste over figurer<br />

Figur 4-6: Amplituderespons <strong>for</strong> underdæmpet system (QTC<strong>ny</strong> = 2,0) ......................................... 53<br />

Figur 5-1: Signalvejen i Foobar2000 ......................................................................................................... 57<br />

Figur 5-2: Illustration af en chunk <strong>for</strong> et stereo musiksignal .......................................................... 58<br />

Figur 5-3: Foobar2000 vindue til aktivering af DSP-modul ............................................................ 61<br />

Figur 5-4: Brugergrænsefalde <strong>for</strong> DSP-modul ....................................................................................... 61<br />

Figur 5-5: Signalniveauer igennem filteret ............................................................................................. 63<br />

Figur 5-6: Analog Devices ADSP-21369 developers kit ..................................................................... 66<br />

Figur 5-7: Oversigt over knapper of lysdioder ...................................................................................... 68<br />

Figur 5-8: Oversigt over mulige indstillinger ........................................................................................ 68<br />

Figur 6-1: Størrelse af elektrisk impedans som funktion af frekvensen .................................... 74<br />

Figur 6-2: Svingspolens udsving som funktion af frekvensen ........................................................ 74<br />

Figur 6-3: Membranens acceleration som funktion af frekvensen .............................................. 75<br />

Figur 6-4: Testede højttalere ........................................................................................................................ 76<br />

Figur 7-1: Equal-loudness kurver ............................................................................................................... 81<br />

10


SYMBOLLISTE<br />

Symbol Enhed Definition<br />

a m Radius af membran<br />

B T Magnetisk flux densitet<br />

c m/s Lydens hastighed<br />

C m A<br />

5 /N Akustisk eftergivenhed<br />

C AS<br />

C AT<br />

m 5 /N Akustisk eftergivenhed af membranophæng<br />

m 5 /N Totale akustiske eftergivenhed af membranophæng og kabinet<br />

C F Elektrisk kapacitans<br />

E<br />

C M<br />

C MS<br />

m/N Mekanisk eftergivenhed<br />

m/N Mekanisk eftergivenhed af membranophæng<br />

e V Elektrisk spænding<br />

f N, Hz Kraft, frekvens<br />

f c , c<br />

Hz, rad/s Resonansfrekvens <strong>for</strong> lukket-kabinet system (højttalerteori)<br />

f s , s<br />

Hz, rad/s Resonansfrekvens <strong>for</strong> højttalerenhed i uendelig baffle (højttalerteori)<br />

i A Elektrisk strøm<br />

l m Effektiv spolelængde<br />

L E<br />

H Elektrisk induktans<br />

11


Symbolliste<br />

M kg/m A<br />

4 Akustisk masse<br />

M kg/m AC<br />

4 Akustisk masse <strong>for</strong> membran og luftmodstand i lukket-kabinet<br />

M kg/m AD<br />

4 Akustisk masse <strong>for</strong> membran<br />

M kg/m AS<br />

4 Akustisk masse <strong>for</strong> membran og luftmodstand i uendelig baffle<br />

M M<br />

12<br />

kg Mekanisk Masse<br />

M kg Mekanisk masse af membran<br />

MD<br />

P Pa Akustisk tryk<br />

p Pa Akustisk tryk<strong>for</strong>skel<br />

D<br />

Q - Q-faktor <strong>for</strong> elektrisk lukket-kabinet system<br />

EC<br />

Q - Q-faktor <strong>for</strong> elektrisk uendelig baffle system<br />

ES<br />

Q - Q-faktor <strong>for</strong> mekanisk lukket-kabinet system<br />

MC<br />

Q - Q-faktor <strong>for</strong> mekanisk uendelig baffle system<br />

MS<br />

Q - Q-faktor <strong>for</strong> totale lukket-kabinet system<br />

TC<br />

Q - Q-faktor <strong>for</strong> totale uendelig baffle system<br />

TS<br />

Q - Ny Q-faktor <strong>for</strong> totale lukket-kabinet system<br />

TC<strong>ny</strong><br />

R N∙s/m A<br />

5 Akustisk modstand<br />

R N∙s/m AE<br />

5 Akustisk modstand som modellerer det elektriske tab<br />

R N∙s/m AS<br />

5 Akustisk modstand som modellerer tab i ophæng<br />

R N∙s/m AT<br />

5<br />

RAERAS<strong>for</strong> uendelig baffle<br />

R E<br />

Ω Elektrisk modstand


R M<br />

N∙s/m Mekanisk modstand<br />

R N∙s/m Mekanisk modstand <strong>for</strong> membranophæng<br />

MS<br />

S D<br />

m 2 Membrans overfaldeareal<br />

u m/s Mekanisk hastighed<br />

u m/s Mekanisk hastighed <strong>for</strong> membran<br />

D<br />

U m 3 /s Volumenhastighed<br />

U m D<br />

3 /s Volumenhastighed <strong>for</strong>årsaget af membran<br />

V m AS<br />

3 Ækvivalent volumen <strong>for</strong> højttalerenheds ophæng<br />

V m AT<br />

3 Samlet ækvivalent volumen <strong>for</strong> højttalerenhed og kabinet<br />

rad/s Knækfrekvens (signalteori)<br />

c<br />

rad/s Knækfrekvens (signalteori)<br />

c<strong>ny</strong><br />

x m Mekanisk udsving <strong>for</strong> membran<br />

D<br />

x m Maksimalt membranudsving<br />

max<br />

Z E<br />

Ω Elektrisk impedans<br />

Z M<br />

Ω Mekanisk impedans<br />

m Bølgelængde<br />

kg/m 0<br />

3 Densitet af luft<br />

Symbolliste<br />

13


1<br />

INDLEDNING<br />

1.1 Baggrund<br />

Den nuværende trend inden<strong>for</strong> højttalerdesign er ønsket om at konstruere mindre og<br />

mindre enheder og kabinetter. Udviklingen er blandt andet en følge, af de konstant stigende<br />

krav der stilles til de elektroniske enheder, som de små højttalere implementeres i. Som<br />

eksempel kan nævnes mobiltelefoner, hvis dimensioner gerne ses reducerede, også med<br />

den øgede funktionalitet taget i betragtning. Også i det private er der en stigende efterspørgsel<br />

på små højttalere, der helst skal kunne placeres diskret på en hylde, og ikke virke<br />

frembrusende i hjemmet. Størrelsen på højttaleren er altså en afgørende faktor, når folk<br />

skal vælge højttalermodel, også selvom det medfører en <strong>for</strong>ringet lydkvalitet.<br />

Små højttalere har nemlig svært ved at gengive de dybe toner, da deres størrelse udgør en<br />

væsentlig begrænsning <strong>for</strong>, hvor stor en mængde luft de kan flytte. Det betyder, at den lave<br />

del af frekvensresponset dæmpes betydeligt til <strong>for</strong>del <strong>for</strong> højttalerens reducerede dimensioner.<br />

Ved <strong>brug</strong> af digital signalbehandling kan man kompensere <strong>for</strong> den manglende baslyd, og<br />

derved rette op på små højttaleres medfødte mangel. Men denne kompensering stiller<br />

samtidig store krav til højttalerenhedens mekaniske konstruktion. Så <strong>for</strong> at undgå skader<br />

på enheden, skal kompenseringen <strong>for</strong>etages under konstant korrektion alt efter signalets<br />

frekvensindhold og niveau.<br />

1.2 Problem<strong>for</strong>mulering<br />

Ved <strong>brug</strong> af digital signalbehandling, vil vi i dette projekt designe et digitalt filter, som skal<br />

<strong>for</strong>etage adaptiv korrektion af de lave frekvenser. Filteret designes på baggrund af højttalerens<br />

lavfrekvente amplituderespons, og korrektionen sker på baggrund af den fremstillede<br />

algoritme <strong>for</strong> den mekaniske beskyttelse. Til programmering af filter og algoritme<br />

be<strong>ny</strong>ttes programmeringssprogene C og C++. Selve filteret vil blive implementeret som<br />

plug-in til musikafspilleren Foobar2000, samt programmeret på et DSP evaluation board<br />

fra Analog Devices. Med udgangspunkt i det stigende ønske om mindre højttalere, og den<br />

dertilhørende begrænsning i <strong>for</strong>m af højtalerens lavfrekvente respons, vil vi i dette projekt<br />

besvare følgende spørgsmål:<br />

Hvordan udledes højttalerens lavfrekvente amplituderespons?<br />

15


Indledning<br />

Hvordan fremstiller man et digitalt filter, der på <strong>for</strong>nuftig vis kompenserer <strong>for</strong> højttalerens<br />

reducerede lavfrekvente gengivelse?<br />

Hvordan fremstilles en beskyttelsesalgoritme der tager højde <strong>for</strong> højttalerens mekaniske<br />

begrænsning?<br />

Hvordan implementeres filteret i henholdsvis Foobar2000 og på et DSP evaluation<br />

board?<br />

1.3 Afgrænsning og <strong>for</strong>udsætninger<br />

Gennem hele projektet antager vi, at den modellerede højttalermodel er linear. Ulinearitet<br />

kan <strong>for</strong>ekomme på grund af højttalerenhedens indre og ydre ophæng. Ved små membranudsving<br />

er fjederkonstanten konstant, men ved øget membranudsving kan ophænget blive<br />

ulineært. Vi antager der<strong>for</strong>, at membranudsvinget er tilstrækkeligt småt, så der kan ses<br />

bort fra eventuel ulinearitet.<br />

Det digitale filter kan kun anvendes på lukket-kabinet højttalere, idet modelleringen er<br />

<strong>for</strong>etaget <strong>for</strong> en uendelig baffle med tilsvarende analogi. Dette afgrænser gyldighedsområdet<br />

<strong>for</strong> resultaterne, idet de kun giver mening, hvis man be<strong>ny</strong>tter netop denne type højttaler.<br />

Det ville også være muligt at designe et filter til en basrefleks højttaler, men her ville<br />

det lavfrekvente amplituderespons være givet ved et 4. ordens filter, til <strong>for</strong>skel fra vores<br />

modellerede 2. ordens filter.<br />

Når der kompenseres <strong>for</strong> den manglende baslyd, stilles der også store krav til højttalerenheden<br />

termisk såvel som mekanisk. Vi har valgt, kun at fremstille en beskyttelsesalgoritme<br />

der tager højde <strong>for</strong> højttalerens mekaniske begrænsning, men kommer dertil med et kort<br />

<strong>for</strong>slag til en mulig implementering af termisk beskyttelse.<br />

1.4 Læsevejledning<br />

Den teoretiske del af rapporten er bygget op som to uafhængige hovedafsnit. Her stifter<br />

læseren bekendtskab med den nødvendige højttalerteori og signalbehandlingsteori. Således<br />

opnås en dybere teoretisk <strong>for</strong>ståelse, som be<strong>ny</strong>ttes til fremstillingen af filter og algoritmer.<br />

Det færdige filter og dertilhørende algoritme implementeres herefter i henholdsvis<br />

Foobar2000 og på et DSP evaluation board. Til sidst afprøves og testes filteret. Neden<strong>for</strong><br />

er opskrevet rapportens hovedafsnit i kronologisk rækkefølge efterfulgt af en kort beskrivelse.<br />

16<br />

Teori – højttaler: Gennemgang af nødvendig højttalerteori<br />

Teori – signalbehandling: Gennemgang af nødvendig signalbehandlingsteori<br />

Filter design: Fremstilling af filter<br />

Implementering: Implementering af filter i Foobar2000 og DSP evaluation board


Test: Bestemmelse af højttalerparametre og afprøvning af filter<br />

Indledning<br />

Til hvert underafsnit inden<strong>for</strong> de to teoriafsnit er k<strong>ny</strong>ttet en fodnote til den tilhørende<br />

overskrift. Her kan man se de be<strong>ny</strong>ttede referencer, samt hvilke kapitler afsnittet har taget<br />

udgangspunkt i.<br />

17


2<br />

TEORI - HØJTTALER<br />

I følgende hovedafsnit vil vi udlede generelle overføringsfunktioner <strong>for</strong> henholdsvis volumenhastighed,<br />

tryk og mekanisk udsving. Overføringsfunktionen <strong>for</strong> trykket be<strong>ny</strong>ttes, når<br />

filteret skal designes, da den beskriver selve højttalerenhedens evne til at gengive <strong>for</strong>skellige<br />

frekvenser i det interessante frekvensbånd. Her menes det lavfrekvente amplituderespons.<br />

Overføringsfunktionen <strong>for</strong> membranens mekaniske udsving be<strong>ny</strong>ttes til at undersøge,<br />

hvorvidt højttalerenheden overbelastes i <strong>for</strong>søget på at gengive et signal. En videre<br />

korrektion <strong>for</strong>etages ved eventuel overlast. Overføringsfunktionen <strong>for</strong> volumenhastigheden<br />

anvendes ikke direkte, men den indgår i ligningerne <strong>for</strong> tryk og udsving, og udgør der<strong>for</strong><br />

et vigtigt led i udledningen af disse to overføringsfunktioner.<br />

Vi vil indlede dette kapitel med et afsnit, der omhandler højttalerens opbygning. Her mener<br />

vi naturligvis den elektrodynamiske højttaler, som er den mest <strong>brug</strong>te til dato. Herefter<br />

vil vi kort nævne, hvorledes en højttaler både kan betragtes som et akustisk, mekanisk<br />

og elektrisk system, og det derved er nødvendigt at konvertere fysiske variable til kredsløbselementer<br />

<strong>for</strong> at sammenkæde de tre systemer. Dette gøres i underafsnittet Højttaler<br />

modellering.<br />

Enhver højttaler er styret af nogle begrænsninger, som er bestemt ud fra højttalerens type<br />

og design. Her menes frem <strong>for</strong> alt det indvendige design, bestående af de enkelte komponenter<br />

og materialer, som højttaleren er sammensat af. Ved en eventuel overskridelse af<br />

disse begrænsninger som følge af <strong>for</strong> høj tilført effekt, har det alvorlige konsekvenser idet<br />

højttaleren overbelastes. Årsagen til en sådan overbelastning sker på basis af højttalerens<br />

termiske og mekaniske begrænsninger, og resulterer i en beskadigelse af enhederne. Vi vil<br />

slutte dette teoriafsnit med en beskrivelse af den mekaniske begrænsning, herunder hvad<br />

begrænsningen skyldes, og hvorledes det er muligt, at undersøge hvorvidt en korrektion<br />

er nødvendig. Den termiske begrænsning vil vi ikke komme nærmere ind på, men en mulig<br />

implementering af termisk beskyttelse vil kort nævnes til slut i opgaven under afsnittet<br />

videre arbejde.<br />

2.1 Højttaleropbygning 1<br />

En højttaler er en elektroakustisk transducer, som konverterer elektriske signaler til lyd.<br />

Den består af en membran, som bevæger sig frem og tilbage svarende til pulseringen af det<br />

1 [1] Chapter 6, 6.1, [6]<br />

19


Teori - højttaler<br />

elektriske signal, og lydbølger udbredes således i den omgivende luft. Membranen er fastgjort<br />

til en spole, der er placeret mellem en permanent magnets syd og nordpol. Når spolen<br />

tilføres et elektrisk signal, dannes der et elektromagnetisk felt <strong>for</strong>saget af strømmen<br />

gennem spolen. Det giver anledning til en kraft, hvor retningen af strømmen afgør, hvorvidt<br />

kraften virker den ene eller den anden vej, hvilket resulterer i, at højttalermembranen<br />

bevæger sig enten frem eller tilbage. Lorentz lov definerer kraften, hvormed spolen af<br />

membranen påvirkes. Ligningen er givet ved:<br />

20<br />

f Bli<br />

( 2.1)<br />

Hvor B er den permanente magnets styrke, l er den effektive længde af spolen, og i er<br />

strømmen der løber igennem spolen. Den permanente magnets styrke er konstant og afhænger<br />

blandt andet af, hvor tæt spolen er på magneten, samt hvilket materiale den består<br />

af. Længden af spolen afhænger af antallet af viklinger, samt tykkelsen af ståltråden. Her<br />

gælder det om at finde et passende kompromis, så spolen og membranen ikke bliver <strong>for</strong><br />

tunge. I højttalerenhedens yderpositioner kan man desuden komme ud <strong>for</strong>, at den effektive<br />

længde bliver mindre, da nogle af viklingerne kommer væk fra den permanente magnet.<br />

Det vil vi komme nærmere ind på som en del af den mekaniske begrænsning. Ellers er både<br />

B og l konstante, og der<strong>for</strong> er kraften direkte proportional med strømmen i spolen. Et<br />

tværsnit af en typisk højttalerenhed er illustreret af. Her ses højttalermembranen, svingspolen<br />

samt den permanente magnet. Derudover består højttalerenheden af et indre og<br />

ydre ophæng. De tillader membranen at bevæge sig frem og tilbage, men sørger samtidig<br />

også <strong>for</strong>, at membranen er centreret omkring dens hvileposition.<br />

Indre ophæng<br />

Permanent<br />

magnet<br />

Svingspole<br />

Støvhætte<br />

Membran<br />

bevægelse<br />

Membran<br />

Ydre ophæng<br />

a) b)<br />

c)<br />

Figur 2-1: Tværsnit af højttaler. a) Tilbageskydning. b) Hvileposition. c) Fremskydning<br />

Ovenstående figur viser også, hvorledes membranen bevæger sig frem og tilbage, når der<br />

løber en strøm gennem svingspolen. Når der ikke frembringes nogle lyd, så befinder membranen<br />

sig i hvilepositionen som illustreret af b). Betragtes et standardiseret eksempel,<br />

hvor højttalerenheden tilføres et sinussignal, så vil membranen bevæge sig fremad, i takt


Teori - højttaler<br />

med at sinussignalet går imod sin maksimumværdi. Når maksimumværdien er nået, er<br />

membranen ved sin maksimale fremskydning. Dette er illustreret af c). På samme måde vil<br />

membranen bevæge sig imod sin maksimale tilbageskydning, i takt med at sinussignalet<br />

når sin mindsteværdi. Dette er illustreret af a). Amplituden af det indkommende signal<br />

afgør altså, hvor kraftig en tone der frembringes.<br />

I udregningen af det akustiske tryk <strong>for</strong> membranen, er det almindeligt at antage, at membranen<br />

kan modelleres som et fladt cirkulært stempel. Dette gælder dog kun ved lave frekvenser,<br />

da tilnærmelsen af en membran med et fladt cirkulært stempel fejler ved høje<br />

frekvenser. Den højest mulige frekvens <strong>for</strong> en sådan tilnærmelse er en funktion af stemplets<br />

radius, membranens dybde og membranens materiale. Selvom det er umuligt at bestemme<br />

en nøjagtig øvre frekvens, så anses den normalt <strong>for</strong> at være den frekvens, hvor<br />

stemplets omkreds er mellem en halv og en hel bølgelængde. Over denne frekvens vil lydubredelsen<br />

fra membranen være retningsafhængig og der vil opstå toppe og dyk i frekvensresponset.<br />

2.2 Højttaler modellering 2<br />

En højttaler kan både betragtes som et akustisk, mekanisk og elektrisk system. Når vi skal<br />

udlede de tidligere nævnte overføringsfunktioner, er det en god idé at <strong>brug</strong>e analysemetoderne<br />

<strong>for</strong> kredsløbsdesign. For at kunne analysere højttaleren som værende et akustisk og<br />

mekanisk system, bliver vi der<strong>for</strong> nødt til at konvertere de fysiske variable til kredsløbselementer.<br />

På den måde kan man sammenkæde de tre systemer, og derved danne overføringsfunktioner<br />

som relaterer fysiske variable med spændinger/strømme.<br />

De to basale variable, som definerer et akustisk system, er tryk p og volumenhastighed U.<br />

Når det akustiske system omskrives til et elektrisk kredsløb, be<strong>ny</strong>ttes en analogi, hvor tryk<br />

svarer til spænding, og volumenhastighed svarer til strøm. Et kredsløb af denne type kaldes<br />

<strong>for</strong> et impedans-analogt kredsløb. Figur 2-2 viser kredsløbssymbolerne <strong>for</strong> tryk og<br />

volumenhastighed, hvor diamant<strong>for</strong>men <strong>for</strong>tæller, hvorvidt værdien af spændingskilden<br />

eller strømkilden er proportional med en anden spænding eller strøm i kredsløbet. Er dette<br />

ikke tilfældet, be<strong>ny</strong>ttes en cirkel i stedet.<br />

2 [1] Chapter 3, chapter 4<br />

U<br />

p p<br />

U<br />

Figur 2-2: Trykkilde og volumenhastighedskilde<br />

21


Teori - højttaler<br />

Det er også muligt at be<strong>ny</strong>tte en omvendt analogi, hvor volumenhastighed svarer til spænding,<br />

og tryk svarer til strøm, men generelt set er den første analogi mest intuitiv. Den<br />

akustiske impedans er defineret som <strong>for</strong>holdet mellem trykket p og volumenhastigheden<br />

U og benævnes Z A . Vi har at:<br />

22<br />

Z<br />

p<br />

U<br />

5<br />

A N s/m<br />

( 2.2)<br />

De tre passive elementer i det akustiske system er:<br />

R A akustisk modstand<br />

C A akustisk eftergivenhed<br />

M A akustisk masse<br />

Et mekanisk analogt kredsløb er et elektrisk kredsløb, hvor strøm og spænding svarer til<br />

kraft og hastighed i det mekaniske system. De to basale variable som definerer et mekanisk<br />

system, er altså kraft f og hastighed u. Be<strong>ny</strong>ttes en analogi hvor kraft svarer til spænding,<br />

og hastighed svarer til strøm, så kaldes kredsløbet <strong>for</strong> et impedans-analogt kredsløb.<br />

Her er strømmen u identisk med en hastigheds<strong>for</strong>skel u u1 u2.<br />

Figur 2-3 viser kreds-<br />

løbssymbolerne <strong>for</strong> kraft og hastighed:<br />

u<br />

f f<br />

u<br />

Figur 2-3: Kraftkilde og hastighedskilde<br />

De tre passive elementer i det mekaniske system er:<br />

R M mekanisk modstand<br />

C M mekanisk eftergivenhed<br />

M M mekanisk masse<br />

Med disse definitioner af det akustiske og mekaniske system vil vi nu udlede et udtryk <strong>for</strong><br />

volumenhastigheden U D .


2.3 Overføringsfunktion <strong>for</strong> volumenhastighed 3<br />

Teori - højttaler<br />

Først optegnes det elektriske kredsløb <strong>for</strong> svingspolen (Figur 2-4). Forstærkeren som<br />

driver svingspolen er repræsenteret med spændingskilden eg og udgangsmodstanden Rg.<br />

Svingspolens modstand og induktans er givet ved henholdsvis RE og LE(ω), og eddystrømmen<br />

der <strong>for</strong>svinder på grund af det elektriske felt er givet ved R’E(ω). Spændingen<br />

som induceres i svingspolen, når den bevæger sig med den mekaniske hastighed uD, er<br />

modelleret med spændingskilden ec BluD.<br />

eg<br />

Rg ic RE<br />

Svingspole<br />

terminaler<br />

R’E(ω)<br />

LE(ω)<br />

ec=BluD<br />

Figur 2-4: Elektrisk kredsløb <strong>for</strong> svingspolen<br />

Vi ønsker at udlede et udtryk <strong>for</strong> strømmen gennem svingspolen iC. Her antager vi,<br />

at Rg 0 , og be<strong>ny</strong>tter os af ligningen UD uDS D , som beskriver sammenhængen mellem<br />

svingspolens mekaniske hastighed og volumen hastigheden. Vi får at:<br />

i<br />

e eeBlueBl U<br />

g c g D g D<br />

c ( 2.3)<br />

ZE ZE ZE ZE SD<br />

hvor impedansen ZE er defineret som:<br />

LE( )<br />

s<br />

ZE RE LE ( ) s|| R' E( )<br />

RE<br />

( 2.4)<br />

1 [<br />

L ( )/ R' ( )]<br />

s<br />

3 [1] Chapter 6, 6.2, 6.3, 6.4 og 6,5<br />

E E<br />

23


Teori - højttaler<br />

Denne ligning be<strong>ny</strong>ttes senere, men først skal de analoge kredsløb <strong>for</strong> det tilsvarende mekaniske<br />

og akustiske system bestemmes. Starter vi med det mekaniske kredsløb, så kan<br />

det udledes ud fra højttalerens mekaniske diagram, som er illustreret af Figur 2-5. Det<br />

mekaniske diagram skitseres på følgende måde: Først tegnes horisontale linjer svarende<br />

til de enkelte hastigheder i systemet, herunder en linje i bunden <strong>for</strong> hastigheden nul. Herefter<br />

<strong>for</strong>bindes linjerne med de mekaniske elementer. I vores tilfælde er det tilstrækkeligt<br />

med membranens hastighed u D . Kilden fD Blic<br />

repræsenterer den kraft, som virker på<br />

membranen, når der løber en strøm i c gennem svingspolen. Her er B den magnetiske flux<br />

densitet, og l er længden af ståltråden <strong>for</strong> den del at spolen, som befinder sig i den magnetiske<br />

flux. Massen MMD er den mekaniske masse af både membran og svingspole, CMS er den<br />

mekaniske eftergivenhed <strong>for</strong> membranens ophæng, og RMS er det mekaniske tab i ophæn-<br />

get. Kilden fa SDpD repræsenterer den akustiske kraft på membranen, som frembringes<br />

af tryk<strong>for</strong>skellen mellem membranens bagside og <strong>for</strong>side. Her er S D membranens overfla-<br />

deareal, og p D er <strong>for</strong>skellen i akustisk tryk hen over membranen. På Figur 2-5 er valgt<br />

polaritet, så u D stiger, når i c er positiv, og u D falder, når p D er positiv.<br />

24<br />

fD = Blic<br />

uD<br />

MMD RMS CMS<br />

Figur 2-5: Mekanisk diagram <strong>for</strong> højttaler<br />

fa = SDpD<br />

Med ovenstående mekaniske diagram er det muligt at udlede det analoge kredsløb. Dette<br />

er en længere procedure, hvis man illustrativt skal <strong>for</strong>klare de enkelte trin. Her henvises til<br />

reference [1], kapitel 4.3. Kredsløbet er vist på Figur 2-6.<br />

fD=Blic<br />

uD<br />

MMD RMS CMS<br />

fa=pDSD<br />

Figur 2-6: Analogt mekanisk kredsløb<br />

Vi ønsker at udlede et udtryk <strong>for</strong> membranens hastighed u D . Kigger vi på ovenstående<br />

figur, så svarer det til strømmen rundt i kredsløbet. Ved udregning fås:


u<br />

D<br />

U Blic fa Blic<br />

S p<br />

<br />

S Z Z Z<br />

D D D<br />

D M M M<br />

Hvor den mekaniske impedans Z M er defineret som:<br />

Teori - højttaler<br />

( 2.5)<br />

1<br />

ZM MMDs RMS<br />

( 2.6)<br />

C s<br />

MS<br />

Vi kigger nu på det analoge kredsløb <strong>for</strong> det akustiske system. Kredsløbet er illustreret af<br />

Figur 2-7, hvor UD uDS D repræsenterer membranens volumenhastighed. De to impedan-<br />

ser Z AF og Z AB modellerer den akustiske luftmodstand <strong>for</strong> henholdsvis membranens <strong>for</strong>-<br />

side og bagside.<br />

pB<br />

ZAB<br />

UD=uDSD<br />

pD<br />

UD<br />

ZAF<br />

Figur 2-7: Analogt akustisk kredsløb<br />

Tryk<strong>for</strong>skellen mellem membranens <strong>for</strong>side og bagside er givet ved:<br />

p U( Z Z )<br />

( 2.7)<br />

D D AF AB<br />

Vi ønsker nu at kombinere ovenstående analoge kredsløb i et enkelt sammenfattet kreds-<br />

løb, som relaterer D U og g e . Dette gøres ved, at indsætte c i (2.3) og p D (2.7) i udtrykket<br />

<strong>for</strong> membranens hastighed (2.5) og herefter multiplicere med ZM / S D.<br />

ZM UD ZM Bl eg<br />

Bl U D ZM SD<br />

UDZAFUDZAB<br />

SD SD SD ZM ZEZESD SD ZM<br />

2 2<br />

D M g<br />

D<br />

2<br />

SD ZE SD 2<br />

ZE SD<br />

D AF D AB<br />

pF<br />

( 2.8)<br />

U Z Ble B l U<br />

U Z U Z ( 2.9)<br />

U<br />

Z<br />

Z Z<br />

<br />

<br />

Ble<br />

2<br />

( Bl)<br />

M<br />

g<br />

D 2 2 AF AB <br />

ZE SD SD SDZ E<br />

( 2.10)<br />

25


Teori - højttaler<br />

Vi har nu et udtryk, der sammenfatter volumenhastigheden UD og <strong>for</strong>stærkerens output-<br />

spænding e g , hvor hvert led i parentesen er en akustisk impedans. Den første impedans er<br />

2 2<br />

den omvendte af Z E ganget med en faktor ( Bl) / S D . Den anden impedans<br />

26<br />

Z / S repræ-<br />

2<br />

M D<br />

senterer tre serieimpedanser, som stammer fra den mekaniske impedans (2.4). På akustisk<br />

<strong>for</strong>m kan disse defineres som:<br />

M<br />

R<br />

M R C S C<br />

( 2.11)<br />

MD<br />

MS<br />

2<br />

AD 2<br />

SD AS 2<br />

SD<br />

AS D MS<br />

Hvor AD M er den samlede akustiske masse af membranen og svingspolen, R AS er den aku-<br />

stiske modstand, som modellerer det mekaniske tab i ophænget, og C AS er den akustiske<br />

eftergivenhed <strong>for</strong> membranens ophæng. Ved be<strong>ny</strong>ttelse af ovenstående definitioner giver<br />

ligning (2.11) anledning til følgende kredsløb:<br />

Ble<br />

S Z<br />

g<br />

D E<br />

Bl<br />

S Z<br />

2 2<br />

2<br />

D E<br />

UD<br />

MAD RAS CAS<br />

Figur 2-8: Kombineret analogt kredsløb (Thévenin)<br />

Spændingskilden (eller trykkilden med den be<strong>ny</strong>ttede analogi) er omvendt proportional<br />

med Z E . Ved at trans<strong>for</strong>mere spændingskilden om til en strømkilde kommer vi frem til en<br />

volumenhastighed, som ikke er en funktion af Z E . Denne omskrivning er <strong>ny</strong>ttig og svarer<br />

til at omskrive det ovenstående Thévenin kredsløb til det ækvivalente Norton kredsløb.<br />

Kredsløbet er illustreret af Figur 2-9.<br />

SDeg Bl<br />

Bl<br />

S Z<br />

2 2<br />

2<br />

D E<br />

UD<br />

MAD RAS CAS<br />

Figur 2-9: Kombineret analogt kredsløb (Norton)<br />

Vi ønsker nu at finde det tilsvarende analoge kredsløb <strong>for</strong> en uendelig baffle. Et hvilket<br />

som helst system, som akustisk isolerer højttalerenhedens <strong>for</strong>side fra dens bagside, kaldes<br />

en baffle. Det mest simple eksempel er en uendelig baffle, hvor en uendelig stor plade<br />

tænkes placeret, så den opdeler hele rummet i to halvdele. Hvis en højttalerenhed monteres<br />

i et lukket kabinet, og den indre volumen er tilstrækkelig stor, så vil den indre luft ikke<br />

ZAF<br />

ZAB<br />

ZAF<br />

ZAB


Teori - højttaler<br />

ændre membranophængets effektive fjederkonstant, og kabinettet kaldes <strong>for</strong> en uendelig<br />

baffle. Analogien <strong>for</strong> en uendelig baffle er altså identisk med en lukket-kabinet højttaler,<br />

som vi arbejder med.<br />

Først skal vi have omskrevet Norton kredsløbet fra Figur 2-9, således at det gælder <strong>for</strong> en<br />

uendelig baffle. Impedanserne Z AF og Z AB som modellerer den akustiske luftmodstand<br />

<strong>for</strong> henholdsvis membranens <strong>for</strong>side og bagside, kan hver især repræsenteres med kredsløbet<br />

på Figur 2-10 (udledt i afsnit 3.7, Electroacoustics, reference [1]), som er luftmodstands-impedansen<br />

<strong>for</strong> en flad cirkel<strong>for</strong>met disk i en uendelig baffle. Dette er kun impe-<br />

dansen <strong>for</strong> den ene side, og da vi har både Z AF og Z AB , så skal spolen og modstandene i<br />

kredsløbet <strong>for</strong>dobles mens kondensatoren skal halveres.<br />

UD<br />

pD<br />

CA1<br />

RA1<br />

MA1<br />

Figur 2-10: Analogt kredsløb <strong>for</strong> luftmodstands-impedansen<br />

Den tilsvarende impedans E Z er en modstand med værdien 1/ R E i parallel med en kon-<br />

densator med værdien LE ( ) og en modstand med værdien1/ R' E(<br />

) i seriekobling. Det<br />

analoge kombinerede kredsløb kan således om<strong>for</strong>mes til:<br />

Hvor:<br />

SDeg Bl<br />

RAE<br />

UD<br />

CAE<br />

R’AE<br />

RA2<br />

MAD RAS CAS<br />

0.5CA1<br />

2RA1<br />

2MA1<br />

Figur 2-11: Kombineret analogt kredsløb <strong>for</strong> uendelig baffle<br />

( Bl) S L ( )<br />

( Bl)<br />

R C R ( 2.12)<br />

( ) ' ( )<br />

2 2<br />

2<br />

AE 2<br />

SDRE AE<br />

D E<br />

Bl<br />

2 'AE<br />

2<br />

SDR E<br />

2RA2<br />

27


Teori - højttaler<br />

Ud fra ovenstående kredsløb er det nu muligt at udlede et udtryk <strong>for</strong> U D . Da vi kun skal<br />

behandle de lave frekvenser, kan der be<strong>ny</strong>ttes flere tilnærmelser til en lavfrekvent analyse<br />

af kredsløbet. Den første tilnærmelse gælder <strong>for</strong> kondensatoren C AE . Ved lave frekvenser<br />

erstattes den af et åbent kredsløb. Den anden tilnærmelse gælder <strong>for</strong> luftmodstands-<br />

impedansen. Impedansen <strong>for</strong> den akustiske masse 2M A1<br />

er meget lille i <strong>for</strong>hold til de an-<br />

dre elementer, som den er i parallel med. Dermed kan luftmodstands-impedansen tilnær-<br />

mes med den akustiske masse 2M A1<br />

. Det <strong>ny</strong>e kredsløb er vist på Figur 2-12.<br />

28<br />

SDeg Bl<br />

UD<br />

RAE<br />

MAS RAS CAS<br />

Figur 2-12: Kombineret analogt kredsløb (Lavfrekvent tilnærmelse)<br />

Her repræsenterer M AS den totale akustiske masse, som er givet ved:<br />

M M 2M<br />

( 2.13)<br />

AS AD A1<br />

Vi be<strong>ny</strong>tter nu strømdelingsprincippet til at udlede et udtryk <strong>for</strong> volumenhastigheden U D .<br />

Vi får:<br />

U<br />

U<br />

D<br />

D<br />

Se D g R<br />

<br />

AE<br />

<br />

Bl RAEMASsRAS1/ C AS s <br />

D g AE<br />

AT<br />

2<br />

AS<br />

AT AS AS AT AS<br />

( 2.14)<br />

Se R R C s<br />

<br />

( 2.15)<br />

Bl R M C s RCs 1<br />

Hvor R AT er den totale akustiske modstand givet ved:<br />

RAT RAE RAS<br />

( 2.16)<br />

Vi har nu udregnet en overføringsfunktion <strong>for</strong> volumenhastigheden (2.15). Denne overføringsfunktion<br />

be<strong>ny</strong>ttes senere til at udlede overføringsfunktioner <strong>for</strong> henholdsvis tryk og<br />

mekanisk udsving. Men først simplificeres udtrykket, idet vi definerer den fundamentale<br />

resonansfrekvens s og den totale kvalitets faktor Q TS som:


Teori - højttaler<br />

1 1<br />

s 2<br />

fs<br />

( 2.17)<br />

M C M C<br />

Q<br />

TS<br />

AS AS MS MS<br />

2<br />

1 M 1 M 1 M<br />

<br />

R C R R C Bl C<br />

RMS<br />

R<br />

AS AS MS<br />

AT AS AE AS AS MS<br />

E<br />

( 2.18)<br />

Med disse <strong>ny</strong>e definitioner kan vi opskrive overføringsfunktionen på den færdige <strong>for</strong>m:<br />

U<br />

D<br />

1 s<br />

SDeg RAE<br />

QTS<br />

s<br />

<br />

2<br />

Bl RAT s 1 s<br />

1<br />

s QTS<br />

s<br />

2.4 Småsignalsparametre 4<br />

( 2.19)<br />

Inden vi udleder overføringsfunktionerne <strong>for</strong> tryk og mekanisk udsving, nævnes fem parametre<br />

<strong>for</strong> højttalerenheden, som man betegner småsignalsparametre. Disse parametre<br />

er resonansfrekvensen s f , den totale Q-faktor TS Q , den elektriske Q-faktor Q ES , den me-<br />

kaniske Q-faktor Q MS , og VAS der betegner det ækvivalente volumen. De første to er allere-<br />

de defineret af ligning (2.17) og (2.18), mens de resterende tre defineres neden<strong>for</strong>. Parametrene<br />

kaldes småsignalsparametre, idet man antager, at højttalermembranens <strong>for</strong>skyd-<br />

ning er tilstrækkelig lille, så eventuel ulinearitet kan ignoreres. Da TS Q er en funktion af<br />

R AT , og R AT er en sum af to modstande, som modellerer henholdsvis det elektriske tab i<br />

svingspolen og det mekaniske tab i ophænget, så kan Q TS opdeles i to separate led. Det er<br />

den mekaniske Q-faktor Q MS og den elektriske Q-faktor Q ES , som er defineret på følgende<br />

måde:<br />

Q<br />

Q<br />

MS<br />

ES<br />

1 MAS1 MMS<br />

( 2.20)<br />

R C R C<br />

AS AS MS MS<br />

1 MASREMMS ( 2.21)<br />

R C C<br />

2<br />

Bl<br />

AE AS MS<br />

Herefter kan den samlede Q-faktor udregnes til:<br />

4 [1] Chapter 6, 6.7<br />

29


Teori - højttaler<br />

30<br />

Q<br />

TS<br />

QMSQES <br />

Q Q<br />

MS ES<br />

( 2.22)<br />

Både Q TS og de to særskilte Q-faktorer er opgivet i datablade. Den mekaniske Q-faktor er<br />

ikke relevant som sådan, da det kun er værdien <strong>for</strong> ES Q og Q TS , der kommer til at indgå i<br />

overføringsfunktionerne <strong>for</strong> tryk og mekanisk udsving, hvilket tydeliggøres senere.<br />

Den sidste småsignalsparametre er det ækvivalente volumen V AS . Det er den mængde luft,<br />

der giver samme fjederkonstant som højttalerenhedens ophæng, når den komprimeres af<br />

et stempel med samme areal som højttalermembranen. V AS er defineret som:<br />

V c S C c C<br />

( 2.23)<br />

2 2 2<br />

AS 0 D MS 0 AS<br />

Denne parameter er også opgivet i datablade, og kommer til at indgå i overføringsfunktionen<br />

<strong>for</strong> det mekaniske udsving.<br />

2.5 Overføringsfunktion <strong>for</strong> tryk 5<br />

Til at beregne en overføringsfunktion <strong>for</strong> trykket be<strong>ny</strong>ttes følgende grundlæggende ligning,<br />

som beskriver trykket <strong>for</strong> et fladt cirkulært stempel i en uendelig baffle.<br />

jkr<br />

e<br />

p( r) j0U ( 2.24)<br />

D<br />

2<br />

r<br />

Her angiver 0 densiteten af den omkringværende luft, og U D betegner volumenhastighe-<br />

den fra stemplet. Afstanden fra membranen til observationspunktet betegnes r og<br />

k / c.<br />

Ligningen er kun gyldig, hvis man befinder sig i far-field regionen, hvilket kræver<br />

2<br />

at r 8 a / , hvor a definerer membranens radius. For at opskrive en mere simpel over-<br />

føringsfunktion defineres afstanden som r 1 m . Den komplekse eksponentialfunktion<br />

repræsenterer fase<strong>for</strong>sinkelsen, der skyldes <strong>for</strong>sinkelsen grundet udbredelsen fra højttalermembranen<br />

til observationspunktet r. Da den absolutte værdi af eksponentialfunktionen<br />

er lig 1, udlades den i den videre beregning af overføringsfunktionen. Ligning (2.24)<br />

kan der<strong>for</strong> <strong>for</strong>simples til:<br />

0 0<br />

p jU D sUD<br />

( 2.25)<br />

2 2<br />

5 [1] Chapter 6, 6.9 og 6.10


Teori - højttaler<br />

Det ses, at trykket er proportionalt med sU D , da resten er konstant. Når man ganger med s<br />

i frekvensdomænet, svarer det til at differentiere i tidsdomænet. U D er defineret som vo-<br />

lumenhastigheden, og tages den tidsafledte af en hastighed, fås en acceleration. Lydtrykket<br />

fra en højttaler er der<strong>for</strong> direkte proportionalt med accelerationen af højttalermembranen.<br />

Normalt vil man gerne have, at højttaleren kan gengive <strong>for</strong>skellige frekvenser med<br />

samme lydtryk. Dette kræver, at højttalermembranens acceleration er konstant i <strong>for</strong>hold<br />

til frekvensen. Vi opskriver nu et udtryk, som relaterer membranens udsving og volumenhastigheden,<br />

og indsætter det i ligning (2.25). Herved får vi følgende udtryk <strong>for</strong> lydtrykket:<br />

U<br />

x x S s U ( 2.26)<br />

D<br />

D<br />

SDs D D D<br />

0 0<br />

p s xDS Ds xDS Ds<br />

2 <br />

2<br />

2<br />

( 2.27)<br />

S D betegner membranens areal og er der<strong>for</strong> konstant, mens parameteren x D betegner<br />

membranens vandring. Man kan der<strong>for</strong> konkludere, at <strong>for</strong> at holde trykket konstant når<br />

frekvensen halveres, så skal membranen bevæge sig fire gange så langt. Går man en hel<br />

dekade ned, fra fx 200 Hz til 20 Hz, skal membranen bevæge sig 100 gange så langt <strong>for</strong> at<br />

give samme lydtryk. Dette er netop årsagen til, at det er svært at frembringe kraftige<br />

lydtryk ved lave frekvenser.<br />

Vi udleder nu en overføringsfunktion <strong>for</strong> trykket p ved lave frekvenser. Her indsættes<br />

overføringsfunktionen <strong>for</strong> volumenhastigheden U D (ligning 2.19), som også er udledt med<br />

lavfrekvente tilnærmelser, i det <strong>for</strong>simplede udtryk <strong>for</strong> trykket (ligning 2.25). Vi får:<br />

1 s<br />

<br />

<br />

<br />

<br />

S e R Q <br />

<br />

<br />

<br />

s QTS<br />

1<br />

s<br />

0 0 D g AE<br />

TS s<br />

p sUD s 2<br />

2 2 Bl RAT s 1 s<br />

s <br />

<br />

Ble 0 g s<br />

Ble<br />

0<br />

g<br />

p <br />

<br />

<br />

H( s)<br />

2<br />

2 SDRE MAS s 1 s 2<br />

SDRE MAS<br />

1<br />

s QTS<br />

s<br />

2<br />

( 2.28)<br />

( 2.29)<br />

Overføringsfunktionen H(s) afbilder et 2-ordens højpas-filter, hvis amplitude aftager med<br />

12 dB per oktav, og beskriver højttalerenhedens evne til at gengive lave frekvenser. Denne<br />

overføringsfunktion udgør et vigtigt led i vores videre afsnit om filterdesign. Det ses, hvor-<br />

31


Teori - højttaler<br />

ledes overføringsfunktion udelukkende bestemmes ud fra de to parametre TS Q og s . En-<br />

hver højttaler har altså en trykkarakteristik, der er specifik <strong>for</strong> netop denne enhed.<br />

2.6 Overføringsfunktion <strong>for</strong> mekanisk udsving 6<br />

Højttalerenheden har et begrænset område, som den kan bevæge sig frem og tilbage på.<br />

Det er der<strong>for</strong> aktuelt at undersøge, hvilket membranudsving et indkommende lydsignal<br />

giver anledning til. Membranens udsving er en funktion af frekvensen, og overføringsfunktionen<br />

kan findes ved <strong>brug</strong> af ligning (2.26), som udtrykker sammenhængen mellem<br />

membranens udsving og volumenhastigheden. Defineres membranudsvinget som:<br />

32<br />

x<br />

U<br />

D<br />

D ( 2.30)<br />

SDs så bestemmes en overføringsfunktion <strong>for</strong> x D ved indsættelse af ligning (2.19) i ovenstå-<br />

ende udtryk.<br />

x<br />

D<br />

1<br />

U e D g RAE<br />

QTSs<br />

<br />

2<br />

SDs Bl RAT s 1 s<br />

1<br />

s QTS<br />

s<br />

Dette udtryk kan simplificeres ved <strong>brug</strong> af småsignalsparametre.<br />

x e<br />

D g<br />

V<br />

<br />

AS<br />

2 2<br />

0c<br />

SDRE sQES s<br />

2<br />

1 s<br />

1<br />

<br />

1<br />

s QTS<br />

s<br />

( 2.31)<br />

( 2.32)<br />

Herved kommer vi frem til den færdige overføringsfunktion, som afbilder et 2. ordens lavpas-filter.<br />

Dette er også i god overensstemmelse med den tidligere beskrivelse af membranens<br />

udsving i <strong>for</strong>hold til frekvensen, hvor et konstant tryk kræver større udsving ved<br />

lave frekvenser end ved høje.<br />

Som nævnt tidligere har vi udført vores modellering <strong>for</strong> en uendelig baffle, og da analogien<br />

er den samme <strong>for</strong> en lukket-kabinet højttaler, er overføringsfunktionerne ligeledes identiske.<br />

Den eneste <strong>for</strong>skel er benævnelserne på nogle af kredsløbselementerne. For at overføringsfunktionerne<br />

skal gælde <strong>for</strong> en lukket-kabinet højttaler, skal der der<strong>for</strong> <strong>for</strong>etages<br />

nogle navneændringer, som er givet ud fra nedenstående liste. Her skal pilene læses som:<br />

”erstattes med”.<br />

6 [1] Chapter 6, 6.21, chapter 7, 7.4, [5]


MASMAC Teori - højttaler<br />

S C<br />

fS fC<br />

VAS VATQES<br />

QECQTS<br />

QTC<br />

Ændringen skyldes, at nogle af parametrene ændrer værdi, når højttalerenheden placeres<br />

i et lukket-kabinet.<br />

2.7 Mekanisk begrænsning 7<br />

Når svingspolen vandrer ud af det magnetiske felt, opstår der hvad vi kalder højttaler clipping.<br />

Det <strong>for</strong>ekommer, når spolevandringen der er påkrævet <strong>for</strong> at gengive et signal, overskrider<br />

en hvis grænse. Herved reduceres antallet af viklinger, som befinder sig i det magnetiske<br />

felt, hvilket vil sige, at den effektive længde af spolen l bliver mindre. Ligesom en<br />

<strong>for</strong>stærker har en fysisk begrænsning, med hensyn til spændingen eller strømmen, der er<br />

til rådighed, så har en højttaler en fysisk begrænsning med hensyn til spolevandringen.<br />

Hvis antallet af viklinger, som befinder sig i det magnetiske felt, ikke ændrer sig, når membranen<br />

bevæger sig, så vil kraften, der virker på membranen, være lineært relateret til<br />

strømmen gennem svingspolen. Der er to metoder, hvorved man kan holde antallet af viklinger<br />

konstant. Den første er illustreret af Figur 2-13a, hvor en lang svingspole sørger<br />

<strong>for</strong>, at antallet af viklinger som <strong>for</strong>lader det magnetiske felt, er identisk med antallet som<br />

kommer ind. Denne geometri be<strong>ny</strong>ttes oftest i subwoofers, da den tillader en større vandring<br />

af membranen, og varmeafgivningen er bedre. Den anden metode er illustreret af<br />

Figur 2-13b. Her er svingspolen kort og i flere lag, hvilket resulterer i, at ingen viklinger<br />

<strong>for</strong>lader det magnetiske felt, når membranen bevæger sig. Denne opbygning er mere effektiv,<br />

da alle viklingerne befinder sig i det magnetiske felt. Til gengæld er varmeafgivelsen<br />

væsentlig ringere, idet viklingerne sidder i flere lag.<br />

a)<br />

Figur 2-13: a) Lang svingspole. b) Kort svingspole<br />

Den maksimale afstand spolen kan bevæge sig, før at antallet af viklinger i det magnetiske<br />

felt ikke længere <strong>for</strong>bliver konstant, kaldes <strong>for</strong> x max . Denne afstand måles fra membranens<br />

7 [1] Chapter 6, 6.1<br />

b)<br />

33


Teori - højttaler<br />

hvileposition til en af dens yderpositioner. Overskrides denne maksimale afstand, vil højttalerenheden<br />

blive ulineær og producere et <strong>for</strong>vrænget output. Det skyldes, at produktet<br />

( B l)<br />

bliver reduceret, og derved reduceres kraften der virker på svingspolen tilsvarende<br />

ifølge ligning (2.1).<br />

Med vores tidligere udledte overføringsfunktion <strong>for</strong> det mekaniske udsving er det muligt<br />

at undersøge, hvilket membranudsving et indkommende lydsignal giver anledning til. På<br />

den måde kan vi sørge <strong>for</strong>, at membranens udsving aldrig overstiger x max . Dette gøres med<br />

løbende korrektion af vores filter, og <strong>for</strong>klares nærmere i de senere afsnit.<br />

2.8 Kort om termisk begrænsning<br />

Effektiviteten af en højtaler er ofte nede på omkring få procent. Det betyder, at der nødvendigvis<br />

må blive afgivet en masse overskydende varme. Svingspolen udgør en modstand,<br />

og når den tilføres et spændingsfald, vil der løbe en resulterende strøm gennem<br />

spolen. Dermed vil der blive afgivet effekt i svingspolen. Overskrider denne effekt en given<br />

grænse, vil systemet modtage varme hurtigere end det kan skille sig af med det, hvilket<br />

kan resultere i en overophedet svingspole. I takt med, at metaldelene omkring svingspolen<br />

bliver varmere, vil de samtidig blive mindre og mindre tilbøjelige til at absorbere den genererede<br />

varme. Således kan højtaleren ende med at brænde sammen. Mængden af effekt<br />

som en givet højttaler kan klare, afhænger af mange <strong>for</strong>skellige parametre, heriblandt tykkelsen<br />

og materialet af den tråd som udgør spolen, samt arealet af det nærliggende materiale.<br />

Ønsker man et kraftigere lydtryk, bliver man nødt til at øge mængden af strøm gennem<br />

svingspolen, hvilket resulterer i, at den i værste fald kan blive op til 250 ̊ C varm. For<br />

at undgå skader på højtalerenheden, er det der<strong>for</strong> en god idé at undersøge temperaturen<br />

på svingspolen, så man kan nå at stoppe eller skrue ned <strong>for</strong> strømmen, inden svingspolen<br />

brænder over. Modstanden i en tråd stiger i takt med, at temperaturen stiger. Hvis man<br />

skal beregne modstanden <strong>for</strong> en ledning ved en bestemt temperatur, skal man <strong>brug</strong>e <strong>for</strong>m-<br />

len 20<br />

34<br />

R R (1 t)<br />

. Her er R modstanden, R20 er modstanden ved 20 ̊C, er temperatur-<br />

koefficienten og t er ledningens temperatur. Således ville man kunne bestemme temperaturen<br />

ved at måle svingspolens modstand.


3<br />

TEORI - SIGNALBEHANDLING<br />

Dette afsnit omhandler teorien bag projektets signalbehandlingsdel. Digital signalbehandling<br />

beskrives bedst som studiet af signaler på digital <strong>for</strong>m og behandlingen af disse. Digital<br />

signalbehandling er matematikken, algoritmerne og teknikkerne, som be<strong>ny</strong>ttes til manipulation<br />

af de digitale signaler. De tilhørende anvendelsesmuligheder er mange, herunder<br />

telekommunikation, billedbehandling og selvfølgelig behandlingen af audiosignaler,<br />

hvilket er det område vi vil beskæftige os med. Her kan man be<strong>ny</strong>tte digital signalbehandling<br />

til at filtrere signalerne, hvor den digitale behandling sikrer, at alle operationer er meget<br />

veldefinerede og reproducerbare. Ved behandlingen af lyd studeres de digitale signaler<br />

i frekvensdomænet, og en efterfølgende korrektion <strong>for</strong>etages. I frekvensdomænet kan signalerne<br />

analyseres med hensyn til frekvensen, idet en graf i frekvensdomænet viser, hvordan<br />

signalet er <strong>for</strong>delt ud over de <strong>for</strong>skellige frekvenser.<br />

I tidsdomænet er et lydsignal beskrevet ved svingninger i luftrykket som funktion af tiden.<br />

Dette er nok den mest gængse måde at beskrive et signal, og en repræsentation af lyden i<br />

tidsdomænet er der<strong>for</strong> vigtig at <strong>for</strong>stå. Men ikke desto mindre kan en analyse af et lydsignal<br />

i tidsdomænet være <strong>for</strong>holdsvis vanskelig at udføre. For eksempel er frekvensen en af<br />

de vigtigste fysiske størrelser til beskrivelsen af et lydsignal, men en bestemmelse af denne<br />

størrelse i tidsdomænet kræver målinger af tidsintervaller og efterfølgende udregninger.<br />

For et normalt musiksignal, som er sammensat af mange <strong>for</strong>skellige sinusfunktioner af<br />

varierende frekvens, er det der<strong>for</strong> vanskeligt at <strong>for</strong>etage disse målinger. Her giver frekvensdomænet<br />

en alternativ beskrivelse af lyden, idet tidsaksen er udskiftet med en frekvensakse.<br />

Igennem denne opgave vil der løbende blive gjort <strong>brug</strong> af både tidsdomænet og<br />

frekvensdomænet. I arbejdet med vores filter skinner frekvensdomænet igennem som et<br />

uundværligt værktøj, der hjælper med at opnå den ønskede filtrering. Vores filter design<br />

vil altså <strong>for</strong>egå i dette domæne, hvorimod vores færdige filter vil blive implementeret i<br />

tidsdomænet. Et skift mellem de to domæner vil altså være nødvendigt.<br />

Det færdige filter vil udføre en lang række digitale regneoperationer. De digitale operationer<br />

kan enten udføres af en mikroprocessor specifikt lavet til <strong>for</strong>målet, kaldet en DSP, eller<br />

de kan udføres på en almindelig computer gennem særlig software. Begge metoder kræver<br />

et kendskab til computerprogrammering, samt en dybere <strong>for</strong>ståelse af teknikkerne bag<br />

digital signalbehandling. I dette afsnit vil vi <strong>for</strong>klare de matematiske operationer, som ligger<br />

til grund <strong>for</strong> vores videre arbejde med signalbehandlingen. Operationer som skal be<strong>ny</strong>ttes<br />

til at designe vores filter helt fra grunden og omskrive det til anvendelig <strong>for</strong>m. Her<br />

kan nævnes Laplace trans<strong>for</strong>mationen, z-trans<strong>for</strong>mationen samt den bilineære trans<strong>for</strong>-<br />

35


Teori - signalbehandling<br />

mation. Disse matematiske operationer beskriver det bedste inden<strong>for</strong> digital signalbehandling,<br />

idet de på elegant vis kan lede til den mest optimale løsning. Samtidig beskriver<br />

de også det værste inden<strong>for</strong> digital signalbehandling, eftersom deres kompleksitet kan få<br />

mange til at lede efter et nemmere alternativ.<br />

Idéen bag dette afsnit er at klæde læseren på til det efterfølgende afsnit, som omhandler<br />

design af filteret. Afsnittet er struktureret, så man på overskuelig vis bliver introduceret<br />

<strong>for</strong> de nødvendige begreber. Selve arbejdsprocessen med filteret kan på simpel vis illustreres<br />

ud fra nedenstående figur:<br />

36<br />

Bilineær<br />

s-domæne z-domæne<br />

trans<strong>for</strong>mation<br />

Figur 3-1: Illustration af filterdesign <strong>for</strong>løbet<br />

Rekursivt<br />

filter<br />

Disse hovedbegreber inden<strong>for</strong> digital signalbehandling er essentielle <strong>for</strong> vores arbejde og<br />

udgør samtidig de fire underkapitler, som afsnittet er bygget op af. Den sidste blok, det<br />

rekursive filter, kan betragtes som vores mål og vil ligesom de tre andre blokke blive <strong>for</strong>klaret<br />

i dybden. Når man designer et rekursivt digitalt filter, starter man oftest med at specificere<br />

et analogt filter, som besidder de ønskede egenskaber i frekvensresponset. Det<br />

analoge filter designes i s-domænet. En serie at matematiske operationer be<strong>ny</strong>ttes herefter<br />

til at fremstille det tilsvarende digitale filter, som herefter er givet i z-domænet. Trans<strong>for</strong>mationen<br />

mellem de to domæner sker med en teknik kaldet bilineær trans<strong>for</strong>mation.<br />

Både s-domænet og z-domænet er frekvensdomæner, og da det færdige filter skal defineres<br />

i tidsdomænet, skal der en omskrivning til. På den måde ender man ud med det rekursive<br />

digitale filter, som er det filter, der skal implementeres.<br />

3.1 Laplace trans<strong>for</strong>mation 8<br />

Inden <strong>for</strong> signalbehandling gælder, at et lineært system kan beskrives fuldt ud gennem<br />

dets impulsrespons og frekvensrespons. Denne realitet følger af de to hovedbegreber inden<br />

<strong>for</strong> signalbehandling, nemlig foldning og Fourier analyse, og er på sin vis også sand.<br />

Dog er det en meget generaliseret tilgang til <strong>for</strong>ståelsen af det lineære system, idet et systems<br />

impulsrespons og frekvensrespons kan have en hvilken som helst <strong>for</strong>m. Faktisk er<br />

det <strong>for</strong> generelt til mange anvendelser inden <strong>for</strong> videnskab og ingeniørarbejde. Mange af<br />

universets <strong>for</strong>skellige parametre påvirker hinanden gennem differentiale ligninger, og<br />

fysikken er fyldt med disse relationer. Impulsresponset og frekvensresponset <strong>for</strong> sådanne<br />

systemer kan ikke være vilkårligt, men må være i overensstemmelse med løsningerne til<br />

disse differentialligninger. Det betyder, at impulsresponset kun kan bestå af eksponentialfunktioner<br />

og sinusfunktioner. Laplace trans<strong>for</strong>mation er en teknik til at analysere disse<br />

8 [3] Chapter 31-32, [4] Chapter 6


Teori - signalbehandling<br />

specielle systemer, når signalerne er kontinuerte. Z-trans<strong>for</strong>mation er en tilsvarende teknik<br />

som be<strong>ny</strong>ttes i det diskrete tilfælde.<br />

Laplace trans<strong>for</strong>mation er altså en grundlæggende metode til løsning af differentialligninger.<br />

Ved en Laplace trans<strong>for</strong>mation ændrer man et signal fra tidsdomænet til et signal i sdomænet.<br />

Som nævnt tidligere er s-domænet et frekvensdomæne. Signalet i tidsdomænet<br />

kan være både periodisk og aperiodisk samt strække sig i det uendelige i både negativ og<br />

positiv retning. Derudover tillader Laplace trans<strong>for</strong>mationen, at tidsdomæne-signalet er<br />

komplekst. Men anvendelsen af komplekse signaler er yderst sjælden og be<strong>ny</strong>ttes næsten<br />

aldrig i signalbehandling, hvilket også er gældende i vores tilfælde, hvor tidsdomænesignalet<br />

er reelt. Derimod er s-domænet et komplekst plan arrangeret i et rektangulært<br />

koordinatsystem med de reelle tal placeret langs horisontalaksen og de komplekse tal<br />

placeret langs vertikalaksen. Horisontalaksens værdier beskrives ved variablen σ, mens<br />

vertikalaksen be<strong>ny</strong>tter sig af vinkelfrekvensen ω. Be<strong>ny</strong>ttes kompleks notation, kan enhver<br />

lokalisering i s-planet der<strong>for</strong> repræsenteres ved en kompleks variabel, s, hvor s j.<br />

S-planet er kontinuert og strækker sig i det uendelige i alle fire retninger. En Laplace<br />

trans<strong>for</strong>mation analyserer signaler på baggrund af eksponentialfunktioner og sinusfunktioner.<br />

Figur 3-2 er en grafisk afbildning, der illustrerer hvorledes s-domænet er relateret<br />

til tidsdomænet. For at finde værdierne langs en vertikal linje i s-planet, det vil sige til en<br />

specifik σ-værdi, multipliceres tidsdomæne-signalet med en eksponentialfunktion af typen<br />

t<br />

e <br />

(trin 2). Den venstre side af s-planet multiplicerer tidsdomæne-signalet med stigende<br />

eksponentialfunktioner (σ < 0), mens den højre side multiplicerer tidsdomæne-signalet<br />

med aftagende eksponentialfunktioner (σ > 0). Herefter tager man den komplekse Fourier<br />

trans<strong>for</strong>mation af de eksponentielt vægtede signaler (trin 3). Det resulterende spektrum<br />

er placeret langs en vertikal linje i s-planet, hvor den øverste halvdel af s-planet indeholder<br />

de positive frekvenser, og den nederste halvdel indeholder de negative (trin 4). Men<br />

først en kort præsentation af Fourier trans<strong>for</strong>mationen som er givet ved:<br />

<br />

jt X( )<br />

x( t) e dt<br />

( 3.33)<br />

<br />

Fourier trans<strong>for</strong>mationen er et matematisk værktøj, der gør det muligt at repræsentere et<br />

j t<br />

givet signal x(t) som en kontinuert sum af eksponentialfunktioner af typen e , hvis frekvenser<br />

er bundet til den imaginære akse i det komplekse plan ( s j).<br />

Ovenstående<br />

ligning kan udvides til Laplace trans<strong>for</strong>mationen ved først at multiplicere tidsdomæne-<br />

t<br />

signalet med eksponentialfunktion e <br />

, som nævnt tidligere, og derefter <strong>for</strong>ene de to<br />

eksponentialfunktioner til et enkelt led. Dette er illustreret af ligning (3.34) og (3.35).<br />

37


Teori - signalbehandling<br />

Trin 1<br />

Start med et vilkårligt<br />

tidsdomæne-signal.<br />

Trin 2<br />

Multiplicer tidsdomæne-signalet med<br />

et uendeligt antal<br />

eksponentialfunktioner, hver med en<br />

<strong>for</strong>skellig hældningskonstant σ. Det vil<br />

sige, udregn signalet x(t)e -σt<br />

<strong>for</strong> alle værdier af σ.<br />

Trin 3<br />

Tag den komplekse Fourier<br />

trans<strong>for</strong>mation af hvert<br />

eksponentielt vægtet tidsdomænesignal.<br />

Det vil sige, udregn<br />

38<br />

<br />

<br />

<br />

t jt [ x( t) e ] e dt<br />

<strong>for</strong> alle værdier af σ fra<br />

negativ til positiv uendelig.<br />

Trin 4<br />

Opstil hvert spektrum langs en vertikal<br />

linje i s-planet. Den øverste halvdel af<br />

s-planet indeholder de positive<br />

frekvenser, og den nederste halvdel<br />

indeholder de negative.<br />

F.T.<br />

Amplitude<br />

2<br />

1<br />

0<br />

-1<br />

x(t)<br />

-2<br />

-4 -3 -2 -1 0 1 2 3 4<br />

F.T.<br />

F.T.<br />

Time<br />

σ=-3 σ=-2 σ=-1 σ=0 σ=1 σ=2 σ=3<br />

Imaginær akse (jω)<br />

4<br />

3<br />

2<br />

1<br />

0<br />

-1<br />

-2<br />

-3<br />

-4<br />

X(s)<br />

F.T. F.T. F.T. F.T.<br />

-4 -3 -2 -1 0 1 2 3 4<br />

Real akse (σ)<br />

Figur 3-2: Illustration af Laplace trans<strong>for</strong>mationen. Laplace trans<strong>for</strong>mationen konverterer<br />

et signal i tidsdomænet x(t) til et signal i s-domænet X(s)<br />

<br />

t jt X( , ) [ x( t) e ] e dt <br />

( 3.34)<br />

<br />

<br />

( j) t<br />

X( , ) x( t) e dt<br />

( 3.35)<br />

<br />

Til slut reducerer vi udtrykket til en mere kompakt <strong>for</strong>m, hvor lokaliseringen i det komplekse<br />

plan repræsenteres med den komplekse variabel s, som er givet ved s j.<br />

Positive<br />

frekvenser<br />

Negative<br />

frekvenser


Teori - signalbehandling<br />

st<br />

X( s) x( t) e dt<br />

( 3.36)<br />

<br />

Dette er Laplace trans<strong>for</strong>mationens endelige <strong>for</strong>m og er en af de vigtigste ligninger inden<br />

<strong>for</strong> signalbehandling og elektronik. Denne ligning beskriver hvorledes et tidsdomænesignal<br />

x(t) er relateret til et s-domæne-signal X(s). Eller mere generelt; hvordan tidsdomænet<br />

er relateret til frekvensdomænet.<br />

For at overskueliggøre det netop gennemgåede underafsnit og belyse dets relevans, vil vi<br />

kort <strong>for</strong>klare betydningen af det opnåede resultat. I afsnittets indledning beskrev vi vigtigheden<br />

af frekvensdomænet, idet et signal kunne analyseres med hensyn til frekvensen.<br />

Ved hjælp af Laplace trans<strong>for</strong>mationen kan vi designe vores filter direkte i frekvensdomænet<br />

og derved sørge <strong>for</strong>, at det opfylder de stillede krav. Her menes krav til filterets<br />

funktion i <strong>for</strong>m af behandlingen af de enkelte frekvenser. Vi kan betragte et 2-ordens filter<br />

givet ved:<br />

Hs ( ) <br />

2<br />

as bsc 2<br />

ds es f<br />

( 3.37)<br />

Ved at erstatte hvert s med jω opnår vi et udtryk <strong>for</strong> frekvensresponset. Dette er en kompleks<br />

størrelse, som beskriver hvorledes systemet reagerer på sinusfunktioner af varierende<br />

frekvens. Frekvensresponset repræsenterer altså et systemets filterkarakteristik, og<br />

ved at vælge nogle specifikke værdier <strong>for</strong> filterkoefficienterne ( a , b, c, d, e og f) kan man<br />

designe et filter, som besidder de ønskede egenskaber i frekvensresponset. Man kan udtrykke<br />

H(jω) på polær <strong>for</strong>m som:<br />

H( j) | H( j)| e<br />

jH( j<br />

)<br />

( 3.38)<br />

Et plot af modulus og argument som funktion af frekvensen ω kaldes henholdsvis amplituderesponset<br />

og faseresponset. Amplituderesponset vil vi be<strong>ny</strong>tte flittigt under filterdesign-delen<br />

til at illustrere en eventuel dæmpning såvel som <strong>for</strong>stærkning af samtlige frekvenser.<br />

Faseresponset derimod, som beskriver filterets frekvensafhængige <strong>for</strong>skydning<br />

af signaler, vil der ikke blive lagt vægt på. Det skyldes, at <strong>for</strong> et filter med ulineær fase kan<br />

det diskuteres, hvorvidt man kan høre <strong>for</strong>skel på et lydsignal og det tilsvarende lydsignal<br />

med ændret fase. Det menneskelige øre er ufølsomt over <strong>for</strong> relativ faseændring i en statisk<br />

lydbølge. Det vil sige, at man ikke kan høre <strong>for</strong>skel på et enkelt savtakket signal (som<br />

indeholder alle harmoniske frekvenser), og et andet signal som indeholder de samme<br />

harmoniske frekvenser, men hvor fasen af disse frekvenser <strong>for</strong>skydes med vilkårlige men<br />

kontante værdier. Selvom de to signaler vil se <strong>for</strong>skellige ud på et oscilloskop, vil du ikke<br />

kunne høre <strong>for</strong>skel. Et dynamisk signal derimod kan godt påvirkes af faseændring. Specielt<br />

musikalske transienter kan tage skade når fasen ændres. Et transient er sammensat af<br />

mange frekvenser af kort varighed, og en faseændring tilslører deres indbyrdes <strong>for</strong>hold i<br />

tiden. Da musik er et dynamisk signal, kan en faseændring godt påvirke lyden, men der er<br />

39


Teori - signalbehandling<br />

mange faktorer der spiller ind. Blandt andet graden af fase<strong>for</strong>vrængningen, størrelsen af<br />

det spektrum det dækker over, samt musikken i sig selv. Man kan der<strong>for</strong> sige, at hvis det er<br />

muligt, så skal man undgå faseændring. Det kan gøres ved at be<strong>ny</strong>tte et filter som er faselineært,<br />

hvilket vil sige, at alle frekvenserne <strong>for</strong>skydes lige meget. Dette er dog ikke muligt i<br />

vores tilfælde, da vores filter ikke kan opnå de ønskede egenskaber i amplituderesponset<br />

og samtidig være faselineært.<br />

3.2 Z-trans<strong>for</strong>mation 9<br />

I kapitlet om Laplace trans<strong>for</strong>mation beskrev vi hvorledes, et analogt filter kan designes<br />

ved <strong>brug</strong> af netop denne trans<strong>for</strong>mation. I dette kapitel vil vi <strong>for</strong>klare, hvorledes et rekursivt<br />

digitalt filter kan fremstilles ved hjælp af en parallel teknik kaldet z-trans<strong>for</strong>mationen.<br />

Den overordnede strategi er den samme <strong>for</strong> de to trans<strong>for</strong>mationer, nemlig at beskrive<br />

impulsresponset gennem sinusfunktioner og eksponentialfunktioner. S-trans<strong>for</strong>mationen<br />

håndterer differentialligninger i s-domænet. På samme måde håndterer ztrans<strong>for</strong>mationen<br />

differensligninger i z-domænet. Selvom strategierne er ens <strong>for</strong> de trans<strong>for</strong>mationer,<br />

så er teorien bag en smule anderledes. S-planet er arrangeret i et rektangulært<br />

koordinatsystem, mens z-planet be<strong>ny</strong>tter sig af polære koordinater. Ztrans<strong>for</strong>mationen<br />

giver et indblik i den matematiske struktur, som et digitalt filter er bygget<br />

op omkring.<br />

For at belyse sammenhængen mellem de to trans<strong>for</strong>mationer vil vi som udgangspunkt<br />

starte med ligningen <strong>for</strong> Laplace trans<strong>for</strong>mationen, og derigennem vise hvorledes den kan<br />

ændres til z-trans<strong>for</strong>mationen. Fra ovenstående delkapitel blev Laplace trans<strong>for</strong>mationen<br />

defineret som relationen mellem signaler i tidsdomænet og signaler i s-domænet. Vi havde<br />

at:<br />

40<br />

<br />

t jt X( , ) x( t) e e dt<br />

( 3.39)<br />

<br />

Denne ligning analyserer et tidsdomæne-signal med hensyn til sinus- og cosinusfunktioner<br />

med eksponentielt ændrende amplitude. Laplace trans<strong>for</strong>mationen kan ændres til ztrans<strong>for</strong>mationen<br />

gennem separate trin. Først skal signalerne i ovenstående udtryk ændres<br />

fra kontinuert til diskret tid. Her erstatter man tidsvariablen t med samplenummeret<br />

n, samt ændrer integralet til et summationstegn.<br />

<br />

njn X( , ) x[ n] e e<br />

( 3.40)<br />

n<br />

Næste trin består af en omskrivning af det eksponentielle led. Et eksponentielt signal kan<br />

matematisk set repræsenteres på følgende to måder.<br />

9 [3] Chapter 33, [4] Chapter 11


Teori - signalbehandling<br />

n n<br />

y[ n] eeller y[ n] r<br />

( 3.41)<br />

Begge disse ligninger genererer en eksponentiel kurve. Det første udtryk styrer signalets<br />

hældning gennem parameteren σ. Hvis σ er positiv, så vil kurven falde i værdi i takt med at<br />

samplenummeret n øges. På samme måde vil kurven stige progressivt, hvis σ er negativ.<br />

Hvis σ antager værdien nul, så vil signalet have en konstant værdi på én. Det andet udtryk<br />

be<strong>ny</strong>tter variablen r til at styre signalets hældning. Kurven vil aftage hvis r > 1, stige hvis r<br />

< 1, og have en konstant værdi hvis r = 1. Kort sagt, er de to udtryk blot to <strong>for</strong>skellige måder<br />

at repræsentere den samme ting på. Vi indsætter nu det alternative eksponentielle<br />

udtryk i vores diskrete Laplace trans<strong>for</strong>mation.<br />

<br />

n j n<br />

X( , ) x[ n] r e <br />

( 3.42)<br />

n<br />

Denne ligning er på sin vis et korrekt udtryk <strong>for</strong> z-trans<strong>for</strong>mationen, men kan opskrives på<br />

en mere kompakt <strong>for</strong>m i <strong>for</strong>hold til den komplekse notation. I Laplace trans<strong>for</strong>mationen<br />

introducerede vi den komplekse variabel s. På samme måde definerer vi en <strong>ny</strong> variabel <strong>for</strong><br />

z-trans<strong>for</strong>mationen givet ved:<br />

j<br />

z re <br />

( 3.43)<br />

z er altså defineret som en kompleks variabel, der består af en polær kombination af de to<br />

reelle variable r og ω. Konverteringen fra Laplace trans<strong>for</strong>mationen til z-trans<strong>for</strong>mationen<br />

færdiggøres nu ved at udskifte r og ω med z.<br />

<br />

n<br />

X( z) x[ n] z<br />

( 3.44)<br />

n<br />

Dette er z-trans<strong>for</strong>mationens standard <strong>for</strong>m, og den beskriver sammenhængen mellem et<br />

tidsdomæne-signal x[n] og det tilsvarende z-domæne-signal X(z). Man kan spørge sig selv,<br />

hvor<strong>for</strong> z-trans<strong>for</strong>mationen <strong>brug</strong>er<br />

n<br />

r i stedet <strong>for</strong><br />

n<br />

e og z i stedet <strong>for</strong> s. Rekursive filtre<br />

implementeres med nogle rekursions-koefficienter. For at analysere disse systemer i zdomænet<br />

skal vi være i stand til at konvertere disse rekursions-koefficienter over i zdomænets<br />

overføringsfunktion og tilbage igen. Ved at definere z-trans<strong>for</strong>mationen på net-<br />

op denne måde ( n<br />

r og z) opnår vi det simpleste værktøj, til frit at kunne bevæge os mellem<br />

disse to repræsentationer. Det vil vi komme nærmere ind på i næste delafsnit.<br />

Figur 3-3 illustrerer <strong>for</strong>skellen mellem Laplace trans<strong>for</strong>mationens s-plan og ztrans<strong>for</strong>mationens<br />

z-plan. S-domænet et komplekst plan arrangeret i et rektangulært koordinatsystem<br />

som nævnt tidligere. Horisontalaksens værdier beskrives ved variablen σ,<br />

mens vertikalaksen be<strong>ny</strong>tter sig af vinkelfrekvensen ω. Den komplekse relation s <br />

j<br />

41


Teori - signalbehandling<br />

beskriver altså enhver lokalisering i s-planet. Til <strong>for</strong>skel be<strong>ny</strong>tter z-domænet sig af de to<br />

variable r og ω arrangeret som polære koordinater. Afstanden fra origo, r, er værdien <strong>for</strong><br />

den eksponentielle hældning. Vinkelafstanden målt fra den positive horisontalakse, ω, er<br />

j<br />

frekvensen. Denne specielle geometri er et resultat af definitionen af z ( z e <br />

). Forskelle-<br />

ne mellem s og z resulterer i, at vertikale linjer i s-planet matcher cirkler i z-planet. Dette<br />

er tydeligt illustreret af Figur 3-3, hvor vilkårlige poler og nulpunkter i s-planet er gengivet<br />

i z-planet. Venstre og højre side af s-planet svarer til henholdsvis den indre og ydre del<br />

af enhedscirklen (r = 1).<br />

42<br />

ω<br />

s-plan<br />

σ<br />

Im<br />

DC<br />

(σ = 0, ω = 0)<br />

Re<br />

z-plan<br />

Im<br />

r<br />

ω<br />

Re<br />

DC<br />

(r = 1, ω = 0)<br />

Figur 3-3: Sammenhæng mellem s-planet og z-planet, illustreret ved poler og nulpunkter.<br />

Vertikale linjer i s-planet svarer til cirkler i z-planet<br />

Poler og nulpunkter er ikke nævnt yderlige i dette teoriafsnit, da de ikke be<strong>ny</strong>ttes til at<br />

designe filteret. Men ellers udgør de et vigtigt led i signalbehandling, idet et filter/overføringsfunktion<br />

direkte kan beskrives gennem dets poler og nulpunkter. De beskriver<br />

de lokaliseringer i s-planet der resulterer i henholdsvis dyk og toppe.<br />

3.3 Bilineær trans<strong>for</strong>mation 10<br />

Inden <strong>for</strong> digital signalbehandling be<strong>ny</strong>ttes bilineær trans<strong>for</strong>mation til at trans<strong>for</strong>mere et<br />

system fra s-domænet over i z-domænet, det vil sige, gør det muligt at repræsentere et<br />

system i diskret tid, hvis det oprindelige system er designet i kontinuert tid. Metoden konverterer<br />

altså en overføringsfunktion Ha(s) <strong>for</strong> et filter i kontinuert tid til en tilsvarende<br />

overføringsfunktion H(z) <strong>for</strong> et filter i diskret tid. Den plotter positionerne fra jω-aksen<br />

(Re[s] = 0) i s-planet til en enhedscirkel (|z| = 1) i z-planet. Frekvensresponset <strong>for</strong> et analogt<br />

filter tilnærmes altså frekvensresponset <strong>for</strong> det tilsvarende digitale filter med identisk<br />

gain og fase<strong>for</strong>skydning. Dog vil der være en lille <strong>for</strong>skydning af frekvenserne, hvilken re-<br />

10 [4] Chapter 12


Teori - signalbehandling<br />

sulterer i, at de to kurver <strong>for</strong> amplituderesponset og faseresponset ikke vil være helt identiske.<br />

Denne <strong>for</strong>skydning er næsten ikke synlig ved lave frekvenser, men bliver mere og<br />

mere tydelig som frekvensen <strong>for</strong>øges. Ved <strong>brug</strong> af en speciel metode inden <strong>for</strong> bilineær<br />

trans<strong>for</strong>mation gøres det muligt at rette op på denne skævhed i både amplituderesponset<br />

og faseresponset. Til at illustrere hvorledes et system kan trans<strong>for</strong>meres fra s-domænet<br />

over i z-domænet, betragtes Figur 3-4.<br />

f(t) Kontinuert til<br />

diskret A/D<br />

f[k]<br />

f(t)<br />

Ha(s)<br />

H[z]<br />

Ha(s)<br />

y[k]<br />

Diskret til<br />

Kontinuert D/A<br />

Figur 3-4: Realisering af et analogt filter med et digitalt filter<br />

Det øverste filter en digital realisering af det nederste analoge filter. Indgangssignalet som<br />

er et kontinuert lydsignal f(t) konverters til et diskret lydsignal f[k] gennem en A/D konverter.<br />

Herefter behandles signalet af det digitale system med overføringsfunktionen H[z]<br />

og producerer signalet y[k]. Til slut konverteres udgangssignalet tilbage til et kontinuert<br />

lydsignal y(t) gennem en D/A konverter. Vores mål er at bestemme den korrekte digitale<br />

overføringsfunktion H[z], så det digitale system bliver ækvivalent med det ønskede analoge<br />

system med overføringsfunktionen Ha(s). Først afgøres hvorvidt de to systemer skal<br />

opføre sig ens i tidsdomænet eller frekvensdomænet, da beslutningen giver anledning til<br />

to <strong>for</strong>skellige designmetoder og deraf to <strong>for</strong>skellige ækvivalenskriterier. I vores tilfælde<br />

arbejder vi med frekvensresponset, så det er naturligvis mest hensigtsmæssigt at bestemme<br />

ækvivalenskriteriet i frekvensdomænet.<br />

For et analogt system med overføringsfunktionen Ha(s) vil systemresponset y(t) til en<br />

uendelig lang eksponentialfunktion f(t) = e st også være en uendelig lang eksponentialfunktion<br />

givet ved:<br />

( ) ( ) st<br />

y t H s e<br />

( 3.45)<br />

a<br />

Samme egenskab gør sig gældende <strong>for</strong> et digitalt system med overføringsfunktionen H[z].<br />

Her vil systemresponset y[k] til en uendelig lang eksponentialfunktion f[k] = z k som indgangssignal<br />

ligeledes være en uendelig lang eksponentialfunktion givet ved:<br />

y(t)<br />

y(t)<br />

43


Teori - signalbehandling<br />

44<br />

[ ] [ ] k<br />

y k H z z<br />

( 3.46)<br />

Hvis de to systemer fra Figur 3-4 skal være ækvivalente, så må systemresponset til en<br />

uendelig lang eksponentialfunktion f(t) = e st være ens <strong>for</strong> de to systemer. En sampling af<br />

dette kontinuerte tidssignal i <strong>for</strong>hold til sampleintervallet T giver anledning til det diskrete<br />

tidssignal:<br />

skT k<br />

f [ k] e z<br />

( 3.47)<br />

hvor z = e sT. Vi kigger nu på det digitale system. Den diskrete eksponentialfunktion z k tilføres<br />

nu som indgangssignal til overføringsfunktionen H[z], hvor det resulterende respons<br />

vil være givet ved:<br />

k sT skT<br />

y[ k] H[ z] z | sT H[ e ] e<br />

( 3.48)<br />

ze Ser vi på det analoge system, så vil en sampling af udgangssignalet y(t) give anledning til<br />

følgende respons:<br />

( ) ( ) skT<br />

y kT H s e<br />

( 3.49)<br />

a<br />

Hvis de to systemer skal være ækvivalente, må en nødvendig betingelse være, at responset<br />

<strong>for</strong> det digitale system y[k] er lig med det samplede respons <strong>for</strong> det analoge system y(kT).<br />

Denne betingelse betyder at:<br />

sT<br />

H[ e ] H ( s)<br />

( 3.50)<br />

a<br />

Ovenstående ligning beskriver ækvivalenskriteriet i frekvensdomænet. Men dette kriterium<br />

sikrer kun, at det digitale filters respons matcher det analoge filters respons til specifikke<br />

sampling øjeblikke. Ønsker vi, at responset <strong>for</strong> de to filtrer skal matche <strong>for</strong> samtlige<br />

værdier af t, må vi lade T -> 0. Herved får vi at<br />

sT<br />

lim H[ e ] H ( s)<br />

( 3.51)<br />

T0 a<br />

Kriteriet <strong>for</strong> at realisere et digitalt filter som er ækvivalent med et givet analogt filter er<br />

der<strong>for</strong>, at betingelsen T -> 0 er opfyldt. Men denne betingelse kan ikke lade sig gøre i praksis,<br />

da det kræver en uendelig høj samplefrekvens. I praksis vælger man en værdi, der er<br />

meget lille men <strong>for</strong>skellige fra nul <strong>for</strong> at opnå den bedste tilnærmelse. Ved <strong>brug</strong> af ovenstående<br />

ækvivalenskriterium vil vi nu udlede et udtryk, der kan trans<strong>for</strong>mere et system<br />

fra s-domænet over i z-domænet. Betragt nu følgende hyperbolske tangent som kan beskrives<br />

ved den uendelige række


sT /2 sT<br />

/2<br />

3 5<br />

sT e e sT1 sT 2 sT <br />

sT /2 sT<br />

/2 <br />

2 e e 2 3 2 15 2<br />

<br />

tanh ...<br />

<br />

Teori - signalbehandling<br />

( 3.52)<br />

For små værdier af T (T -> 0) kan vi ignorere leddene af højere orden i den uendelige række.<br />

Dette giver anledning til følgende udtryk:<br />

<br />

lim<br />

T 0<br />

sT /2 sT<br />

/2 <br />

e e 2<br />

sT /2 sT<br />

/2<br />

e e Ts<br />

Det vil sige, som T - > 0, kan udtrykket skrives som:<br />

sT /2 sT<br />

/2<br />

sT<br />

2 e e2e1 <br />

s sT/2 sT<br />

/2<br />

sT<br />

T<br />

<br />

e e<br />

<br />

T<br />

<br />

e 1<br />

( 3.53)<br />

( 3.54)<br />

Vi har nu isoleret s, og indsætter herefter det fundne udtryk i ligningen <strong>for</strong> ækvivalenskriteriet.<br />

sT<br />

sT 2 e 1<br />

H[ e ] Ha sT <br />

Te 1 <br />

Idet at z = e sT, kan ovenstående udtryk opskrives som:<br />

2 z 1<br />

H[ z] H H(<br />

s)|<br />

a a 2 z1<br />

Tz1 s Tz1<br />

( 3.55)<br />

( 3.56)<br />

Således har vi vist, at vi kan finde frem til overføringsfunktionen H[z] ud fra Ha(s) ved <strong>brug</strong><br />

af trans<strong>for</strong>mationen<br />

2z1 s <br />

T<br />

<br />

z1<br />

( 3.57)<br />

Denne trans<strong>for</strong>mation kaldes <strong>for</strong> den bilineære trans<strong>for</strong>mation. Den gør os i stand til at<br />

designe et filter i kontinuert tid <strong>for</strong> herefter at opskrive det i diskret tid. Dette er yderst<br />

praktisk, da højttalerens amplituderespons er udtrykt som et analogt højpas-filter, og dette<br />

filter ligger til grund <strong>for</strong> fremstillingen af vores equalizersystem. I ligningen <strong>for</strong> den bilineære<br />

trans<strong>for</strong>mation indgår også variablen T, som er sampleintervallet bestemt ud fra<br />

samplefrekvensen.<br />

Ved en bilineær trans<strong>for</strong>mation vil der være en lille <strong>for</strong>skydning af frekvenserne som<br />

nævnt tidligere. Det betyder, at det digitale filter vil imitere det ønskede analoge filter ved<br />

lave frekvenser, men som frekvensen øges vil der opstå nævneværdig <strong>for</strong>vrængning. Den-<br />

45


Teori - signalbehandling<br />

ne <strong>for</strong>vrængning kan elimineres på to <strong>for</strong>skellige måder. Først of fremmest kan man reducere<br />

T (øge samplefrekvensen), og derved tilnærme sig det analoge filter i det ønskede<br />

frekvensbånd. Vi husker, at kun <strong>for</strong> T -> 0 vil de to amplituderespons være helt identiske.<br />

En sådan løsning udføres nemt i praksis, men kræver en højere samplefrekvens (lavere T)<br />

end nødvendig. Man kan måle lidt på afvigelsen, og diskutere hvorvidt det overhovedet er<br />

relevant med en bedre tilnærmelse. Oftest vil den allerede tillagte værdi af sampleintervallet<br />

T sikkert være tilstrækkelig, men ved <strong>brug</strong> af en anden metode (på engelsk: prewarping)<br />

kan man løse problemet helt uden at reducere T. Idéen er, at starte sit filter design<br />

med et allerede <strong>for</strong>vrænget analogt filter. Denne <strong>for</strong>vrængning vil hermed kompensere <strong>for</strong><br />

den <strong>for</strong>vrængning, der opstår som konsekvens af en bilineær trans<strong>for</strong>mation. Metoden<br />

nævnes kun kort, men bygger på, at alle kritiske frekvenser ωi trans<strong>for</strong>meres (prewarpes)<br />

med følgende ligning:<br />

46<br />

2 iT<br />

i ' tan i 1,2,..., m<br />

( 3.58)<br />

T 2<br />

I vores filter design be<strong>ny</strong>tter vi <strong>for</strong>skellige knækfrekvenser, som ændres ved <strong>brug</strong> af ovenstående<br />

ligning. De <strong>ny</strong>e værdier indgår herefter som led i bestemmelsen af overførings-<br />

2 z 1<br />

funktionen Ha(s) <strong>for</strong> vores prewarpede analoge filter. Til sidst erstatter vi s med<br />

Tz<br />

1<br />

i<br />

Ha(s) <strong>for</strong> at finde overføringsfunktionen H[z] <strong>for</strong> vores ønskede digitale filter.<br />

3.4 Rekursive filtre 11<br />

Efter vi har bestemt en overføringsfunktion H[z], skal vi have opskrevet det tilsvarende<br />

rekursive filter, også kaldt et IIR-filter, der som sagt er defineret i tidsdomænet. Ligningen<br />

<strong>for</strong> et rekursivt filter beskriver på indlysende vis, hvordan man som programmør skal implementere<br />

det. Derudover repræsenterer det også det matematiske sammenhæng mellem<br />

inputtet og outputtet, som konstant skal være gældende. Til at illustrere dette betragtes<br />

et 2. ordens system med overføringsfunktionen:<br />

b z bzb Hz [ ] <br />

( 3.59)<br />

2<br />

0 1 2<br />

2<br />

z a1za2 Sammenhængen mellem inputtet f[k] og det tilsvarende output y[k] <strong>for</strong> dette system er<br />

givet ved:<br />

y[ k] a y[ k 1] a y[ k 2] b f[ k] b f[ k 1] b f[ k 2] ( 3.60)<br />

1 2 0 1 2<br />

y[ k] = a y[ k 1] a y[ k 2] b f[ k] b f[ k 1] b f[ k 2] ( 3.61)<br />

11 [3] Chapter 33<br />

1 2 0 1 2


Teori - signalbehandling<br />

Dette kaldes en differensligning, og den beskriver netop det rekursive filter. Det er altså<br />

muligt at gå direkte fra en given overføringsfunktion til det tilsvarende digitale rekursive<br />

filter, når blot man kan aflæse filterkoefficienterne. Dette skyldes, nogle specielle egenskaber<br />

der gør sig gældende <strong>for</strong> z-trans<strong>for</strong>mationen. Her kan nævnes henholdsvis Right Shift<br />

(Delay) og Left Shift (Advance). For Right Shift gælder der, at hvis:<br />

Så er<br />

og<br />

f[ k] u[ k] F[ z]<br />

( 3.62)<br />

1<br />

f [ k 1] u[ k] F[ z] f [ 1]<br />

( 3.63)<br />

z<br />

1 1<br />

f [ k 2] u[ k] F[ z] f [ 1] f [ 2]<br />

( 3.64)<br />

2<br />

z z<br />

hvor u[k] er trinfunktionen. Tilsvarende udsagn kan opskrives <strong>for</strong> outputtet y[k]. Vi kan nu<br />

udlede et mere generelt udtryk <strong>for</strong> ovenstående trans<strong>for</strong>mation, idet alle begyndelsestilstande<br />

y[-1] = y[-2] = … = y[-n] = 0. Derudover er det antaget, at inputtet f[k] er kausalt,<br />

hvilket vil sige, at f[-1] = f[-2] = … = f[-n] = 0. Dette giver god mening, idet der hverken er<br />

defineret nogle tidligere input eller output, når vi påbegynder vores filtrering. Kigger vi på<br />

ovenstående regler <strong>for</strong> Right Shift, kan de der<strong>for</strong> <strong>for</strong>kortes til:<br />

1<br />

y[ k m] u[ k] Y[ z] m<br />

z<br />

m 1,2,..., n<br />

1<br />

f [ k m] u[ k] F[ z] m<br />

z<br />

m 1,2,..., n<br />

( 3.65)<br />

På den måde har man stort set defineret det rekursive filter, når overføringsfunktionen i zdomænet<br />

først er udregnet.<br />

Kigger vi på det rekursive filter, så er y[k] outputtet til et givet samplenummer k. Denne<br />

værdi afhænger både af inputværdierne f[k], f[k - 1] og f[k - 2] samt de tidligere outputværdier<br />

y[k – 1] og y[k – 2]. For at udregne det nuværende output <strong>for</strong> dette 2. ordens system<br />

skal vi altså be<strong>ny</strong>tte de to tidligere outputværdier. Udregningen af en enkelt outputværdi<br />

er illustreret af Figur 3-5, hvor variablen k repræsenterer det samplenummer, hvis<br />

værdi udregnes i det pågældende øjeblik. Dette er en interessant egenskab <strong>for</strong> rekursive<br />

filtre. Så snart at systemet tilføres et input, vil en <strong>for</strong>tsat tilbagekobling af outputtet ind i<br />

systemet resultere i, at outputtet <strong>for</strong>tsætter i det uendelige. Dette skyldes de rekursive<br />

koefficienter 0 a , 1 a , 2<br />

a , …, n 1<br />

a , som findes i overføringsfunktionens tæller. Sættes disse<br />

koefficienter lig nul, vil der ikke være nogen tilbagekobling af outputtet, og resultatet vil<br />

47


Teori - signalbehandling<br />

være et filter af ikke-rekursiv natur (på engelsk: nonrecursive filter eller finite impulse response<br />

filter). Det kan virke umiddelbart indlysende, at rekursive filtre må være de mest<br />

anvendelige, idet ikke-rekursive filtre bare er en speciel <strong>for</strong>m <strong>for</strong> rekursive filtre. Dette er<br />

på sin vis også sandt, efter som et specifikt filterrespons kan opnås med et rekursivt filter<br />

af meget lavere orden end det tilsvarende ikke-rekursive filter. Men til gengæld har ikkerekursive<br />

filtre den <strong>for</strong>del, at deres fasekarakteristik er lineær. Dette er ikke gældende <strong>for</strong><br />

rekursive filtre, der kun tilnærmelsesvis kan realisere en lineær fasekarakteristik.<br />

Amplitude<br />

48<br />

2<br />

1<br />

0<br />

-1<br />

-2<br />

0<br />

5<br />

Inputsignal f[k]<br />

10<br />

15<br />

f[k-2]<br />

f[k-1]<br />

f[k]<br />

20<br />

Samplenummer<br />

25<br />

30<br />

2<br />

1<br />

0<br />

-1<br />

-2<br />

0<br />

5<br />

Outputsignal y[k]<br />

10<br />

15<br />

20<br />

Samplenummer<br />

Figur 3-5: Outputtet til samplenummer k, y[k], udregnes af værdierne fra inputsignalet<br />

f[k], f[k – 1] og f[k – 2], samt de tidligere værdier fra outputsignalet y[k – 1] og y[k – 2].<br />

Figurerne er vist <strong>for</strong> k = 25.<br />

Brugen af rekursive filtre er en effektiv metode til at opnå et langt impulsrespons uden at<br />

udføre en lang foldning. Dette skyldes, at kun få koefficienter indgår i udregningen. Derudover<br />

kræver de mindre regnekraft og udregnes hurtigere, men til gengæld er de ikke så<br />

fleksible som andre digitale filtre.<br />

Amplitude<br />

y[k-2]<br />

y[k-1]<br />

y[k]<br />

25<br />

30


4<br />

FILTER DESIGN<br />

Filter design<br />

Dette afsnit omhandler design af det digitale rekursive filter. Arbejdsprocessen <strong>for</strong>løber<br />

som beskrevet i det <strong>for</strong>egående teoriafsnit omkring signalbehandlingen, hvor en række<br />

trin leder hen til det ønskede filter, som illustreret af Figur 3-1. Først designes et analogt<br />

filter, som besidder de nødvendige egenskaber i frekvensresponset. Herefter fremstilles<br />

det tilsvarende digitale filter, som er en overføringsfunktion givet i z-domænet. Til sidst<br />

omskrives overføringsfunktionen fra frekvensdomænet til tidsdomænet, hvilket fører til<br />

vores digitale rekursive filter. Hvor <strong>for</strong>rige afsnit udelukkende omhandlede teorien af den<br />

be<strong>ny</strong>ttede signalbehandling, er dette afsnit baseret på udregninger og grafiske illustrationer<br />

af filteret.<br />

4.1 Design af filter i s-domænet<br />

Tidligere introducerede vi lydtrykket <strong>for</strong> en højttalerenhed ved lave frekvenser, og skrev<br />

hvorledes denne karakteristik var givet ved et højpas-filter, der var specifikt <strong>for</strong> den enkelte<br />

enhed. I vores projekt ønsker vi kun at fremhæve de dybe toner, dvs. <strong>for</strong>stærke de lave<br />

frekvenser, set i <strong>for</strong>hold til højttalerenhedens knækfrekvens. Lydtrykket ved lave frekvenser<br />

var givet ved:<br />

<br />

Ble s s<br />

2 2<br />

0<br />

g<br />

p k k H s<br />

2<br />

SDRE MAC 2 c 2 2 c<br />

2<br />

s s c s s c<br />

QTCQTC ( )<br />

( 4.66)<br />

Her har nogle af parametrene ændret navn, hvilket er i overensstemmelse med benævnelserne<br />

<strong>for</strong> en lukket-kabinet højttaler. Her har vi sat parametrene til venstre <strong>for</strong> overføringsfunktionen<br />

lig en konstant k. Denne konstant bestemmer <strong>for</strong>stærkningen, men udelades<br />

i de videre udregninger, da vi ikke koncentrerer os om den eksakte <strong>for</strong>stærkning, men<br />

kun <strong>for</strong>stærknings<strong>for</strong>holdet mellem de <strong>for</strong>skellige frekvenser. Overføringsfunktionen H(s)<br />

afbilder et 2. ordens højpas-filter og beskriver højttalerenhedens evne til at gengive lave<br />

frekvenser. Denne overføringsfunktion bestemmes ud fra parametrene ωc og QTC. Som<br />

eksempel kan vi afbilde H(s) <strong>for</strong> en højttalerenhed med en knækfrekvens fc på 100 Hz (fc =<br />

100 Hz ωc ≈ 630 rad/s) og en Q-faktor QTC på 0,707. Amplituderesponset er givet af<br />

Figur 4-1.<br />

49


Filter design<br />

50<br />

Figur 4-1: Amplituderespons <strong>for</strong> vilkårlig højttalerenhed H(s)<br />

I første omgang ønsker vi at fjerne denne højpas-effekt fra højttalerenheden, dvs. fremstille<br />

en overføringsfunktion hvis <strong>for</strong>stærkning er lig 1 over hele frekvensspektret. Benævnes<br />

denne overføringsfunktion Y(s), skal vi der<strong>for</strong> finde en <strong>ny</strong> overføringsfunktion G(s) der<br />

multipliceret med H(s) giver resultatet 1.<br />

Y( s) H( s) G( s)<br />

1<br />

( 4.67)<br />

Dette er netop tilfældet hvis G(s) defineres som den inverse funktion til H(s). Be<strong>ny</strong>ttes de<br />

samme værdier <strong>for</strong> ωc og QTC, fås følgende amplituderespons <strong>for</strong> G(s):<br />

Dvs.<br />

Figur 4-2: Inverteret amplituderespons G(s)<br />

2 c<br />

2<br />

s s<br />

2<br />

c<br />

s<br />

QTC<br />

Y( s) H( s) G( s)<br />

1<br />

2<br />

<br />

s<br />

s s<br />

2 c 2<br />

QTC<br />

c<br />

( 4.68)


Filter design<br />

Hermed vil alle frekvenser gå igennem filteret uden dæmpning. Amplituderesponset vil<br />

således være givet ved en horisontal linje med <strong>for</strong>stærkningen 1, som illustreret af Figur<br />

4-3. Et faserespons <strong>for</strong> dette filter ville vise, at filteret er faselineært, idet fasedrejet fra<br />

højttalerens højpas-filter bliver udlignet af det inverterede lavpas-filter.<br />

Figur 4-3: Amplituderespons med <strong>for</strong>stærkning 1<br />

Et amplituderespons med denne egenskab er ikke at tilstræbe, idet de lave frekvenser vil<br />

være <strong>for</strong>stærket i alt <strong>for</strong> høj grad. Det er der<strong>for</strong> nødvendigt at introducere endnu et filter,<br />

som efter den ovenstående udjævning af amplituderesponset, skal kunne dæmpe de laveste<br />

frekvenser. Filteret vil være et højpas-filter, og den ønskede dæmpning skal kunne<br />

justeres ud fra de to <strong>ny</strong>e parametre ωc<strong>ny</strong> og QTC<strong>ny</strong>. Filteret benævnes K(s) og vil være givet<br />

ved:<br />

2<br />

s<br />

K( s)<br />

<br />

<br />

s s<br />

2 c<strong>ny</strong> 2<br />

QTC<strong>ny</strong><br />

c<strong>ny</strong><br />

( 4.69)<br />

Det endelige system, som vil være en kombination af højttalerenhedens egen frekvenskarakteristik<br />

H(s), den inverterede overføringsfunktion G(s), samt højpas-filteret K(s), vil da<br />

være:<br />

2<br />

s<br />

Y( s) H( s) G( s) K ( s)<br />

<br />

<br />

s s<br />

Filter der skal<br />

implementeres<br />

2 c<strong>ny</strong> 2<br />

QTC<strong>ny</strong><br />

c<strong>ny</strong><br />

( 4.70)<br />

Overføringsfunktionen H(s), som er højttalerenhedens eget amplituderespons, indgår naturligvis<br />

i det samlede system, men er ikke en del af det færdige filter, som skal implementeres.<br />

Det færdige filter vil bestå af produktet af G(s) og K(s), dvs. ledet som er markeret i<br />

ligningen oven<strong>for</strong>. Vi har at:<br />

51


Filter design<br />

52<br />

2 c<br />

2<br />

s sc<br />

QTC<br />

J( s) G( s) K ( s)<br />

<br />

<br />

s s<br />

2 c<strong>ny</strong> 2<br />

QTC<strong>ny</strong><br />

c<strong>ny</strong><br />

( 4.71)<br />

Hvor vi har benævnt filteret J(s). Ved at sammensætte disse to filtre, opnår vi et resulterende<br />

amplituderespons, der minder meget om højttalerenhedens eget amplituderespons,<br />

men som kan <strong>for</strong>skydes mod venstre alt efter værdien af ωc<strong>ny</strong>. På den måde kan vi selv<br />

vælge den ønskede knækfrekvens. På nedenstående graf har vi be<strong>ny</strong>ttet samme højttalerenhed<br />

som tidligere (fc = 100 Hz og QTC = 0,707), samt specificeret en <strong>ny</strong> knækfrekvens fc<strong>ny</strong><br />

på 40 Hz (fc<strong>ny</strong> = 40 Hz ωc<strong>ny</strong> ≈ 250 rad/s) og en <strong>ny</strong> Q-faktor QTC<strong>ny</strong> = 0,707. Grafen fremstil-<br />

ler et 2. ordens højpas-filter, og en sammenligning med det originale amplituderespons<br />

(Figur 4-1) viser tydeligt, hvorledes grafen er <strong>for</strong>skudt mod venstre. Ved at mindske værdien<br />

af ωc<strong>ny</strong>, i <strong>for</strong>hold til den oprindelige knækfrekvens, kan vi således <strong>for</strong>stærke de lave<br />

frekvenser som vi ønsker. ωc<strong>ny</strong> kan justeres frit, men skal defineres i intervallet 0 ≤ ωc<strong>ny</strong> ≤<br />

ωc, hvor en værdi på 0 giver anledning til et amplituderespons med <strong>for</strong>stærkningen 1 over<br />

hele frekvensområdet, mens en værdi der er identisk med ωc, efterlader amplituderesponset<br />

uændret. Det er selvfølgelig muligt at definere ωc<strong>ny</strong> > ωc, men dette vil blot resultere i<br />

en yderligere dæmpning af de laveste frekvenser, så disse værdier er ikke hensigtsmæssige<br />

i vores tilfælde.<br />

Figur 4-4: Amplituderespons <strong>for</strong> vilkårlig højttalerenhed med ændret knækfrekvens<br />

Faseresponset <strong>for</strong> det færdige filter vil ikke længere være faselineært, idet det ekstra højpas-filter<br />

er blevet introduceret. Betydningen af fasedrejet kan diskuteres, som det også er<br />

beskrevet tidligere, men der vil ikke blive lagt yderligere arbejde i denne <strong>for</strong>skydning af<br />

frekvenserne.<br />

Det er også muligt at justere på Q-faktoren QTC<strong>ny</strong>, hvilket resulterer i et enten underdæmpet,<br />

overdæmpet eller kritisk dæmpet system. Højttalerenhedens oprindelige Q-faktor QTC,<br />

vil oftest være givet ved omkring 0,707, svarende til et kritisk dæmpet system, men QTC<strong>ny</strong><br />

kan stadig indstilles frit, og den efterfølgende virkning på amplituderesponset er ganske<br />

tydelig.


Filter design<br />

Et system med lav Q-faktor (QTC<strong>ny</strong> < 0,707) kaldes overdæmpet. Et sådan system består af<br />

to reelle og <strong>for</strong>skellige poler, og impulsresponset vil der<strong>for</strong> være givet ved to aftagende<br />

eksponentialfunktioner. I takt med at Q-faktoren mindskes, vil den ene pol blive mindre<br />

mens den anden bliver større. Den mindste af polerne vil dominere systemresponset, hvilket<br />

resulterer i et meget langsomt system. Nedenstående figur illustrerer, hvorledes QTC<strong>ny</strong><br />

påvirker det samlede amplituderespons. Her har vi valgt parametrene fra Figur 4-4 (fc =<br />

100 Hz, fc<strong>ny</strong> = 40 Hz og QTC = 0,707), men ændret QTC<strong>ny</strong> til 0,2. Systemet er altså overdæmpet,<br />

og det ses tydeligt, hvordan kurven aftager mere jævnt.<br />

Figur 4-5: Amplituderespons <strong>for</strong> overdæmpet system (QTC<strong>ny</strong> = 0,2)<br />

Et system med høj Q-faktor (QTC<strong>ny</strong> > 0,707) kaldes underdæmpet. Et sådan system har to<br />

komplekse og konjugerede poler, som giver anledning til en oscillerende karakteristik,<br />

hvor polernes reelle del bidrager til dæmpningen. I takt med at Q-faktoren <strong>for</strong>størres,<br />

mindskes dæmpningen, så i stedet <strong>for</strong> at aftage jævnt, vil kurven lave et lille bump opad<br />

inden den aftager. Det er muligt at beregne oversvingsfaktoren, som er <strong>for</strong>stærkningen<br />

udgjort af det lille bump, hvilket vil blive be<strong>ny</strong>ttet i afsnittet omkring implementeringen.<br />

Virkningen er illustreret af Figur 4-6, hvor QTC<strong>ny</strong> er sat til værdien 2,0. Systemet er der<strong>for</strong><br />

underdæmpet.<br />

Figur 4-6: Amplituderespons <strong>for</strong> underdæmpet system (QTC<strong>ny</strong> = 2,0)<br />

I dette delafsnit har vi designet det ønskede filter, som skal implementeres, og illustreret<br />

de enkelte parametres indflydelse på det endelige amplituderespons gennem diverse grafer.<br />

Højttalerenhedens amplituderespons bestemmes ud fra parametrene ωc og QTC, som<br />

fastsættes ved måling eller beregnes ud fra opslag i datablad. Disse be<strong>ny</strong>ttes til at bestemme<br />

den inverse overføringsfunktion og indgår der<strong>for</strong> i det færdige filter som fastlagte<br />

værdier. De to parametre ωc<strong>ny</strong> og QTC<strong>ny</strong> kan til gengæld justeres frit, og det er deres effekt<br />

53


Filter design<br />

på det endelige amplituderespons, der danner grundlag <strong>for</strong> den mulige <strong>for</strong>stærkning af de<br />

lave frekvenser. Hvorledes en justering af de to parametre giver sig til udtryk i den resulterende<br />

lyd, diskuteres i et senere afsnit. Her kan enkelte personers vurdering variere<br />

meget i <strong>for</strong>hold til hinanden, og det som <strong>for</strong> nogle opfattes som en ”<strong>for</strong>bedring” af lyden,<br />

kan <strong>for</strong> andre opfattes anderledes.<br />

4.2 Bilineær trans<strong>for</strong>mation<br />

Design af filteret i s-domænet er nu færdiggjort, og en direkte omskrivning af systemet fra<br />

s-domænet over i z-domænet kan påbegynde. Som beskrevet i teoriafsnittet be<strong>ny</strong>ttes en<br />

metode kaldet bilineær trans<strong>for</strong>mation, som gør det muligt at repræsentere et system i<br />

diskret tid, hvis det oprindelige system er designet i kontinuert tid. For en god ordens<br />

skyld opskrives det færdige filter:<br />

54<br />

2 c<br />

2<br />

s sc<br />

QTC<br />

J( s)<br />

<br />

<br />

s s<br />

2 c<strong>ny</strong> 2<br />

QTC<strong>ny</strong><br />

c<strong>ny</strong><br />

Vi finder frem til overføringsfunktionen J[z] ud fra J(s) ved <strong>brug</strong> af trans<strong>for</strong>mationen:<br />

2z1 s <br />

T<br />

<br />

z1<br />

Ved indsættelse fås:<br />

4( z 1)<br />

2 ( z 1)<br />

2<br />

c<br />

( 1) ( 1)<br />

Jz [ ] <br />

4( 1) 2 ( 1)<br />

<br />

T ( z 1) Q T( z 1)<br />

2<br />

2<br />

T z<br />

2<br />

c<br />

QTCT z<br />

z <br />

2 c<strong>ny</strong><br />

z<br />

2 2<br />

TC<strong>ny</strong><br />

2<br />

c<strong>ny</strong><br />

Ved udregning og isolering af de enkelte led fås:<br />

( 4.72)<br />

( 4.73)<br />

( 4.74)<br />

2 2 2 2 2 2 2 2 2<br />

QTC<strong>ny</strong>(4Q TCz 8QTC z 4QTC 2cTz 2 cT c T QTC z 2 cT QTC z c<br />

T QTC<br />

)<br />

TC TC<strong>ny</strong><br />

2<br />

TC<strong>ny</strong> TC<strong>ny</strong> c<strong>ny</strong> 2<br />

c<strong>ny</strong> 2<br />

c<strong>ny</strong> 2<br />

TC<strong>ny</strong><br />

2<br />

<br />

2<br />

c<strong>ny</strong> 2<br />

TC<strong>ny</strong><br />

2<br />

c<strong>ny</strong><br />

2<br />

TC<strong>ny</strong><br />

Jz [ ] <br />

Q (4Q z 8Q z 4Q 2 Tz 2 T T Q z 2 T Q z T Q )


Filter design<br />

2 2 2 2 2 2 2<br />

QTC<strong>ny</strong>((4Q TC c T QTC 2 cT ) z ( 8QTC 2 cT QTC ) z 2 cT 4 QTC c<br />

T QTC<br />

)<br />

TC<br />

2<br />

TC<strong>ny</strong> c<strong>ny</strong> 2<br />

TC<strong>ny</strong> c<strong>ny</strong> 2<br />

TC<strong>ny</strong> <br />

2<br />

c<strong>ny</strong> 2<br />

TC<strong>ny</strong> c<strong>ny</strong> <br />

2<br />

TC<strong>ny</strong> c<strong>ny</strong><br />

2<br />

TC<strong>ny</strong><br />

Jz [ ] <br />

Q ((4Q T Q 2 T ) z ( 8Q 2 T Q ) z 2 T 4 Q T Q )<br />

Vi har nu opskrevet overføringsfunktionen <strong>for</strong> det tilsvarende digitale filter i z-domænet.<br />

Udtrykket er der<strong>for</strong> en funktion af den komplekse variabel z, og filterkoefficienterne kan<br />

direkte aflæses som de <strong>for</strong>anstående led. Til <strong>for</strong>skel fra overføringsfunktionen i sdomænet,<br />

indgår der også variablen T, som er sampleintervallet bestemt ud fra samplefrekvensen.<br />

I teoriafsnittet Bilineær trans<strong>for</strong>mation blev det nævnt, hvorledes de to amplituderespons,<br />

<strong>for</strong> henholdsvis s-domænet og z-domænet, kun var identiske <strong>for</strong> T -> 0. Det<br />

er altså nødvendigt at prewarpe knækfrekvenserne ωc og ωc<strong>ny</strong> inden de medregnes i overføringsfunktionen.<br />

Denne udregning kan let <strong>for</strong>etages som et led i programmeringen af<br />

filteret, og udelades der<strong>for</strong> her. Ligningen <strong>for</strong> de prewarpede knækfrekvenser var givet<br />

ved:<br />

2 iT<br />

i ' tan i 1,2,..., m<br />

( 4.75)<br />

T 2<br />

4.3 Omskrivning til rekursivt filter<br />

For at kunne arbejde med vores digitale filter, skal det først defineres i tidsdomænet. Indtil<br />

videre har vi fremstillet en overføringsfunktion J[z] i frekvensdomænet, som opfylder de<br />

stillede krav til filterets funktion. Vi husker hvorledes et 2. ordens system med overføringsfunktionen:<br />

b z bzb Hz [ ] <br />

2<br />

0 1 2<br />

2<br />

z a1za2 direkte kan omskrives til et digitalt rekursivt filter på <strong>for</strong>men:<br />

1 2 0 1 2<br />

( 4.76)<br />

y[ k] = a y[ k 1] a y[ k 2] b f[ k] b f[ k 1] b f[ k 2] ( 4.77)<br />

Sammenligner vi den udregnede J[z] med ovenstående overføringsfunktion, skal den blot<br />

normeres i <strong>for</strong>hold til leddet i nævneren. På den måde kommer vi frem til følgende filterkoefficienter.<br />

55


Filter design<br />

56<br />

b<br />

b<br />

b<br />

a<br />

a<br />

2 2<br />

QTC<strong>ny</strong>(4Q TC cTQTC2 cT)<br />

0 <br />

2 2<br />

TC TC<strong>ny</strong> c<strong>ny</strong>TC<strong>ny</strong> c<strong>ny</strong><br />

Q (4Q T Q 2 T )<br />

2 2<br />

QTC<strong>ny</strong>( 8QTC2 cT<br />

QTC<br />

)<br />

1 <br />

2 2<br />

TC TC<strong>ny</strong> c<strong>ny</strong>TC<strong>ny</strong> c<strong>ny</strong><br />

Q (4Q T Q 2 T )<br />

2 2<br />

QTC<strong>ny</strong>( 2cT4 QTC cTQTC)<br />

2 <br />

2 2<br />

QTC QTC<strong>ny</strong> c<strong>ny</strong>TQTC<strong>ny</strong> c<strong>ny</strong>T<br />

(4 2 )<br />

2 2<br />

QTC ( 8QTC<strong>ny</strong>2 c<strong>ny</strong>T<br />

QTC<strong>ny</strong><br />

)<br />

1 <br />

2 2<br />

TC TC<strong>ny</strong> c<strong>ny</strong>TC<strong>ny</strong> c<strong>ny</strong><br />

Q (4Q T Q 2 T )<br />

2 2<br />

QTC ( 2c<strong>ny</strong>T4 QTC<strong>ny</strong> c<strong>ny</strong>TQTC<strong>ny</strong>)<br />

2 <br />

2 2<br />

QTC (4QTC<strong>ny</strong> c<strong>ny</strong>TQTC<strong>ny</strong>2 c<strong>ny</strong>T)<br />

( 4.78)<br />

Vi har nu udledt det digitale rekursive filter, som skal stå <strong>for</strong> selve behandlingen af lyden.<br />

På samme måde skal vi udlede et rekursivt filter <strong>for</strong> membranens udsving. Det gøres ud<br />

fra overføringsfunktionen (2.32), som afbilder et 2. ordens lavpas-filter i s-domænet. Ligesom<br />

oven<strong>for</strong> er en direkte omskrivning af systemet fra s-domænet over i z-domænet<br />

nødvendig. Her be<strong>ny</strong>ttes den bilineære trans<strong>for</strong>mation ligeledes. Vi har valgt ikke at gennemgå<br />

denne udregning, men opskriver blot filterkoefficienterne. For det mekaniske filter<br />

er filterkoefficienterne givet ved:<br />

a<br />

b<br />

b<br />

b<br />

a<br />

Q<br />

TQ<br />

T Q T<br />

2 2<br />

0 <br />

4 TC <br />

c<br />

2<br />

c<br />

2<br />

TC<br />

TC 2<br />

c<br />

Q<br />

2<br />

TQ<br />

T Q T<br />

2 2<br />

1 <br />

4 TC <br />

c<br />

2<br />

c<br />

2<br />

TC<br />

TC 2<br />

c<br />

Q<br />

TQ<br />

T Q T<br />

2 2<br />

2 <br />

4 TC <br />

c<br />

2<br />

c<br />

2<br />

TC<br />

TC 2<br />

c<br />

2 2<br />

2 QTC( 4 cT<br />

)<br />

1 <br />

2 2<br />

4 TC c TC 2<br />

c<br />

Q T Q T<br />

2 T 4Q<br />

T Q<br />

2 2<br />

c TC c TC<br />

2 <br />

2 2<br />

4QTCcTQTC2cT ( 4.79)<br />

Også her har vi udeladt alle de <strong>for</strong>anstående parametre i overføringsfunktionen <strong>for</strong> det<br />

mekaniske udsving (2.32). Det skyldes, at vi ikke koncentrerer os om det eksakte udsving,<br />

men kun <strong>for</strong>holdet af udsvinget ved <strong>for</strong>skellige frekvenser. Grunden hertil <strong>for</strong>klares nærmere<br />

i afsnittet Mekanisk beskyttelse.


5<br />

IMPLEMENTERING<br />

Implementering<br />

Det digitale rekursive filter vil blive implementeret som plug-in til musikafspilleren Foobar2000<br />

samt på et DSP evaluation board. Hovedafsnittet vil være delt op i to underafsnit,<br />

som beskriver de to respektive implementerings<strong>for</strong>mer. For et nærmere kig på selve kildekoden<br />

henvises til appendiks A og appendiks B, hvor den relevante kode er opskrevet<br />

med <strong>for</strong>klaringer og kommentarer.<br />

5.1 Foobar2000<br />

Musikafspillerprogrammet Foobar2000 er et gratis program, der frit kan downloades fra<br />

internettet. Til Foobar2000 er lavet et SDK 12, som gør det muligt <strong>for</strong> tredjeparter at udvide<br />

programmets funktionalitet ved programmeringen af egne plug-ins. En af de typer plug-in<br />

det er muligt at udvide, er et DSP-plugin, som kan <strong>brug</strong>es til at modificere lyden. Foobar2000<br />

er i stand til at afspille lyd fra <strong>for</strong> eksempel computerens harddisk, CD-drev eller<br />

fra en internetradiostation. Når der afspilles lyd i Foobar2000, bliver en del af lyden indlæst<br />

i hukommelsen, og alt efter hvilket <strong>for</strong>mat lyden er i, bliver denne stump enten kopieret<br />

eller dekodet over til et <strong>ny</strong>t sted i computerens hukommelse. Indholdet fra hukommelsen<br />

bliver herefter sendt ud i computerens lydkort, hvor lyden kan sendes videre digitalt<br />

eller omdannes til et analogt lydsignal. Når man be<strong>ny</strong>tter et DSP-plugin, så tilføjes et ekstra<br />

led i bearbejdningen af lyden, inden den sendes fra input til output. Signalvejen i Foobar2000<br />

er illustreret neden<strong>for</strong>.<br />

Lydfil på<br />

computeren<br />

Foobar<br />

Input<br />

Foobar DSP<br />

Figur 5-1: Signalvejen i Foobar2000<br />

Foobar<br />

Output<br />

Lydkort<br />

Foobar2000’s DSP-arkitektur er implementeret på en sådan måde, at en samling af samples,<br />

der tilsammen danner en lydblok, bliver behandlet en ad gangen. Samlingen af samples,<br />

også kaldt en chunk, består normalt af mellem 623 og 4096 samples og indeholder<br />

12 Software Developers Kit<br />

57


Implementering<br />

samtlige lydkanaler. For et stereo-musiksignal vil starten af en chunk se ud på følgende<br />

måde:<br />

58<br />

Chunk<br />

Sample 0 Sample 1 Sample 2 Sample 3 Sample 4 Sample 5 Sample 6 Sample 7<br />

Venstre<br />

sample 0<br />

Højre<br />

sample 0<br />

Venstre<br />

sample 1<br />

Højre<br />

sample 1<br />

Venstre<br />

sample 2<br />

Højre<br />

sample 2<br />

Venstre<br />

sample 3<br />

Figur 5-2: Illustration af en chunk <strong>for</strong> et stereo musiksignal<br />

Højre<br />

sample 3<br />

Fra Foobar2000’s inputmodul sendes hukommelsesadressen på chunken til DSP modulet.<br />

DSP modulet kan herefter modificere chunken og efterfølgende rapportere videre, når den<br />

har færdigbehandlet chunken. I vores DSP-plugin er det første der sker, når input modulet<br />

har sendt chunkadressen til DSP-modulet, at hele indholdet af chunken kopieres til et midlertidigt<br />

lager. Årsagen til at dette midlertidige lager introduceres er, at den mekaniske<br />

beskyttelsesalgoritme kan give behov <strong>for</strong> en gentagende filtrering af en chunk. Det er således<br />

muligt at korrigere filteret løbende.<br />

Når lyden deles op i blokke, som behandles en af gangen, har IIR-filteret behov <strong>for</strong> at kende<br />

de sidste to input og output sampleværdier fra den <strong>for</strong>rige chunk. Sampleværdierne <strong>for</strong><br />

de sidste to samples gemmes der<strong>for</strong> altid i separate variable, så problemer med skift fra en<br />

chunk til den næste undgås.<br />

Sampleværdierne som be<strong>ny</strong>ttes internt i Foobar2000 ligger i intervallet -1 til 1, hvor -1<br />

angiver maksimal negativ amplitude, og +1 angiver maksimal positiv amplitude. Internt<br />

gemmer Foobar2000 sampleværdierne i variable af typen float, hvilket giver mulighed <strong>for</strong><br />

at lagre decimaltal med en præcision på 32 bit. De 32 bit er opdelt således, at 24 bit be<strong>ny</strong>ttes<br />

til at lagre heltalsdelen, mens der be<strong>ny</strong>ttes 8 bit til at lagre eksponenten. For at opnå<br />

størst mulig præcision med IIR-filteret, bliver de samples som filteret be<strong>ny</strong>tter til mellemresultater<br />

gemt i variable af typen double. Denne type variabel kan lagre decimaltal med<br />

64-bit præcision, så den interne præcision maksimeres. Foruden mellemresultater gemmes<br />

også de beregnede filterkoefficienter med 64-bit præcision.<br />

Selve IIR-filteret, som blev udledt i afsnit 4.3, udgøres af en enkelt kodelinje og indeholder<br />

de fem filterkoefficienterne a 1 , a 2 , b 0 , b 1 , b 2 (ligning 4.78), de tre sampleværdier <strong>for</strong> in-<br />

putsignalet f[ k ] , f[ k 1] og f[ k 2] og de to <strong>for</strong>egående outputsamples yk [ 1] og<br />

yk [ 2] .


1.5.1 Mekanisk beskyttelse<br />

Implementering<br />

Til beskyttelse af højttalerenheden mod <strong>for</strong> store membranudsving, be<strong>ny</strong>ttes den tidligere<br />

udledte overføringsfunktion <strong>for</strong> det mekaniske udsving x D . Denne overføringsfunktion<br />

udgør et IRR-filter, og den be<strong>ny</strong>tter outputsignalet fra vores første rekursive filter som<br />

input. Vi havde at:<br />

V<br />

1 1<br />

x e k <br />

D g<br />

AT<br />

2 2<br />

p0c SDRE cQEC s<br />

2<br />

1 s s<br />

2<br />

1 s<br />

1 1<br />

c QTCccQTCc ( 5.80)<br />

Her har vi sat hele det <strong>for</strong>anstående led lig en konstant k. Alle output-signalværdierne<br />

multipliceres med denne konstant, som vi kalder den mekaniske <strong>for</strong>stærkning. I <strong>brug</strong>ergrænsefladen<br />

er det muligt at definere en samlet konstant bestående af det mekaniske<br />

gain og det maksimale udsving x max , hvilket beskrives videre fremme, og værdien af denne<br />

konstant har stor indflydelse på den videre korrektion. Øges denne konstant, så vil programmet<br />

opfatte en tilsvarende stigning af membranudsvinget over hele frekvensbåndet,<br />

og der skal således mindre til, før der <strong>for</strong>etages en justering af filteret. Grunden til at vi<br />

blot definerer de <strong>for</strong>anstående parametre som en konstant er, at vi ikke kender <strong>for</strong>stær-<br />

ker-spændingen e g . Afspilles der musik fra computeren, så vil der være flere <strong>for</strong>skellige<br />

steder, hvor lydniveauet, og dermed e g , indstilles, og det vil der<strong>for</strong> ikke være muligt at<br />

bestemme den præcise værdi.<br />

Ved korrektion af filteret <strong>for</strong>stås, at knækfrekvensen <strong>for</strong> det rekursive filter c<strong>ny</strong> justeres i<br />

<strong>for</strong>hold til membranens udsving. Er membranudsvinget <strong>for</strong> stort, så skal mængden af dyb<br />

bas i signalet reduceres, da det normalt er ved lave frekvenser at store membranudsving<br />

frembringes. Dette gøres, ved at øge knækfrekvensen og på den måde tilnærme sig højttalerens<br />

eget amplituderespons. Er membranudsvinget derimod småt i <strong>for</strong>hold til den fast-<br />

satte værdi <strong>for</strong> det mekaniske gain, så sænkes knækfrekvensen. På den måde vil c<strong>ny</strong> blive<br />

justeret op og ned løbende, og de tilhørende filterkoefficienter vil ligeledes blive udregnet<br />

på <strong>ny</strong>. Den behandlede chunk, som er gemt i det midlertidige lager, bliver da genberegnet,<br />

indtil det resulterende output er korrekt. Korrektionen <strong>for</strong>etages hvis:<br />

x x ( 5.81)<br />

D<br />

max<br />

1<br />

kx 2<br />

max <br />

s 1 s<br />

1<br />

c QTC<br />

c<br />

( 5.82)<br />

59


Implementering<br />

60<br />

k<br />

1<br />

2<br />

xmax s 1 s<br />

<br />

1<br />

c QTC<br />

c<br />

1<br />

( 5.83)<br />

Konstanten k/ x max indstilles ved <strong>brug</strong> af slider’en nederst til venstre i <strong>brug</strong>ergrænsefal-<br />

den. Designet af <strong>brug</strong>ergrænsefladen kan ses af Figur 5-4, men <strong>for</strong>klares nærmere i næste<br />

afsnit.<br />

Når situationen med <strong>for</strong> meget bas <strong>for</strong>ekommer, vil knækfrekvensen øges proportionalt<br />

med det resulterende udsving, multipliceret med den mekaniske <strong>for</strong>stærkning. Derefter<br />

startes <strong>for</strong>fra med beregningen af chunken. Afvigelsen mellem den ønskede knækfrekvens,<br />

og den nødvendige knækfrekvensen betegnes fcnewoffset. Den filtrerede chunk vil derefter<br />

genberegnes indtil der ikke længere er <strong>for</strong> meget bas, eller at den ønskede knækfrekvens<br />

har nået den originale knækfrekvens. Herefter <strong>for</strong>tsættes til næste chunk.<br />

For at returnere til den ønskede knækfrekvens defineret i <strong>brug</strong>ergrænsefladen, vil der når<br />

en chunk-behandling startes, ske det at den regulerede knækfrekvens sænkes i retning af<br />

den ønskede knækfrekvens. Dette gøres ved at multiplicere fcnewoffset med værdien 0,95.<br />

Denne værdi er valgt på baggrund af afprøvning, idet en højere værdi gør filterets tilbagejustering<br />

af fcnew langsom, mens en lavere værdi påvirker lyden negativt, da knækfrekvensen<br />

har <strong>for</strong> store udsving. Ved at multiplicere med en konstant vil en stor <strong>for</strong>skel, mellem<br />

den regulerede og ønskede knækfrekvens, der<strong>for</strong> reduceres hurtigere end en lille <strong>for</strong>skel.<br />

Selvom fcnewoffset bliver tilstrækkelig lille, vil der dog altid være 1 Hz regulering mellem<br />

hver chunk, indtil programmet er tilbage på den ønskede knækfrekvens.<br />

1.5.2 Brugergrænseflade<br />

For at aktivere DSP-modulet startes Foobar2000, hvorefter man åbner vinduet Preferences<br />

ved <strong>brug</strong> af genvejstasten Ctrl+P. Vinduet er vist på Figur 5-3. I træet til venstre åbnes<br />

menupunktet Playback, og DSP Manager vælges. For at tilføre et DSP-modul til signalvejen,<br />

dobbeltklikkes på det ønskede DSP-modul i højre side af vinduet. DSP-modulet vil<br />

derefter blive vist i venstre sektion, hvor de aktive DSP-moduler befinder sig. En given<br />

kombination af DSP-moduler, inklusivt de indtastede indstillinger, kan herefter gemmes<br />

som et preset nederst i vinduet. På den måde kan man let skifte mellem <strong>for</strong>skellige sæt af<br />

indstillinger.


Figur 5-3: Foobar2000 vindue til aktivering af DSP-modul<br />

Implementering<br />

En af de store <strong>for</strong>dele ved digital signalbehandling er, at man let kan justere på filterets<br />

karakteristik. For at gøre justeringen af de mange parametre, som systemet afhænger af,<br />

mere overskuelig, er der lavet en <strong>brug</strong>ergrænseflade til DSP-modulet. Her kan man let<br />

justere på parametrene alt imens musikken afspiller. Figur 5-4 viser hvorledes <strong>brug</strong>ergrænsefladen<br />

er designet.<br />

Figur 5-4: Brugergrænseflade <strong>for</strong> DSP-modul<br />

Brugergrænsefladen er opdelt i fire sektioner.<br />

Indstillinger <strong>for</strong> original højttaler<br />

Indstillinger <strong>for</strong> ønsket højttaler<br />

61


Implementering<br />

62<br />

Indstillinger <strong>for</strong> mekanisk beskyttelse<br />

Indstillinger af <strong>for</strong><strong>for</strong>stærkning af signalet<br />

I den første sektion, som er tillagt den originale højttaler, er det muligt at justere på højttalerens<br />

knækfrekvens og Q-faktor. Disse parametre indstilles fra starten og er specifikt<br />

defineret <strong>for</strong> den enkelte højttaler. Da de tilsammen udgør det inverterede amplituderespons<br />

som er illustreret af Figur 4-2, skal de helst defineres nogenlunde præcist. Det er<br />

naturligvis muligt at justere på parametrene <strong>for</strong> den originale højttaler undervejs, hvilket<br />

tydeligt vil lade sig høre i musikken, men vi vil ikke argumentere <strong>for</strong> den resulterende effekt.<br />

Her kan man selv eksperimentere lidt.<br />

I den anden sektion, som er tillagt den ønskede højttaler, er det muligt at justere den ønskede<br />

knækfrekvens samt eventuelt ændre Q-værdien. Hvorledes justeringen af de to parametre<br />

ændrer på det resulterende amplituderespons er beskrevet i hovedafsnittet Filter<br />

design. For at høre hvilken indflydelse filteret har på lyden, kan man aktivere og deaktivere<br />

filteret med checkboksen i programmets midtersektion.<br />

De fire parametre som indstilles i de to ovennævnte sektioner indgår alle i det rekursive<br />

filter (ligning 4.77) og (ligning 4.78). Det vil altså sige, at hver gang der justeres på en af<br />

disse fire sliders, så bliver der beregnet <strong>ny</strong>e filterkoefficienter.<br />

I den nederste sektion til højre indstilles signalets <strong>for</strong><strong>for</strong>stærkning. Idet signalet tilføres<br />

ekstra bas igennem filteret og der<strong>for</strong> gøres kraftigere, er det nødvendigt at sænke signalniveauet<br />

inden filteret be<strong>ny</strong>ttes. Denne <strong>for</strong><strong>for</strong>stærkning kan man vælge at justere manuelt.<br />

Men hvis man vil være på den sikre side, så kan man be<strong>ny</strong>tte checkboksen, så <strong>for</strong><strong>for</strong>stærkningen<br />

automatisk udregnes på baggrund af, at ingen frekvenser må kunne overstyre<br />

signalet. Ved at aktivere checkboksen har man der<strong>for</strong> en sikkerhedsmargen, så <strong>for</strong>vrængning<br />

undgås.<br />

Som det er beskrevet i teoriafsnittet <strong>for</strong> højttaleren, så kan højttaleren modelleres med et<br />

2. ordens højpas-filter, hvis amplitude aftager med 12 dB per oktav under knækfrekvensen.<br />

Befinder vi os i dette aftagende interval, så skal signalniveauet <strong>for</strong>øges med 12 dB,<br />

hvis højttaleren skal kunne gengive lydniveauet uændret en oktav dybere. Dette svarer til,<br />

at signalniveauet <strong>for</strong>øges med en faktor 4. Ved maksimal amplitude er det der<strong>for</strong> nødvendigt<br />

at reducere det samlede signalniveau med en tilsvarende skaleringsfaktor. Det er<br />

netop det programmet gør, hvis man vælger at indstille <strong>for</strong><strong>for</strong>stærkningen automatisk. Vi<br />

betragter nu to sinustoner med den maksimalt tilladte amplitude 1. Rød svarer til fc, mens<br />

blå svarer til fcnew, som er en oktav dybere. Sendes disse to sinussignaler igennem filteret,<br />

vil det resultere i følgende output.


1<br />

-1<br />

1<br />

-1<br />

1<br />

-1<br />

Implementering<br />

Oprindelige signaler Skalerede signaler Filtrerede signaler<br />

a) b) c)<br />

Figur 5-5: Signalniveauer igennem filteret<br />

Idet den <strong>ny</strong>e knækfrekvens er en oktav dybere, så vil filteret <strong>for</strong>stærke lydniveauet <strong>for</strong><br />

denne frekvens med 12 dB (blå kurve). Men som det ses af Figur 5-5, så er en sådan <strong>for</strong>stærkning<br />

ikke mulig, da det vil resultere i en overskridelse af den maksimale amplitude<br />

på 1. Har man der<strong>for</strong> indstillet <strong>for</strong><strong>for</strong>stærkningen, så vil signalerne først blive skaleret ned<br />

med en faktor 4, inden de bliver <strong>for</strong>stærket. Dette er illustreret af Figur 5-5b og Figur<br />

5-5c. Det er også nødvendigt at skalere yderligere, hvis den angivne Q-faktor resulterer i<br />

et underdæmpet system. Den nødvendige <strong>for</strong><strong>for</strong>stærkning bliver udregnet på baggrund af<br />

nedenstående skaleringsfaktor.<br />

2<br />

2<br />

2<br />

c tcnew c<br />

f Q f <br />

skaleringsfaktor oversvingsfaktor <br />

<br />

f Q 0.25 f <br />

2<br />

cnew tcnew<br />

cnew<br />

( 5.84)<br />

Den bliver altså udregnet ud fra <strong>for</strong>holdet mellem den oprindelige knækfrekvens f c og<br />

den ønskede knækfrekvens f cnew samt en oversvingsfaktor. Oversvingsfaktoren antager<br />

værdien 1, hvis filteret er overdæmpet eller kritisk dæmpet, hvorimod den antager den<br />

beregnede værdi, hvis filteret er underdæmpet. I tilfældet hvor den ønskede knækfrekvens<br />

er en oktav lavere end den oprindelige, og systemet er kritisk dæmpet, giver det<br />

der<strong>for</strong> skaleringsfaktoren 4.<br />

Nederst til venstre i vinduet justeres parametrene <strong>for</strong> den mekaniske beskyttelse, hvilket<br />

er den mekaniske <strong>for</strong>stærkning divideret med membranudsvinget. Ønskes et mindre<br />

membranudsving, justeres slideren op, og ønskes mere udsving justeres slideren ned. Den<br />

mekaniske beskyttelse kan også aktiveres og deaktiveres ved <strong>brug</strong> af checkboksen.<br />

1.5.3 Foobar2000 kode<br />

Foobar2000 DSP-modulet er programmeret i C++ ved hjælp af udviklingsværktøjet Microsoft<br />

Visual Studio 2008. På den vedlagte CD kan man finde det samlede Visual Studio projekt,<br />

som kan compiles til Foobar2000 DSP-modulet. Desuden kan koden findes i appendiks<br />

A, hvis man ønsker at se nærmere på den. Her gives en kort beskrivelse af koden, som<br />

er opdelt i tre hovedsektioner:<br />

63


Implementering<br />

64<br />

struct t_dsp_loudspeakereq_params<br />

class dialog_dsp_loudspeakereq<br />

class dsp_loudspeakereq<br />

Strukturen t_dsp_loudspeaker_params indeholder alle parametre der har med presets<br />

at gøre, samt funktioner til at læse fra og skrive til presets. For at kunne lukke og åbne<br />

dialogboksen, som <strong>brug</strong>es til at ændre filterparametrene, be<strong>ny</strong>tter DSP-modulet et midlertidigt<br />

preset til at gemme de nuværende indstillinger. Første gang man indsætter DSPmodulet,<br />

indsættes det med standardværdierne angivet i constructoren.<br />

Klassen dialog_dsp_loudspeakereq er ansvarlig <strong>for</strong> den grafiske <strong>brug</strong>ergrænseflade<br />

(GUI) og interaktionen mellem GUI, preset og den resterende kode.<br />

Funktionen on_message varetager fremvisningen af dialogboksen, opretter <strong>brug</strong>ergrænsefladens<br />

sliders og checkbokse, og indstiller dem til deres tilhørende variables værdier.<br />

Desuden defineres i hvilket interval det er muligt at justere de <strong>for</strong>skellige parametre. Når<br />

man ændrer på noget i GUI’en, så giver funktionen også beskeden videre til resten af programmet.<br />

Ved tryk på OK sørger funktionen <strong>for</strong> at gemme de nuværende indstillinger i det<br />

midlertidige preset, og ved tryk på Cancel hoppes der tilbage til indstillingerne, inden der<br />

blev <strong>for</strong>etaget ændringer.<br />

Funktionen update_display henter værdier fra sliders og checkbokse og gemmer dem i<br />

tilhørende variable. Checkboksen <strong>for</strong> automatisk pregain sætter gang i beregningen af et<br />

passende pregain ud fra de be<strong>ny</strong>ttede frekvenser og Q-værdi. Denne værdi <strong>brug</strong>es til at<br />

indstille pregain-slideren, så <strong>brug</strong>eren oplever, at sliderne direkte påvirker hinanden. De<br />

mange tekstfelter bliver opdateret og <strong>for</strong>materet i henhold til de gemte variabelværdier.<br />

Funktionen giver desuden besked til resten af programmet om, at indstillingerne har ændret<br />

sig.<br />

Klassen dsp_loudspeakereq står <strong>for</strong> den egentlige signalbehandling af lydsignalet samt<br />

beregningen af filterkoefficienterne. I starten af klassen defineres de globale variable, der<br />

be<strong>ny</strong>ttes på tværs af klassen. En midlertidig buffer gemmer hver chunk samt de tidligere<br />

sampleværdier og begyndelsesværdier. De mange buffers defineres som array_t og indeholder<br />

typen doubles. Grunden til at man be<strong>ny</strong>tter denne type frem <strong>for</strong> almindelige arrays<br />

er, at de dynamisk kan ændre størrelse. Dette er nødvendigt, da størrelsen af en<br />

chunk, alt efter hvilket <strong>for</strong>mat indgangssignalet er i samt antallet af kanaler, kan variere.<br />

Funktionen set_data tager værdierne som er gemt i det midlertidige preset (begynder<br />

med params.m_) og gemmer dem i de tilhørende lokale variable. Her beregnes også det<br />

resulterende pregain.


Implementering<br />

Funktionen calculate_coefficients beregner filterkoefficienter <strong>for</strong> både equalizerfilteret<br />

og filteret <strong>for</strong> membranens udsving ud fra de angivne parametre og teorien beskrevet<br />

tidligere i rapporten.<br />

Hovedfunktionen i klassen hedder on_chunk, og er den funktion der kaldes, når Foobar2000<br />

har en chunk parat til behandling. Som parameter har funktionen blandt andet<br />

hukommelsesadressen på chunken, hvorfra den indlæses, modificeres og gemmes. Hver<br />

gang on_chunk funktionen bliver kaldt, gemmes sampleværdierne fra den <strong>for</strong>egående<br />

chunk i de tre arrays fk_s, yk_s og yk_m_s. Desuden læses chunken igennem, en duplikat<br />

gemmes i en midlertidig buffer, og hukommelsesadressen <strong>for</strong> chunkens begyndelsessted<br />

gemmes.<br />

Herefter begynder den relativt beregningstunge del bestående af henholdsvis equalizerfilteret,<br />

og filteret som modellerer højttalerenhedens mekaniske udsving. Beregningen <strong>for</strong>egår<br />

gennem to løkker, hvor første løkke gentager en kodestump <strong>for</strong> hver sample i en<br />

chunk, og anden løkke står <strong>for</strong> separat at behandle antallet af kanaler i lydsignalet.<br />

Til at starte med flyttes alle inputsamples et diskret tidsskridt, dvs. f[k-1] bliver til f[k-<br />

2], f[k] bliver til f[k-1], og den nuværende sample divideret med skaleringsfaktoren<br />

bliver til f[k]. Herefter beregnes filteroutputtet y[k] ved hjælp af de beregnede filterko-<br />

efficienter. Er equalizerfilteret deaktiveret, sættes y[k] = f[k], så man kun opnår en skalering<br />

af signalet.<br />

Efterfølgende kommer koden <strong>for</strong> den mekaniske beskyttelse. Her beregnes outputtet på<br />

samme måde som <strong>for</strong> equalizerfilteret, hvor inputtet til filteret er det netop beregnede<br />

output fra equalizerfilteret. Som beskrevet i afsnittet om mekanisk beskyttelse, undersøges<br />

om det resulterende mekaniske udsving overskrider en given grænse. Dette gøres ved<br />

hele tiden at gemme det maksimale udsving i variablen mp_max. Når chunken er færdigbehandlet,<br />

kendes det maksimale oversving <strong>for</strong> hele chunken. Den maksimale værdi multipliceres<br />

med den mekaniske <strong>for</strong>stærkning, og i tilfælde af at dette resultat giver en værdi<br />

over 1, slår den mekaniske beskyttelse til, da det er ensbetydende med <strong>for</strong> meget bas. For<br />

at få mindre bas, skal den ønskede knækfrekvens <strong>for</strong>øges. Afvigelsen mellem den ønskede<br />

knækfrekvens og den mekanisk mulige knækfrekvens defineres af variablen<br />

fcnew_offset. Den mekaniske beskyttelse <strong>for</strong>øger fcnew_offset proportionalt i <strong>for</strong>hold<br />

til, hvor meget udsvinget er <strong>for</strong> stort. Herefter beregnes <strong>ny</strong>e filterkoefficienter, hvor den<br />

ønskede knækfrekvens defineres som fcnew + fcnew_offset.<br />

65


Implementering<br />

Efter de <strong>ny</strong>e filterkoefficienter er beregnet, skal chunken filtreres igen. Her be<strong>ny</strong>ttes de<br />

tidligere omtalte arrays fk_s, yk_s og yk_m_s, samt adressen <strong>for</strong> chunkens start, til at<br />

genskabe starttilstanden <strong>for</strong> hovedløkken, så man kan starte helt <strong>for</strong>fra med beregningen<br />

af chunken.<br />

Til sidst i løkken gemmes sampleværdien y[k] i den tilhørende placering chunken, og<br />

outputværdierne <strong>for</strong>skydes ét tidsskridt, så de er parat til næste gennemkørsel af løkken.<br />

5.2 DSP evaluation board<br />

Boardet som vi vil arbejde med er et Analog ADSP-21369 developers kit. Ved at implementere<br />

filteret på et eksternt DSP board er det muligt at <strong>brug</strong>e det uanset lydkilde. Man kan<br />

<strong>for</strong> eksempel tilslutte en FM-radio, CD/DVD-afspiller eller en computer. Boardet har en<br />

stereo analog indgang, en coaxial SPDIF indgang samt fire analoge stereo udgange og en<br />

coaxial SPDIF udgang.<br />

66<br />

Figur 5-6: Analog Devices ADSP-21369 developer’s kit<br />

Til at <strong>for</strong>etage beregningen af IIR-filterets output og filterkoefficienter er boardet udstyret<br />

med en 32-bit, 400 MHz SHARC DSP-processor med 256 kilobyte SRAM. Til <strong>for</strong>skel fra<br />

mange andre DSP’er er processoren på boardet i stand til at arbejde med decimaltal, hvilket<br />

betyder, at koden fra Foobar2000 relativt let kan føres over på boardet. På grund af<br />

boardets høje hastighed kan et 2. ordens IIR-filters output beregnes på 5 ns.<br />

I modsætning til Foobar2000 DSP-modulet er der ingen grafisk <strong>brug</strong>ergrænseflade, hvor<br />

man kan justere de <strong>for</strong>skellige parametre. I stedet er boardet udstyret med fire knapper og<br />

otte lysdioder, som kan be<strong>ny</strong>ttes til at <strong>for</strong>etage og vise indstillinger.


Implementering<br />

Grundlæggende fungerer boardet på samme måde som Foobar2000 ved at behandle en<br />

lydblok ad gangen. På DSP’en består en lydblok af 384-1024 samples, alt efter om man<br />

be<strong>ny</strong>tter digital eller analog lyd. Først allokeres fire blokke af hukommelse, som hver har<br />

plads til en halv chunk, <strong>for</strong> at opdele den oprindelige chunk i de to lydkanaler. Der refereres<br />

til hukommelsesblokkene med pointerne audio_pointer[0] (venstre) og au-<br />

dio_pointer[1] (højre) samt audio_buffer[0] og audio_buffer[1]. Her gemmes al<br />

lyden der behandles midlertidigt. Efterfølgende sættes boardet i en uendelig løkke, hvori<br />

funktionen processBlock behandler lydsignalerne, som sendes ind i boardet.<br />

Sampleværdierne gemmes i 32-bit heltal. Lydsamples har på boardet en opløsning på 24bit,<br />

så de 8 øverste bits be<strong>ny</strong>ttes ikke til noget. Bit nummer 23 bestemmer, hvorvidt der er<br />

tale om et negativt tal. For at kunne arbejde med tallet, laves det først om til 2komplementær<strong>for</strong>m<br />

ved at sætte alle bits til venstre <strong>for</strong> nummer 23 lig værdien af bit<br />

nummer 23. Herefter laves heltallet om til decimaltal, som gemmes i audio_pointer[0]<br />

(venstre) og audio_pointer[1] (højre). Idet boardet be<strong>ny</strong>tter 24-bit til at gemme værdien<br />

af lydsamples, vil de kunne antage værdier i intervallet -8388608 til +8388607. For at<br />

få tilsvarende sampleværdier som i Foobar2000 kan man der<strong>for</strong> dividere med 2 23<br />

For at behandle indkommen lyd og tryk på de <strong>for</strong>skellige knapper be<strong>ny</strong>tter boardet interrupts.<br />

Et interrupt gør, at uanset hvad et program i DSP’en er i gang med, så vil programmet<br />

blive afviklet, hvis det er tilk<strong>ny</strong>ttet et interrupt. Det er meget praktisk, da man dermed<br />

får mulighed <strong>for</strong> at afbryde hovedprogramkoden midlertidigt, afvikle en anden kort programkode<br />

og derefter <strong>for</strong>tsætte med hovedprogramkoden. De små programmer tilk<strong>ny</strong>ttet<br />

interrupts kaldes <strong>for</strong> Interrupt Service Rutiner (ISR).<br />

De fire ISR’er som boardet be<strong>ny</strong>tter sig af er TalkThroughISR, IRQ0ISR, IRQ1ISR og<br />

DAIISR. Når man trykker på knappen PB1, så afvikles IRQ1ISR. Trykker man på PB2, så<br />

afvikles IRQ0ISR. De sidste to knapper har ikke selvstændige ISR’er, men registreres beg-<br />

ge af DAIISR. Den sidste ISR er TalkThroughISR, der står <strong>for</strong> I/O af lyd gennem boardet.<br />

Boardet understøtter lyd I/O gennem analog eller digital indgangene. Det der bestemmer,<br />

om boardet arbejder med analog eller digital I/O, er boardets SRU. SRU står <strong>for</strong> Signal<br />

Routing Unit, og den bestemmer hvilke signaler der sendes hvorhen. SRU’en indstiller<br />

desuden, hvordan knapper og LED’er er <strong>for</strong>bundet til resten af boardet, så dette indstilles<br />

samtidig med, at boardet konfigureres til digital eller analog lyd.<br />

De fire knapper be<strong>ny</strong>ttes i samspil med de otte lysdioder til at indstille boardet. Ved at<br />

trykke på PB1 og PB2 skiftes tilstand til henholdsvis højre eller venstre. Ved at trykke på<br />

PB3 deaktiveres funktionen, eller parameteren reduceres. PB4 aktiverer eller <strong>for</strong>øger pa-<br />

rameteren.<br />

67


Implementering<br />

68<br />

Knapper<br />

PB1 PB2 PB3 PB4<br />

Lysdioder<br />

LED1 LED2 LED3 LED4 LED5 LED6 LED7 LED8<br />

Figur 5-7: Oversigt over knapper og lysdioder<br />

Alt efter hvilken lysdiode der lyser, kan man vælge at konfigurere en given parameter, jf.<br />

tabellen neden<strong>for</strong>:<br />

Tilstand Funktion Mængde Fra Til Standardværdi<br />

Equalizer Off/ On Off On Off<br />

Mekanisk beskyttelse Off / On Off On Off<br />

Automatisk pregain Off / On Off On On<br />

Original knækfrekvens - 2 Hz / + 2 Hz 10 Hz 254 Hz 170 Hz<br />

Ønsket knækfrekvens - 2 Hz / + 2 Hz 10 Hz 254 Hz 40 Hz<br />

Mekanisk<br />

gain/excursion<br />

Pre-gain<br />

- 0,2x / + 0,2x 1,0x 25,4x 10,0x<br />

- 0,4 dB / + 0,4<br />

dB<br />

Figur 5-8: Oversigt over mulige indstillinger<br />

0,0 dB -51 dB -25.2 dB<br />

Som det kan ses, er hver tilstand <strong>for</strong>bundet med en funktion/parameter. Her er angivet<br />

mængden som indstilles ved et enkelt tryk, samt i hvilket interval det er muligt at justere.<br />

Når en af de tre første indstillinger aktiveres, tændes lysdioderne gradvist, <strong>for</strong> at indikere<br />

indstillingen aktiveres. Omvendt slukkes lysdioderne gradvist, når en indstilling deaktiveres.<br />

Idet der kun er 7 lysdioder (kan repræsentere værdier op til 127), som kan be<strong>ny</strong>ttes<br />

til at vise parameterindstillingen, vises den halve værdi <strong>for</strong> knækfrekvenserne, i binær<br />

repræsentation. Er knækfrekvensen indstillet til 40 Hz, vil lysdiode 3 og 5 tændes, der<br />

binært indikerer 20. Den mekaniske <strong>for</strong>stærkning vil binært vise værdien 50, når den er<br />

sat til <strong>for</strong>stærkningen 10,0x, da et enkelt trin er på 0,2x. Det nødvendige Pre-gain kan indstilles<br />

med en nøjagtighed på 0,4 dB, hvor lysdioderne viser værdien i hele dB.


2.5.1 DSP evaluation board kode<br />

Implementering<br />

DSP’en er programmet i programmeringssproget C ved hjælp af det medfølgende programmeringsværktøj<br />

Analog Devices VisualDSP++ 5.0. VisualDSP-projektet indeholdende<br />

alt kildekoden er inkluderet på CD’en, og den relevante kode er desuden givet i appendiks<br />

B.<br />

Overordnet består koden af følgende del-filer:<br />

main.c<br />

Irqprocess.c<br />

initSRU.c<br />

initSPORT.c<br />

initSPDIF.c<br />

initPBLED.c<br />

initPLL_SDRAM.c<br />

blockProcess.c<br />

SPORTisr.c<br />

tt.h<br />

Hovedfilen main.c indeholder alle de globale variable, der udveksles mellem de <strong>for</strong>skelli-<br />

ge dele af programmet. Funktionen main, der afvikles automatisk når programmet startes,<br />

begynder med at initialisere de <strong>for</strong>skellige komponenter på boardet og indstille<br />

SRU’en og SPORT’e, så signaler kan modtages og bearbejdes i DSP’en. Derefter aktiveres de<br />

interrupts, der gør at lyd I/O og knapperne fungerer. Som midlertidige buffere til at gemme<br />

lydsignalet i decimaltal, allokeres hukommelsesområder svarende til en halv chunk,<br />

indeholdende doubles <strong>for</strong> hver af pointerne audio_pointer[0], audio_pointer[1],<br />

audio_buffer[0] og audio_buffer[1]. I projektindstillingerne <strong>for</strong> projektet kan man<br />

definere, hvor stor præcision typen double har. Hvor de i Foobar2000 som standard har<br />

64-bit præcision, be<strong>ny</strong>tter boardet som standard 32-bit. Af hastigheds- og stabilitetsårsager<br />

har vi valgt at <strong>brug</strong>e 32-bit. Efter bufferne er initieret, starter den uendelige løkke, der<br />

sørger <strong>for</strong>, at funktionen processBlock konstant modtager en <strong>ny</strong> blok at arbejde med.<br />

Løkken gentages <strong>for</strong> hver 384 samples, så med CD-lyd gentages løkken 229 gange i sekundet.<br />

For at have mulighed <strong>for</strong> kortvarigt at vise anden in<strong>for</strong>mation end hvilken tilstand<br />

boardet er i, er en nedtællingsløkke <strong>for</strong> g_led_counter indbygget i den uendelige løkke.<br />

Indtil g_led_counter er nået nul, kan en anden lysdiodekonfiguration fremvises. Idet<br />

g_led_counter tælles ned med 1, <strong>for</strong> hver gang løkken afvikles, svarer en værdi på 229<br />

til 1 sekunds pause.<br />

Irqprocess.c indeholder flere <strong>for</strong>skellige funktioner. SetupIRQ01 funktionen sørger<br />

<strong>for</strong>, at IRQ0 og IRQ1 aktiveres. Når <strong>brug</strong>eren trykker på en af knapperne, bliver en af de tre<br />

ISR-funktioner kaldt. Irq1ISR- og IRQ0ISR-funktionerne bliver kaldt, når <strong>brug</strong>eren tryk-<br />

ker på PB1 eller PB2. Disse knapper ændrer begge på den globale variabel<br />

g_current_setting, der betegner hvilken tilstand, som boardet er i. DAIISR-funktionen<br />

69


Implementering<br />

kaldes, når man trykker på PB3 eller PB4. Disse knapper <strong>brug</strong>es til at redigere parameteren<br />

hørende til den nuværende tilstand. For at ændre på parameteren be<strong>ny</strong>ttes en<br />

switch(g_current_setting), med cases tilsvarende den ønskede parameterændring.<br />

Til at styre hvilke lysdioder der skal tændes, be<strong>ny</strong>ttes funktionerne Activate_LED og<br />

Activate_LED_Bank. Hovedfunktionen Activate_LED indstiller SRU’en og sætter flags,<br />

så lysdioderne tændes, og ved hjælp af ClearAll_LED funktionen kan de alle slukkes igen.<br />

Til at vise om en On/Off funktion slås til eller fra, be<strong>ny</strong>ttes funktionen LED_BAR, der kaldes<br />

i hovedfunktionen, hvis g_led_counter antager en værdi over 400. Defineres værdien af<br />

g_led_counter til 7200, vil LED_BAR funktionen gradvist slukke lysdioderne, <strong>for</strong> at give<br />

effekten af at noget deaktiveres. Be<strong>ny</strong>ttes i stedet værdien 3600, så vil LED_BAR funktionen<br />

gradvist tænde lysdioderne.<br />

initSRU.c indeholder funktionen InitSRU, der er ansvarlig <strong>for</strong> at indstille SRU’en, når<br />

boardets hovedprogram starter. Her <strong>for</strong>bindes de <strong>for</strong>skellige indgange og udgange, og ben<br />

sættes henholdsvis høje og lave.<br />

initSPORT.c har funktionen InitSPORT, der konfigurerer SPORT’ene på boardet, hvilket<br />

er de <strong>for</strong>skellige kommunikationskanaler, som boardet be<strong>ny</strong>tter. De anvendes til at <strong>for</strong>binde<br />

SPDIF receiver og transmitter med DSP-processoren, så lyd I/O kan <strong>for</strong>egå.<br />

initSPDIF.c har funktionen initSPDIF, hvis eneste opgave er at indstille SPDIF-<br />

interfacet.<br />

initPBLED.c indeholder funktionen initPBLED, der sørger <strong>for</strong> at indstille SRU’en, så de<br />

fire knapper og lysdioderne kommer til at fungere.<br />

initPLL_SDRAM.c indeholder en funktion InitPLL, der sørger <strong>for</strong>, at klokgeneratoren og<br />

hukommelsen på boardet bliver initialiseret, så de kan <strong>brug</strong>es af boardet.<br />

SPORTisr.c har ISR funktionen TalkThroughISR, der sørger <strong>for</strong>, at lyd I/O fungerer.<br />

Den indeholder også variable tilhørende de <strong>for</strong>skellige pointere, der refererer til adresser i<br />

hukommelsen, indeholdende lyd.<br />

blockProcess.c er den fil, der indeholder den beregningsmæssige del af lydbehandlin-<br />

gen svarende til Foobar2000’s dsp_loudspeakereq klasse. Funktionen indeholder filterkoefficienter<br />

samt tidligere sampleværdier defineret gennem <strong>for</strong>skellige arrays. C-filen<br />

indeholder de to funktioner calculate_coefficients og processBlock, der svarer til<br />

Foobar2000’s on_chunk funktion.<br />

Funktionen processBlock får adresserne til input lydsignalet som input. De er defineret<br />

via en pointer kaldet block_ptr samt to pointers til de to allokerede hukommelsesområ-<br />

der, som blev defineret i main og kaldt audio_ptr og audio_buffer. Input lydsignalet er<br />

70


Implementering<br />

defineret som et heltal, så noget af det første funktionen gør, er at konvertere lydsignalet<br />

fra heltals-<strong>for</strong>mat til decimaltals-<strong>for</strong>mat. Her be<strong>ny</strong>ttes audio_buffer til at lagre inputlydsignalet<br />

i decimaltals <strong>for</strong>mat. I tilfælde af at outputsignalet skal beregnes på <strong>ny</strong> grundet<br />

den mekaniske beskyttelse, gemmes de sidste samples fra den tidligere behandlede blok i<br />

tre arrays nøjagtigt som i Foobar2000 implementeringen. Hvis filterkoefficienterne har<br />

ændret sig, eller endnu ikke er udregnet, vil de i starten af processBlock funktionen<br />

blive beregnet.<br />

Selve filterberegningen <strong>for</strong>etages i while-løkken. Her kan outputtet beregnes flere gange i<br />

tilfælde af, at den mekaniske beskyttelse kræver det. Ellers er løkken meget lig den i Foobar2000<br />

implementeringen, idet hovedløkken køres én gang per sample, og underløkken<br />

kører <strong>for</strong> venstre og højre kanal. Ved nærmere tests viste det sig, at hovedløkken højest<br />

kan gentages 16 gange, ellers crasher boardet. Dette kan skyldes, at boardet ikke er tilstrækkeligt<br />

hurtigt til at bearbejde chunken, inden der er en <strong>ny</strong> chunk klar, og dermed går<br />

ned.<br />

For at undersøge om den mekaniske beskyttelse skal slås til, udregnes filteroutputtet <strong>for</strong><br />

det mekaniske udsving. Samtidig gemmes den maksimale værdi filteret støder på. Hvis<br />

denne værdi multipliceret med den definerede mekaniske <strong>for</strong>stærkning overskrider grænseværdien,<br />

betyder det, at der er <strong>for</strong> meget bas i lydsignalet. Herefter øges knækfrekvensen<br />

ved at øge fcnew_offset, og <strong>ny</strong>e filterkoefficienter beregnes. I tilfældet hvor der ikke<br />

er <strong>for</strong> meget bas, sættes variablen calculateBlock til at være falsk, hvilket får programmet<br />

til at hoppe ud af while-løkken.<br />

Til sidst i processBlock funktionen konverteres sampleværdierne tilbage fra decimaltal<br />

til heltals<strong>for</strong>mat, som boardets I/O be<strong>ny</strong>tter.<br />

Funktionen calculate_coefficients er stort set identisk med funktionen i Foo-<br />

bar2000 med den væsentlige <strong>for</strong>skel, at det eneste input er fcnew_offset. Resten af pa-<br />

rametrene hentes fra globale variable defineret <strong>for</strong> funktionerne i blockProcess.c.<br />

tt.h er headerfilen, der indeholder funktionsprototyper, så funktionerne kan be<strong>ny</strong>ttes på<br />

tværs af programmet. Det er vigtigt <strong>for</strong> blandt andet at kunne vise in<strong>for</strong>mation på lysdioderne.<br />

Desuden indeholder headerfilen nogle globale variable be<strong>ny</strong>ttet internt i programmet.<br />

71


Implementering<br />

72


6<br />

TEST<br />

Nu hvor filter og mekanisk beskyttelse er blevet implementeret, er det nærliggende at<br />

teste, hvorledes det færdige resultat lyder. Her vil vi be<strong>ny</strong>tte en specifik højttaler, og teste<br />

hvorledes filteret virker på denne. I teoriafsnittet omkring højttalere udledte vi overføringsfunktioner<br />

<strong>for</strong> henholdsvis tryk og mekanisk udsving ved at modellere højttaleren<br />

som et mekanisk og akustisk system. I overføringsfunktionerne indgår parametrene ωc og<br />

QTC, som beskriver den modellerede højttalerenhed. Disse parametre er nødvendige at<br />

kende, og deres præcision har indflydelse på det designede filter og den mekaniske beskyttelse.<br />

QTC og ωc kan beregnes ud fra QTS og ωs, som kan findes i datablade tilegnet den<br />

enkelte højttalerenhed, men det er også muligt at bestemme dem ved <strong>brug</strong> af specielt måleudstyr.<br />

I dette afsnit vil vi der<strong>for</strong> <strong>for</strong>etage målinger på vores valgte højttaler og derved<br />

bestemme resonansfrekvensen ωc og den totale Q-faktor QTC. Herefter afprøves og testes<br />

filteret ud fra en personlig vurdering.<br />

6.1 Bestemmelse af parametre<br />

Det tyske selskab Klippel GmbH arbejder med akustik, ulineær systemteori og digital signalbehandling<br />

og producerer måleapparatur til højttalere. Det anvendte måleapparat består<br />

af en laser, som udfører målinger af membranens mekaniske vibration og geometri,<br />

samt tilhørende software og hardware. Når de opnåede data er bearbejdet, kan man efterfølgende<br />

se en lang liste over målte og udregnede parametre som vist i appendiks C. Derudover<br />

har man adgang til en lang række grafer som <strong>for</strong> eksempel strømspektret og<br />

spændingsspektret over terminalerne, samt størrelsen af den elektriske impedans og<br />

svingspolens udsving.<br />

Resonansfrekvens kan direkte aflæses ud fra listen i appendiks C, men den kan også bestemmes<br />

af grafen på Figur 6-1. Her kan den aflæses som den frekvens, hvor den elektriske<br />

impedans topper. Det vil altså sige ved omkring 170 Hz.<br />

Test<br />

73


Test<br />

74<br />

Figur 6-1: Størrelse af elektrisk impedans som funktion af frekvensen<br />

Her er den sorte kurve optegnet på baggrund af de målte værdi, mens den røde kurve er<br />

en tilnærmet funktion udregnet af programmet. Det er også muligt at bestemme højttalerens<br />

nedre 3 dB knækfrekvens. Dette gøres ved at be<strong>ny</strong>tte værdierne <strong>for</strong> svingspolens<br />

udsving som funktion af frekvensen. Værdierne er tilgængelige i <strong>for</strong>m af en lang liste, og<br />

den tilhørende graf er vist på Figur 6-2. Fra ligning (2.27) kan det ses, hvorledes trykket p<br />

er proportionalt med membranens acceleration, da accelerationen netop svarer til den<br />

dobbeltafledte af membranens udsving x D , det vil sige<br />

2<br />

xDs .<br />

Figur 6-2: Svingspolens udsving som funktion af frekvensen


Værdierne som udgør ovenstående graf gemmes nu som en lang liste i et Excel ark. Her<br />

multipliceres hvert membranudsving med den tilhørende frekvens i anden potens, og resultaterne<br />

plottes som funktion af frekvensen (Figur 6-3). Grafen illustrerer membranens<br />

acceleration over det opgivne frekvensbånd.<br />

Figur 6-3: Membranens acceleration som funktion af frekvensen<br />

Test<br />

Betragtes en <strong>linie</strong>, som løber igennem alle de lokale toppunkter, så er denne graf<br />

porportional med amplituderesponset <strong>for</strong> den modellerede overføringsfunktion <strong>for</strong><br />

trykket. Der er altså kun en skaleringsfaktor til <strong>for</strong>skel, og man kan der<strong>for</strong> direkte aflæse<br />

højttalerens nedre 3 dB knækfrekvens. Det kan dog være <strong>for</strong>holdsvis vanskeligt hvis man<br />

ønsker en nøjagtig værdi, så vi har blot udregnet den ud fra værdierne i Excel. Den nedre<br />

3 dB knækfrekvens blev udregnet til 165 Hz. Den be<strong>ny</strong>ttes ikke direkte til at modellere<br />

højttaleren, men det er en værdi der anvendes, når man angiver hvor dybt en højttaler kan<br />

spille. Ovenstående ekspempel er altså blot <strong>for</strong> at illustrere, hvorledes målingerne og<br />

graferne kan be<strong>ny</strong>ttes til at bestemme den testede højtalers parametre.<br />

Den anden parameter, som det er nødvendigt at kende <strong>for</strong> at modellere højttaleren, er QTC.<br />

Denne værdi kan også direkte aflæses af appendiks C til 0,762. Da QTC 0,707 , så skal den<br />

nedre 3 dB knækfrekvensen være mindre end resonansfrekvensen, hvilket også er tilfældet.<br />

Med de målte værdier <strong>for</strong> den testede højttaler er det nu tid til at afprøve filteret.<br />

75


Test<br />

6.2 Afprøvning<br />

Dette under vil udelukkende tage sit udgangspunkt i en personlig vurdering af filterets<br />

effekt på den afspillede musik. Den umiddelbare virkning er illustreret af de <strong>for</strong>skellige<br />

grafer i afsnittet der omhandler filterdesign<br />

Den testede højttaler består af en enkelt højttalerenhed på 5,25”, monteret i et kabinet<br />

med indre mål 17x18x10 cm, hvilket svarer til et rumfang på omkring 3L. På nedenstående<br />

figur ses en stereoopsætning <strong>for</strong> den testede højtaler.<br />

76<br />

Figur 6-4: Testede højttalere<br />

Højtalerne er <strong>for</strong>bundet til en Texas Instruments TAS5182 klasse-D <strong>for</strong>stærker, der be<strong>ny</strong>tter<br />

digitalt inputsignal.<br />

Ved aktivering af equalizerfilteret, indstillet så højttalerens knækfrekvens sænkes til 40<br />

Hz, er det markant at højtalernes basgengivelse drastisk <strong>for</strong>bedres. Højttaleren får en mere<br />

behagelig bund, som ellers manglede før. Equalizerfilterets effekt <strong>for</strong>nemmes bedst,<br />

hvis man aktiverer det samtidig med, at der afspilles musik. Her er det tydeligt, hvorledes<br />

alle de dybe frekvenser bliver fremhævet, mens de lysere frekvenser <strong>for</strong>bliver uændrede.<br />

Dette illustrerer netop den grundlæggende idé bag filteret, hvis design bestod i at sænke<br />

knækfrekvensen <strong>for</strong> det modellerede amplituderespons uden at <strong>for</strong>stærke de øvre frekvenser.<br />

Kigger man nærmere på højttaleren, så ses det tydeligt, hvordan højttalermembranen<br />

bevæger sig langt mere, når equalizerfilteret er aktiveret. Ved samtidig aktivering<br />

af det mekaniske beskyttelsesfilter, kan man ved <strong>for</strong>øgelse af den mekaniske <strong>for</strong>stærkning<br />

observere, hvordan membranudsvinget begrænses. Jo mere filteret beskytter, desto mere<br />

begynder højttaleren at lyde, som den oprindeligt gør uden equalizerfilter.


Test<br />

Sænkes knækfrekvensen yderligere en oktav, med den resulterende sænkning af <strong>for</strong><strong>for</strong>stærkningen,<br />

bliver signalniveauet meget lavt. Så selvom det er muligt at sænke knækfrekvensen<br />

med helt ned til 10 Hz, er det ikke nødvendigvis at <strong>for</strong>etrække, idet signalniveauet<br />

dæmpes betydeligt <strong>for</strong> at beskytte højttaleren.<br />

Indstilles Q TC<strong>ny</strong> så systemet bliver lettere underdæmpet eller overdæmpet, er det svært at<br />

høre en ændring i musikken. Ved kraftig underdæmpning kan man godt høre, hvordan<br />

nogle af de lave frekvenser <strong>for</strong>stærkes, men det er svært at afgøre, om basgengivelsen <strong>for</strong>bedres.<br />

Ved kraftig overdæmpning lyder det som om, at knækfrekvensen <strong>for</strong>øges.<br />

Ved test af equalizerfilter og højttaler afspillede vi et vilkårligt musiknummer, <strong>for</strong> at bestemme<br />

hvilket lydtryk der maksimalt kan afspilles med, uden at højttaleren lider mekanisk<br />

overlast. Ved hjælp af et Brüel & Kjær 2250 SPL-meter kan gennemsnitslydtrykket<br />

LAeq bestemmes. For at undgå refleksioner fra rummet er LAeq målt 10 cm fra højtalerenheden.<br />

Henover 1 minut er LAeq målt til 93 dB. Idet trykket er inverst proportionalt<br />

med afstanden, vil en tidobling af afstanden reducere lydtrykket med en faktor 10. Først<br />

omregnes fra dB til Pa.<br />

1 0<br />

Laeq<br />

93<br />

20 20<br />

p p 10 0,00002 Pa10 0.89 Pa<br />

( 6.85)<br />

Det resulterende lydtryk i 1 meters afstand er da:<br />

L<br />

p<br />

p 2 p1/10<br />

0,09 Pa <br />

20 log10 20 log10 20 log10 73 dB<br />

p0 p<br />

<br />

0<br />

0,00002 Pa<br />

<br />

<br />

( 6.86)<br />

Ved at be<strong>ny</strong>tte en stereoopsætning <strong>for</strong>øges lydtrykket med 6 dB, hvilket giver et gennemsnitslydtryk<br />

på 79 dB. Det er altså hvad de testede højttalere kan præstere, når knækfrekvensen<br />

sænkes fra 170 Hz til 40 Hz, og man ønsker at undgå mekaniske skader på enhederne.<br />

Sænkningen af lydniveauet er altså en konsekvens af den bedre basgengivelse, men<br />

dette bliver stærkt opvejet af den <strong>for</strong>bedrede lydkvalitet set i vores øjne. Man skal dog ikke<br />

<strong>for</strong>vente, at højtaleren kan gengive musik ved festniveauer, samtidigt med at knækfrekvensen<br />

reduceres med to oktaver.<br />

77


7<br />

KONKLUSION<br />

7.1 Resultater<br />

I denne opgave har vi ved <strong>brug</strong> af digital signalbehandling designet et digitalt filter, som<br />

<strong>for</strong>etager adaptiv korrektion af de lave frekvenser. Filteret blev designet på baggrund af<br />

højttalerens lavfrekvente amplituderespons. Vi fandt frem til, hvorledes dette amplituderespons<br />

kunne udledes ved at modellere højttaleren, og på den måde betragte akustiske og<br />

mekaniske variable som værende kredsløbselementer. Ved at designe filteret som en<br />

sammensætning af højttalerens inverterede amplituderespons samt et højpas-filter, kan<br />

man <strong>for</strong>stærke frekvenserne under højttalerens resonansfrekvens uden at påvirker de<br />

øvre frekvenser. Dette er en <strong>for</strong>nuftig måde, hvorved man kan kompensere <strong>for</strong> højttalerens<br />

reducerede lavfrekvente gengivelse, da det blot svarer til at <strong>for</strong>skyde knækfrekvensen,<br />

og derved få højttaleren til at lyde som en større model. Equalizerfilteret blev designet<br />

som et analogt filter, og derefter trans<strong>for</strong>meret til et digitalt rekursivt filter ved hjælp af<br />

den bilineære trans<strong>for</strong>mation. Derudover fik vi fremstillet en beskyttelsesalgoritme, der<br />

tog højde <strong>for</strong> højttalerens mekaniske begrænsning. Den blev implementeret ved, at man<br />

under hele filtreringen overvågede det mekaniske udsving, og justerede på den ønskede<br />

knækfrekvens, hvis udsvinget skulle overstige det maksimalt tilladte. Både equalizerfilteret<br />

og filteret <strong>for</strong> det mekaniske udsving blev implementeret i Foobar2000 og på DSP evaluation<br />

boardet i programmeringssprogene C og C++. Fælles <strong>for</strong> begge implementeringer<br />

er, at de filtrerer lyden i blokke, som muliggør, at filterparametrene kan ændres mens musikken<br />

spiller.<br />

7.2 Perspektiver<br />

Set i et større perspektiv, så kunne man <strong>for</strong>stille sig, at et sådan equalizerfilter og tilhørende<br />

mekaniske beskyttelse kunne implementeres direkte i små højttalere. Dog er der mange<br />

komplikationer <strong>for</strong>bundet med en sådan implementering. Et generelt krav fra <strong>for</strong><strong>brug</strong>ernes<br />

side er, at deres <strong>ny</strong>investerede højttalere skal kunne spille højt og i lang tid. Når<br />

producenterne producerer højttalere er det med dette krav i baghovedet, så en højttaler<br />

der lyder godt, men kun kan spille ved lave lydniveauer, er ikke at <strong>for</strong>etrække. Skulle equalizerfilteret<br />

implementeres direkte i små højtalere, skulle <strong>ny</strong>ttegraden <strong>for</strong>bedres på baggrund<br />

af den termiske beskyttelse, og spolevandringen skulle øges <strong>for</strong> et større membranudsving.<br />

Først her ville en lille højttaler kunne gøre <strong>brug</strong> af equalizerfilteret og samtidig<br />

spille tilstrækkelig højt. Nyttegraden kan <strong>for</strong>bedres ved at <strong>brug</strong>e en kraftigere permanent<br />

79


Konklusion<br />

magnet og gøre svingspolen kortere og lettere. Men dette introducerer mere <strong>for</strong>vrængning<br />

af lyden. Vores filter er designet ud fra en lineær model og tager der<strong>for</strong> ikke højde <strong>for</strong> sådanne<br />

ulineariteter. Det ville der<strong>for</strong> være nødvendigt at introducere yderligere digital signalbehandling<br />

<strong>for</strong> at korrigere lyden. Hvis vores designede equalizerfilter skulle have nogen<br />

anvendelighed, ville det nok kræve, at højttaleren blev designet til <strong>for</strong>målet, og vores<br />

filter blev designet til også at tage højde <strong>for</strong> ulineariteter.<br />

7.3 Videre arbejde<br />

Projektet er afgrænset til ikke at indeholde nogen <strong>for</strong>m <strong>for</strong> termisk beskyttelse. En måde at<br />

implementere den termiske beskyttelse på, er ved at måle højttalerenhedens DC modstand,<br />

som stiger når højttaleren bliver varm. DSP-boardet er i stand til at måle spændingsniveauer<br />

på de analoge indgange. Så ved at be<strong>ny</strong>tte et passende ekstrakredsløb, der<br />

omsætter modstanden til en spænding, ville den termiske beskyttelse kunne implementeres<br />

på DSP-boardet. Ligeledes skulle der fremstilles en beskyttelsesalgoritme, som kunne<br />

ændre på den ønskede knækfrekvens eller lydniveauet, hvis højttalerenheden skulle blive<br />

<strong>for</strong> varm.<br />

Projektet har udelukkende beskæftiget sig med modellering og korrektion af lukketkabinet<br />

højttalere, der ud fra få parametre kan modelleres. En videreudvikling af filteret<br />

kunne være, at be<strong>ny</strong>tte et passende antal ekstra parametre, så de to implementeringer<br />

kunne udvides til, også at omfatte korrektion og beskyttelse af basrefleks højttalere. Det<br />

lavfrekvente amplituderespons <strong>for</strong> en basrefleks højttaler er nemlig givet ved en 4. ordens<br />

overføringsfunktion til <strong>for</strong>skel fra vores 2. ordens filter.<br />

Den mekaniske beskyttelsesalgoritme kan <strong>for</strong>bedres ved, at man først identificerer hvilke<br />

problematiske frekvenser i signalet, der giver anledning til mekanisk overbelastning. De<br />

problematiske frekvenser kan identificeres ved at lave en Fourier trans<strong>for</strong>mation af signalet.<br />

Herefter har man bedre kendskab til, hvordan knækfrekvensen kan justeres, så mekanisk<br />

overbelastning undgås.<br />

Som udledt i implementeringsafsnittet, så bestemmes den nødvendige <strong>for</strong><strong>for</strong>stærkning ud<br />

fra den ønskede knækfrekvens’ placering i <strong>for</strong>hold til den originale. Man justerer altså på<br />

den ønskede knækfrekvens, og så indstilles <strong>for</strong><strong>for</strong>stærkningen derefter. Et alternativ ville<br />

være at be<strong>ny</strong>tte <strong>for</strong><strong>for</strong>stærkningen som volumenkontrol, så når man indstiller på volumenkontrollen,<br />

vil knækfrekvensen justere sig herefter. På den måde vil man altid spille så<br />

dybt som muligt til et givet lydniveau.<br />

En anden modifikation, som kan <strong>for</strong>bedre den måde bassen opleves på, er at implementere<br />

en adaptiv baskorrektion med henblik på, at basniveauet <strong>for</strong>øges ved lav lydstyrke. I ISO<br />

226 beskrives, hvordan det menneskelige øre opfatter intensiteten af lyd ved <strong>for</strong>skellige<br />

frekvenser. De kurver der beskriver, hvad øret opfatter som ens intensitet, kaldes equalloudness<br />

kurver og kan ses på Figur 7-1 neden<strong>for</strong>.<br />

80


Figur 7-1: Equal-loudness kurver<br />

Konklusion<br />

Det ses tydeligt, at der er stor <strong>for</strong>skel på, hvordan man oplever niveauet af bas, alt efter om<br />

man lytter til svag musik eller kraftig musik. Dette har givet anledning til, at mange musikanlæg<br />

er udstyret med en simpel loudness knap, som kan <strong>brug</strong>es til at <strong>for</strong>øge niveauet af<br />

lave frekvenser. Men denne loudness knap <strong>for</strong>stærker de lave frekvenser ens uanset volumenindstillingen.<br />

Vores filter kunne modificeres til, at tilføre ekstra bas svarende til en<br />

given volumenindstilling.<br />

81


REFERENCER<br />

[1] W. Marshall Leach, Jr., Introduction to Electroacoustics and Audio Amplifier Design,<br />

Kendall/Hunt, third edition, 2003.<br />

[2] Udo Zölzer, Digital Audio Signal Processing, John Wiley & Sons Ltd, second edition,<br />

2008, chapter 5.<br />

[3] Steven W. Smith, The Scientist and Engineer's Guide to Digital Signal Processing,<br />

free to download at www.dspguide.com.<br />

[4] B.P Lathi, Signal Processing & Linear Systems, Berkeley Cambridge Press, first<br />

edition, 1998.<br />

[5] Homepage: http://www.audioholics.com/education/loudspeakerbasics/loudspeaker-power-ratings/loudspeaker-power-handling.<br />

Hentet den 17. juni 2009.<br />

[6] Homepage: http://hyperphysics.phy-astr.gsu.edu/hbase/audio/spk.html.<br />

Hentet den 17. juni 2009<br />

83


A<br />

KILDEKODE FOR DSP-MODUL TIL FOOBAR2000<br />

#include "../SDK/foobar2000.h"<br />

#include "../helpers/helpers.h"<br />

#include "resource.h"<br />

#define M_PI 3.14159265358979323846<br />

// Number of parameters saved in presets<br />

#define NUMBEROFPARMS 10<br />

/**********************************<br />

Loudspeaker equalization plugin<br />

**********************************/<br />

DECLARE_COMPONENT_VERSION(<br />

"Loudspeaker Equalizer",<br />

"1.0.1",<br />

"Coded by Martin Werner & Esben <strong>Barnkob</strong>"<br />

"Based on DSP Tutorial <strong>for</strong> foobar2000 0.9.5\n"<br />

"Written by Holger Stenger\n"<br />

"Derived from foo_dsp_delta with kind permission from Marc Heubeck."<br />

);<br />

// Here all settings related to the GUI is stored, and it includes function<br />

<strong>for</strong> saving and loading presets<br />

struct t_dsp_loudspeakereq_params {<br />

// Settings stored in presets<br />

t_int32 m_eq_activated, m_mp_activated, m_fc, m_fcnew, m_q_tc, m_q_tcnew;<br />

t_int32 m_auto_pregain, m_pregain_db, m_mp_gain;<br />

// The constructor sets the default values.<br />

t_dsp_loudspeakereq_params(t_int32 p_eq_activated = 0, t_int32<br />

p_mp_activated = 0,<br />

t_int32 p_fc = 60, t_int32 p_fcnew = 30,<br />

t_int32 p_q_tc = (t_int32)(1000*1/sqrt(2.0)),<br />

t_int32 p_q_tcnew = (t_int32)(1000*1/sqrt(2.0)),<br />

t_int32 p_auto_pregain = 1, t_int32 p_pregain = 120,<br />

t_int32 p_mp_gain = 100) :<br />

m_eq_activated(p_eq_activated),<br />

m_mp_activated(p_mp_activated),<br />

m_fc(p_fc), m_fcnew(p_fcnew), m_q_tc(p_q_tc),<br />

m_q_tcnew(p_q_tcnew),<br />

m_auto_pregain(p_auto_pregain), m_pregain_db(p_pregain),<br />

m_mp_gain(p_mp_gain) {<br />

}<br />

// The GUID that identifies this DSP and its configuration.<br />

static const GUID &g_get_guid() {<br />

static const GUID guid = { 0xae6fd06e, 0xa868, 0x43b2, { 0xac, 0x39,<br />

0x5b, 0x49, 0xcc, 0x81, 0x3a, 0x69 } };<br />

return guid;<br />

}<br />

// Read data from a preset.<br />

85


Kildekode <strong>for</strong> DSP-modul til foobar2000<br />

86<br />

bool set_data(const dsp_preset & p_data) {<br />

t_int32 temp[NUMBEROFPARMS];<br />

if (p_data.get_owner() != g_get_guid())<br />

return false;<br />

if (p_data.get_data_size() != (NUMBEROFPARMS*sizeof(t_int32)))<br />

return false;<br />

t_int32 * location = (t_int32 *)p_data.get_data();<br />

<strong>for</strong>(int i=0; i


Kildekode <strong>for</strong> DSP-modul til foobar2000<br />

HWND checkbox_eq_activated = GetDlgItem(get_wnd(), IDC_CHECKBOX1);<br />

HWND checkbox_auto_pregain = GetDlgItem(get_wnd(), IDC_CHECKBOX2);<br />

HWND checkbox_mp_activated = GetDlgItem(get_wnd(), IDC_CHECKBOX4);<br />

// Check the checkboxes in GUI if they are checked in preset<br />

if (m_params.m_eq_activated)<br />

SendMessage(checkbox_eq_activated, BM_SETCHECK, BST_CHECKED, 0);<br />

if (m_params.m_auto_pregain)<br />

SendMessage(checkbox_auto_pregain, BM_SETCHECK, BST_CHECKED, 0);<br />

if (m_params.m_mp_activated)<br />

SendMessage(checkbox_mp_activated, BM_SETCHECK, BST_CHECKED, 0);<br />

// Define the interval the 7 sliders can be set to<br />

SendMessage(slider_fc, TBM_SETRANGE, TRUE, MAKELONG(10, 400));<br />

SendMessage(slider_fcnew, TBM_SETRANGE, TRUE, MAKELONG(10, 400));<br />

SendMessage(slider_q_tc, TBM_SETRANGE, TRUE, MAKELONG(0, 2000));<br />

SendMessage(slider_q_tcnew, TBM_SETRANGE, TRUE, MAKELONG(0, 2000));<br />

SendMessage(slider_pregain_db, TBM_SETRANGE, TRUE, MAKELONG(0,<br />

1000));<br />

SendMessage(slider_mp_gain, TBM_SETRANGE, TRUE, MAKELONG(100,<br />

5000));<br />

// Put the slider in a position corresponding to it's value<br />

SendMessage(slider_fc, TBM_SETPOS, TRUE, m_params.m_fc);<br />

SendMessage(slider_fcnew, TBM_SETPOS, TRUE, m_params.m_fcnew);<br />

SendMessage(slider_q_tc, TBM_SETPOS, TRUE, m_params.m_q_tc);<br />

SendMessage(slider_q_tcnew, TBM_SETPOS, TRUE, m_params.m_q_tcnew);<br />

SendMessage(slider_pregain_db, TBM_SETPOS, TRUE,<br />

m_params.m_pregain_db);<br />

SendMessage(slider_mp_gain, TBM_SETPOS, TRUE, m_params.m_mp_gain);<br />

// Defines how far apart the ticks of the slider should be put<br />

SendMessage(slider_fc, TBM_SETTICFREQ, 20, 0);<br />

SendMessage(slider_fcnew, TBM_SETTICFREQ, 20, 0);<br />

SendMessage(slider_q_tc, TBM_SETTICFREQ, 100, 0);<br />

SendMessage(slider_q_tcnew, TBM_SETTICFREQ, 100, 0);<br />

SendMessage(slider_pregain_db, TBM_SETTICFREQ, 60, 0);<br />

SendMessage(slider_mp_gain, TBM_SETTICFREQ, 200, 0);<br />

update_display();<br />

}<br />

break;<br />

// Slider has been moved.<br />

case WM_HSCROLL: {<br />

m_dirty = true;<br />

update_display();<br />

}<br />

break;<br />

// Something has been clicked<br />

case WM_COMMAND: {<br />

switch (wp) {<br />

// OK button activated<br />

case IDOK: {<br />

end_dialog(1);<br />

}<br />

break;<br />

// Cancel button activated<br />

case IDCANCEL: {<br />

m_callback.on_preset_changed(m_old_data);<br />

end_dialog(0);<br />

}<br />

87


Kildekode <strong>for</strong> DSP-modul til foobar2000<br />

88<br />

}<br />

}<br />

break;<br />

}<br />

return 0;<br />

}<br />

break;<br />

// An element in the GUI has been clicked<br />

default: {<br />

m_dirty = true;<br />

update_display();<br />

}<br />

break;<br />

// Function that is responsible <strong>for</strong> updating the GUI and getting values from<br />

sliders/checkboxes<br />

private:<br />

void update_display() {<br />

//char mid[50];<br />

double q_gain, pregain;<br />

// Retrieve slider values<br />

m_params.m_fc = SendDlgItemMessage(get_wnd(), IDC_SLIDER, TBM_GETPOS, 0,<br />

0);<br />

m_params.m_fcnew = SendDlgItemMessage(get_wnd(), IDC_SLIDER1, TBM_GETPOS,<br />

0, 0);<br />

m_params.m_q_tc = SendDlgItemMessage(get_wnd(), IDC_SLIDER2, TBM_GETPOS,<br />

0, 0);<br />

m_params.m_q_tcnew = SendDlgItemMessage(get_wnd(), IDC_SLIDER3,<br />

TBM_GETPOS, 0, 0);<br />

m_params.m_pregain_db = SendDlgItemMessage(get_wnd(), IDC_SLIDER4,<br />

TBM_GETPOS, 0, 0);<br />

m_params.m_mp_gain = SendDlgItemMessage(get_wnd(), IDC_SLIDER7,<br />

TBM_GETPOS, 0, 0);<br />

// Check if "Activate EQ" checkbox is marked<br />

if<br />

(SendDlgItemMessage(get_wnd(),IDC_CHECKBOX1,BM_GETCHECK,0,0)==BST_CHECKED)<br />

m_params.m_eq_activated = 1;<br />

else<br />

m_params.m_eq_activated = 0;<br />

// Check if "Auto pre-gain" checkbox is marked<br />

if<br />

(SendDlgItemMessage(get_wnd(),IDC_CHECKBOX2,BM_GETCHECK,0,0)==BST_CHECKED) {<br />

m_params.m_auto_pregain = 1;<br />

// No pregain needed when fcnew >= fc<br />

if (m_params.m_fcnew >= m_params.m_fc)<br />

m_params.m_pregain_db = 0;<br />

else {<br />

// Underdamped system needs more attenuation<br />

if (m_params.m_q_tcnew > 707)<br />

q_gain = ((m_params.m_q_tcnew*m_params.m_q_tcnew/1000000.0)/<br />

sqrt(m_params.m_q_tcnew*m_params.m_q_tcnew/1000000.0-<br />

0.25));<br />

// Critically damped or overdamped, no extra attenuation needed<br />

else<br />

q_gain = 1;<br />

pregain =<br />

q_gain*m_params.m_fc*m_params.m_fc/((double)(m_params.m_fcnew*m_params.m_fcnew<br />

));<br />

m_params.m_pregain_db = (t_int32)ceil(10*20*log10(pregain));


Kildekode <strong>for</strong> DSP-modul til foobar2000<br />

}<br />

SendDlgItemMessage(get_wnd(), IDC_SLIDER4, TBM_SETPOS, 1,<br />

m_params.m_pregain_db);<br />

}<br />

else {<br />

// Manual pregain, retrieve value of pre-gain slider<br />

m_params.m_auto_pregain = 0;<br />

m_params.m_pregain_db = SendDlgItemMessage(get_wnd(), IDC_SLIDER4,<br />

TBM_GETPOS, 0, 0);<br />

}<br />

// Check if "Mechanical protection" checkbox is marked<br />

if<br />

(SendDlgItemMessage(get_wnd(),IDC_CHECKBOX4,BM_GETCHECK,0,0)==BST_CHECKED)<br />

m_params.m_mp_activated = 1;<br />

else<br />

m_params.m_mp_activated = 0;<br />

// Something in the GUI has been changed, create new instance of<br />

dsp_preset_impl and apply preset<br />

if (m_dirty) {<br />

dsp_preset_impl data;<br />

m_params.get_data(data);<br />

m_callback.on_preset_changed(data);<br />

m_dirty = false;<br />

}<br />

// Formatting the textboxes showing the values of the sliders<br />

uSetDlgItemText(get_wnd(), IDC_STATIC_DISPLAY,<br />

pfc::string_<strong>for</strong>matter()


Kildekode <strong>for</strong> DSP-modul til foobar2000<br />

// f[k-2], f[k-1] and f[k] - original audio samples<br />

pfc::array_t fk[3];<br />

// y[k-2], y[k-1] and y[k] - filtered audio samples<br />

pfc::array_t yk[3];<br />

// y[k-2], y[k-1] and y[k] - mechanical model output<br />

pfc::array_t yk_m[3];<br />

// Last values from previous chunk, similar to above<br />

pfc::array_t fk_s[3];<br />

pfc::array_t yk_s[3];<br />

pfc::array_t yk_m_s[3];<br />

// Finally, this is our DSP class. We need a few extra methods to support<br />

presets.<br />

class dsp_loudspeakereq : public dsp_impl_base {<br />

// Contains duplicate of chunk<br />

pfc::array_t buffer;<br />

// Duplicates of preset<br />

int fc, fcnew, fs, mp_gain; //fcnew_offset<br />

double pregain;<br />

double q_tc, q_tcnew, q_gain;<br />

// Filter coefficients, audio- and mechanical filter<br />

double a[3], b[3], a_m[3], b_m[3];<br />

bool eq_activated, mp_activated, auto_pregain;<br />

double offset_adjustment_speed;<br />

public:<br />

dsp_loudspeakereq(const dsp_preset & p_data) {<br />

set_data(p_data);<br />

offset_adjustment_speed = 0.95;<br />

}<br />

// Function <strong>for</strong> retriving GUID of plugin<br />

static GUID g_get_guid() {<br />

90<br />

return t_dsp_loudspeakereq_params::g_get_guid();<br />

}<br />

// Function <strong>for</strong> retrieving name of plugin<br />

static void g_get_name(pfc::string_base & p_out) {<br />

p_out = "Loudspeaker Equalizer";<br />

}<br />

// Return if we have a configuration popup (we do).<br />

static bool g_have_config_popup() {<br />

return true;<br />

}<br />

// Show our configuration popup.<br />

// The provided callback is used to report configuration changes back to the<br />

caller.<br />

static void g_show_config_popup(const dsp_preset & p_data, HWND p_parent,<br />

dsp_preset_edit_callback & p_callback) {<br />

t_dsp_loudspeakereq_params params;<br />

if (params.set_data(p_data)) {<br />

dialog_dsp_loudspeakereq dlg(p_data, p_callback);<br />

// TODO dialog_helper::dialog_modal is deprecated<br />

dlg.run(IDD_CONFIG, p_parent);<br />

}<br />

}<br />

// Return our default preset.<br />

static bool g_get_default_preset(dsp_preset & p_out) {<br />

t_dsp_loudspeakereq_params().get_data(p_out);<br />

return true;<br />

}<br />

// Parameters are read from the provided preset, also read if preset is<br />

modified */<br />

bool set_data(const dsp_preset & p_data) {<br />

t_dsp_loudspeakereq_params params;


Kildekode <strong>for</strong> DSP-modul til foobar2000<br />

if (!params.set_data(p_data)) {<br />

return false;<br />

}<br />

// Store values from GUI in local variables<br />

fc = params.m_fc;<br />

fcnew = params.m_fcnew;<br />

q_tc = params.m_q_tc/1000.0;<br />

q_tcnew = params.m_q_tcnew/1000.0;<br />

eq_activated = (params.m_eq_activated != 0);<br />

mp_activated = (params.m_mp_activated !=0);<br />

auto_pregain = (params.m_auto_pregain != 0);<br />

mp_gain = params.m_mp_gain;<br />

// Automatically calculate the resulting pre-gain as a result of fc,<br />

fcnew and q_tcnew<br />

if (auto_pregain) {<br />

if (fcnew >= fc) {<br />

pregain = 1;<br />

params.m_pregain_db = 0;<br />

}<br />

else {<br />

// Underdamped system<br />

if (params.m_q_tcnew > 707)<br />

// Calculating overshoot<br />

q_gain = ((q_tcnew*q_tcnew)/sqrt(q_tcnew*q_tcnew-0.25));<br />

else // Over- or critically damped system<br />

q_gain = 1;<br />

// Round to yy.xx<br />

pregain = ceil(q_gain*fc*fc/((double)(fcnew*fcnew))*100)/100;<br />

// Calculate value <strong>for</strong> slider<br />

params.m_pregain_db = (t_int32)ceil(10*20*log10(pregain));<br />

}<br />

}<br />

}<br />

// Userselected pre-gain in dB<br />

else {<br />

// Convert from dB to factor<br />

pregain = pow(10.0, params.m_pregain_db/200.0);<br />

}<br />

calculate_coefficients(44100, params.m_fc, params.m_fcnew, q_tc, q_tcnew,<br />

a, b, a_m, b_m);<br />

return true;<br />

virtual void on_endoftrack(abort_callback & p_abort) {<br />

flush();<br />

}<br />

virtual void on_endofplayback(abort_callback & p_abort) {<br />

flush();<br />

}<br />

// Main class responsible <strong>for</strong> modifying audio chunks<br />

virtual bool on_chunk(audio_chunk * chunk, abort_callback & p_abort) {<br />

unsigned calculate_block = 2;<br />

unsigned channel_count = chunk->get_channels();<br />

t_size sample_count = chunk->get_sample_count();<br />

static int fcnew_offset;<br />

// Arrays initialized according to the number of channels */<br />

//Old check to see if array needs reinitialization<br />

if (channel_count != yk[2].get_size()) {<br />

<strong>for</strong> (unsigned i = 0; i


Kildekode <strong>for</strong> DSP-modul til foobar2000<br />

92<br />

}<br />

yk_s[i].fill(0);<br />

fk_s[i].set_size(channel_count);<br />

fk_s[i].fill(0);<br />

yk_m[i].set_size(channel_count);<br />

yk_m[i].fill(0);<br />

yk_m_s[i].set_size(channel_count);<br />

yk_m_s[i].fill(0);<br />

}<br />

// Restarting a<strong>ny</strong> previous mechanical protection<br />

// Mechanical protection activated, new chunk calculation started<br />

if (fcnew_offset > 0) {<br />

if (fcnew_offset < 2) // Difference between fcnew and fcnew+offset<br />

fcnew_offset = 0; // is miniscule, assuming it's zero<br />

// Reduce fcnew_offset by multiplication with speed<br />

else<br />

fcnew_offset = (int)(fcnew_offset*offset_adjustment_speed);<br />

calculate_coefficients(fs, fc, fcnew+fcnew_offset, q_tc, q_tcnew, a,<br />

b, a_m, b_m);<br />

}<br />

// stores address of chunk containing current audio<br />

audio_sample * current = chunk->get_data();<br />

// IIR filter coefficients are calculated according to the sampling<br />

frequency<br />

if (fs != chunk->get_sample_rate()) {<br />

fs = chunk->get_sample_rate();<br />

calculate_coefficients(fs, fc, fcnew, q_tc, q_tcnew, a, b, a_m, b_m);<br />

}<br />

// Last values of previous chunk is stores, in case IIR filter is to be<br />

restarted<br />

<strong>for</strong> (unsigned i = 0; i


}<br />

Kildekode <strong>for</strong> DSP-modul til foobar2000<br />

// no max excursion determined yet<br />

double mp_max = 0;<br />

<strong>for</strong> (t_size sample = 0; sample < sample_count; sample++) {<br />

<strong>for</strong> (unsigned channel = 0; channel < channel_count; channel++) {<br />

// k = k + 1<br />

// old f[k-1] = new f[k-2]<br />

fk[2][channel] = fk[1][channel];<br />

// old f[k] = new f[k-1]<br />

fk[1][channel] = fk[0][channel];<br />

// Pregain is applied<br />

fk[0][channel] = (double)(buffer[sample_index] / pregain);<br />

if (eq_activated) {<br />

yk[0][channel] = -a[1]*yk[1][channel] -a[2]*yk[2][channel] +<br />

b[0]*fk[0][channel] + b[1]*fk[1][channel] +<br />

b[2]*fk[2][channel];<br />

}<br />

else { // No equalizing is applied<br />

yk[0][channel] = fk[0][channel];<br />

}<br />

if (mp_activated) {<br />

// Filter modelling mechanical excursion<br />

yk_m[0][channel] = -a_m[1]*yk_m[1][channel] –<br />

a_m[2]*yk_m[2][channel] + b_m[0]*yk[0][channel] +<br />

b_m[1]*yk[1][channel] + b_m[2]*yk[2][channel];<br />

// Save highest excursion during chunk<br />

if (abs(yk_m[0][channel]) > mp_max)<br />

mp_max = abs(yk_m[0][channel]);<br />

yk_m[2][channel] = yk_m[1][channel];<br />

yk_m[1][channel] = yk_m[0][channel];<br />

}<br />

current[sample_index] = (audio_sample)yk[0][channel];<br />

// old y[k-1] = y[k-2] new<br />

yk[2][channel] = yk[1][channel];<br />

// old y[k] = y[k-1] new<br />

yk[1][channel] = yk[0][channel];<br />

sample_index++;<br />

}<br />

}<br />

// Chunk has now been fully processed<br />

if (mp_activated && mp_max*mp_gain/100.0 > 1) {<br />

if (fcnew + fcnew_offset < fc) {<br />

fcnew_offset += (int)ceil(mp_max*mp_gain/100.0);<br />

calculate_coefficients(fs, fc, fcnew+fcnew_offset, q_tc, q_tcnew,<br />

a, b, a_m, b_m);<br />

}<br />

else<br />

calculate_block = 0;<br />

}<br />

else<br />

calculate_block = 0;<br />

}<br />

return true;<br />

virtual void flush() {<br />

// Nothing to flush.<br />

}<br />

virtual double get_latency() {<br />

// We have no buffer, so latency is 0.<br />

return 0.0;<br />

}<br />

virtual bool need_track_change_mark() {<br />

return false;<br />

}<br />

93


Kildekode <strong>for</strong> DSP-modul til foobar2000<br />

virtual void calculate_coefficients(int fs, t_int32 fc, t_int32 fcnew,<br />

double q_tc, double q_tcnew, double * a, double * b, double * a_m, double *<br />

b_m) {<br />

double timeunit, wc, wcnew, k_z;<br />

// Tidsinterval<br />

timeunit = 1.0/fs;<br />

// Original frekvens prewarpet i rad/s<br />

wc = 2/timeunit*tan(fc*timeunit/2)*2*M_PI;<br />

// Ønsket frekvens prewarpet i rad/s<br />

wcnew = 2/timeunit*tan(fcnew*timeunit/2)*2*M_PI;<br />

// constant <strong>for</strong> b[0], b[1] and b[2] of mechanical filter<br />

k_z = (wc*wc*timeunit*timeunit*q_tc)/(4*q_tc+wc*wc*timeunit*timeunit*q_<br />

tc+2*wc*timeunit);<br />

a[0] = q_tc*(4*q_tcnew+wcnew*wcnew*timeunit*timeunit*q_tcnew+2*<br />

wcnew*timeunit);<br />

a[1] = q_tc*(-8*q_tcnew+2*wcnew*wcnew*timeunit*timeunit*q_tcnew)/a[0];<br />

a[2] = q_tc*(-2*wcnew*timeunit+4*q_tcnew+wcnew*wcnew*timeunit*timeunit*<br />

q_tcnew)/a[0];<br />

b[0] = q_tcnew*(4*q_tc+wc*wc*timeunit*timeunit*q_tc+2*wc*timeunit)/a[0];<br />

b[1] = q_tcnew*(-8*q_tc+2*wc*wc*timeunit*timeunit*q_tc)/a[0];<br />

b[2] = q_tcnew*(-2*wc*timeunit+4*q_tc+wc*wc*timeunit*timeunit*q_tc)/a[0];<br />

a[0] = 1;<br />

a_m[0] = 1;<br />

a_m[1] = (2*q_tc*(-4+wc*wc*timeunit*timeunit))/(4*q_tc+wc*wc*timeunit*<br />

timeunit*q_tc+2*wc*timeunit);<br />

a_m[2] = (-2*wc*timeunit+4*q_tc+wc*wc*timeunit*timeunit*q_tc)/<br />

(4*q_tc+wc*wc*timeunit*timeunit*q_tc+2*wc*timeunit);<br />

b_m[0] = 1*k_z;<br />

b_m[1] = 2*k_z;<br />

b_m[2] = 1*k_z;<br />

}<br />

};<br />

static dsp_factory_t foo_dsp_loudspeakereq;<br />

94


Generated by ResEdit 1.4.5<br />

// Copyright (C) 2006-2009<br />

// http://www.resedit.net<br />

#include "resource.h"<br />

#include <br />

#include <br />

Kildekode <strong>for</strong> DSP-modul til foobar2000<br />

//<br />

// Dialog resources<br />

//<br />

LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US<br />

IDD_CONFIG DIALOGEX 0, 0, 357, 239<br />

STYLE DS_MODALFRAME | DS_SETFONT | WS_VISIBLE | WS_BORDER | WS_CAPTION |<br />

WS_DLGFRAME | WS_POPUP | WS_SYSMENU<br />

EXSTYLE WS_EX_CONTROLPARENT<br />

CAPTION "Loudspeaker Equalizer"<br />

FONT 8, "Tahoma", 0, 0, 1<br />

{<br />

GROUPBOX "Cutoff frequency", IDC_STATIC, 15, 15, 155, 45, BS_LEFT |<br />

0x00000200<br />

CONTROL "", IDC_SLIDER, TRACKBAR_CLASS, WS_TABSTOP | TBS_AUTOTICKS<br />

| TBS_TOP, 19, 34, 147, 23<br />

CTEXT "80 Hz", IDC_STATIC_DISPLAY, 19, 24, 147, 8, SS_CENTER |<br />

SS_CENTERIMAGE, WS_EX_TRANSPARENT<br />

PUSHBUTTON "Cancel", IDCANCEL, 294, 216, 50, 14<br />

DEFPUSHBUTTON "OK", IDOK, 235, 216, 50, 14<br />

GROUPBOX "Cutoff frequency", IDC_STATIC, 15, 96, 155, 45, BS_LEFT |<br />

0x00000200<br />

CONTROL "", IDC_SLIDER1, TRACKBAR_CLASS, WS_TABSTOP |<br />

TBS_AUTOTICKS | TBS_TOP, 19, 115, 147, 23<br />

CTEXT "80 Hz", IDC_STATIC_DISPLAY1, 70, 105, 33, 8, SS_CENTER |<br />

SS_CENTERIMAGE, WS_EX_TRANSPARENT<br />

GROUPBOX "Original loudspeaker", IDC_STATIC, 8, 5, 340, 60<br />

GROUPBOX "Equalized loudspeaker", IDC_STATIC, 8, 70, 340, 80,<br />

BS_LEFT<br />

GROUPBOX "Qtc value", IDC_STATIC, 186, 15, 155, 45, BS_LEFT |<br />

0x00000200<br />

CONTROL "", IDC_SLIDER2, TRACKBAR_CLASS, WS_TABSTOP |<br />

TBS_AUTOTICKS | TBS_TOP, 190, 35, 147, 23<br />

GROUPBOX "Qtc value", IDC_STATIC, 186, 96, 155, 45, BS_LEFT |<br />

0x00000200<br />

CONTROL "", IDC_SLIDER3, TRACKBAR_CLASS, WS_TABSTOP |<br />

TBS_AUTOTICKS | TBS_TOP, 190, 116, 147, 23<br />

CTEXT "0.707", IDC_STATIC_DISPLAY2, 190, 25, 147, 8, SS_CENTER |<br />

SS_CENTERIMAGE, WS_EX_TRANSPARENT<br />

CTEXT "0.707", IDC_STATIC_DISPLAY3, 188, 107, 150, 8, SS_CENTER<br />

| SS_CENTERIMAGE, WS_EX_TRANSPARENT<br />

CONTROL "", IDC_SLIDER4, TRACKBAR_CLASS, WS_TABSTOP |<br />

TBS_AUTOTICKS | TBS_BOTH, 192, 182, 147, 20<br />

GROUPBOX "Equalizer pre-gain", IDC_STATIC, 185, 155, 162, 56<br />

CTEXT "- 0 dB", IDC_STATIC_DISPLAY4, 235, 172, 55, 10, SS_CENTER<br />

| SS_CENTERIMAGE, WS_EX_TRANSPARENT<br />

GROUPBOX "Mechanical protection", IDC_STATIC, 8, 155, 169, 80<br />

AUTOCHECKBOX "Activate", IDC_CHECKBOX4, 20, 170, 43, 10, 0,<br />

WS_EX_TRANSPARENT<br />

CTEXT "1.4x", IDC_STATIC_DISPLAY7, 78, 189, 30, 8, SS_CENTER |<br />

SS_CENTERIMAGE, WS_EX_TRANSPARENT<br />

GROUPBOX "Gain/excursion factor", IDC_STATIC, 15, 181, 155, 45,<br />

BS_LEFT | 0x00000200<br />

CONTROL "", IDC_SLIDER7, TRACKBAR_CLASS, WS_TABSTOP |<br />

TBS_AUTOTICKS | TBS_TOP, 19, 196, 147, 23<br />

AUTOCHECKBOX "Activate", IDC_CHECKBOX1, 20, 85, 43, 10, 0,<br />

WS_EX_TRANSPARENT<br />

AUTOCHECKBOX "Auto", IDC_CHECKBOX2, 192, 170, 31, 10<br />

}<br />

95


Kildekode <strong>for</strong> DSP evaluation board<br />

B<br />

KILDEKODE FOR DSP EVALUATION BOARD<br />

//////////////////////////////////////////////////////////////////////////////<br />

/////////<br />

//NAME: main.c (Block-based Loudspeaker Equalizer)<br />

//DATE: 26/06/09<br />

//PURPOSE: Applying loudspeaker equalization and protection algoritms through<br />

SPDIF I/O<br />

//<br />

//USAGE: This file contains the main routine calls functions to set up the<br />

talkthrough<br />

// routine. It receives an input signal from the SPDIF Rx via SPORT0A<br />

and outputs<br />

// to DAC's via SPORT3A.<br />

//<br />

//////////////////////////////////////////////////////////////////////////////<br />

//////////<br />

#include <br />

#include <br />

#include "tt.h"<br />

int g_eq_activated; // 1) Activate EQ in blockProcessing<br />

int g_mp_activated; // 2) Activate mechanical protection<br />

int g_manual_pregain; // 3) Deactivate automatic pregain<br />

int g_fc = 170; // 4) Original cutoff frequency<br />

int g_fcnew = 40; // 5) Desired cutoff frequency<br />

int g_mp_gain = 100; // 6) Mechanical protection gain/excursion<br />

int g_pregain_db = 252; // 7) Manual pre-gain<br />

int g_led_counter; // Counter <strong>for</strong> advanced use of LEDs<br />

int g_eqfc_calculated; // Used <strong>for</strong> recalculating coefficients if<br />

parameters change<br />

int g_current_setting = 1; // For changing between modifying different<br />

parameters<br />

void main(void) {<br />

96<br />

//Initialize PLL to run at CCLK= 331.776 MHz & SDCLK= 165.888 MHz.<br />

//SDRAM is setup <strong>for</strong> use, but cannot be accessed until MSEN bit is enabled<br />

InitPLL_SDRAM();<br />

// Setting up IRQ0 and IRQ1<br />

SetupIRQ01();<br />

// Need to initialize DAI because the sport signals need to be routed<br />

InitSRU();<br />

// Initializes SPDIF I/O<br />

InitSPDIF();<br />

// Initializes Push buttons and LEDs<br />

InitPBLED();


Finally setup the sport to receive / transmit the data<br />

InitSPORT();<br />

interrupt (SIG_SP0,TalkThroughISR); // For audio I/O<br />

interrupt (SIG_IRQ0, Irq0ISR); // For PB2<br />

interrupt (SIG_IRQ1, Irq1ISR); // For PB1<br />

interrupt (SIG_DAIH, DAIISR); // For PB3 og PB4<br />

Kildekode <strong>for</strong> DSP evaluation board<br />

//Make two pointers to the left and right channels <strong>for</strong> block based<br />

processing<br />

//Used to de-interleave the left and right audio channels<br />

audio_pointer[0] = (double *)malloc(sizeof(double)*NUM_SAMPLES/2);<br />

audio_pointer[1] = (double *)malloc(sizeof(double)*NUM_SAMPLES/2);<br />

audio_buffer[0] = (double *)malloc(sizeof(double)*NUM_SAMPLES/2);<br />

audio_buffer[1] = (double *)malloc(sizeof(double)*NUM_SAMPLES/2);<br />

// Be in infinite loop and do nothing until done.<br />

<strong>for</strong>(;;) {<br />

while(blockReady) {<br />

if (g_led_counter > 399) {<br />

LED_BAR(13);<br />

}<br />

if (g_led_counter > 0 && g_led_counter < 400) // Keep current LED<br />

display<br />

g_led_counter -= 1;<br />

else if (g_led_counter == 0) { // Return to showing CurrentSetting<br />

ClearAll_LED();<br />

Activate_LED(g_current_setting);<br />

g_led_counter--;<br />

}<br />

processBlock(insrc_pointer[int_cntr],outsrc_pointer[int_cntr],<br />

audio_pointer, audio_buffer);<br />

}<br />

}<br />

}<br />

//////////////////////////////////////////////////////////////////////////////<br />

/////////<br />

//NAME: irqprocess.c (Block-based Talkthrough)<br />

//DATE: 26/06/09<br />

//PURPOSE: Interrupt Service Routines <strong>for</strong> buttons and functions <strong>for</strong><br />

displaying on LEDs<br />

//<br />

//USAGE: This file contains the setup routine <strong>for</strong> IRQ0 and IRQ1, as well as<br />

the<br />

// interrupt service routine <strong>for</strong> handling each of the IRQ's. The ISR<br />

<strong>for</strong><br />

// each button accesses change settings or modify parameters.<br />

// Includes functions <strong>for</strong> lighting LEDs, clearing LEDs and slowly<br />

lighting and<br />

// dimming LEDs.<br />

//<br />

//////////////////////////////////////////////////////////////////////////////<br />

//////////<br />

#include "tt.h"<br />

#include "SRU.h"<br />

#include <br />

extern int g_eq_activated, g_mp_activated, g_manual_pregain, g_fc, g_fcnew;<br />

extern int g_mp_gain, g_pregain_db, g_led_counter, g_eqfc_calculated,<br />

g_current_setting;<br />

void SetupIRQ01() {<br />

//Enable the pins as IRQ0 and IRQ1<br />

*pSYSCTL|= IRQ0EN | IRQ1EN;<br />

97


Kildekode <strong>for</strong> DSP evaluation board<br />

}<br />

98<br />

asm ("#include ") ;<br />

//Set the IRQ pins to be edge sensitive<br />

asm ("bit set mode2 IRQ0E;") ;<br />

asm ("bit set mode2 IRQ1E;") ;<br />

// ISR run when PB2 button is pressed<br />

void Irq0ISR (int i) {<br />

if (g_current_setting < 7) // Move the lighted LED right<br />

g_current_setting += 1;<br />

else // Reached end of LED array<br />

g_current_setting = 1; // change to first LED<br />

g_led_counter = 0; // Display CurrentSetting<br />

}<br />

// ISR run when PB1 button is pressed<br />

void Irq1ISR (int i) {<br />

if (g_current_setting > 1) // Move the lighted LED left<br />

g_current_setting -= 1;<br />

else // Reached end of LED array<br />

g_current_setting = 7; // go to last LED<br />

g_led_counter = 0; // Display CurrentSetting<br />

}<br />

// ISR run when PB3 and PB4 is pressed<br />

void DAIISR (int i) {<br />

int iTest;<br />

int sign = 1;<br />

ClearAll_LED();<br />

g_led_counter = 400; // Turns on LED update delay<br />

iTest = (*pDAI_IRPTL_H); // reading pDAI_IRPTL_H clears the latched<br />

interrupt.<br />

if( SRU_EXTMISCA1_INT == iTest ) { // PB3<br />

switch(g_current_setting) {<br />

case(1): {<br />

g_eq_activated = 0;<br />

g_led_counter = 7200; // Gradually dims LEDs<br />

}<br />

break;<br />

case(2): {<br />

g_mp_activated = 0;<br />

g_led_counter = 7200;<br />

}<br />

break;<br />

case(3): {<br />

g_manual_pregain = 0;<br />

g_eqfc_calculated = 0;<br />

g_led_counter = 7200;<br />

}<br />

break;<br />

default: {<br />

sign = -1; // Decrease value<br />

}<br />

break;<br />

}<br />

}<br />

else if( SRU_EXTMISCA2_INT == iTest ) // PB4<br />

{<br />

switch(g_current_setting) {<br />

case(1): {<br />

g_eq_activated = 1;<br />

g_led_counter = 3600; // Gradually lits LEDs<br />

}<br />

break;<br />

case(2): {<br />

g_mp_activated = 1;


}<br />

}<br />

g_led_counter = 3600;<br />

}<br />

break;<br />

case(3): {<br />

g_manual_pregain = 1;<br />

g_led_counter = 3600;<br />

}<br />

break;<br />

default: {<br />

sign = 1; // Increase value<br />

}<br />

break;<br />

}<br />

switch(g_current_setting) {<br />

case(4): {<br />

if (g_fc+2*sign >= 10 && g_fc+2*sign < 255) {<br />

g_fc += 2*sign;<br />

g_eqfc_calculated = 0;<br />

Activate_LED_Bank(g_fc/2);<br />

}<br />

}<br />

break;<br />

case(5): {<br />

if (g_fcnew+2*sign >= 10 && g_fcnew+2*sign < 256) {<br />

g_fcnew += 2*sign;<br />

Activate_LED_Bank(g_fcnew);<br />

g_eqfc_calculated = 0;<br />

}<br />

}<br />

break;<br />

case(6): {<br />

if (g_mp_gain+2*sign >= 10 && g_mp_gain+2*sign < 255) {<br />

g_mp_gain += 2*sign;<br />

Activate_LED_Bank(g_mp_gain/2);<br />

}<br />

}<br />

break;<br />

Kildekode <strong>for</strong> DSP evaluation board<br />

case(7): {<br />

if (g_pregain_db > 9 && g_pregain_db < 992 && g_manual_pregain) {<br />

g_pregain_db += 10*sign;<br />

g_eqfc_calculated = 0;<br />

Activate_LED_Bank(g_pregain_db/10);<br />

}<br />

}<br />

break;<br />

}<br />

//////////////////////////////////////////////////////////////////////////////<br />

// void LED_BAR(const int speed)<br />

//<br />

// PURPOSE: Gradually dims or lits LED bar<br />

// g_led_counter = 7200 gradually dims<br />

// g_led_counter = 3600 gradually lits<br />

//<br />

// INPUT: speed - the speed it dims/lits<br />

//////////////////////////////////////////////////////////////////////////////<br />

void LED_BAR(const int speed) {<br />

if (g_led_counter > 4000)<br />

99


Kildekode <strong>for</strong> DSP evaluation board<br />

}<br />

100<br />

ClearAll_LED();<br />

if (g_led_counter = 6800)<br />

Activate_LED_Bank(127);<br />

else if (g_led_counter < 6800 && g_led_counter >= 6400)<br />

Activate_LED_Bank(126);<br />

else if (g_led_counter < 6400 && g_led_counter >= 6000)<br />

Activate_LED_Bank(124);<br />

else if (g_led_counter < 6000 && g_led_counter >= 5600)<br />

Activate_LED_Bank(120);<br />

else if (g_led_counter < 5600 && g_led_counter >= 5200)<br />

Activate_LED_Bank(112);<br />

else if (g_led_counter < 5200 && g_led_counter >= 4800)<br />

Activate_LED_Bank(96);<br />

else if (g_led_counter < 4800 && g_led_counter >= 4400)<br />

Activate_LED_Bank(64);<br />

else if (g_led_counter < 4400 && g_led_counter >= 4000)<br />

g_led_counter = speed;<br />

else if (g_led_counter = 3200)<br />

Activate_LED_Bank(128);<br />

else if (g_led_counter < 3200 && g_led_counter >= 2800)<br />

Activate_LED_Bank(64);<br />

else if (g_led_counter < 2800 && g_led_counter >= 2400)<br />

Activate_LED_Bank(32);<br />

else if (g_led_counter < 2400 && g_led_counter >= 2000)<br />

Activate_LED_Bank(16);<br />

else if (g_led_counter < 2000 && g_led_counter >= 1600)<br />

Activate_LED_Bank(8);<br />

else if (g_led_counter < 1600 && g_led_counter >= 1200)<br />

Activate_LED_Bank(4);<br />

else if (g_led_counter < 1200 && g_led_counter >= 800)<br />

Activate_LED_Bank(2);<br />

else if (g_led_counter < 800 && g_led_counter >= 400) {<br />

Activate_LED_Bank(1);<br />

if (g_led_counter < 500 && g_led_counter > 400) {<br />

g_led_counter = speed;<br />

}<br />

}<br />

g_led_counter -= speed;<br />

//////////////////////////////////////////////////////////////////////////////<br />

// void ClearAll_LED()<br />

//<br />

// PURPOSE: Clears all LEDS<br />

//<br />

//////////////////////////////////////////////////////////////////////////////<br />

void ClearAll_LED() {<br />

SRU(LOW,DAI_PB15_I);<br />

SRU(LOW,DAI_PB16_I);<br />

sysreg_bit_clr(sysreg_FLAGS, FLG4);<br />

sysreg_bit_clr(sysreg_FLAGS, FLG5);<br />

sysreg_bit_clr(sysreg_FLAGS, FLG6);<br />

sysreg_bit_clr(sysreg_FLAGS, FLG7);<br />

sysreg_bit_clr(sysreg_FLAGS, FLG8);<br />

sysreg_bit_clr(sysreg_FLAGS, FLG3);<br />

}<br />

//////////////////////////////////////////////////////////////////////////////<br />

// void Activate_LED_Bank(const int enleds)<br />

//<br />

// PURPOSE: Sets a particular LED or group of LED's<br />

//<br />

// INPUT: enleds - the LED(s) to actually blink (255 <strong>for</strong> all)<br />

//<br />

//////////////////////////////////////////////////////////////////////////////<br />

void Activate_LED_Bank(const int enleds) {<br />

int n;


}<br />

<strong>for</strong>( n = 0; n < 8; n++ ) {<br />

if( (1


Kildekode <strong>for</strong> DSP evaluation board<br />

void InitSRU(){<br />

// Disable the pull-up resistors on all 20 pins<br />

*pDAI_PIN_PULLUP = 0x000FFFFF;<br />

//------------------------------------------------------------------------<br />

// Connect the SPDIF Receiver<br />

SRU(DAI_PB18_O, DIR_I);<br />

//------------------------------------------------------------------------<br />

// Connect the SRC 0 inputs.<br />

RX<br />

102<br />

SRU(DIR_DAT_O, SPORT0_DA_I); // Data in from the SPDIF RX<br />

SRU(DIR_FS_O, SPORT0_FS_I); // Input Frame sync from the SPDIF<br />

SRU(DIR_CLK_O, SPORT0_CLK_I); // Input clock from the SPDIF RX<br />

//------------------------------------------------------------------------<br />

// Connect the SPDIF Transmitter Inputs<br />

SRU(SPORT3_DA_O, DIT_DAT_I); // Data in from SPORT 3A<br />

SRU(DIR_FS_O, DIT_FS_I); // Frame sync from SPDIF receiver<br />

SRU(DIR_CLK_O, DIT_CLK_I); // Clock from SPDIF receiver<br />

SRU(DIR_CLK_O, SPORT3_CLK_I); // Clock from SPDIF receiver<br />

SRU(DIR_TDMCLK_O, DIT_HFCLK_I); // Oversampling Clock from SPDIF<br />

receiver<br />

SRU(DIR_FS_O, SPORT3_FS_I ); // FS from SPDIF receiver<br />

//------------------------------------------------------------------------<br />

// Connect the SPDIF Transmitter Output.<br />

SRU(DIT_O, DAI_PB01_I);<br />

//------------------------------------------------------------------------<br />

// Tie the pin buffer inputs LOW <strong>for</strong> DAI pin 18. Even though<br />

// these pins are inputs to the SHARC, tying unused pin buffer inputs<br />

// LOW is "good coding style" to eliminate the possibility of<br />

// termination artifacts internal to the IC. Note that signal<br />

// integrity is degraded only with a few specific SRU combinations.<br />

// In practice, this occurs VERY rarely, and these connections are<br />

// typically unnecessary.<br />

SRU(LOW, DAI_PB18_I);<br />

//------------------------------------------------------------------------<br />

// Tie the pin buffer enable inputs LOW <strong>for</strong> DAI pin 18 so<br />

// that they are always input pins.<br />

SRU(LOW, PBEN18_I);<br />

//----------------------------------------------------------------------------<br />

-<br />

//------------------------------------------------------------------------<br />

// Tie the pin buffer enable high<br />

SRU(HIGH, PBEN01_I);<br />

//----------------------------------------------------------------------------<br />

-<br />

}


Kildekode <strong>for</strong> DSP evaluation board<br />

//////////////////////////////////////////////////////////////////////////////<br />

/////////<br />

//NAME: initSPORT.c (Block-based Talkthrough)<br />

//DATE: 7/29/05<br />

//PURPOSE: Talkthrough framework <strong>for</strong> sending and receiving samples to the<br />

AD1835.<br />

//<br />

//USAGE: This file uses SPORT0 to receive data from the SPDIF Rx and<br />

transmits the<br />

// data to the SPDIF Tx via SPORT3A. DMA Chaining is enabled<br />

//<br />

//////////////////////////////////////////////////////////////////////////////<br />

//////////<br />

#include "tt.h"<br />

unsigned int PCI = 0x00080000 ;<br />

unsigned int OFFSET = 0x00080000 ;<br />

// TCB blocks <strong>for</strong> Chaining<br />

// Input ping pong blocks<br />

unsigned int InBlock_A[NUM_SAMPLES] ;<br />

unsigned int InBlock_B[NUM_SAMPLES] ;<br />

// Output ping pong blocks<br />

unsigned int OutBlock_C[NUM_SAMPLES] ;<br />

unsigned int OutBlock_D[NUM_SAMPLES] ;<br />

//Set up the TCBs to rotate automatically<br />

int TCB_Block_InA[4] = { 0, sizeof(InBlock_A), 1, 0};;<br />

int TCB_Block_InB[4] = { 0, sizeof(InBlock_B), 1, 0};<br />

int TCB_Block_OutC[4] = { 0, sizeof(OutBlock_C), 1, 0};<br />

int TCB_Block_OutD[4] = { 0, sizeof(OutBlock_D), 1, 0};<br />

void InitSPORT()<br />

{<br />

//Proceed from Block A to Block B<br />

TCB_Block_InA[0] = (int) TCB_Block_InB + 3 - OFFSET + PCI ;<br />

TCB_Block_InA[3] = (unsigned int) InBlock_A - OFFSET ;<br />

//Proceed from Block B to Block A<br />

TCB_Block_InB[0] = (int) TCB_Block_InA + 3 - OFFSET + PCI ;<br />

TCB_Block_InB[3] = (unsigned int) InBlock_B - OFFSET ;<br />

//Proceed from Block C to Block D<br />

TCB_Block_OutC[0] = (int) TCB_Block_OutD + 3 - OFFSET + PCI ;<br />

TCB_Block_OutC[3] = (unsigned int) OutBlock_C - OFFSET ;<br />

//Proceed from Block C to Block D<br />

TCB_Block_OutD[0] = (int) TCB_Block_OutC + 3 - OFFSET + PCI ;<br />

TCB_Block_OutD[3] = (unsigned int) OutBlock_D - OFFSET ;<br />

/*//////////////////////////////////////////////////////////<br />

// //<br />

// SPORT Loopback: Use SPORT0 as RX & SPORT3 as TX //<br />

// //<br />

////////////////////////////////////////////////////////////<br />

//initially clear SPORT control register */<br />

*pSPMCTL0 = 0 ;<br />

*pSPMCTL3 = 0 ;<br />

*pSPCTL0 = 0 ;<br />

*pSPCTL3 = 0 ;<br />

103


Kildekode <strong>for</strong> DSP evaluation board<br />

// Configure SPORT0 as a reciever externally generating clock and frame<br />

sync<br />

*pDIV0 = 0;<br />

*pSPCTL0 = (SPEN_A| /* Enable Channel A */<br />

SLEN24| /* 32-bit word length */<br />

OPMODE| /* Enable I2S Mode*/<br />

L_FIRST| /* I2S sends left channel first */<br />

SDEN_A| /* Enable Channel A DMA */<br />

SCHEN_A); /* Enable Channel A DMA Chaining */<br />

}<br />

104<br />

// Enabling Chaining<br />

// Block A will be filled first<br />

*pCPSP0A = (unsigned int) TCB_Block_InA - OFFSET + 3 ;<br />

/* Configure SPORT3 as a transmitter */<br />

*pDIV3 = 0;<br />

*pSPCTL3 = (SPEN_A| /* Enable Channel A */<br />

L_FIRST| /* I2S sends left channel first */<br />

SLEN32| /* 32-bit word length */<br />

SPTRAN| /* Transmit on enabled channels */<br />

SDEN_A| /* Enable Channel A DMA */<br />

SCHEN_A| /* Enable Channel A DMA Chaining */<br />

OPMODE); /* Enable I2S Mode*/<br />

*pCPSP3A = (unsigned int) TCB_Block_OutC - OFFSET + 3 ;<br />

/*****************************************************************************<br />

**********************<br />

** File: initSPDIF.c<br />

** Date: 7-29-05<br />

** Author: BM<br />

** Use: Testing ADSP-21369 EZkit SPDIF Interfaces<br />

** Note: Sets up the SPDIF peripherals<br />

**<br />

******************************************************************************<br />

***********************/<br />

#include "tt.h"<br />

void InitSPDIF()<br />

{<br />

*pDITCTL = (DIT_EN|DIT_IN_I2S);<br />

// SPDIF Setup code goes here<br />

// Use default setting of SPDIF<br />

*pDIRCTL=0x0;<br />

}<br />

/*****************************************************************************<br />

**********************<br />

** File: initPBLED.c<br />

** Date: 7-29-05<br />

** Use: Setting up Push Buttons and LEDs<br />

** Note: Sets up the SPDIF peripherals<br />

**<br />

******************************************************************************<br />

***********************/<br />

#include "tt.h"<br />

#include <br />

#include


Kildekode <strong>for</strong> DSP evaluation board<br />

void InitPBLED() {<br />

//Pin Assignments in SRU_PIN3 (Group D)<br />

SRU(LOW,DAI_PB19_I);//assign pin buffer 19 low so it is an input<br />

SRU(LOW,DAI_PB20_I); //assign pin buffer 20 low so it is an input<br />

//Route MISCA singnals in SRU_EXT_MISCA (Group E)<br />

SRU(DAI_PB19_O,MISCA1_I);//route so that DAI pin buffer 19 connects to<br />

MISCA1<br />

SRU(DAI_PB20_O,MISCA2_I);//route so that DAI pin buffer 20 connects to<br />

MISCA2<br />

//Pin Buffer Disable in SRU_PINEN0 (Group F)<br />

SRU(LOW,PBEN19_I);//assign pin 19 low so it is an input<br />

SRU(LOW,PBEN20_I);//assign pin 20 low so it is an input<br />

(*pDAI_IRPTL_PRI) = (SRU_EXTMISCA1_INT | SRU_EXTMISCA2_INT); //unmask<br />

individual interrupts<br />

(*pDAI_IRPTL_RE) = (SRU_EXTMISCA1_INT | SRU_EXTMISCA2_INT); //make sure<br />

interrupts latch on the rising edge<br />

//Set up interrupt priorities<br />

sysreg_bit_set(sysreg_IMASK, DAIHI); //make DAI interrupts high priority<br />

sysreg_bit_set(sysreg_MODE1, IRPTEN ); //enable global<br />

interrupts<br />

//Setting the SRU and route so that Flag pins connects to DPI pin buffers.<br />

//Use Flags 4 to 15 only. Flags 0 to 3 are reserved<br />

SRU(FLAG4_O,DPI_PB06_I); //DPI => We can use flags.<br />

SRU(FLAG5_O,DPI_PB07_I); //DPI => We can use flags.<br />

SRU(FLAG6_O,DPI_PB08_I); //DPI => We can use flags.<br />

SRU(FLAG7_O,DPI_PB13_I); //DPI => We can use flags.<br />

SRU(FLAG8_O,DPI_PB14_I); //DPI => We can use flags.<br />

SRU(LOW,DAI_PB15_I); //DAI => We can't use flags. Value has to be set low<br />

or high.<br />

SRU(LOW,DAI_PB16_I); //DAI => We can't use flags. Value has to be set low<br />

or high.<br />

//*pSYSCTL |= MSEN;<br />

//Enabling the Buffer using the following sequence: High -> Output, Low -><br />

Input<br />

SRU(HIGH,DPI_PBEN06_I);<br />

SRU(HIGH,DPI_PBEN07_I);<br />

SRU(HIGH,DPI_PBEN08_I);<br />

SRU(HIGH,DPI_PBEN13_I);<br />

SRU(HIGH,DPI_PBEN14_I);<br />

SRU(HIGH,PBEN15_I); //default <strong>for</strong>mat to enable the buffer using DAI<br />

SRU(HIGH,PBEN16_I);<br />

}<br />

sysreg_bit_set(sysreg_FLAGS, (FLG3O|FLG4O|FLG5O|FLG6O|FLG7O|FLG8O) );<br />

//Setting flag pins as outputs<br />

sysreg_bit_clr(sysreg_FLAGS, (FLG3|FLG4|FLG5|FLG6|FLG7|FLG8) );<br />

//Clearing flag pins<br />

/*****************************************************************************<br />

***************<br />

**<br />

** File: initPLL.c<br />

** Date: 7-29-05<br />

** Author: SH<br />

** Use: Initialize the DSP PLL <strong>for</strong> the required CCLK and HCLK rates.<br />

** Note: CLKIN will be 24.576 MHz from an external oscillator. The PLL is<br />

programmed<br />

** to generate a core clock (CCLK) of 331.776 MHz - PLL multiplier =<br />

27 and<br />

** divider = 2.<br />

105


Kildekode <strong>for</strong> DSP evaluation board<br />

**<br />

******************************************************************************<br />

***************/<br />

#include <br />

#include <br />

void InitPLL_SDRAM(){<br />

/*****************************************************************************<br />

***************/<br />

int i, pmctlsetting;<br />

//Change this value to optimize the per<strong>for</strong>mance <strong>for</strong> quazi-sequential accesses<br />

(step > 1)<br />

#define SDMODIFY 1<br />

106<br />

pmctlsetting= *pPMCTL; //0 - nulstilling af alle indstillinger<br />

pmctlsetting &= ~(0xFF); //Clear<br />

// CLKIN= 24.576 MHz, Multiplier= 27, Divisor= 2, CCLK_SDCLK_RATIO 2.<br />

// Core clock = (24.576 MHz * 27) /2 = 331.776 MHz<br />

pmctlsetting= SDCKR2|PLLM27|PLLD2|DIVEN; //1<br />

*pPMCTL= pmctlsetting; //2<br />

pmctlsetting|= PLLBP; //3<br />

*pPMCTL= pmctlsetting; // 5<br />

//Wait <strong>for</strong> around 4096 cycles <strong>for</strong> the pll to lock.<br />

<strong>for</strong> (i=0; i


}<br />

Kildekode <strong>for</strong> DSP evaluation board<br />

// Make sure that jumper is set appropriately so that MS2 is connected to<br />

// chip select of 16-bit SDRAM device<br />

*pEPCTL |=B2SD; // 12<br />

*pEPCTL &= ~(B0SD|B1SD|B3SD);<br />

//===================================================================<br />

//<br />

// Configure AMI Control Register (AMICTL0) Bank 0 <strong>for</strong> the ISSI IS61LV5128<br />

//<br />

// WS2 : Wait States = 2 cycles<br />

// HC1 : Bus Hold Cycle (at end of write access)= 1 cycle.<br />

// AMIEN: Enable AMI<br />

// BW8 : External Data Bus Width= 8 bits.<br />

//<br />

//--------------------------------------------------------------------<br />

//SRAM Settings<br />

*pAMICTL0 = WS2|HC1|AMIEN|BW8;<br />

//===================================================================<br />

//<br />

// Configure AMI Control Register (AMICTL) Bank 1 <strong>for</strong> the AMD AM29LV08<br />

//<br />

// WS23 : Wait States= 23 cycles<br />

// AMIEN: Enable AMI<br />

// BW8 : External Data Bus Width= 8 bits.<br />

//<br />

//--------------------------------------------------------------------<br />

//Flash Settings<br />

*pAMICTL1 = WS23|AMIEN|BW8;<br />

//Delay loop<br />

void Delay (int i)<br />

{<br />

<strong>for</strong> (;i>0;--i)<br />

asm ("nop;") ;<br />

}<br />

//////////////////////////////////////////////////////////////////////////////<br />

/////////<br />

//NAME: blockProcess.c (Loudspeaker Equalizer)<br />

//DATE: 26/06/09<br />

//PURPOSE: To apply loudspeaker equalization and protection algorithm<br />

// to audio input. Uses SPDIF I/O and block struckture.<br />

//<br />

//USAGE: This file contains audio processing algorithms <strong>for</strong> SPDIF I/O<br />

//<br />

//////////////////////////////////////////////////////////////////////////////<br />

//////////<br />

#include <br />

#include <br />

#include "tt.h"<br />

#define M_PI ((double)3.14159265358979323846)<br />

extern int g_eq_activated, g_mp_activated, g_manual_pregain, g_fc, g_fcnew;<br />

extern int g_mp_gain, g_pregain_db, g_led_counter, g_eqfc_calculated;<br />

double fk[3][2] = {{0.0, 0.0},{0.0, 0.0}, {0.0, 0.0}};<br />

double yk[3][2] = {{0.0, 0.0},{0.0, 0.0}, {0.0, 0.0}};<br />

double fk_s[3][2] = {{0.0, 0.0},{0.0, 0.0}, {0.0, 0.0}};<br />

double yk_s[3][2] = {{0.0, 0.0},{0.0, 0.0}, {0.0, 0.0}};<br />

double yk_m[3][2] = {{0.0, 0.0},{0.0, 0.0}, {0.0, 0.0}};<br />

double yk_m_s[3][2] = {{0.0, 0.0},{0.0, 0.0}, {0.0, 0.0}};<br />

double a[3], b[3], a_m[3], b_m[3];<br />

107


Kildekode <strong>for</strong> DSP evaluation board<br />

double pregain = 1;<br />

int q_tc_int = 762;<br />

int q_tcnew_int = 707;<br />

/***************************************<br />

* blockProcess<br />

*<br />

* processes the audio blocks. The input and output are given<br />

* as unsigned integer pointers.<br />

***************************************/<br />

//////////////////////////////////////////////////////////////////////////////<br />

// void processBlock(unsigned int *inblock_ptr, unsigned int *outblock_ptr,<br />

// double **audio_ptr, double **audio_buffer)<br />

//<br />

// PURPOSE: Processes the audio blocks.<br />

//<br />

// INPUT: *inblock_ptr - input audio as unsigned integer pointers<br />

// OUTPUT: *outblock_ptr - output audio as unsigned integer pointers<br />

// **audio_buffer - temporary buffer used as source <strong>for</strong> audio<br />

// **audio_ptr - temporary buffer used as destination<strong>for</strong> <strong>for</strong><br />

audio<br />

//<br />

//////////////////////////////////////////////////////////////////////////////<br />

void processBlock(unsigned int *inblock_ptr, unsigned int *outblock_ptr,<br />

double **audio_ptr, double **audio_buffer) {<br />

int i, j;<br />

static int fcnew_offset;<br />

108<br />

int eq_activated = g_eq_activated;<br />

int mp_activated = g_mp_activated;<br />

int mp_gain = g_mp_gain;<br />

int calculate_block = 16;<br />

// For splitting pointer to left/right channel<br />

unsigned int lsample;<br />

unsigned int rsample;<br />

// For temporary storage of left/right channel as doubles<br />

double f_lsample = 0.0;<br />

double f_rsample = 0.0;<br />

double mp_max;<br />

double fc = g_fc;<br />

double fcnew = g_fcnew;<br />

//Clear the Block Ready Semaphore<br />

blockReady = 0;<br />

//Set the Processing Active Semaphore be<strong>for</strong>e starting processing<br />

isProcessing = 1;<br />

// Last values of previous chunk is stored,<br />

// in case IIR filter is to be restarted<br />

<strong>for</strong> (i = 0; i 4) {<br />

fcnew_offset -= 1;<br />

g_eqfc_calculated = 0;


}<br />

Kildekode <strong>for</strong> DSP evaluation board<br />

// Converts from integer input in chunk<br />

// to doubles in audio_buffer<br />

<strong>for</strong> (i=0, j=0;i


Kildekode <strong>for</strong> DSP evaluation board<br />

// printf("mpmax = %f, yk_m[0][0] = %f, yk[0][0] = %f", mp_max,<br />

yk_m[0][0], yk[0][0]);<br />

// Chunk can only be calculated 16 times<br />

calculate_block--;<br />

// Blip on LED7 shows protection has been activated<br />

Activate_LED(7);<br />

g_led_counter = 50;<br />

}<br />

110<br />

// Increase proportional to mechanical overload<br />

fcnew_offset += ceil(mp_max*mp_gain/10/8388608);<br />

// Increase cutoff frequency 4 Hz<br />

//fcnew_offset += 4;<br />

// Recalculate filtercoefficients after offset change<br />

g_eqfc_calculated = 0;<br />

}<br />

else<br />

// Excursion acceptable - proceed<br />

calculate_block = 0;<br />

}<br />

else<br />

// No mechanical protection active - proceed<br />

calculate_block = 0;<br />

//Put processed audio samples back into buffer pointer<br />

<strong>for</strong> (i=0, j=0; i


Kildekode <strong>for</strong> DSP evaluation board<br />

else<br />

pregain = q_gain;<br />

// If auto-pregain, store dB value of global variable<br />

if (!g_manual_pregain)<br />

g_pregain_db = ceil(10*20*log10(pregain));<br />

else<br />

pregain = pow(10.0, g_pregain_db/200.0);<br />

timeunit = 1.0/fs;<br />

// Original cutoff frequency prewarpet [rad/s]<br />

wc = 2/timeunit*tan(g_fc*timeunit/2)*2*M_PI;<br />

// Desired cutoff frequency prewarpet [rad/s]<br />

wcnew = 2/timeunit*tan((g_fcnew+fcnew_offset)*timeunit/2)*2*M_PI;<br />

// Constant <strong>for</strong> b[0], b[1] and b[2] of mechanical filter<br />

k_z =<br />

(wc*wc*timeunit*timeunit*q_tc)/(4*q_tc+wc*wc*timeunit*timeunit*q_tc+2*wc*timeu<br />

nit);<br />

// Equalizing filter coefficients<br />

a[0] =<br />

q_tc*(4*q_tcnew+wcnew*wcnew*timeunit*timeunit*q_tcnew+2*wcnew*timeunit);<br />

a[1] = q_tc*(-8*q_tcnew+2*wcnew*wcnew*timeunit*timeunit*q_tcnew)/a[0];<br />

a[2] = q_tc*(-<br />

2*wcnew*timeunit+4*q_tcnew+wcnew*wcnew*timeunit*timeunit*q_tcnew)/a[0];<br />

b[0] = q_tcnew*(4*q_tc+wc*wc*timeunit*timeunit*q_tc+2*wc*timeunit)/a[0];<br />

b[1] = q_tcnew*(-8*q_tc+2*wc*wc*timeunit*timeunit*q_tc)/a[0];<br />

b[2] = q_tcnew*(-2*wc*timeunit+4*q_tc+wc*wc*timeunit*timeunit*q_tc)/a[0];<br />

a[0] = 1;<br />

// Mechanical filter coefficients<br />

a_m[0] = 1;<br />

a_m[1] = (2*q_tc*(-<br />

4+wc*wc*timeunit*timeunit))/(4*q_tc+wc*wc*timeunit*timeunit*q_tc+2*wc*timeunit<br />

);<br />

a_m[2] = (-<br />

2*wc*timeunit+4*q_tc+wc*wc*timeunit*timeunit*q_tc)/(4*q_tc+wc*wc*timeunit*time<br />

unit*q_tc+2*wc*timeunit);<br />

b_m[0] = 1*k_z;<br />

b_m[1] = 2*k_z;<br />

b_m[2] = 1*k_z;<br />

// Calculate filter coefficients only once<br />

g_eqfc_calculated = 1;<br />

}<br />

//////////////////////////////////////////////////////////////////////////////<br />

/////////<br />

//NAME: SPORTisr.c (Block-based Talkthrough)<br />

//DATE: 7/29/05<br />

//PURPOSE: Talkthrough framework <strong>for</strong> sending and receiving samples to the<br />

AD1835.<br />

//<br />

//USAGE: This file contains SPORT0 Interrupt Service Routine. Three buffers<br />

are used<br />

// <strong>for</strong> this example. One is filled by the ADC, another is sent to the<br />

DAC, and<br />

// the final buffer is processed. Each buffer rotates between these<br />

functions<br />

// upon each SP0 interrupt received.<br />

//////////////////////////////////////////////////////////////////////////////<br />

/////////<br />

/*<br />

Here is the mapping between the SPORTS and the SPDIF<br />

SPDIF Rx -> DSP: SPORT0A : I2S<br />

DSP -> SPDIF Tx: SPORT3A : I2S<br />

*/<br />

#include "tt.h"<br />

#include <br />

extern unsigned int InBlock_A[NUM_SAMPLES] ;<br />

111


Kildekode <strong>for</strong> DSP evaluation board<br />

extern unsigned int InBlock_B[NUM_SAMPLES] ;<br />

extern unsigned int OutBlock_C[NUM_SAMPLES] ;<br />

extern unsigned int OutBlock_D[NUM_SAMPLES] ;<br />

extern unsigned int OFFSET ;<br />

112<br />

//Pointer to the blocks<br />

unsigned int *insrc_pointer[2] = {InBlock_A,<br />

InBlock_B};<br />

unsigned int *outsrc_pointer[2] = {OutBlock_C,<br />

OutBlock_D};<br />

// Counter to choose which buffer to process<br />

int int_cntr=1;<br />

// Semaphore to indicate to main that a block is ready <strong>for</strong> processing<br />

int blockReady=0;<br />

// Semaphore to indicate to the isr that the processing has not completed<br />

be<strong>for</strong>e the<br />

// buffer will be overwritten.<br />

int isProcessing=0;<br />

//If the processing takes too long, the program will be stuck in this infinite<br />

loop.<br />

void ProcessingTooLong(void)<br />

{<br />

while(1);<br />

}<br />

void TalkThroughISR(int sig_int)<br />

{<br />

if(isProcessing)<br />

ProcessingTooLong();<br />

}<br />

//Increment the block pointer<br />

int_cntr++;<br />

int_cntr %= 2;<br />

blockReady = 1;<br />

//////////////////////////////////////////////////////////////////////<br />

/////////////////<br />

//NAME: tt.h<br />

//DATE: 7/29/05<br />

//PURPOSE: Header file with definitions use in the C-based<br />

talkthrough examples<br />

//<br />

//////////////////////////////////////////////////////////////////////<br />

//////////////////<br />

#ifndef _TT_H_<br />

#define _TT_H_<br />

#include <br />

#include <br />

#include <br />

#include <br />

#include <br />

#define NUM_SAMPLES 384


Function prototypes <strong>for</strong> setup<br />

extern void InitPLL_SDRAM(void);<br />

extern void InitSRU(void);<br />

extern void InitSPDIF(void);<br />

extern void InitPBLED(void);<br />

extern void InitSPORT(void);<br />

extern void ClearSPORT(void);<br />

extern void Delay (int i);<br />

extern void TalkThroughISR(int);<br />

extern void SetupIRQ01 (void);<br />

extern void Irq0ISR (int i);<br />

extern void Irq1ISR (int i);<br />

extern void DAIISR (int i);<br />

// Global variables <strong>for</strong> audio I/O<br />

extern int isProcessing;<br />

extern int blockReady;<br />

extern unsigned int *insrc_pointer[2];<br />

extern unsigned int *outsrc_pointer[2];<br />

extern int int_cntr;<br />

// Audio buffers<br />

double *audio_pointer[2];<br />

double *audio_buffer[2];<br />

Kildekode <strong>for</strong> DSP evaluation board<br />

// Function prototypes <strong>for</strong> audio processing<br />

void processBlock(unsigned int *, unsigned int *, double **audio_ptr,<br />

double **audio_buffer);<br />

void calculate_coefficients(int fcnew_offset);<br />

// Function prototypes <strong>for</strong> LED output<br />

extern void ClearAll_LED(void);<br />

extern void Activate_LED(const int enleds);<br />

extern void Activate_LED_Bank(const int enleds);<br />

extern void LED_BAR(const int speed);<br />

#endif<br />

113


Kildekode <strong>for</strong> DSP evaluation board<br />

114


C<br />

MÅLTE HØJTTALERPARAMETRE<br />

Målte højttalerparametre<br />

Nedenstående er en liste over målte og udregnede parametre <strong>for</strong> vores testede højttaler.<br />

Resultaterne er opnået med måleudstyr fra det tyske firma Klippel, og listen er en udskrift<br />

fra deres tilhørende software.<br />

Electrical Parameters<br />

R E<br />

6.35 Ω Electrical voice coil resistance at DC<br />

L E<br />

0.364 mH Frequency independent part of voice coil induc<br />

tance<br />

L 2<br />

0.630 mH Para-inductance of voice coil<br />

R 2<br />

4.24 Ω Electrical resistance due to eddy current losses<br />

C MES 192.83 µF Electrical capacitance representing moving mass<br />

L CES<br />

4.55 mH Electrical inductance representing driver com<br />

pliance<br />

R ES<br />

8.89 Ω Resistance due to mechanical losses<br />

f s<br />

169.9 Hz Driver resonance frequency<br />

Mechanical Parameters<br />

(Using laser)<br />

M MS 9.881 g Mechanical mass of driver diaphragm assembly<br />

including air load and voice coil<br />

MMD( S D ) 9.832 g Mechanical mass of voice coil and diaphragm<br />

without air load<br />

R MS<br />

5.764 kg/s Mechanical resistance of total-driver losses<br />

C MS<br />

0.089 mm/N Mechanical compliance of driver suspension<br />

K MS<br />

11.26 N/mm Mechanical stiffness of driver suspension<br />

Bl 7.16 N/A Force factor ( Bl product)<br />

s<br />

0.269 Suspension creep factor<br />

Loss factors<br />

Q TP<br />

0.770 Total Q-factor considering all losses<br />

Q MS<br />

1.830 Mechanical Q-factor of driver in free air consi<br />

dering Rms only<br />

115


Målte højttalerparametre<br />

Q ES<br />

1.307 Electrical Q-factor of driver in free air consider<br />

116<br />

ing RE only<br />

Q TS<br />

0.762 Total Q-factor considering E<br />

R and Rms only<br />

V AS<br />

0.0484 l Equivalent air volume of suspension<br />

n 0<br />

0.017 % Reference efficiency (2 pi-radiation using E<br />

L M<br />

74.62 dB Characteristic sound pressure level (SPL at 1m<br />

L NOM<br />

N<br />

<strong>for</strong> 1W @ R E )<br />

R )<br />

Z missing dB Nominal sensitivity (SPL at 1m <strong>for</strong> 1W @ Z N )<br />

RMSE Z 3.86 % Root-mean-square fitting error of driver imped<br />

ance Z( f )<br />

RMSE H X 5.63 % Root-mean-square fitting error of transfer func<br />

tion HX( f )<br />

Series resistor0.00 Ω Resistance of series resistor<br />

S D<br />

19.63 cm² Diaphragm area


www.oersted.dtu.dk/cet<br />

Ørsted·DTU<br />

Centre <strong>for</strong> Electric Technology (CET)<br />

Technical University of Denmark<br />

Elektrovej 325<br />

DK-2800 Kgs. Lyngby<br />

Denmark<br />

Tel: (+45) 45 25 35 00<br />

Fax: (+45) 45 88 61 11<br />

E-mail: cet@oersted.dtu.dk

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!