Digital Signal Processing (DSP), feature extraction kalla det vad du vill, men en strömmad signal är inget vi kan använda rakt av som den är.

Låt mig försöka förklara, men innan jag går vidare så vill jag bara vara tydlig med att jag är 100% självlärd och ingen har heller någonsin kommenterat mina kunskaper så antiken är det jag skriver helt fel eller ganska nära sanningen. Nåväl det här är min historia låt oss fortsätta.

I vårat projekt har vi en accelerometer som ger ifrån sig en eller flera digitala strömmar. I detta fall ett flyttal som representerar negativ eller positiv g-kraft (eller liknande) som sensorn utsätt för. Talet läses av drygt 4000ggr per sekund och formar en signal. Tänk dig att sensorn sitter på en symaskinsnål då skulle signalen nästan likna en sinuskurva.

Problemet är att jag vill kunna ta ett prov/sampel skicka till en ML modell och få tillbaka ett svar. Min modell skulle kunna vara flera olika sensorvärden vid den givna tidpunkten men nu vill jag istället bara använda mig av en sensor. Stoppar jag tiden och ta ut det aktuella värdet skulle det kunna se ut såhär.

K1
0.43
0.42

4736-graph1-1672655423

Detta säger ingenting och kommer inte heller hjälpa varken mig eller en dator att förstå något om signalen. Jag måste alltså kolla på signalen över tid, jag skulle kunna göra det genom att skicka de 10 senaste värdena.

K1 K2 K3 K4 k10
0.43 0.42 0.41 0.39 -2
0.41 0.39 0.01 0.01 0.10

Men om jag bara skiftar inläsningen med ett steg så blir tabellen helt annorlunda, jag skulle kunna göra som jag gjorde I ett annat projekt där jag försökte hitta en start-bit och hela tiden utgå ifrån denna punkt. I det projektet analyserade jag en människas puls och signalen var mycket förutsägbar. Nu vet jag inte alls hur signalen ser ut och kan därför inte göra på detta sätt. Eller I alla fall inte lika kontrollerat, (kom ihåg även sånt som ser värdelöst ut kan vara användbart I en ML modell så varför inte använda båda). I fallet med pulsen tog jag ut Max och Min amplitud I varje hjärtslag samt tiden från max till min, min till max och tillbaka i den andra kammaren (eller vad som gör den lilla taggen I pulsen). Detta visade sig vara mycket effektivt och data modellen blev då tex.

MaxP1 MinP1 MaxP2 MinP2 T1 T2 T3
3.2 -2.1 2.2 -1.4 0.1 0.02 0.07
3.3 -2.0 2.2 -1.3 0.09 0.02 0.06

Men denna gång så har jag bestämt mig för att använda FFT (Fast Fourier transform). Teorin är att alla signaler kan skapas av att addera flera perfekta sinus kurvor I olika frekvenser. På samma sätt kan vi bryta ner en signal till vilka frekvenser dom består av. Man pratar om signalen som time-domain och det transformera resultatet som Frequency domain.

4736-graph2-1672655424

Det skulle ge en sinus på 50hz och 10amplitud en spik på 50e kolumnen. Eller en kombinerad signal som ovan skulle kunna se ut som följande. (fastna inte på siffrorna i tabellerna eller graferna dom är helt fiktiva och har inget med nått att göra).

4736-graph3-1672655425

K1 K2 K50 K500
0 9 10 0
0 9 10 0

Detta är något vi kan jobba vidare med. Nu när vi är nere på en frekvens domän som också kräver ett sample över tid så har vi redan data över tid I en rad, med flera features.

4736-graph4-1672655426
Men vi kan göra mer! Vi kan aggregera dessa samples över tid.

4736-graph5-1672655427

K1(n-x) K500(n-x)
0.2 50
K1(n-2) K500(n-2)
0.3 30
K1(n-1) K500(n-1)
0.1 60
K1(n) K500(n) KX1
(k1(n-1)+k1(n-2)+…k1(n-x))/x

Max över tid, snitt över tid, ackumulerat absolut värde över tid osv. Sky is the limit 🙂

Vi kan också minska antalet features till frekvensgrupper 0-10Hz 11-50Hz osv detta kan minska data kvalitén men och öka prestanda I form av träningstid, överföringshastighet mm. Det är en balans vi måste hitta.

Att komma ihåg här är att jag fick en 2D bil att ta kurvor själv med bara ett 20 tal features och kunde klassificera en pulsrytm typ 3 olika personer med 7 features.

Andra features som vi skulle kunna extrahera är majoritets- och minoritetsfrekvenser.

Ma1 Ma2 Ma3 Mi1 Mi2
50 49 48 1 972

Eftersom motorn snurrar i ca 6500rpm så borde vi få en likande frekvens rent naturligt. Tyvärr vet jag inte om sensorn är snabb nog att läsa va en så hög frekvens, dock skulle vi kunna läsa av varvtalet med en halleffekt sensor eller likande. Nåväl vi börjar såhär och skulle jag missat något, skriv i så fall en kommentar här på bloggen.

Men nu när vi har lite mer kött på benen, vart ska vi då göra all beräkning? Jag har faktiskt redan börjat göra den direkt på klienten (maskinen), dock anser jag att detta är fel och kommer med högsta sannolikhet bryta ut det till en Azure tjänst eller klass bibliotek som kan användas i stream analytics eller liknande tjänst. Givetvis finns det en god orsak. Om data transformeras innan den lämnar enheten är rådata förbrukad ifall den inte lagras dubbelt. Detta skulle betyda att vi kan behöva göra om mycket träning ifall vi väljer att processa signalen på annat vis.

Tanken är att flytta all logik till Azure för att sedan docker-paketera den och lyfta hem den till hårdvaran när allt är klart (IoT edge). Men om vi någonsin kommer dit vet jag inte.

Relaterade inlägg

Vill du vara säker på att inte missa något

Som du märker brinner vi för att dela med oss av våra erfarenheter, nyttiga lärdomar och spaningar ut i exosfären. Se till att följa vårt nyhetsbrev eller vårt flöde på Linkedin så du inte missar något.

Detta fält är dolt när formuläret visas

Denna webbplats använder cookies

Cookies ("kakor") består av små textfiler. Dessa innehåller data som lagras på din enhet. För att kunna placera vissa typer av cookies behöver vi inhämta ditt samtycke. Vi på Exobe AB, orgnr. 556769-5605 använder oss av följande slags cookies. För att läsa mer om vilka cookies vi använder och lagringstid, klicka här för att komma till vår cookiepolicy.

Hantera dina cookieinställningar

Nödvändiga cookies

Nödvändiga cookies är cookies som måste placeras för att grundläggande funktioner på webbplatsen ska kunna fungera. Grundläggande funktioner är exempelvis cookies som behövs för att du ska kunna använda menyer och navigera på sajten.

Funktionella cookies

Funktionella cookies behöver placeras för att webbplatsen ska kunna prestera som du förväntar dig, exempelvis så att den känner av vilket språk som du föredrar, för att känna av om du är inloggad, för att hålla webbplatsen säker, komma ihåg inloggningsuppgifter eller för att kunna sortera produkter på webbplatsen utefter dina preferenser.

Cookies för statistik

För att kunna veta hur du interagerar med webbplatsen placerar vi cookies för att föra statistik. Dessa cookies anonymiserar personuppgifter.

Cookies för personlig anpassning

För att ge dig en bättre upplevelse placerar vi cookies för dina preferenser

Cookies för annonsmätning

För att kunna erbjuda bättre service och upplevelse placerar vi cookies för att kunna anpassa marknadsföring till dig. Ett annat syfte med denna behandling är att kunna marknadsföra produkter eller tjänster till dig, ge anpassade erbjudanden eller marknadsföra och ge rekommendationer kring nya koncept utifrån vad du har köpt tidigare.

Cookies för personlig annonsmätning

För att kunna visa relevant reklam placerar vi cookies för att anpassa innehållet för dig

Cookies för anpassade annonser

För att visa relevanta och personliga annonser placerar vi cookies för att tillhandahålla unika erbjudanden som är skräddarsydda efter din användardata