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

This website uses cookies

Cookies ("cookies") consist of small text files. The text files contain data which is stored on your device. To be able to place some type of cookies we need your consent. We at Exobe AB, corporate identity number 556769-5605 use these types of cookies. To read more about which cookies we use and storage duration, click here to get to our cookiepolicy.

Manage your cookie-settings

Necessary cookies

Necessary cookies are cookies that need to be placed for fundamental functions on the website to work. Fundamental functions are for instance cookies that are needed for you to use menus and navigate the website.

Functional cookies

Functional cookies need to be placed for the website to perform in the way that you expect. For instance to remember which language you prefer, to know if you are logged in, to keep the website secure, remember login credentials or to enable sorting of products on the website in the way that you prefer.

Statistical cookies

To know how you interact with the website we place cookies to collect statistics. These cookies anonymize personal data.

Personalization cookies

In order to provide a better experiance we place cookies for your preferances

Ad measurement cookies

To be able to provide a better service and experience we place cookies to tailor marketing for you. Another purpose for this placement is to market products or services to you, give tailored offers or market and give recommendations on new concepts based on what you have bought from us previously.

Ad measurement user cookies

In order to show relevant ads we place cookies to tailor ads for you

Personalized ads cookies

To show relevant and personal ads we place cookies to provide unique offers that are tailored to your user data