Sida 1 av 2
filtrera importerad fil i Matlab
Postat: 3 september 2005, 23:10:52
av fatpo83
Jag har nu lyckats komma igång med Matlab som skall användas till att analysera loggad data. Jag har ritat några grafert och dyl till att börja med.
Men jag märkte att logg-filen innehöll "sk*t"data, dvs. vissa siffror har bytts ut mot tecken som %,(,&,: osv. Säkerligen beror det på att jag inte kontroller om erhållit värde från COM porten är rätt, och hyperterminalen sparar ju allt som kommer till porten så...
Det skulle vara bra om man kunde ignorera dessa värden i matlab. Finns det något smidigt sätt? Jag kanske måste gå genom varje rad i filen och jämföra om det är en tal eller inte? Dock måste noteras att filen kommer att innållan flera 100k rader, är det nåt problem för Matlab?
För övrigt skickar PICen 10bitar till PCn.
Postat: 3 september 2005, 23:20:27
av strombom
du kan använda en texteditor med ersätt-funktion ...
jag skulle först kolla om serieporten verkligen tar emot rätt data, det ska ju inte bli några fel alls
Postat: 4 september 2005, 00:41:06
av simon78
om du kör windows installera cygwin. Sen kan du använda grep från matlab, typ
!grep -v [0-9] <felfil.txt >rättfil.txt
typ...
Postat: 4 september 2005, 00:41:44
av mullemeck
enklast skulle nog vara att skriva ett scrip som tar bort alla skräpvärden, alt ett litet console-baserat c++ program..
eller som strombom säger att se till att bara giltliga värden sparas.
Postat: 4 september 2005, 23:23:25
av fatpo83
Nu har jag skrivit ihop lite matlabkod som delvis fungerar:
Kod: Markera allt
clear all;
global arrays;
fid=fopen('fil.dat');
for i=1:100
tline = fgetl(fid);
if ~ischar(tline)
break
end
if str2num(tline)
arrays(i)=str2num(tline);
else
i=i-1;
end
end
fclose(fid);
arrays
Problemet är att den rad i filen som inte är ett "tal" inte ska skrivas i arrayen. Det skrivs inte heller men jag får '0' i den positionen. Jag har försökt minska 'i' med 1 men det hjälper inte, jag får fft '0'!
Exempel: Filen innehåller: "12,124,a12,012"
Jag får: "12,124,0,012"
Jag vill alltså få: "12,124,012"[/b]
Re: filtrera importerad fil i Matlab
Postat: 5 september 2005, 00:25:51
av Kaggen
fatpo83: "Men jag märkte att logg-filen innehöll "sk*t"data, dvs. vissa siffror har bytts ut mot tecken som %,(,&,: osv. Säkerligen beror det på att jag inte kontroller om erhållit värde från COM porten är rätt, och hyperterminalen sparar ju allt som kommer till porten så..."
Jag skulle nog vara supspekt inställd till alla värden (även till synes normala) om det kommer skräptecken emellanåt. Iaf om jag inte har full koll på vad det är för något "skräp".
fatpo83: "För övrigt skickar PICen 10bitar till PCn."
Hur kopplar du samman dessa värden då? Normalt får du ju in 8:a bitar per byte från serieporten. Skickas 10bitar in så hamnar väl de två sista i nästa byte (om inte du har nån specialhårdvarulösning). Detta skulle isåfall förklara "skräptecknen". Fast om dina värden skickas som ASCII-tecken och inte binärt så håller inte den teorin.
Mats
Postat: 5 september 2005, 13:43:36
av fatpo83
Kaggen jag samplar 10bitar men allt skickas som ASCII och tecken för tecken. Efter att ha skickat samplat värde görs en radbrytning. Värdet i sin helthet kan alltså innehålla "A123" eller "2&/9" etc. you get the point...
Postat: 5 september 2005, 14:37:45
av MicaelKarlsson
fatpo83 skrev:
Exempel: Filen innehåller: "12,124,a12,012"
Jag får: "12,124,0,012"
Jag vill alltså få: "12,124,012"[/b]
jag skulle lösa det på följande vis:
Lägg in ovanstående rad sist i din kod.
Postat: 5 september 2005, 23:06:47
av fatpo83
Nu får jag meddelandet "Not enough memory to read file contents". Filen är ca 2 meg och innehåller säkert minst 100k värden. Kan nån hjälpa mig??!?
MicaelKarlsson hur skulle du lösa mitt problem i Matlab? Jag menar, matlab borde ju greja det här....
Postat: 7 september 2005, 10:44:34
av MicaelKarlsson
Kan du skicka en exempelfil samt info om vad du vill få ut så kan jag göra ett försök.
E-post: micael.karlsson(at)home.se
Postat: 7 september 2005, 19:54:52
av fatpo83
Tjenare micke,
jag har löst problemet. Grejen är den att värdena i filen innehöll skräpvärden. Och dessa skräpvärden kunde då innehålla vad som helst. Jag la in några test variabler och märkte då att tex. ett värde innehöll ",", ".", ";" osv. vilket matlab inte gillar. Det resulterar ju att talet uppfattas som två olika tal, i kolumner och rader. Eftersom min array bara är en dimensionell så klagade matlab på detta.
Tack för alla svar![/b]
Postat: 8 september 2005, 13:04:38
av MicaelKarlsson
Joo, det har man ju råkat ut för x^y gånger, speciellt en gång när jag skulle läsa in värden från en fil skapad i LabView då blev det sannerligen skräpdata som kom ut

Postat: 8 september 2005, 21:58:43
av fatpo83
Förresten, har nån testat att koppla ett oscilloskop direkt till Matlab? Det finns väl såna funktioner har jag för mig...har ett digitalt oscilloskop som har en serie-utgång, man borde testa det nån gång

Postat: 9 september 2005, 15:13:49
av MicaelKarlsson
Låter spännande!
Glöm inte att berätta "alla smaskiga detaljer"

Postat: 9 september 2005, 16:48:28
av fatpo83
En snabb fråga bara Micke,
Hur resulterar med en "range" av en array i matlab? alltså jag vill ha en del utav en array. Typ: array[12 13 14 15 16 17], och jag vill ha från position 2 till 4, alltså 13,14,15...
Det måste väl finnas en sån funktion inbyggd i matlab, eller är det så att man måste göra en egen funktion för det?