• No results found

Teorin visar hur det går att använda dopplereffekten för uppmätning av hastig- heten för flöden, t.ex. blodflöden. Det gör det möjligt att med hjälp av att Cook- Swartz probarna placeras direkt på ett blodkärl. Probarna skickar i sin tur ut pulser och med dopplereffekten mäts blodflödet.

Vidare visar teorin hur man kan designa och använda sig av filter för att kunna filtrera bort störningar på en signal. Att designa filter med fönstermetoden visar sig vara en enkel metod för att ta fram ett FIR-filter. Det finns många olika typer av fönster beroende på önskat resultat.

Slutligen visas en teknik som kan användas för att få varierad förstärkning, Au- tomatic gain control. Den möjliggör att kunna få ut en jämn utsignal oberoende av insignalen.

3

Metod

För att besvara frågeställningen utfördes ett antal moment. Inledningsvis använ- des dioder för avläsning av blodflödet. Vidare implementerades flera filter som genererades med hjälp av MATLAB för att sedan kodas in till Raspberry Pi. Där- efter togs en AGC fram genom att beräkna energin på insignalen för att få fram rätt förstärkning. För att kunna presentera flödet och andra resultat på skärmen programmerades Raspberry Pi så att användaren kan använda flaggor för olika funktioner.

3.1

Avläsning av blodflöde

Det första som gjordes var att använda sig av 10 dioder som fanns på analyslådan som indikerade det aktuella blodflödet. Alla dioder kopplades vidare till Raspber- ry Pi med varsin kabel så det var möjligt att läsa in värdet för varje diod. Det var digitala signaler som skickades, antingen var signalen låg, alltså en ’0’, eller så var signalen hög, alltså en ’1’, så genom att läsa av de tio olika signalerna kunde antalet lysande dioder räknas ut.

Så blodflödet kunde inta 11 olika värden, 0-10. Då gjorde jag ett program skrivet i C till Raspberry Pi som läste av GPIO-pinnarna för att få reda på om värdet från dioderna var hög eller låg. Detta gjordes med en samplingsfrekvens på 1000 Hz.

Figur 3.1:Analyslådan med de 10 dioderna som indikerar det aktuella blod- flödet samt kablarna som är vidarekopplade till GPIO på Raspberry Pi.

3.2

Implementering av FIR-filter

För att implementera FIR-filter användes MATLAB som har bra funktioner för att just göra filter. Det som skulle göras var ett lågpassfilter vilket betyder att låg- frekventa signaler släpps igenom medan högfrekventa signaler dämpas. För att veta vilken brytningsfrekvens lågpassfiltret skulle ha testades lite olika varianter. I laborationssalen där examensarbetet utfördes finns ett instrument som mäter upp just flöden. Detta instrument har tyvärr inte kunnat användas under arbe- tets gång, men är tänkt att användas i framtiden. Instrumentet har redan färdiga lågpassfilter inbyggda med fyra olika brytningsfrekvenser så det kändes lämpligt att välja samma brytningsfrekvenser.

3.2 Implementering av FIR-filter 21

(a)Brytningsfrekvens 0,1 Hz (b)Brytningsfrekvens 10 Hz

(c)Brytningsfrekvens 40 Hz (d)Brytningsfrekvens 160 Hz Figur 3.2:Lågpassfiltrerna med olika brytningsfrekvenser.

3.2.1

Glidande medelvärde

Jag testade även att göra den enklaste typen av FIR-filter där man helt enkelt tar de N senaste samplevärdena och summerar ihop och delar på antalet samples.

Samplevärde Glidande medelvärde

0 0 0 y(n)=0+0+03 x(0) 0 0 y(n)=x(0)+0+03 x(1) x(0) 0 y(n)=x(1)+x(0)+03 x(2) x(1) x(0) y(n)=x(2)+x(1)+x(0)3 x(3) x(2) x(1) y(n)=x(3)+x(2)+x(1)3 ... ... ... ... x(n) x(n-1) x(n-2) y(n)=x(n)+x(n−1)+x(n−2)3

3.2.2

Fönstermetoden

Precis som med glidande medelvärdet kan man svepa olika fönster framåt eller bakåt i tiden. Det är för att få ett sorts värde som inte bara beror på det nuvarande värdet utan också beror på tidigare värden för att få en mindre ryckig utsignal.

(a)Rektangulärt fönster (b)Triangulärt fönster

(c)Hamming fönster (d)Rätvinklig triangulärt fönster Figur 3.3:De fyra valda fönster som testades i projektet.

3.3 Simulerad insignal 23

3.3

Simulerad insignal

För att läsa in en simulerad insignal gjordes två olika varianter. Det finns nämli- gen en sensor på analyslådan som gör så att det blir utslag på dioderna om man rör den med ett finger. Den första varianten var att försöka dra till med fingret för att efterlikna ett hjärtslag och få som pulser, ungefär en gång i sekunden. Den andra var att försöka ha en konstant signal, likt ett konstant lågt brus.

Figur 3.4:Så här såg sensorn ut som gjorde det möjligt att simulera en insig- nal med hjälp av fingret.

För att ordna detta gjordes en inläsning av 10 000 värden som varade i 10 sekun- der. Då lästes alltså 1000 värden in i sekunden som sparades över i filer för att därefter analyseras.

(a)Insignal variant 1

(b)Insignal variant 2

Figur 3.5: De simulerade insignalerna. Det syns i 3.5a att det finns spikar som når upp till 9 medans i 3.5b håller sig signalen mellan 3 och 5 och någon enstaka gång är den uppe på 6

3.4 Implementering av AGC 25

3.4

Implementering av AGC

För att få systemet att fungera lika bra med de olika probarna och deras vari- erande känslighet implementerades en AGC. Som nämndes tidigare om AGC i teoriavsnittet gör funktionen att utsignalen ska hamna på en konstant nivå oav- sett amplituden på insignalen.

Figur 3.6:Signalflödet från insignal till utsignal. Först sker det en sampling för att läsa in ett samplevärde för att därefter gå vidare till AGC:n för att få rätt förstärkning. Efter AGC:n sker filtrering innan utsignalen uppnås.

Det går att åstadkomma genom att man har en algoritm med en skalningsfaktor som i sin tur beror på signalen som kommer in. Det som jag använde mig av var att kolla på energin på signalen som kom in över ett visst antal samples. Jag räknade ut RMS-värdet för insignalen enligt formeln nedan.

skalningsf aktor(n) = xrms(n) = v u t 1 N N X n=0 x(n)2 (3.1)

Så för varje nytt samplevärde som kommer in räknas det ut en ny skalningsfaktor som beror på de N senaste samplevärdena. För att därefter få till rätt förstärkning och en konstant utsignal användes formeln nedanför.

y(n) = x(n) α

 + skalningsf aktor(n) (3.2)

I formeln 3.2 finns  som en konstant i nämnaren som finns för att om skalnings- faktorn skulle vara 0 skulle ekvationen sakna lösning. Den andra konstanten, α, används för att bestämma hur stor förstärkningen ska vara.

Om insignalen har hög energi blir det en stor skalningsfaktor vilket gör att det blir en låg förstärkning eftersom enligt formeln 3.2 blir då nämnaren stor vilket gör att kvoten blir mindre. Om det är tvärtom, och det är en insignal med låg energi blir skalningsfaktorn mindre som gör så att kvoten i formeln 3.2 blir stor och förstärkningen blir större. Resultatet blir alltså att beroende på insignalen ändras förstärkningen och det blir en konstant utsignal.

Figur 3.7:Överblick över AGC-blockets funktion. En skalningsfaktor räk- nas ut varje gång ett samplevärde kommer in för att sedan användas för att bestämma hur stor förstärkningen blir

Den här AGC-funktionen implementerades i Raspberry Pi i C-kod och studerar man formeln 3.1 så ska skalningsfaktorn räknas så fort ett nytt samplevärde kom- mer in. Det kan enkelt räknas ut med en simpel for-loop, men det är en ineffektiv lösning som är onödigt krävande. Därför använder jag en annan lösning som går ut på att hålla koll på det samplevärdet som puttas ut och det nya värdet som kommer in. Den formeln motsvarar 3.1 och syns här nedanför.

skalningsf aktor(n) =

r

skalningsf aktor(n − 1)2∗N − x(N + 1)2+ x(n)2 N

(3.3) Då slipper man använda sig av en for-loop som är krävande och löser det med en ekvation istället. Ekvationen använder sig av den tidigare skalningsfaktorn och subtraherar bort det samplevärdet som puttas ut, alltså x(N + 1), och adderar in det nya samplevärdet x(n)

3.5

Presentation av flödet

Koden som är skriven till Raspberry Pi ger användaren tre olika alternativ för hur programmet ska köras. Med hjälp av olika flaggor som skrivs i terminalen när användaren ska starta programmet bestäms vad som ska göras. Det går att med hjälp av flaggan-g få en grafisk presentation av det aktuella flödet.

3.6 Diskussion 27

skärmen. Då skrivs medelvärdet ut över ett visst antal samples, utsignalen ef- ter AGC:n och hur stor skalningsfaktorn för varje nytt samplevärde som kommer in. Det sista alternativet är att spara värden till filer och för att göra det används flaggan-d. Då kommer 10 000 samplade värden att läsas in och spara över insig-

nalens, utsignalens och skalningsfaktorns värden i tre filer.

3.5.1

Grafisk presentation

För att visa det aktuella blodflödet efter inläsning av dioderna använder jag mig av ett bibliotek som heter ncurses. Det tillåter användaren att placera textsträng- ar på en specifik yta. Det fungerar som ett stort koordinatsystem med en x-axel och en y-axel. Eftersom inläsningen av dioderna sker i en frekvens på 1 kHz an- vänds en fördröjning på 300 ms efter varje inläsning för att få en lagom snabb uppdatering av blodflödet som visas i realtid på skärmen. För att inte riskera att datan ska hamna utanför skärmens storlek, sker en återställning när x-koordinaten har nått 75 och börjar om från början.

Figur 3.8:Den grafiska presentationen. Längst till vänster är det en skala på tänkbara värden och sen blir det staplar som representerar det aktuella blodflödet. Efter varje inläsning skrivs det ut en ny stapel.

3.6

Diskussion

Valet att implementera en AGC i projektet är inte bara för att det ska fungera för de tre olika probarna som fanns tillgängliga. I slutändan i det här projektet är det tänkt att användas på riktiga blodkärl och ska då fungera för alla kärl, oberoende av kärlets egenskaper.

Avläsningen som gjordes med en samplingsfrekvens 1 kHz valdes för att få till- räckligt många värden men inte alldeles för många för att kunna jobba vidare

3.7

Sammanfattning

Metoden visar hur avläsningen av blodflödet gick till. Då använde jag mig av 10 dioder som indikerade det aktuella blodflödet. Det blev som 10 digitala signaler som kunde sparas vidare i Raspberry Pi och bearbetas. Därefter användes olika lågpassfilter med olika brytningsfrekvenser och typ av fönster för att undersöka och hitta den optimala lösningen. En AGC implementerades och allt detta pre- senterades på en datorskärm som Raspberry Pi var kopplad till, där det gick att se båda grafisk presentation och presentation i text.

4

Resultat

Under arbetets gång genomfördes att antal olika mätningar för att kunna testa olika delar av systemet och tillslut hela mätkedjan med alla delar tillsammans. Den första delen kommer att presentera hur lågpassfilterna blev med olika föns- ter och brytningsfrekvenser. Alla filter har tagits fram med hjälp av MATLAB och resultatet presenteras i plottar som visar frekvenssvaren. Det har även gjorts mätningar för att testa AGC:n som också är framtagen med hjälp av MATLAB som presenteras i plottar. Slutligen gjordes mätningar på hela mätkedjan, från insignal till utsignal genom alla delar av systemet.

4.1

FIR-filter med olika fönster

Resultatet av alla fönster som syns i figuren 3.3 med olika brytningsfrekvens. Brytningsfrekvenserna var samma som nämnts tidigare, de som fanns förvalda i det instrumentet som fanns i laborationssalen.

Figur 4.1: Frekvenssvaret för de fyra fönsterna med brytningsfrekvensen 0.1Hz.

Figur 4.2: Frekvenssvaret för de fyra fönsterna med brytningsfrekvensen 10Hz.

4.1 FIR-filter med olika fönster 31

Figur 4.3: Frekvenssvaret för de fyra fönsterna med brytningsfrekvensen 40Hz.

Figur 4.4: Frekvenssvaret för de fyra fönsterna med brytningsfrekvensen 160Hz.

som beskrivs i metodkapitlet i figur 3.5. Inget filter har används, utan bara insig- nalerna, AGC:n och plottat hur utsignalen ser ut.

(a)Utsignal efter AGC, variant 1

(b)Utsignal efter AGC, variant 2

4.3 Mätresultat 33

4.3

Mätresultat

Mätresultatet som har tagits fram finns som bilder i appendix A.3. Det är bilder på hur utsignalen såg ut efter att insignalen har passerat AGC:n och filtreringen. Eftersom jag har gjort två olika varianter på insignalen och fyra lågpassfilter med olika brytningsfrekvens med fyra olika fönster, vilket ger 32 bilder som syns i ap- pendixet.

4.4

Sammanfattning

Sammanfattningsvis visar resultatet att topparna och dalarna blir större ju högre brytningsfrekvens som används samt mindre i de som har filter än de utan filter.

5

Diskussion

5.1

Resultat

Mätresultatet på hela mätkedjan när utsignalen har plottats med filter med olika brytningsfrekvenser och olika insignaler (som går att se i appendix A.3) skiljer sig inte så mycket mot varandra. Det som går att se som är gemensamt för alla typer av filter är att topparna och dalarna blir större ju högre brytningsfrekvens är. Det går också att se om man jämför utsignalen med filter och utan filter (figu- rerna som syns appendix A.3 och i figur 4.5a och 4.5b) att topparna och dalarna är mindre i de som har filter än de som inte har. Detta är väntat då tanken är att signalen ska vara mindre känslig för förändring och beror också på tidigare värden.

5.2

Metod

Vid designen av filter använde jag mig av fönstring som är en enkel och gam- mal metod för att designa FIR-filter. Det finns flera sätt att designa FIR-filter på, det finns något som t.ex. heter minsta kvadratmetoden". Det som är bra med just fönstring är att det är relativt enkelt och robust, men det är inte ett optimalt fil- ter och filterordningen blir ganska hög. Att filterordningen blir hög är sämre i jämfört med andra metoder, men får man ner filterordningen ökar komplexite- ten. Om man skulle göra om projektet med obegränsat med tid skulle det vara intressant att testa andra metoder än just fönstring för att kunna optimera filtret. Insignalen som ska genereras av blodflödet simulerade jag med hjälp av en sensor som gav utslag på dioderna när man drog lite med fingret. Jag försökte efterlik- na ett hjärtslag med pulser en gång i sekunden. Det är givetvis svårt att få till

sensorn som fanns tillgänglig för att få till en insignal så att jag hade något jag kunde jobba vidare med.

5.3

Vidareutveckling

I framtiden är det tänkt att produkten ska sitta inne i huden vilket betyder att storleken på hela produkten måste minska rejält. Men det viktiga är att få signa- len att bli ännu säkrare så att det inte riskerar att skicka felaktig information till mottagaren. Med tanke på att en människas hälsa kan drabbas känns det som att många tester måste göras för att verkligen säkerställa att det fungerar som det är tänkt.

Det som först skulle kunna göras för att minska storleken på produkten är att koppla bort frontpanelen till analyslådan där dioderna finns. Det den används till nu är bara dioderna, vilket inte kommer behövas senare till nästkommande projekt. Detta skulle vara en början för att minska storleken.

6

Slutsats

För att återkoppla till frågeställningarna utvärderas bland annat hur variation av blodkärl påverkar blodflödet. Slutsatser dras även om hur en rad olika filter kan påverka en signal samt vid vilka omständigheter vissa filter med fördel kan väljas.

6.1

Översikt

Den produkt som jag, och de tidigare exjobbare på detta projekt, har kommit fram till syns i figuren 6.1 nedanför. Den visar hela förloppet som börjar med pumpen och slangar som ska simulera blodkärl i ett kretslopp. De blåa kablar- na är de tre proberna som kopplas vidare till frontpanelen där dioderna finns. Slutligen kopplas den vidare till Raspberry Pi där all kod finns programmerad.

Figur 6.1:Mätuppställning för uppmätning av blodflöde med pump, slang- ar, frontpanelen och Raspberry Pi.

6.2

Variation av blodkärl

Att variationen av ett blodkärl kommer påverka blodflödet är uppenbart. Det be- kräftades inte minst i avsnittet 2.2 där det efter studerande framgick tydligt att det var så. Utrustningen som fanns tillgänglig som skulle simulera ett blodkärl var redan inkopplad när det här projektet drog igång och eftersom det skulle va- ra väldigt tidskrävande att koppla om alla probar samt att jag saknar medicinsk kompetens för att utföra detta, testades bara mätningarna för ett och samma si- mulerat blodkärl. Med hjälp av teorin går det dock att dra slutsatsen att variatio- ner av blodkärlet skulle ha gett ett annat mätresultat. Precis som ekvationen 2.3 beskriver så kommer ett blodkärls resistans främst att bero på radien av blodkär- let som kommer ha störst påverkan av flödet som i sin tur är mätresultatet.

6.3

Fönsterjämförelse

Om man ska försöka jämföra de olika fönster som har testats och bestämma vil- ket som är bäst, beror det på vad som ska prioriteras. Om man studerar figurerna 4.1, 4.2, 4.3 och 4.4 där frekvenssvaret visas för alla filter med olika brytningsfre- kvens med olika fönstertyper ser man att det rektangulära fönstret har en smala- re huvudlob än de andra tre men att sidloberna är relativt höga. Det som skiljer sig mest mot det rektangulära fönstret är hamming fönstret som har vidast hu- vudlob men överlägset lägsta sidlober. Detta stämmer väl överens om man läser på om fönster och deras olika egenskaper, t.ex. i rapporten skriven av Fredric J.Harris där alla tänkbara filter jämförs [Harris, 1978]. Så beroende på vad som ska filtreras bort bör ett visst fönster väljas. Om den signalen som ska filtreras bort ligger väldigt nära den önskade signalen i frekvens så bör ett rektangulärt fönster väljas. Men om den önskade signalen och den som ska filtreras bort istäl-

6.4 Funktionen av AGC:n 39

let skiljer sig i frekvens bör ett hamming fönster väljas för att inte riskera att den oönskade signalen smiter igenom genom att ha höga sidlober.

Det triangulära fönstret beter sig som ett mellanläge mellan rektangulärt och hamming för de filter med 0.1Hz och 10Hz som brytningsfrekvens. Det går att se i figur 4.1 och 4.2. Däremot i de filter med brytningsfrekvens 40Hz och 160Hz är varken huvudloben smalare än hamming och sidloberna är inte lägre än det rektangulära, vilket går att se i figurerna 4.3 och 4.4.

6.4

Funktionen av AGC:n

Resultatet som presenteras i figurerna 4.5a och 4.5b visar att AGC:n fungerar. Det syns tydligt att efter ett visst antal samples stabiliseras utsignalen till en någorlunda jämn nivå. Det framgår även att 4.5a är något ojämnare vilket inte är så konstigt med tanke på att insignalen var den som skulle efterlikna ett hjärtslag, se figur 3.5a, som var ganska ryckig.

A

Appendix

Här kommer delar som inte har plats i den flytande texten. Koden som används i Raspberry Pi och körhandledning hur programmet fungerar samt bilder på mä- tresultater.

A.1

Rasperry Pi-koden

Nedanför är koden som användes i Raspberry Pi.

1 # i n c l u d e < s t d i o . h> 2 # i n c l u d e <w i r i n g P i . h> 3 # i n c l u d e < s t d l i b . h> 4 # i n c l u d e <math . h> 5 # i n c l u d e <n c u r s e s . h> 6 # i n c l u d e < s t r i n g . h> 7 8 i n t l e d = 0 ; 9 i n t va lu e = 0 ; 10 i n t ledArray [ 1 0 ] = { 8 , 9 , 7 , 0 , 2 , 3 , 1 , 4 , 5 , 6 } ; 11 i n t valuemax =0; 12 i n t input [ 1 0 0 0 ] = { 0 } ; 13 f l o a t temp =0; 14 f l o a t s c a l i n g f a c t o r = 0 . 0 1 ; 15 f l o a t tempY = 0 . 0 ; 16 17 void s h i f t ( ) ; 18

19 void usage (void) 20 { 21 p r i n t f (" −g Graphic \n ") ; 22 p r i n t f (" − f Text \n ") ; 23 p r i n t f (" −d Save t o f i l e s \n ") ; 24 e x i t ( 8 ) ; 25 } 43

29 i n t i =0;

30 i f ( w i r i n g P i S e t u p ( ) == −1) 31 r e t u r n 1 ;

32

33 // I n i t i e r a r r a s p b e r r y n v i l k a GPIO−pinnar som anv ä nds 34 f o r ( i = 0 ; i < 1 0 ; ++ i )

35 {

36 pinMode ( ledArray [ i ] , INPUT ) ; // s ä t t e r pinnarna på RPi t i l l i n p u t s 37 pullUpDnControl ( ledArray [ i ] ,PUD_DOWN) ;

38 } 39 r e t u r n 1 ; 40 } 41 42 /* void f i l t e r ( ) 43 { 44 f l o a t yn = 0 ; 45 f i l t e r _ k o e f [ ? ] = ? ? ? ; 46 47 f o r ( i =0; i < s i z e o f ( f i l t e r _ k o e f ; ++ i ) 48 { 49 yn += input [ i ]* f i l t e r _ k o e f [ i ] ; 50 } 51 p r i n t f ( " U t s i g n a l e f t e r f i l t e r : %f \n " , yn ) ; 52 53 }*/ 54 55 void read ( ) 56 { 57 va lu e =0; 58 i n t i =0;

59 // Loopar runt och l ä s e r av 10 l e d 60 f o r ( i = 0 ; i < 1 0 ; ++ i )

61 {

62 //Lä s e r i n pinv ä r d e t

63 l e d = d i g i t a l R e a d ( ledArray [ i ] ) ; 64

65 //Hå l l e r reda på hur må nga l e d d a r som ä r t ända 66 i f ( l e d ==1) 67 { 68 va l ue +=1; 69 // p r i n t f ("======") ; 70 } 71 72 // E f t e r 10 i n l ä s n i n g a r 73 i f( i ==9) 74 {

75 // p r i n t f ( "ANTAL LEDDAR %d \n\n " , v al ue ) ; // s k r i v e r ut hur må nga

l e d d a r som var t ända av 10

76 77 //Hå l l e r rade på maxvä r d e t 78 i f ( v al ue > valuemax ) 79 { 80 valuemax = v al ue ; 81 }

A.1 Rasperry Pi-koden 45 83 // p r i n t f ( " %d %d\n " , value , valuemax ) ; 84 85 // S h i f t a r i n p u t v e k t o r n 86 s h i f t ( ) ; 87

88 //Lä s e r i n det nya led −vä r d e t 89 input [ 0 ] = v al ue ; 90 } 91 } 92 // 1 ms d e l a y ge r en s a m p l i n g s f r e k v e n s på 1 kHz 93 d e l a y ( 1 ) ; 94 } 95

96 // Fyra o l i k a FIR− f i l t e r , a l l a l å gpass med b r y t n i n g s f r e k v e n s r n a 0 . 1Hz , 10Hz

, 40Hz och 160Hz 97 f l o a t h_1khz_01hz [ 1 0 6 ] ={ 98 0.134131966394113 , 0.00364739544628279 , 0.00367336591391043 , 0.00373584770126958 , 0.00376459096788709 , 0.00383313426250789 , 0.00385304407405279 , 0.00391514071849736 , 0.00392855907502909 , 0.00398631588631362 , 0.00398703415710025 , 0.00404523299776918 , 0.00402012256669290 , 0.00408715210915339 , 0.00405229370234736 , 0.00424478889986649 , 0.00441227091391755 , 0.00421583050483812 , 0.00433912590099408 , 0.00433666388482654 , 0.00440654596568846 , 0.00442760348211482 , 0.00447956732706747 , 0.00450590146117297 , 0.00455020484961602 , 0.00457559140680613 , 0.00461095783122087 , 0.00463382612259669 , 0.00463774111257648 , 0.00466484819213528 , 0.00467198929194029 , 0.00476352005328634 , 0.00477470727327015 , 0.00475438781375756 , 0.00479646307412790 , 0.00479712862563089 , 0.00482878296471065 , 0.00483635720473297 , 0.00486096796819638 , 0.00486991544195831 , 0.00489403684971537 , 0.00489923714974794 , 0.00492809166311842 , 0.00492113758717183 , 0.00491806414421842 , 0.00492584414171132 , 0.00493586564105952 , 0.00497790705999227 , 0.00496026734767840 , 0.00496240890877989 , 0.00496453022970250 , 0.00496369945570732 , 0.00496580727337442 , 0.00496580727337442 , 0.00496369945570732 , 0.00496453022970250 , 0.00496240890877989 , 0.00496026734767840 , 0.00497790705999227 , 0.00493586564105952 , 0.00492584414171132 , 0.00491806414421842 , 0.00492113758717183 , 0.00492809166311842 , 0.00489923714974794 , 0.00489403684971537 , 0.00486991544195831 , 0.00486096796819638 , 0.00483635720473297 , 0.00482878296471065 , 0.00479712862563089 , 0.00479646307412790 , 0.00475438781375756 , 0.00477470727327015 , 0.00476352005328634 , 0.00467198929194029 , 0.00466484819213528 , 0.00463774111257648 , 0.00463382612259669 , 0.00461095783122087 , 0.00457559140680613 , 0.00455020484961602 , 0.00450590146117297 , 0.00447956732706747 , 0.00442760348211482 , 0.00440654596568846 , 0.00433666388482654 , 0.00433912590099408 , 0.00421583050483812 , 0.00441227091391755 , 0.00424478889986649 , 0.00405229370234736 , 0.00408715210915339 , 0.00402012256669290 , 0.00404523299776918 , 0.00398703415710025 , 0.00398631588631362 , 0.00392855907502909 , 0.00391514071849736 , 0.00385304407405279 , 0.00383313426250789 , 0.00376459096788709 , 0.00373584770126958 , 0.00367336591391043 , 0.00364739544628279 , 0.134131966394113}; 99 100 f l o a t h_1khz_10hz [ 1 0 6 ] ={ 101 −0.0860675903844080 , −0.000391674074825918 , −0.000335150956003810 , −0.000218895258611865 , −7.35222708837940 e −05 , 0.000129529084015256 , 0.000361099365345868 ,0.000656130917842099 ,0.000967935759889127 ,0.00134880207778693 ,0.00174250606347928 ,0.00219809361558704

,0.00837749119260826 ,0.00913525519966048 ,0.00991318585696913 ,0.0106958681499220 ,0.0115025279973706 ,0.0123069081911095 ,0.0131178328455509 ,0.0139314319719974 ,0.0147518002624067 ,0.0155562953479685 ,0.0163820620141611 ,0.0171201431054416 ,0.0179029612930286 ,0.0186748167987290 ,0.0194062148241921 ,0.0201245827747007 ,0.0208106340511351 ,0.0214682770879442 ,0.0221001488788309 ,0.0226887301424463 ,0.0232547838757514 ,0.0237794343802802 ,0.0242523190797436 ,0.0246922579479478 ,0.0250900018786396 ,0.0254385202087622 ,0.0257571312816524 ,0.0259951512238076 ,0.0261955740577605 ,0.0263592606799884 ,0.0264587021521580 ,0.0265137076819039 ,0.0265137076819039 ,0.0264587021521580 ,0.0263592606799884 ,0.0261955740577605 ,0.0259951512238076 ,0.0257571312816524 ,0.0254385202087622 ,0.0250900018786396 ,0.0246922579479478 ,0.0242523190797436 ,0.0237794343802802 ,0.0232547838757514 ,0.0226887301424463 ,0.0221001488788309 ,0.0214682770879442 ,0.0208106340511351 ,0.0201245827747007 ,0.0194062148241921 ,0.0186748167987290 ,0.0179029612930286 ,0.0171201431054416 ,0.0163820620141611 ,0.0155562953479685 ,0.0147518002624067 ,0.0139314319719974 ,0.0131178328455509 ,0.0123069081911095 ,0.0115025279973706 ,0.0106958681499220 ,0.00991318585696913 ,0.00913525519966048 ,0.00837749119260826 ,0.00764233772905561 ,0.00691751981670211 ,0.00623216680837344 ,0.00553410743415839 ,0.00478912574786293 ,0.00437680993799365 ,0.00374529137974500 ,0.00320785325562649 ,0.00267144552458337 ,0.00219809361558704 ,0.00174250606347928 ,0.00134880207778693 ,0.000967935759889127 ,0.000656130917842099 ,0.000361099365345868 ,0.000129529084015256 , −7.35222708837940 e −05 , −0.000218895258611865 , −0.000335150956003810 , −0.000391674074825918 , −0.0860675903844082}; 102 103 f l o a t h_1khz_40hz [ 1 0 6 ] ={ 104 0.0750753466817435 , 0.00179665245784014 , 0.00122188101834787 , 0.000250123712572672 , −0.00101841682000696 , −0.00253829143698835 , −0.00416146338092133 , −0.00582335603087078 , −0.00733844210763128 ,0.00865159977977834 , −0.00958617526437018 , −0.0101200167605585 , −0.0101236396372470 , −0.00965508173098383 , −0.00860984699884013 , −0.00724347127635255 , −0.00523127461175214 , −0.00296436333315374 ,0.000630413308629660 , 0.00180009309037793 , 0.00403158647914009 , 0.00596925913864856 , 0.00740851257213632 , 0.00824469196603135 , 0.00835104404636926 , 0.00769110290414940 , 0.00622825638928386 , 0.00403414590711532 , 0.00119074213269676 , −0.00215216077945025 , −0.00577701681851639 , −0.00949783953252081 , −0.0130632775999085 ,0.0161126479588009 , −0.0184899582088306 , −0.0198791851809304 ,0.0201002706432911 , −0.0189658340353721 , −0.0163833599587667 ,0.0122945699338365 , −0.00675538014018895 , 0.000153888799599752 , 0.00822152792062107 , 0.0172140714245556 , 0.0268307449246835 , 0.0367064693474378 , 0.0464752548841680 , 0.0557744366186889 , 0.0641762340068922 , 0.0713817927505658 , 0.0770716093966299 , 0.0810012269222002 , 0.0830118527794413 , 0.0830118527794413 , 0.0810012269222002 , 0.0770716093966299 , 0.0713817927505658 , 0.0641762340068922 , 0.0557744366186889 , 0.0464752548841680 , 0.0367064693474378 , 0.0268307449246835 , 0.0172140714245556 , 0.00822152792062107 , 0.000153888799599752 , −0.00675538014018895 , −0.0122945699338365 , −0.0163833599587667 , −0.0189658340353721 ,0.0201002706432911 , −0.0198791851809304 , −0.0184899582088306 ,

A.1 Rasperry Pi-koden 47 −0.0161126479588009 , −0.0130632775999085 , −0.00949783953252081 ,0.00577701681851639 , −0.00215216077945025 , 0.00119074213269676 , 0.00403414590711532 , 0.00622825638928386 , 0.00769110290414940 , 0.00835104404636926 , 0.00824469196603135 , 0.00740851257213632 , 0.00596925913864856 , 0.00403158647914009 , 0.00180009309037793 , −0.000630413308629660 , −0.00296436333315374 , −0.00523127461175214 ,0.00724347127635255 , −0.00860984699884013 , −0.00965508173098383 ,0.0101236396372470 , −0.0101200167605585 , −0.00958617526437018 ,0.00865159977977834 , −0.00733844210763128 ,0.00582335603087078 ,0.00416146338092133 , −0.00253829143698835 , −0.00101841682000696 , 0.000250123712572672 , 0.00122188101834787 , 0.00179665245784014 , 0.0750753466817435}; 105 106 f l o a t h_1khz_160hz [ 1 0 6 ] ={ 107 −0.0284167156414015 , 0.0664078872582807 , 0.0283906316756640 , 0.00990364860532624 , −0.00121520761894961 , −0.00514258174499917 , −0.00183460008632927 , 0.00427501542390626 , 0.00681159858309176 , 0.00292514060877247 , −0.00397370465004492 , −0.00732545571747670 , −0.00365448675729516 , 0.00377822815522018 , 0.00793164331287008 , 0.00451363728445482 , −0.00352821236062033 , −0.00859190550568147 , −0.00551018027357704 , 0.00318066264771145 , 0.00930515935892715 , 0.00663537257329624 , −0.00276553333129935 , −0.0101384594872478 , −0.00801343598147411 , 0.00218206710285855 , 0.0110228214924617 , 0.00959093793053663 , −0.00148642020812226 , −0.0121284783210541 , −0.0115476054492339 , 0.000545033179540466 , 0.0133928539479980 , 0.0140996759463997 , 0.000628225664511040 , −0.0149191583816666 , −0.0173330476198441 , −0.00241913111656431 , 0.0170857469717131 , 0.0219853433326505 , 0.00494314955013921 , −0.0202135607663223 , −0.0290829581130326 , −0.00906400231248103 , 0.0253524397852957 , 0.0415520302556688 , 0.0169456680184316 , −0.0357791405085814 , −0.0701964896320970 , −0.0380790253759788 , 0.0706992962173007 , 0.212025413685468 , 0.311080374531698 , 0.311080374531698 , 0.212025413685468 , 0.0706992962173007 , −0.0380790253759788 , −0.0701964896320970 , −0.0357791405085814 , 0.0169456680184316 , 0.0415520302556688 , 0.0253524397852957 , −0.00906400231248103 , −0.0290829581130326 , −0.0202135607663223 , 0.00494314955013921 , 0.0219853433326505 , 0.0170857469717131 , −0.00241913111656431 , −0.0173330476198441 , −0.0149191583816666 , 0.000628225664511040 , 0.0140996759463997 , 0.0133928539479980 , 0.000545033179540466 , −0.0115476054492339 , −0.0121284783210541 , −0.00148642020812226 , 0.00959093793053663 , 0.0110228214924617 , 0.00218206710285855 , −0.00801343598147411 , −0.0101384594872478 , −0.00276553333129935 , 0.00663537257329624 , 0.00930515935892715 , 0.00318066264771145 , −0.00551018027357704 , −0.00859190550568147 , −0.00352821236062033 , 0.00451363728445482 , 0.00793164331287008 , 0.00377822815522018 , −0.00365448675729516 , −0.00732545571747670 , −0.00397370465004492 , 0.00292514060877247 , 0.00681159858309176 , 0.00427501542390626 , −0.00183460008632927 , −0.00514258174499917 , −0.00121520761894961 , 0.00990364860532624 , 0.0283906316756640 , 0.0664078872582807 , −0.0284167156414015}; 108 109

110 //En f u n k t i o n Som sk ö t e r AGC 111 void agc ( )

112 {

113 i n t N=20;

114 f l o a t e p s i l o n = 0 . 0 1 ; 115 f l o a t alpha0 =0;// − 0 . 0 7 ;

119 120 // f o r ( i =0; i <N; i ++) 121 // { 122 // s c a l i n g f a c t o r += input [ i ]* input [ i ] ; 123 // } 124 125 // s c a l i n g f a c t o r = s q r t ( s c a l i n g f a c t o r /N) ; 126 127 // Ber ä knar s k a l n i n g s f a k t o r n 128 s c a l i n g f a c t o r = s q r t ( ( ( s c a l i n g f a c t o r* s c a l i n g f a c t o r ) *N − ( input [N] * input [ N] ) + ( input [ 0 ]* input [ 0 ] ) ) /N) ; 129 130 // Ber ä knar u t s i g n a l e n

131 tempY = alpha0 + alpha1 * input [ 0 ] / ( s c a l i n g f a c t o r ) ; 132 133 // S k r i v e r ut u t s i g n a l e n och s k a l n i n g s f a k t o r n 134 // p r i n t f ( " U t s i g n a l e f t e r agc : %f \ n s k a l n i n g s f a k t o r : %f \n " , tempY , s c a l i n g f a c t o r ) ; 135 136 // d e l a y ( 1 0 0 ) ; 137 } 138 139

140 //En f u n k t i o n som anv ä nder FIR− f i l t r e r n a som f i n n s 141 f l o a t f i r (i n t* input , f l o a t* h ) 142 { 143 i n t i =0; 144 f l o a t yn = 0 ; 145 146 f o r ( i =0; i <106; ++ i ) 147 { 148 yn += input [ i ]* h [ i ] ; 149 } 150 p r i n t f (" FIR MEDEL: %f \n ", yn ) ; 151 r e t u r n yn ; 152 } 153 154 // Funktion som sk ö t e r s h i f t n i n g e n av i n s i g n a l e n 155 void s h i f t ( ) 156 { 157 i n t i =0; 158 f o r ( i =1000 −1; i >0; −− i ) 159 { 160 input [ i ]= input [ i − 1 ] ; 161 } 162 } 163 164 void p r i n t a r r a y (i n t * input , i n t l e n g t h ) 165 { 166 i n t i =0; 167 f o r ( i =0; i <l e n g t h ; ++ i ) 168 { 169 p r i n t f ("%d ", input [ i ] ) ; 170 } 171 }

A.1 Rasperry Pi-koden 49

172

173 // Funktion som r ä knar ut e t t g l i d a n d e medelv ä rde av N a n t a l smaples 174 void avrage ( ) 175 { 176 i n t i =0; 177 f l o a t avrage =0; 178 i n t N=100; 179 180 f o r ( i =0; i <N; ++ i ) 181 { 182 avrage+=input [ i ] ; 183 } 184 p r i n t f (" Medel : %f \n ", avrage /N) ; 185 // r e t u r n ( avrage /N) ; 186 } 187 188

189 i n t main (i n t argc , char * argv [ ] ) 190 {

191 i f ( a r g c != 2 ) 192 {

193 p r i n t f (" Too few arguments ! \ nChoose a f l a g between : \ n ") ; 194 usage ( ) ;

195 r e t u r n ( 0 ) ; 196 }

197 i n i t ( ) ; 198

199 while( ( a r g c > 1 ) && ( argv [ 1 ] [ 0 ] == ’ − ’) ) 200 { 201 s w i t c h( argv [ 1 ] [ 1 ] ) 202 { 203 c a s e ’ g ’: 204 p r i n t f ("%s \n ", &argv [ 1 ] [ 2 ] ) ; 205 i n t x = 1 , y = 1 0 ; 206 i n i t s c r ( ) ; 207 208 i f( h a s _ c o l o r s ( ) == FALSE ) 209 { 210 endwin ( ) ;

211 p r i n t f ("No Support f o r Le Colourz \n ") ; 212 e x i t ( 1 ) ; 213 } 214 215 s t a r t _ c o l o r ( ) ; 216 i n i t _ p a i r ( 1 , COLOR_RED, COLOR_BLACK) ; 217 i n i t _ p a i r ( 2 , COLOR_GREEN, COLOR_BLACK) ; 218 219 noecho ( ) ; 220 c u r s _ s e t ( f a l s e ) ; 221 mvprintw ( y , x ," # ") ; 222 223 i n t f i r s t = 1 ; 224 while( 1 ) 225 { 226 i f( f i r s t == 1 ) 227 { 228 y = 0 ; 229 x = 0 ;

233 mvprintw ( 0 , 0 ," 10 ") ; 234 mvprintw ( 1 , 0 ," 9 ") ; 235 mvprintw ( 2 , 0 ," 8 ") ; 236 mvprintw ( 3 , 0 ," 7 ") ; 237 mvprintw ( 4 , 0 ," 6 ") ; 238 mvprintw ( 5 , 0 ," 5 ") ; 239 mvprintw ( 6 , 0 ," 4 ") ; 240 mvprintw ( 7 , 0 ," 3 ") ; 241 mvprintw ( 8 , 0 ," 2 ") ; 242 mvprintw ( 9 , 0 ," 1 ") ; 243 mvprintw ( 1 0 , 0 ," 0 ") ; 244 f i r s t = 0 ; 245 a t t r o n (COLOR_PAIR ( 2 ) ) ; 246 } 247 248 r e f r e s h ( ) ; 249 d e l a y ( 3 0 0 ) ; 250 read ( ) ; 251 y = 9 − v al ue ; 252 x ++; 253 254 while( y < 10) 255 { 256 y ++; 257 mvprintw ( y , x , " # ") ; 258 } 259 i f( x == 75) 260 f i r s t = 1 ; 261 } 262 break; 263 c a s e ’ f ’: 264 p r i n t f ("%s \n ", &argv [ 1 ] [ 2 ] ) ; 265 266 while( 1 ) 267 { 268 read ( ) ; 269 avrage ( ) ; 270 agc ( ) ; 271 // S k r i v e r ut u t s i g n a l e n och s k a l n i n g s f a k t o r n 272 p r i n t f (" U t s i g n a l e f t e r agc : %f \ n s k a l n i n g s f a k t o r : %f \n ", tempY , s c a l i n g f a c t o r ) ; 273 p r i n t f (" \n ") ; 274 d e l a y ( 1 0 ) ; 275 } 276 break; 277 c a s e ’ d ’: 278 p r i n t f ("%s \n ", &argv [ 1 ] [ 2 ] ) ;

279 // Skapar f i l e r dä r det gå r a t t s p a r a vä rden 280 FILE* fd=NULL;

281 FILE* f i l _ i n p u t=NULL; 282 FILE* f i l _ s c a l i n g =NULL; 283

284 //Öppnar upp f i l e r n a f ö r s k r i v n i n g 285 fd = fopen ("Y_N=20. dat ", "w") ;

A.2 Körhandledning 51

Related documents