• No results found

Generella designval

6.1.1 Mjukvarudesign

Målet med C-implementeringen var att skapa en plattform där olika konstellationer av filterbankar och metoder kan användas. Ekoföljaren är tänkt att köras på processorer där flyttalsoperationer för de fyra räknesätten finns implementerade i hårdvara. Krav på minne och processorprestanda skall vara skalbara. Den implementerade ekoföljaren är skriven på ett sätt så att det är möjligt att köra flera instanser av den på en och samma processor.

Samtliga flyttalsoperationer är trunkerade till att använda enheten ’float’. Detta för att tester på PC-platform skall bättre representera den beräkningsprecision som erhålls med processorerna i dagens nivågivare.

C-implementationen är uppdelad i ett antal klasser. En klass består av en datastruktur och funktioner som verkar på denna struktur. Funktionerna i en klass tar alltid datastrukturen som första argument. Klasser initieras och destrueras av funktioner som simulerar det som konstruktorer respektive destruktorer gör i C++.

I avsnitt 6.2 och 6.3 presenteras två olika intrimningar av ekoföljaren. Det går att byta mellan olika intrimningar utan att kompilera om källkoden.

ZECHO-DB-klassen

Den enklaste av klasserna, ZECHO-klassen, underhåller en lista av ekon som består av både avstånd och amplitud. Samtliga klasser använder på ett eller annat sätt ZECHO-DB klassen.

ZFILTER-DB-klassen

Merparten av signalbehandlingen ligger i ZFILTER-klassen som underhåller en filterbank. Bland funktionerna i denna klass hör rutiner för tids- och mätuppdatering av filterbankens alla filter. Ett antal olika filtertyper stöds (slumpvandringsmodeller, LR- filter etc) och det är möjligt att blanda olika filtertyper i ett och samma filterbank om så skulle önskas. Filterspecifik data lagras i en union för att använda minnet på ett effektivt sätt.

ZLR-klassen

Denna klass innehåller rutiner för att leta efter brytpunkter. ZTRACKLET-DB-klassen

Innehåller rutiner för att underhålla en lista av ekospår med hjälp av en lista av associerade ekon. Detta inkluderar funktioner för tids- och mätuppdatering av ekospår. Dessa funktioner använder sig i sin tur av ZFILTER-DB klassen för själva mätuppdateringen, men lagrar också statistik och sköter spårterminering.

Klassen emitterar signaler för när ekospår skapas, termineras eller när brytpunkter detekteras. För att finna brytpunkter används ZLR-klassen.

Databasen är en lista med ett antal platser (”slots”) i vilket ett ekospår kan lagras, men de aktiva ekospåren kan traverseras i stigande avståndsordningen som en länkad lista.

ZLOG-klassen

Denna mycket enkla klass underhåller en cirkulär buffert, på vilken olika händelser – främst brytpunkter – lagras.

ZTRACKER-klassen

Detta är den översta klassen. Den innehåller konfigureringsdata, håller reda på systemtiden, innehåller två instanser av ZTRACKLET-DB för fullvärdiga respektive preliminära ekospår. Klassen har även instanser av ZLOG och ZRELATIO.

Konfigureringsparametrar och dynamisk data är separerade i olika strukturer eftersom konfigureringsdata typiskt läggs i E2PROM medan dynamisk data bör ligga i RAM. Klassens enda funktion – förutom konstruktor, destruktor och liknande – är ZTRACKER_Update(), vilken tar resultatet av en mätcykel i form av en tidsangivelse och en ZECHO-DB med de ekon som blivit inmätta. Denna funktion:

• Kommenderar tidsuppdatering av samtliga ekospår

• Uppdaterar listan med fullvärdiga ekospår genom att associera inmätta ekon och kommenderar sedan mätuppdatering av de fullvärdiga ekospår som fått ett inmätt eko associerat.

• Uppdaterar preliminära listan med överblivna ekon på samma sätt som ovan. • Beordrar ZTRACKLET-DB klassen att söka upp och hantera kollisioner på de

båda ekolistorna

• Försöker uppdatera preliminära ekospår till fullvärdiga • Initierar nya preliminära ekospår

Förutom klasserna finns en separat modul:

ZASSOC: Ansvarar för själva associeringen. Använder ZECHO-DB klasser. Det naturligaste hade varit att låta denna funktion vara en del av TRACKLET-DB-klassen, men genom att lägga denna funktion separat kan den enkelt återanvändas för att göra associering om implementationen skall kompletteras att göra ekoföljning med modeller för en hel tank enligt kapitel 5.

6.1.2 Associeringsmetod

Upplösningen hos den underliggande fysiken och signalbehandlingen, tillsammans med ett val av en ”gate” (se avsnitt 3.3.2) gör att det maximalt kan finnas ett ändligt antal inmätta ekon som kan associeras till ett visst ekospår. Med de val på ”gate” som används är det max två eller tre ekoinmätningar per spår.

Matchmatrisen, M , från formel (3.40) och (3.41) lagras därför på ett mer minnessnålt sätt i form av en tvådimensionell array vars första index representerar vilket ekospår , j , som avses och i arrayens element lagras såväl index för det inmätta ekot, i , som sannolikheten för associering.

Antal ekospår som kan följas maximalt är satt till 20, och maximalt 4 ekoinmätningar tillåts falla innanför ”gaten” för något enskilt ekospår. Om dessa fyra element i

representationen av M inte räcker till så kommer i alla fall de 4 mest troliga matchningarna att behållas. Detta tillåter ytterligare reducering av ekoföljarens minneskrav.

Båda dessa konstanter kan justeras innan ekoföljaren kompileras.

Själva associeringen utförs som en reducerad ML-associering enligt vad som beskrivits i avsnitt 3.3.3. Vidare används endast avståndet för att beräkna sannolikheterna – amplituden hos ekon betraktas som opålitliga. Dock finns C-kod för att ta med amplitudinformationen implementerad, men denna används inte.

Sannolikheterna pmissatji formel (3.41) har valts till 0.01. Som maximalt tillåtet fel,

(”gate”) används 150 mm.

6.1.3 Spårinitiering

Spårinitiering sker enligt 4.1.3, där man underhåller två listor med ekospår - en ordinarie och en preliminär - visade sig vara enkel att initiera, robust mot ekon som för några enskilda mätningar verkar lovande, men som senare inte visar sig hålla loppet. Därtill ger metoden jämn och låg processorbelastning.

Preliminära ekospår får möjlighet att kvala in som fullvärdiga ekospår efter 20 lyckade mätningar. De preliminära ekospåren som uppnår 20 lyckade, men som inte platsar på listan över fullvärdiga ekospår elimineras.

6.1.4 Spårterminering

Spårterminering - tillsammans med spårinitieringen - är förvånande nog en av de aspekter som påverkar ekoföljaren mest. Ett ekospår som inte termineras, utan glider över och börjar följa ett annat eko medför att två ekospår blir felaktiga. Följande regler har visat sig ge upphov till önskvärda resultat:

• Ett eko avregistreras när det gått minst 20 sek sedan ett ekospår senast kunde mätas in. Detta är det normala sättet för ekospår att termineras.

• Ett eko avregistreras också när sannolikheten för att ett eko mäts in understiger 0.01. Denna sannolikhet , ’p_detect’, beräknas med glömskefaktorfiltering. Denna regel är användbar för att förhindra att enskilda slumpmässiga inmätningar förhindrar att timeouten löser ut. Namnet ’p_detect’ används här istället för

0

1 p− , eftersom detta är variabelnamnet som används i C-implementationen. Sannolikhetenp är densamma som i uttryck (3.49). 0

• Ekon avregistreras även när två ekospår är så nära varandra att sannolikheten att de överlappar varandra överstiger 0.01. Denna sannolikhet beräknas från båda ekospårens skattningar och skattningsvarianser. I detta fall kommer emellertid endast det ekospår vars ’p_detect’ är lägst att avslutas. Om båda ekon har likartad ’p_detect’ (inom 5%) så termineras båda ekospåren, eftersom det då är osäkert om

• När ekolistan blir överfull plockas det ekospår med sämst kvalitetsmått bort. I detta fall så startar en rekursiv algoritm som inte bara tar bort det sämsta ekot, utan även alla i dess närhet. Här används måttet 250 mm, alltså ett större avstånd än vad som valdes som ”gate”. Man får alltså en slags kedjereaktion. Detta är önskvärt för att undvika att ett närliggande eko glider över och börjar mäta på de sampels som borde ha blivit associerade till det terminerade ekot.

6.1.5 Lagring av historik

Om datalagring skall ske, vilket är styrbart med kompileringsdirektiv, sker detta enligt metoden som presenteras i avsnitt 4.2. Metoden är inte optimal men konceptuellt enkel, minnessnål och tillräckligt effektiv. Normalt är denna funktion inkluderad, men kan enkelt tas bort för att ytterligare spara minnesåtgång och programstorlek.

Initialvärden för ∆ är samma som ’gaten’, alltså maximalt tillåtet fel vid associering. Y

Minsta tillåtna tröskelvärde∆Ymin, är 10 mm. Brytpunktstimeouten T∆ är 10 s, och n är min

valt till 5. Se avsnitt 4.2.

6.1.6 Lagring av linjära relationer mellan ekospår

Metoden i kapitel 4.3 finns implementerad, och kompileras med om ett kompileringsdirektiv ges. Eftersom flyttalsprecisionen i dagens processorer inte räcker till inkluderas normalt inte denna funktion.

Related documents