Van een Garmin FIT-bestand met Matlab/Octave naar een grafische weergave in Excel of Calc?
Met veel dank aan @slow whoop voor zijn input, kritische feedback!
Inleiding
De aanleiding om met deze materie te beginnen na de aankoop van mijn nieuwe Garmin FR735XT in februari 2020, was het gebrek aan opties die mij aanspraken om op een PC de Garmin trainingsdata offline te bekijken van dit sporthorloge. De opties van een app op een tablet zijn vaak te beperkt. Vanaf ca 2008 Sportracks V2.0 (referentie 1) gewend, aangevuld met een compacte weeksamenvatting in Excel, een combi van het Word-log van mijn trainster van de wedstrijdgroep en het Haag atletiek logboek in Excel (referentie 2).
Dit offline gebrek aan data analyse is geen onbekend probleem en ook voor de duurzaamheid van veel spullen imho niet goed is omdat de online app zomaar kan verdwijnen of op den duur jouw horloge niet meer ondersteunt. Zoals bekend biedt Garmin Connect online maar een zeer beperkt aantal opties aan om je data eenvoudig, transparant offline nader te bekijken.
Namelijk:
1. De GPX-export met vnl. de route en een paar andere data (deze opsomming is niet compleet)
2. De TCX-export die ook niet alle parameters van de FR735XT bevat
3. De export als csv-bestand met een samenvatting van de geklokte rondjes met de gemiddelden van de meeste parameters zoals hartslag, contacttijd, etc. Een zeer beperkte export.
4. De export van de complete raw data als fit bestand: Dit bestand bevat alle data van het horloge zelf en van de eventuele verbonden HRM en kun je ook gedurende een bepaalde tijd van je sporthorloge downloaden.
Er is dus zonder additionele bewerking van het originele fit -bestand geen andere export die direct in bijvoorbeeld Excel een volwaardig alternatief voor het fit bestand kan zijn waarmee alle online grafieken relatief (!) eenvoudig tot stand komen. Je zou nog van elke online activiteit grafiek een pdf o.i.d. kunnen printen, maar die is niet erg handig om verder in de data te verdiepen en niet eenvoudig in een tool als Excel te verwerken (bijv met een image-to-Excel converter). De online plots hebben verder ook amper of geen ruimte naast de plots om aantekeningen te maken als je dat zou willen.
In dit forum onderdeel zijn al meerdere methodes voorbij gekomen om de ruwe data om te zetten in export data en daarmee zelf je grafieken te maken. Het zijn vooral @ToolkiT en @slow whoop die op verschillende manieren het onder de aandacht brachten, de laatste met een mooie plot om 2 methodes van hartslag metingen te vergelijken.
Bij mijn eigen zoektocht om het fit bestand naar voor bijvoorbeeld Excel leesbaar te maken ging eerst eigenlijk ook via het Python pad (referentie 5) en de andere route was de eerder genoemde Java tool FitCSVTool, waarbij in het begin de Python export route best redelijk was, maar waarbij ook nog redelijk wat handwerk nodig zou zijn geweest. Om dat in Excel te automatiseren … , bij gebrek aan voldoende VBA-programmeer ervaring... En ik heb nog heel kort naar FinalSurge https://finalsurge.com/apps gekeken, waar je als atleet een gratis account kunt krijgen. De plots zijn best goed, maar ook daar zijn er geen opties om een gedecodeerd fit bestand compleet in een voor Excel/Calc leesbaar format te exporteren.
Op een bepaald moment herinnerde me ik in dit forum topic iets over Matlab gelezen te hebben. Ik had zelf maar een klein beetje ervaring met Octave, de Open Source tegenhanger (referentie 6) van het commerciële Matlab, de meeste code daarvan werkt ook bij Octave. Ik werd toen echt nieuwsgierig op welke manier @slow whoop tot zijn resultaat gekomen was.
Het resultaat
In no time had ik een hele leuke reactie van @slow whoop en dat leidde al ras tot het delen van zijn Matlab-code. Het meeste was me wel duidelijk maar niet alles. Hij heeft me de nodige tips gegeven en door de interactie waar ik hem de geüpdate code terugstuurde kwam er ook weer aanvullende code in mijn richting naar mate het meer en meer duidelijk werd waar de kansen maximaal de data uit het fit-bestand te halen en hoe ze ook in Octave te plotten en hoe ook een acceptabele csv output voor een rechtstreeks import in Calc van Libre Office (LO, referentie 7) mogelijk werd en vervolgens voor Excel zonder te rommelen met de regio settings ook correct ingelezen kon worden.
Met de Octave code kunnen nu de volgende parameters direct geplot dan wel in een csv geëxporteerd worden.
:strip_exif()/f/image/6XnvoL9WGAGuyH2PDEukFbKq.jpg?f=fotoalbum_large)
Er ontbreken voor de FR735XT alleen nog de enhanced data van bepaalde parameters. Komt nog.
Dit zijn plots van de ruwe data uit de FIT geëxtraheerd in Octave en dus direct in een keer geplot. Er is verder geen enkele additionele filtering toegepast, ook nog geen omrekening naar minuten voor de x-as. Deze plots kun je ook apart weergeven door voor elke grafiek daar een Octave opdracht te geven. De plots verschijnen in een apart venster en zijn zonder nieuwe Octave code input niet te bewerken. Om bijvoorbeeld dus in te zoomen op een deel van de grafiek moet je dus de code aanpassen. Daar ligt mijn sterke kant (nog?) niet op het gebied van programmeren, dus was er toch een sterke wens om tot een bruikbare export te komen voor Calc (LO)/Excel. Deze export code is met behulp van @slow whoop tot stand gekomen, heb het in samenwerking met hem, verder geoptimaliseerd om tot een voor Calc acceptabele csv import te komen, zoals in het volgende plaatje te zien is.
:strip_exif()/f/image/XfcSlWtapQBz13oPvgz5kSOD.jpg?f=fotoalbum_large)
Ook dit zijn nog ruwe data, met een punt als decimaal teken, maar een regio-NL type Excel herkent dat automatisch als een komma.
Met deze data kun je nu in Excel/Calc heel eenvoudig alle plaatjes maken van de parameters uit het fit-bestand. Een indruk van de eerste grove verwerking, zonder een of ander filter, in Excel geplot (nog zonder cadence).
:strip_exif()/f/image/kEPOjHhhjAtZxKcY8ODznzjZ.jpg?f=fotoalbum_large)
Nabeschouwing
Ok, ik had wat valkuilen/problemen, o.a. zou de volgorde van het extraheren van de parameters het resultaat zou beïnvloedden? Soms leek dat zo, maar dan bleek er toch een mini syntax fout in de code te zitten. Alleen voor de “stance”-type data moet ik nog checken of er een einde tekst teken in de code moet komen, want daar leek de volgorde wel belangrijk te zijn. Kortom er valt nog wel een en ander te valideren, maar grosso modo mag er gesteld worden: Met de gebruikte combi van methodes/tools, Java/FitCSVTool/Octave of Matlab/Calc e/o Excel, blijkt het mogelijk om uit een Garmin-fit-bestand veel parameters tot een prettige data en grafische weergave te komen. We waren uiteindelijk beiden verrast hoe relatief “simpel” en relatief schoon de data eruit kwamen, zelfs zonder op de plots zelf enige additionele data filtering toe te passen.
Alhoewel ik nog bezig ben om in Excel of Calc te kijken wat nu de handige extra tools kunnen zijn om snel naast de grafieken zinvolle samenvattingen van typische onderdelen in de training te geven. Kun je binnen een serie meer zien aan de grond contacttijd dan alleen het gemiddelde, bijvoorbeeld een trend… Data die dan snel bij de grafiek gezet kunnen worden? Ben ook een beetje aan het rondkijken naar zoom tools voor de grafiek, zodat je met schuifjes even snel dat gebied beter kunt bekijken zonder iets met de data zelf te doen? En daar heel kort iets over vastleggen? Dat zoomen kan online ook, helaas niet even een notitie ernaast maken.
En als je dan wat verder gaat? Overlays van grafieken binnen een training… hartslag en contacttijd… zie je wat? Met een 2e Y-as zou je al best veel kunnen combineren.
Ergens daar gaat het voor mij ophouden, ik kan altijd offline bij de data, ze goed bekijken en waar nodig opmerkingen toevoegen en voor de lange termijn (hoop ik..) later heel eenvoudig historische data terughalen…… vergelijken… hmmmm dan ben ik al wellicht geen M60 meer…. Oef…
Oproep:
Leef je uit als je hier behoefte aan hebt. En deel hier vooral jouw ervaringen, additionele code, mooi tools en vul zelf maar verder in wat je graag zou willen delen.
Voor de Garmin Forerunner 645 kon @slow whoop zijn data voor zijn doel extraheren. Hoe breed de huidige code toe te passen is voor andere Garmins sporthorloges? De kans dat je code op onderdelen aan moet passen is realistisch. Probeer het gewoon met alleen tijd (timestamp) en hartslag (heartrate), pas de code aan, ook bij de plot en csv export. Grote kans dat je de systematiek wel door hebt in de code en post je ervaringen/problemen. Mijn ervaring met Octave was niet groot en toch kon ik zelf direct er heel veel aan/mee doen, de tips waren wel handig, vooral hoe je tot de export komt, maar nu die code er eenmaal is, lijkt het vooral een focus te worden om voor jou de juiste parameters uit het fit bestand te halen.
De code is vrij om te gebruiken, ik heb een (groot) deel ervan ook zo van @slow whoop gekregen. Bronvermelding van ons beiden zou netjes staan maar is niet verplicht.
Succes!
Route99 ook namens @slow whoop !
Overige referenties (laatst geraadpleegd 1 en 2 juli 2020):
1. SportTracks V2.0 https://www.dcrainmaker.c...t-tracks-20-released.html
(SportTracks heeft nog V3 gehad, maar is nu ook een online app)
2. Logboek 200x Haag Atletiek door Lodewijk van Dongen, genoemd op pagina 5 in https://www.yumpu.com/nl/...agse-bluf-haag-atletiek/4
3. Java https://www.java.com/nl/download/
4. https://www.dcrainmaker.com/analyzer
5. https://www.fitfiletools.com/#/top
6. Gebruikte Python route: https://github.com/dtcooper/python-fitparse
7. Octave https://www.gnu.org/software/octave/
8. LibreOffice (Calc) https://www.libreoffice.org/
De rest van de referenties is in de lopende tekst geplaatst (laatst geraadpleegd 1 en 2 juli 2020).
De code zie onder.
De code voor Matlab/Octave
Sla de code op in een fitnaam.m script bestand die zowel door Octave als Matlab gerund kan worden.
Pas in de code de fit bestandsnaam en pad naar fit-file en FitCSVTool.jar file aan. Bij mij stonden de systeem settings voor Java en Octave goed, wees alert dat dit een mogelijke extra foutenbron kan zijn.
Door de bestandsnaam van het fit bestand gelijk te houden voorkom je dat je telkens de code aan moet passen. Herbenoem de csv output want die wordt bij het weer runnen van het Octave-script overschreven door een fit bestand van een andere activiteit.
Zijn er Java problemen? Test deze code even apart in een Windows 10/7/? cmd-venster met het Java pad waar het Java-tool script EN de fit-file beiden staan.
Uit de foutmelding blijkt meestal wel wat er nog nodig is om het goed te krijgen.
Aanvullende links over tips voor de code van Matlab/Octave
Een centrale plaats voor weblinks die je bij het begrijpen/aanpassen van de code kunnen ondersteunen .
Algemeen
Met veel dank aan @slow whoop voor zijn input, kritische feedback!
Inleiding
De aanleiding om met deze materie te beginnen na de aankoop van mijn nieuwe Garmin FR735XT in februari 2020, was het gebrek aan opties die mij aanspraken om op een PC de Garmin trainingsdata offline te bekijken van dit sporthorloge. De opties van een app op een tablet zijn vaak te beperkt. Vanaf ca 2008 Sportracks V2.0 (referentie 1) gewend, aangevuld met een compacte weeksamenvatting in Excel, een combi van het Word-log van mijn trainster van de wedstrijdgroep en het Haag atletiek logboek in Excel (referentie 2).
Dit offline gebrek aan data analyse is geen onbekend probleem en ook voor de duurzaamheid van veel spullen imho niet goed is omdat de online app zomaar kan verdwijnen of op den duur jouw horloge niet meer ondersteunt. Zoals bekend biedt Garmin Connect online maar een zeer beperkt aantal opties aan om je data eenvoudig, transparant offline nader te bekijken.
Namelijk:
1. De GPX-export met vnl. de route en een paar andere data (deze opsomming is niet compleet)
2. De TCX-export die ook niet alle parameters van de FR735XT bevat
3. De export als csv-bestand met een samenvatting van de geklokte rondjes met de gemiddelden van de meeste parameters zoals hartslag, contacttijd, etc. Een zeer beperkte export.
4. De export van de complete raw data als fit bestand: Dit bestand bevat alle data van het horloge zelf en van de eventuele verbonden HRM en kun je ook gedurende een bepaalde tijd van je sporthorloge downloaden.
Er is dus zonder additionele bewerking van het originele fit -bestand geen andere export die direct in bijvoorbeeld Excel een volwaardig alternatief voor het fit bestand kan zijn waarmee alle online grafieken relatief (!) eenvoudig tot stand komen. Je zou nog van elke online activiteit grafiek een pdf o.i.d. kunnen printen, maar die is niet erg handig om verder in de data te verdiepen en niet eenvoudig in een tool als Excel te verwerken (bijv met een image-to-Excel converter). De online plots hebben verder ook amper of geen ruimte naast de plots om aantekeningen te maken als je dat zou willen.
In dit forum onderdeel zijn al meerdere methodes voorbij gekomen om de ruwe data om te zetten in export data en daarmee zelf je grafieken te maken. Het zijn vooral @ToolkiT en @slow whoop die op verschillende manieren het onder de aandacht brachten, de laatste met een mooie plot om 2 methodes van hartslag metingen te vergelijken.
- Het op Java gebaseerde fitsdk en een Python gebaseerde export worden hier genoemd: ToolkiT in "Het grote sporthorloge met GPS topic." https://github.com/dgaff/fitsdk en https://www.thisisant.com/resources/fit-sdk/
- en het Python script op https://bit.ly/38ux7oE
- Het resultaat van een Matlab presentatie methode na een Java tool FitCSVTool conversie. slow whoop in "Het grote sporthorloge met GPS topic." waar ook gebruik gemaakt wordt van SDK pakket. (Met nu een update van de dode link uit dat topic naar SDK https://www.thisisant.com/resources/fit-sdk/
Het doel was hier om via een zgn overlay grafiek de Optical Heart-Rate (OHR) van de Garmin Forerunner 645 en de hartslagband van Wahoo Tickr beter te kunnen vergelijken. Het resultaat liet zich beter in Matlab dan in Excel grafisch weergeven. Er was teveel handwerk nodig om dit in Excel mogelijk te maken.
Bij mijn eigen zoektocht om het fit bestand naar voor bijvoorbeeld Excel leesbaar te maken ging eerst eigenlijk ook via het Python pad (referentie 5) en de andere route was de eerder genoemde Java tool FitCSVTool, waarbij in het begin de Python export route best redelijk was, maar waarbij ook nog redelijk wat handwerk nodig zou zijn geweest. Om dat in Excel te automatiseren … , bij gebrek aan voldoende VBA-programmeer ervaring... En ik heb nog heel kort naar FinalSurge https://finalsurge.com/apps gekeken, waar je als atleet een gratis account kunt krijgen. De plots zijn best goed, maar ook daar zijn er geen opties om een gedecodeerd fit bestand compleet in een voor Excel/Calc leesbaar format te exporteren.
Op een bepaald moment herinnerde me ik in dit forum topic iets over Matlab gelezen te hebben. Ik had zelf maar een klein beetje ervaring met Octave, de Open Source tegenhanger (referentie 6) van het commerciële Matlab, de meeste code daarvan werkt ook bij Octave. Ik werd toen echt nieuwsgierig op welke manier @slow whoop tot zijn resultaat gekomen was.
Het resultaat
In no time had ik een hele leuke reactie van @slow whoop en dat leidde al ras tot het delen van zijn Matlab-code. Het meeste was me wel duidelijk maar niet alles. Hij heeft me de nodige tips gegeven en door de interactie waar ik hem de geüpdate code terugstuurde kwam er ook weer aanvullende code in mijn richting naar mate het meer en meer duidelijk werd waar de kansen maximaal de data uit het fit-bestand te halen en hoe ze ook in Octave te plotten en hoe ook een acceptabele csv output voor een rechtstreeks import in Calc van Libre Office (LO, referentie 7) mogelijk werd en vervolgens voor Excel zonder te rommelen met de regio settings ook correct ingelezen kon worden.
Met de Octave code kunnen nu de volgende parameters direct geplot dan wel in een csv geëxporteerd worden.
- timestamp
- distance
- altitude
- speed
- vertical_oscillation
- stance_time_percent
- stance_time
- vertical_ratio
- stance_time_balance
- step_length
- heart_rate
- cadence
:strip_exif()/f/image/6XnvoL9WGAGuyH2PDEukFbKq.jpg?f=fotoalbum_large)
Er ontbreken voor de FR735XT alleen nog de enhanced data van bepaalde parameters. Komt nog.
Dit zijn plots van de ruwe data uit de FIT geëxtraheerd in Octave en dus direct in een keer geplot. Er is verder geen enkele additionele filtering toegepast, ook nog geen omrekening naar minuten voor de x-as. Deze plots kun je ook apart weergeven door voor elke grafiek daar een Octave opdracht te geven. De plots verschijnen in een apart venster en zijn zonder nieuwe Octave code input niet te bewerken. Om bijvoorbeeld dus in te zoomen op een deel van de grafiek moet je dus de code aanpassen. Daar ligt mijn sterke kant (nog?) niet op het gebied van programmeren, dus was er toch een sterke wens om tot een bruikbare export te komen voor Calc (LO)/Excel. Deze export code is met behulp van @slow whoop tot stand gekomen, heb het in samenwerking met hem, verder geoptimaliseerd om tot een voor Calc acceptabele csv import te komen, zoals in het volgende plaatje te zien is.
:strip_exif()/f/image/XfcSlWtapQBz13oPvgz5kSOD.jpg?f=fotoalbum_large)
Ook dit zijn nog ruwe data, met een punt als decimaal teken, maar een regio-NL type Excel herkent dat automatisch als een komma.
Met deze data kun je nu in Excel/Calc heel eenvoudig alle plaatjes maken van de parameters uit het fit-bestand. Een indruk van de eerste grove verwerking, zonder een of ander filter, in Excel geplot (nog zonder cadence).
:strip_exif()/f/image/kEPOjHhhjAtZxKcY8ODznzjZ.jpg?f=fotoalbum_large)
Nabeschouwing
Ok, ik had wat valkuilen/problemen, o.a. zou de volgorde van het extraheren van de parameters het resultaat zou beïnvloedden? Soms leek dat zo, maar dan bleek er toch een mini syntax fout in de code te zitten. Alleen voor de “stance”-type data moet ik nog checken of er een einde tekst teken in de code moet komen, want daar leek de volgorde wel belangrijk te zijn. Kortom er valt nog wel een en ander te valideren, maar grosso modo mag er gesteld worden: Met de gebruikte combi van methodes/tools, Java/FitCSVTool/Octave of Matlab/Calc e/o Excel, blijkt het mogelijk om uit een Garmin-fit-bestand veel parameters tot een prettige data en grafische weergave te komen. We waren uiteindelijk beiden verrast hoe relatief “simpel” en relatief schoon de data eruit kwamen, zelfs zonder op de plots zelf enige additionele data filtering toe te passen.
Alhoewel ik nog bezig ben om in Excel of Calc te kijken wat nu de handige extra tools kunnen zijn om snel naast de grafieken zinvolle samenvattingen van typische onderdelen in de training te geven. Kun je binnen een serie meer zien aan de grond contacttijd dan alleen het gemiddelde, bijvoorbeeld een trend… Data die dan snel bij de grafiek gezet kunnen worden? Ben ook een beetje aan het rondkijken naar zoom tools voor de grafiek, zodat je met schuifjes even snel dat gebied beter kunt bekijken zonder iets met de data zelf te doen? En daar heel kort iets over vastleggen? Dat zoomen kan online ook, helaas niet even een notitie ernaast maken.
En als je dan wat verder gaat? Overlays van grafieken binnen een training… hartslag en contacttijd… zie je wat? Met een 2e Y-as zou je al best veel kunnen combineren.
Ergens daar gaat het voor mij ophouden, ik kan altijd offline bij de data, ze goed bekijken en waar nodig opmerkingen toevoegen en voor de lange termijn (hoop ik..) later heel eenvoudig historische data terughalen…… vergelijken… hmmmm dan ben ik al wellicht geen M60 meer…. Oef…
Oproep:
Leef je uit als je hier behoefte aan hebt. En deel hier vooral jouw ervaringen, additionele code, mooi tools en vul zelf maar verder in wat je graag zou willen delen.
Voor de Garmin Forerunner 645 kon @slow whoop zijn data voor zijn doel extraheren. Hoe breed de huidige code toe te passen is voor andere Garmins sporthorloges? De kans dat je code op onderdelen aan moet passen is realistisch. Probeer het gewoon met alleen tijd (timestamp) en hartslag (heartrate), pas de code aan, ook bij de plot en csv export. Grote kans dat je de systematiek wel door hebt in de code en post je ervaringen/problemen. Mijn ervaring met Octave was niet groot en toch kon ik zelf direct er heel veel aan/mee doen, de tips waren wel handig, vooral hoe je tot de export komt, maar nu die code er eenmaal is, lijkt het vooral een focus te worden om voor jou de juiste parameters uit het fit bestand te halen.
De code is vrij om te gebruiken, ik heb een (groot) deel ervan ook zo van @slow whoop gekregen. Bronvermelding van ons beiden zou netjes staan maar is niet verplicht.
Succes!
Route99 ook namens @slow whoop !
Overige referenties (laatst geraadpleegd 1 en 2 juli 2020):
1. SportTracks V2.0 https://www.dcrainmaker.c...t-tracks-20-released.html
(SportTracks heeft nog V3 gehad, maar is nu ook een online app)
2. Logboek 200x Haag Atletiek door Lodewijk van Dongen, genoemd op pagina 5 in https://www.yumpu.com/nl/...agse-bluf-haag-atletiek/4
3. Java https://www.java.com/nl/download/
4. https://www.dcrainmaker.com/analyzer
5. https://www.fitfiletools.com/#/top
6. Gebruikte Python route: https://github.com/dtcooper/python-fitparse
7. Octave https://www.gnu.org/software/octave/
8. LibreOffice (Calc) https://www.libreoffice.org/
De rest van de referenties is in de lopende tekst geplaatst (laatst geraadpleegd 1 en 2 juli 2020).
De code zie onder.
De code voor Matlab/Octave
Sla de code op in een fitnaam.m script bestand die zowel door Octave als Matlab gerund kan worden.
Pas in de code de fit bestandsnaam en pad naar fit-file en FitCSVTool.jar file aan. Bij mij stonden de systeem settings voor Java en Octave goed, wees alert dat dit een mogelijke extra foutenbron kan zijn.
Door de bestandsnaam van het fit bestand gelijk te houden voorkom je dat je telkens de code aan moet passen. Herbenoem de csv output want die wordt bij het weer runnen van het Octave-script overschreven door een fit bestand van een andere activiteit.
Zijn er Java problemen? Test deze code even apart in een Windows 10/7/? cmd-venster met het Java pad waar het Java-tool script EN de fit-file beiden staan.
code:
1
| java -jar FitCSVTool.jar -b filename.fit filename.csv |
Uit de foutmelding blijkt meestal wel wat er nog nodig is om het goed te krijgen.
Aanvullende links over tips voor de code van Matlab/Octave
Een centrale plaats voor weblinks die je bij het begrijpen/aanpassen van de code kunnen ondersteunen .
Algemeen
- Octave Index op alfabet: https://octave.org/doc/v5...-Index.html#Concept-Index
- Octave inhoudsopgave: https://octave.org/doc/v5.2.0/index.html#SEC_Contents
- Matlab startpagina: https://nl.mathworks.com/help/index.html?
- https://octave.org/doc/v5...Strings.html#index-regexp
- https://nl.mathworks.com/.../regular-expressions.html
Matlab:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
| clear; % Path to fit-file and FitCSVTool.jar file fit_file = 'C:\ACTIVITY\FitSDKRelease_21.32.00\FitSDKRelease_21.32.00\java\naam.fit'; fitcsvtool = 'C:\ACTIVITY\FitSDKRelease_21.32.00\FitSDKRelease_21.32.00\java\FitCSVTool.jar'; %% Convert fit-file to csv-file (system command) [ fit_file_folder, fit_file_name, fit_file_ext ] = fileparts( fit_file ); csv_file = fullfile( fit_file_folder, [ fit_file_name, '.csv' ] ); system_cmd = [ 'java -jar "', fitcsvtool, '" -b "', fit_file, '" "', csv_file, '"' ]; system( system_cmd ); %% Read csv-file line-by-line fid = fopen( csv_file ); k = 0; while ~feof(fid) k = k + 1; tline{k} = fgetl(fid); end fclose(fid); %% Find lines matching the regexp string m = 0; for k = 1:length(tline) raw{k} = regexp( tline{k}, 'timestamp,"(\d*)",s.*distance,"(\d*.\d*)",m.*altitude,"(\d*.\d*)",m.*speed,"(\d*.\d*)",m/s.*vertical_oscillation,"(\d*.\d*)",mm.*stance_time_percent,"(\d*.\d*)",percent.*stance_time,"(\d*.\d*)",ms.*vertical_ratio,"(\d*.\d*)",percent.*stance_time_balance,"(\d*.\d*)",percent.*step_length,"(\d*.\d*)",mm.*heart_rate,"(\d*)",bpm.*cadence,"(\d*)",rpm.', 'tokens' ); if ~isempty( raw{k} ) m = m + 1; timestamp(m) = str2double( raw{k}{1}{1} ); distance(m) = str2double( raw{k}{1}{2} ); altitude(m) = str2double( raw{k}{1}{3} ); speed(m) = str2double( raw{k}{1}{4} ); vertical_oscillation(m) = str2double( raw{k}{1}{5} ); stance_time_percent(m) = str2double( raw{k}{1}{6} ); stance_time(m) = str2double( raw{k}{1}{7} ); vertical_ratio(m) = str2double( raw{k}{1}{8} ); stance_time_balance(m) = str2double( raw{k}{1}{9} ); step_length(m) = str2double( raw{k}{1}{10} ); heart_rate(m) = str2double( raw{k}{1}{11} ); cadence(m) = str2double( raw{k}{1}{12} ); end end %% Write data to "clean" CSV-file header = { 'timestamp', 'distance', 'altitude', 'speed', 'vertical_oscillation', 'stance_time_percent', ... 'stance_time', 'vertical_ratio', 'stance_time_balance', 'step_length', 'heart_rate', 'cadence' }; alldata = [ timestamp-timestamp(1); distance; altitude; speed; vertical_oscillation; stance_time_percent; ... stance_time; vertical_ratio; stance_time_balance; step_length; heart_rate; cadence ]; csv_file_clean = fullfile( fit_file_folder, [ fit_file_name, '_clean.csv' ] ); fid = fopen( csv_file_clean, 'w' ); fprintf( fid,'%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s\n', header{1,:} ); fprintf( fid,'%d, %f, %f, %f, %f, %f, %f, %f, %f, %f, %d, %d\n', alldata ); fclose(fid); %% Plotjes figure(1); subplot(6,2,1); plot( timestamp - timestamp(1), distance ); xlabel('time (s)'); ylabel('distance (m)'); subplot(6,2,2); plot( timestamp - timestamp(1), altitude ); xlabel('time (s)'); ylabel('altitude (m)'); subplot(6,2,3); plot( timestamp - timestamp(1), speed ); xlabel('time (s)'); ylabel('speed (m/s)'); subplot(6,2,4); plot( timestamp - timestamp(1), vertical_oscillation ); xlabel('time (s)'); ylabel('vertical oscillation (mm)'); subplot(6,2,5); plot( timestamp - timestamp(1), stance_time_percent ); xlabel('time (s)'); ylabel('stance time percent (%)'); subplot(6,2,6); plot( timestamp - timestamp(1), stance_time ); xlabel('time (s)'); ylabel('stance time (ms)'); subplot(6,2,7); plot( timestamp - timestamp(1), vertical_ratio ); xlabel('time (s)'); ylabel('vertical ratio (%)'); subplot(6,2,8); plot( timestamp - timestamp(1), stance_time_balance ); xlabel('time (s)'); ylabel('stance time balance (%)'); subplot(6,2,9); plot( timestamp - timestamp(1), step_length ); xlabel('time (s)'); ylabel('step length (mm)'); subplot(6,2,10); plot( timestamp - timestamp(1), heart_rate ); xlabel('time (s)'); ylabel('heart rate (bpm)'); subplot(6,2,11); plot( timestamp - timestamp(1), cadence ); xlabel('time (s)'); ylabel('cadence (rpm)'); |
[ Voor 31% gewijzigd door route99 op 03-07-2020 10:09 . Reden: code verplaatst. editing daarvan door @slow whoop ook mogelijk ]