(brug shift+retur for ny linie)> - Barnkob
(brug shift+retur for ny linie)> - Barnkob
(brug shift+retur for ny linie)> - Barnkob
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