<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="mathml.xsl"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN" "http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg-flat.dtd" >
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">

<head>
<title>Data Analysis</title>
<link rel="stylesheet" type="text/css" href="styles.css" />
</head>

<body>


<h1>Obróka danych pomiarowych</h1>

<h2>Formaty danych</h2>

<p>Efektem prawie każdego doświadczenia w laboratorium IBW
są pliki z pomiarami. Program <tt>DAQUIS</tt> zapisuje pomierzone
wartości w plikach binarnych o formacie <tt>INT</tt>. Ten format
ma już ponad 20 lat i znacząco zmieniał się w przeciągu tych lat.
Istotą tego formatu było przechowywanie danych pomiarowych w formacie
danych dostarczanych przez kartę pomiarową. Jedyny
wyjątek dotyczył kart pomiarowych, które nie obsługiwały wartości
ze znakiem (w kodzie uzupełnienia do 2). Jeśli 12-bitowa karta pomiarowa
przekazywała wartości 0 do 4095 (np. dla napięć -5V od +5V) to program
odbierający dane z karty pomiarowej, odejmował od nich wartość 2048
i w pliku były zapisywane wartości w zakresie -2048 do 2047 w 16-bitowym
kodzie uzupełnienia do 2. Ostatnio została zakupiona 16-bitowa karta
pomiarowa firmy Advantech (PCI-1747U) i pliki pomiarowe INT zarejestrowane
tą kartą będą miały wartości w zakresie -32768 do 32767.</p>

<p>Wspólną cechą wszystkich formatów <tt>INT</tt> jest brak wartości czasu.
Te pliki zakładają stały krok czasowy a początek pomiaru zawsze w chwli
czasu t=0s. Każdy plik w format <tt>INT</tt> składa się z nagłówka i danych
pomiarowych. Pierwszy format <tt>INT</tt> miał bardzo prosty nagłówek:</p>

<table>
<tr><td>0</td><td>double</td><td>Fp</td><td>częstotliwość próbkowania w Hz</td></tr>
<tr><td>8</td><td>unsigned char</td><td>Type</td><td>znacznik typu pliku zawsze równy 0</td></tr>
<tr><td>9</td><td>unsigned char</td><td>Nc</td><td>liczba pomierzonych kanałów</td></tr>
<tr><td>10</td><td>unsigned int</td><td>Ns</td><td>liczba pomierzonych próbek w każdym kanale</td></tr>
<tr><td>14</td><td>16 x double</td><td>Fact</td><td>16 współczyników kalibracyjnych (po jednym na kanał)</td></tr>
</table>

<p>Potem następują dane pomiarowe: kanał pierwszy od próbki pierwszej do Ns-tej, kanał drugi od próbki
1 do N-tej itd. aż do kanału o numerze Nc. Każda próbka zajmowałą 2 bajty. Bardzo łatwo było oczacować
wielkość pliku w bajtach: 142 + 2*Nc*Ns. Wartość rzeczywistą pomierzonego parametry otrzymywało się
mnożąc wartość próbki przez współczynnik <tt>Fact</tt> w danym kanale. Teoretycznie ten format może
przechować 256 kanałów po 4294967296 próbek (plik miał by wielkość 2TB).</p>

<p>Następny format <tt>INT</tt> miał dane pomiarowe przechowywane w identyczny sposób. Zmienił
się tylko nagłówek. Zostały dodane nagłówki poszczególnych kanałów:</p>

<table>
<tr><td>0</td><td>double</td><td>Fp</td><td>częstotliwość próbkowania w Hz</td></tr>
<tr><td>8</td><td>unsigned char</td><td>Type</td><td>znacznik typu pliku zawsze równy 2</td></tr>
<tr><td>9</td><td>unsigned char</td><td>Nc</td><td>liczba pomierzonych kanałów</td></tr>
<tr><td>10</td><td>unsigned int</td><td>Ns</td><td>liczba pomierzonych próbek w każdym kanale</td></tr>
<tr><td>14</td><td>unsigned int</td><td>DateTime</td><td>zakodowana data i czas pomiaru z dokładnością do dwóch sekund</td></tr>
<tr><td>18</td><td>unsigned char</td><td>TitleLen</td><td>liczba znaków w tytule pomiary</td></tr>
<tr><td>19</td><td>60 x char</td><td>Title</td><td>tytuł pomiaru, niewykorzystane znaki mają wartość nieokreśloną</td></tr>
<tr><td>79</td><td>double</td><td>Fact(1)</td><td>współczynik kalibracyjnych pierwszego kanału</td></tr>
<tr><td>87</td><td>unsigned char</td><td>UnitLen(1)</td><td>liczba znaków w nazwie jednostki</td></tr>
<tr><td>88</td><td>7 x char</td><td>Unit(1)</td><td>nazwa jednostki</td></tr>
<tr><td>95</td><td>unsigned char</td><td>ChannelLen(1)</td><td>liczba znaków w nazwie kanałów</td></tr>
<tr><td>96</td><td>40 x char</td><td>Channel(1)</td><td>nazwa nakału</td></tr>
<tr><td>136</td><td>double</td><td>User1(1)</td><td>pierwszy parametr użytkownika</td></tr>
<tr><td>144</td><td>double</td><td>User2(1)</td><td>drugi parametr użytkownika</td></tr>
<tr><td>152</td><td>double</td><td>User3(1)</td><td>trzeci parametr użytkownika</td></tr>
<tr><td>160</td><td>double</td><td>User4(1)</td><td>czwarty parametr użytkownika</td></tr>
<tr><td>168</td><td>double</td><td>User5(1)</td><td>piąty parametr użytkownika</td></tr>
<tr><td>176</td><td>double</td><td>Fact(2)</td><td>współczynik kalibracyjnych drugiego kanału</td></tr>
<tr><td>184</td><td>unsigned char</td><td>UnitLen(2)</td><td>liczba znaków w nazwie jednostki</td></tr>
<tr><td>185</td><td>7 x char</td><td>Unit(2)</td><td>nazwa jednostki</td></tr>
<tr><td>192</td><td>unsigned char</td><td>ChannelLen(2)</td><td>liczba znaków w nazwie kanałów</td></tr>
<tr><td>193</td><td>40 x char</td><td>Channel(2)</td><td>nazwa nakału</td></tr>
<tr><td>233</td><td>double</td><td>User1(2)</td><td>pierwszy parametr użytkownika</td></tr>
<tr><td>241</td><td>double</td><td>User2(2)</td><td>drugi parametr użytkownika</td></tr>
<tr><td>249</td><td>double</td><td>User3(2)</td><td>trzeci parametr użytkownika</td></tr>
<tr><td>257</td><td>double</td><td>User4(2)</td><td>czwarty parametr użytkownika</td></tr>
<tr><td>265</td><td>double</td><td>User5(2)</td><td>piąty parametr użytkownika</td></tr>
<tr><td>273</td><td>double</td><td>Fact(3)</td><td>współczynik kalibracyjnych trzeciego kanału</td></tr>
<tr><td>...</td><td>...</td><td>...</td><td>...</td></tr>
</table>

<p>Potem następują dane pomiarowe: kanał pierwszy od próbki pierwszej do Ns-tej, kanał drugi od próbki
1 do N-tej itd. aż do kanału o numerze Nc. Każda próbka zajmowałą 2 bajty. Aby oczacować
wielkość pliku w bajtach należy wykonać działanie: 79 + 97*Nc + 2*Nc*Ns. Wartość rzeczywistą
pomierzonego parametry otrzymywało się mnożąc wartość próbki przez współczynnik <tt>Fact(i)</tt>
w danym kanale.</p>

<p>Krótko po opracowaniu tego formatu okazało się konieczne wzbogacenie współczynnika kalibracyjnego
o wartość stałego przesunięcia. Aby nie zmieniać nagłówka wykorzystano liczbę User1 na wartość
przesunięcia:</p>

<table>
<tr><td>0</td><td>double</td><td>Fp</td><td>częstotliwość próbkowania w Hz</td></tr>
<tr><td>8</td><td>unsigned char</td><td>Type</td><td>znacznik typu pliku zawsze równy 3</td></tr>
<tr><td>9</td><td>unsigned char</td><td>Nc</td><td>liczba pomierzonych kanałów</td></tr>
<tr><td>10</td><td>unsigned int</td><td>Ns</td><td>liczba pomierzonych próbek w każdym kanale</td></tr>
<tr><td>14</td><td>unsigned int</td><td>DateTime</td><td>zakodowana data i czas pomiaru z dokładnością do dwóch sekund</td></tr>
<tr><td>18</td><td>unsigned char</td><td>TitleLen</td><td>liczba znaków w tytule pomiary</td></tr>
<tr><td>19</td><td>60 x char</td><td>Title</td><td>tytuł pomiaru, niewykorzystane znaki mają wartość nieokreśloną</td></tr>
<tr><td>79</td><td>double</td><td>Fact(1)</td><td>współczynik kalibracyjnych pierwszego kanału</td></tr>
<tr><td>87</td><td>unsigned char</td><td>UnitLen(1)</td><td>liczba znaków w nazwie jednostki</td></tr>
<tr><td>88</td><td>7 x char</td><td>Unit(1)</td><td>nazwa jednostki</td></tr>
<tr><td>95</td><td>unsigned char</td><td>ChannelLen(1)</td><td>liczba znaków w nazwie kanałów</td></tr>
<tr><td>96</td><td>40 x char</td><td>Channel(1)</td><td>nazwa nakału</td></tr>
<tr><td>136</td><td>double</td><td>Const(1)</td><td>stałe przesunięcia dla kanału pierwszego</td></tr>
<tr><td>144</td><td>double</td><td>User1(1)</td><td>pierwszy parametr użytkownika</td></tr>
<tr><td>152</td><td>double</td><td>User2(1)</td><td>drugi parametr użytkownika</td></tr>
<tr><td>160</td><td>double</td><td>User3(1)</td><td>trzeci parametr użytkownika</td></tr>
<tr><td>168</td><td>double</td><td>User4(1)</td><td>czwarty parametr użytkownika</td></tr>
<tr><td>176</td><td>double</td><td>Fact(2)</td><td>współczynik kalibracyjnych drugiego kanału</td></tr>
<tr><td>184</td><td>unsigned char</td><td>UnitLen(2)</td><td>liczba znaków w nazwie jednostki</td></tr>
<tr><td>185</td><td>7 x char</td><td>Unit(2)</td><td>nazwa jednostki</td></tr>
<tr><td>192</td><td>unsigned char</td><td>ChannelLen(2)</td><td>liczba znaków w nazwie kanałów</td></tr>
<tr><td>193</td><td>40 x char</td><td>Channel(2)</td><td>nazwa nakału</td></tr>
<tr><td>233</td><td>double</td><td>Const(2)</td><td>stałe przesunięcia dla kanału drugiego</td></tr>
<tr><td>241</td><td>double</td><td>User1(2)</td><td>pierwszy parametr użytkownika</td></tr>
<tr><td>249</td><td>double</td><td>User2(2)</td><td>drugi parametr użytkownika</td></tr>
<tr><td>257</td><td>double</td><td>User3(2)</td><td>trzeci parametr użytkownika</td></tr>
<tr><td>265</td><td>double</td><td>User4(2)</td><td>czwarty parametr użytkownika</td></tr>
<tr><td>273</td><td>double</td><td>Fact(3)</td><td>współczynik kalibracyjnych trzeciego kanału</td></tr>
<tr><td>...</td><td>...</td><td>...</td><td>...</td></tr>
</table>

<p>Potem następują dane pomiarowe: kanał pierwszy od próbki pierwszej do Ns-tej, kanał drugi od próbki
1 do N-tej itd. aż do kanału o numerze Nc. Każda próbka zajmowałą 2 bajty. Aby oczacować
wielkość pliku w bajtach należy wykonać działanie: 79 + 97*Nc + 2*Nc*Ns. Wartość rzeczywistą
pomierzonego parametry otrzymywało się mnożąc wartość próbki przez współczynnik <tt>Fact(i)</tt>
i dodając wartość <tt>Const(i)</tt> w danym kanale.</p>

<p>W miarę rozwoju stanowisk pomiarowych okazało się, że zamiana kolejności próbek z danymi
okazała się uciążliwa i czasochłonna. Wszystkie karty pomiarowe przekazują próbki w kolejności
ich mierzenia, czyli <tt>Nc</tt> pomiarów w kolejnych kanałach, potem następna seria <tt>Nc</tt> pomiarów
w kolejnych kanałach i tak dalej aż do serii <tt>Ns</tt>. Tą zmianę kolejności można przyrównać
do transpozycji macierzy. W nagłówku pliku <tt>INT</tt> zmienił się
tylko znacznik typu:</p>

<table>
<tr><td>0</td><td>double</td><td>Fp</td><td>częstotliwość próbkowania w Hz</td></tr>
<tr><td>8</td><td>unsigned char</td><td>Type</td><td>znacznik typu pliku zawsze równy 4</td></tr>
<tr><td>9</td><td>unsigned char</td><td>Nc</td><td>liczba pomierzonych kanałów</td></tr>
<tr><td>10</td><td>unsigned int</td><td>Ns</td><td>liczba pomierzonych próbek w każdym kanale</td></tr>
<tr><td>14</td><td>unsigned int</td><td>DateTime</td><td>zakodowana data i czas pomiaru z dokładnością do dwóch sekund</td></tr>
<tr><td>18</td><td>unsigned char</td><td>TitleLen</td><td>liczba znaków w tytule pomiary</td></tr>
<tr><td>19</td><td>60 x char</td><td>Title</td><td>tytuł pomiaru, niewykorzystane znaki mają wartość nieokreśloną</td></tr>
<tr><td>79</td><td>double</td><td>Fact(1)</td><td>współczynik kalibracyjnych pierwszego kanału</td></tr>
<tr><td>87</td><td>unsigned char</td><td>UnitLen(1)</td><td>liczba znaków w nazwie jednostki</td></tr>
<tr><td>88</td><td>7 x char</td><td>Unit(1)</td><td>nazwa jednostki</td></tr>
<tr><td>95</td><td>unsigned char</td><td>ChannelLen(1)</td><td>liczba znaków w nazwie kanałów</td></tr>
<tr><td>96</td><td>40 x char</td><td>Channel(1)</td><td>nazwa nakału</td></tr>
<tr><td>136</td><td>double</td><td>Const(1)</td><td>stałe przesunięcia dla kanału pierwszego</td></tr>
<tr><td>144</td><td>double</td><td>User1(1)</td><td>pierwszy parametr użytkownika</td></tr>
<tr><td>152</td><td>double</td><td>User2(1)</td><td>drugi parametr użytkownika</td></tr>
<tr><td>160</td><td>double</td><td>User3(1)</td><td>trzeci parametr użytkownika</td></tr>
<tr><td>168</td><td>double</td><td>User4(1)</td><td>czwarty parametr użytkownika</td></tr>
<tr><td>176</td><td>double</td><td>Fact(2)</td><td>współczynik kalibracyjnych drugiego kanału</td></tr>
<tr><td>184</td><td>unsigned char</td><td>UnitLen(2)</td><td>liczba znaków w nazwie jednostki</td></tr>
<tr><td>185</td><td>7 x char</td><td>Unit(2)</td><td>nazwa jednostki</td></tr>
<tr><td>192</td><td>unsigned char</td><td>ChannelLen(2)</td><td>liczba znaków w nazwie kanałów</td></tr>
<tr><td>193</td><td>40 x char</td><td>Channel(2)</td><td>nazwa nakału</td></tr>
<tr><td>233</td><td>double</td><td>Const(2)</td><td>stałe przesunięcia dla kanału drugiego</td></tr>
<tr><td>241</td><td>double</td><td>User1(2)</td><td>pierwszy parametr użytkownika</td></tr>
<tr><td>249</td><td>double</td><td>User2(2)</td><td>drugi parametr użytkownika</td></tr>
<tr><td>257</td><td>double</td><td>User3(2)</td><td>trzeci parametr użytkownika</td></tr>
<tr><td>265</td><td>double</td><td>User4(2)</td><td>czwarty parametr użytkownika</td></tr>
<tr><td>273</td><td>double</td><td>Fact(3)</td><td>współczynik kalibracyjnych trzeciego kanału</td></tr>
<tr><td>...</td><td>...</td><td>...</td><td>...</td></tr>
</table>

<p>Potem następują dane pomiarowe: pierwsza seria pomiarów w kanałach od 1 do <tt>Nc</tt>, druga
seria pomiarów w kanałach od 1 do <tt>Nc</tt> itd. aż do serii o numerze <tt>Ns</tt>. Każda próbka
zajmowała 2 bajty. Aby oczacować wielkość pliku w bajtach należy wykonać działanie:
79 + 97*Nc + 2*Nc*Ns. Wartość rzeczywistą pomierzonego parametry otrzymywało się mnożąc wartość
próbki przez współczynnik <tt>Fact(i)</tt> i dodając wartość <tt>Const(i)</tt> w danym kanale.</p>

<p>Program pomiarowy <tt>DAQUIS</tt> zapisuje pliki pomiarowe wyłącznie w tym ostatnim formacie 
<tt>INT</tt>. Na potrzeby programu <tt>WINFI32</tt> zostały opracowane jeszcze dwa formaty danych.
Mimo, że mają one rozszerzenie <tt>INT</tt> to nie przechowują wartości typu całkowitego, a
wartości zmiennoprzecinkowe pojedynczej precyzji. W nagłówku pliku <tt>INT</tt> zmienił się
tylko znacznik typu oraz pola <tt>Frac(i)</tt> i <tt>Const(i)</tt>:</p>

<table>
<tr><td>0</td><td>double</td><td>Fp</td><td>częstotliwość próbkowania w Hz</td></tr>
<tr><td>8</td><td>unsigned char</td><td>Type</td><td>znacznik typu pliku zawsze równy 5</td></tr>
<tr><td>9</td><td>unsigned char</td><td>Nc</td><td>liczba pomierzonych kanałów</td></tr>
<tr><td>10</td><td>unsigned int</td><td>Ns</td><td>liczba pomierzonych próbek w każdym kanale</td></tr>
<tr><td>14</td><td>unsigned int</td><td>DateTime</td><td>zakodowana data i czas pomiaru z dokładnością do dwóch sekund</td></tr>
<tr><td>18</td><td>unsigned char</td><td>TitleLen</td><td>liczba znaków w tytule pomiary</td></tr>
<tr><td>19</td><td>60 x char</td><td>Title</td><td>tytuł pomiaru, niewykorzystane znaki mają wartość nieokreśloną</td></tr>
<tr><td>79</td><td>double</td><td>Fact(1)</td><td>współczynik kalibracyjnych pierwszego kanału zawsze równy 1.0</td></tr>
<tr><td>87</td><td>unsigned char</td><td>UnitLen(1)</td><td>liczba znaków w nazwie jednostki</td></tr>
<tr><td>88</td><td>7 x char</td><td>Unit(1)</td><td>nazwa jednostki</td></tr>
<tr><td>95</td><td>unsigned char</td><td>ChannelLen(1)</td><td>liczba znaków w nazwie kanałów</td></tr>
<tr><td>96</td><td>40 x char</td><td>Channel(1)</td><td>nazwa nakału</td></tr>
<tr><td>136</td><td>double</td><td>Const(1)</td><td>stałe przesunięcia dla kanału pierwszego zawsze równy 0.0</td></tr>
<tr><td>144</td><td>double</td><td>User1(1)</td><td>pierwszy parametr użytkownika</td></tr>
<tr><td>152</td><td>double</td><td>User2(1)</td><td>drugi parametr użytkownika</td></tr>
<tr><td>160</td><td>double</td><td>User3(1)</td><td>trzeci parametr użytkownika</td></tr>
<tr><td>168</td><td>double</td><td>User4(1)</td><td>czwarty parametr użytkownika</td></tr>
<tr><td>176</td><td>double</td><td>Fact(2)</td><td>współczynik kalibracyjnych drugiego kanału zawsze równy 1.0</td></tr>
<tr><td>184</td><td>unsigned char</td><td>UnitLen(2)</td><td>liczba znaków w nazwie jednostki</td></tr>
<tr><td>185</td><td>7 x char</td><td>Unit(2)</td><td>nazwa jednostki</td></tr>
<tr><td>192</td><td>unsigned char</td><td>ChannelLen(2)</td><td>liczba znaków w nazwie kanałów</td></tr>
<tr><td>193</td><td>40 x char</td><td>Channel(2)</td><td>nazwa nakału</td></tr>
<tr><td>233</td><td>double</td><td>Const(2)</td><td>stałe przesunięcia dla kanału drugiego zawsze równy 0.0</td></tr>
<tr><td>241</td><td>double</td><td>User1(2)</td><td>pierwszy parametr użytkownika</td></tr>
<tr><td>249</td><td>double</td><td>User2(2)</td><td>drugi parametr użytkownika</td></tr>
<tr><td>257</td><td>double</td><td>User3(2)</td><td>trzeci parametr użytkownika</td></tr>
<tr><td>265</td><td>double</td><td>User4(2)</td><td>czwarty parametr użytkownika</td></tr>
<tr><td>273</td><td>double</td><td>Fact(3)</td><td>współczynik kalibracyjnych trzeciego kanału zawsze równy 1.0</td></tr>
<tr><td>...</td><td>...</td><td>...</td><td>...</td></tr>
</table>

<p>Potem następują dane pomiarowe: pierwsza seria próbek w kanałach od 1 do <tt>Nc</tt>, druga
seria próbek w kanałach od 1 do <tt>Nc</tt> itd. aż do serii o numerze <tt>Ns</tt>. Każda próbka
zajmowała 4 bajty. Aby oczacować wielkość pliku w bajtach należy wykonać działanie:
79 + 97*Nc + 4*Nc*Ns. W tym pliku są przechowywane wartości rzeczywiste i nie trzeba ich
przez nic mnożyć i niczego dodawać.</p>

<p>Ostatni format <tt>INT</tt> różni się tylko o poprzedniego typem przechowywanych wartości.
zamiast liczb rzeczywistych pojedynczej precyzji przechowuje liczby zespolone pojedynczej
precyzji. W nagłówku pliku <tt>INT</tt> zmienił się tylko znacznik typu:</p>

<table>
<tr><td>0</td><td>double</td><td>Fp</td><td>częstotliwość próbkowania w Hz</td></tr>
<tr><td>8</td><td>unsigned char</td><td>Type</td><td>znacznik typu pliku zawsze równy 6</td></tr>
<tr><td>9</td><td>unsigned char</td><td>Nc</td><td>liczba pomierzonych kanałów</td></tr>
<tr><td>10</td><td>unsigned int</td><td>Ns</td><td>liczba pomierzonych próbek w każdym kanale</td></tr>
<tr><td>14</td><td>unsigned int</td><td>DateTime</td><td>zakodowana data i czas pomiaru z dokładnością do dwóch sekund</td></tr>
<tr><td>18</td><td>unsigned char</td><td>TitleLen</td><td>liczba znaków w tytule pomiary</td></tr>
<tr><td>19</td><td>60 x char</td><td>Title</td><td>tytuł pomiaru, niewykorzystane znaki mają wartość nieokreśloną</td></tr>
<tr><td>79</td><td>double</td><td>Fact(1)</td><td>współczynik kalibracyjnych pierwszego kanału zawsze równy 1.0</td></tr>
<tr><td>87</td><td>unsigned char</td><td>UnitLen(1)</td><td>liczba znaków w nazwie jednostki</td></tr>
<tr><td>88</td><td>7 x char</td><td>Unit(1)</td><td>nazwa jednostki</td></tr>
<tr><td>95</td><td>unsigned char</td><td>ChannelLen(1)</td><td>liczba znaków w nazwie kanałów</td></tr>
<tr><td>96</td><td>40 x char</td><td>Channel(1)</td><td>nazwa nakału</td></tr>
<tr><td>136</td><td>double</td><td>Const(1)</td><td>stałe przesunięcia dla kanału pierwszego zawsze równy 0.0</td></tr>
<tr><td>144</td><td>double</td><td>User1(1)</td><td>pierwszy parametr użytkownika</td></tr>
<tr><td>152</td><td>double</td><td>User2(1)</td><td>drugi parametr użytkownika</td></tr>
<tr><td>160</td><td>double</td><td>User3(1)</td><td>trzeci parametr użytkownika</td></tr>
<tr><td>168</td><td>double</td><td>User4(1)</td><td>czwarty parametr użytkownika</td></tr>
<tr><td>176</td><td>double</td><td>Fact(2)</td><td>współczynik kalibracyjnych drugiego kanału zawsze równy 1.0</td></tr>
<tr><td>184</td><td>unsigned char</td><td>UnitLen(2)</td><td>liczba znaków w nazwie jednostki</td></tr>
<tr><td>185</td><td>7 x char</td><td>Unit(2)</td><td>nazwa jednostki</td></tr>
<tr><td>192</td><td>unsigned char</td><td>ChannelLen(2)</td><td>liczba znaków w nazwie kanałów</td></tr>
<tr><td>193</td><td>40 x char</td><td>Channel(2)</td><td>nazwa nakału</td></tr>
<tr><td>233</td><td>double</td><td>Const(2)</td><td>stałe przesunięcia dla kanału drugiego zawsze równy 0.0</td></tr>
<tr><td>241</td><td>double</td><td>User2(2)</td><td>pierwszy parametr użytkownika</td></tr>
<tr><td>249</td><td>double</td><td>User3(2)</td><td>drugi parametr użytkownika</td></tr>
<tr><td>257</td><td>double</td><td>User4(2)</td><td>trzeci parametr użytkownika</td></tr>
<tr><td>265</td><td>double</td><td>User5(2)</td><td>czwarty parametr użytkownika</td></tr>
<tr><td>273</td><td>double</td><td>Fact(3)</td><td>współczynik kalibracyjnych trzeciego kanału zawsze równy 1.0</td></tr>
<tr><td>...</td><td>...</td><td>...</td><td>...</td></tr>
</table>

<p>Potem następują dane pomiarowe: pierwsza seria próbek w kanałach od 1 do <tt>Nc</tt>
(pary realis i imaginaris), druga seria próbek w kanałach od 1 do <tt>Nc</tt> (pary realis i
imaginaris) itd. aż do serii o numerze <tt>Ns</tt>. Każda próbka
zajmowała 8 bajtów. Aby oczacować wielkość pliku w bajtach należy wykonać działanie:
79 + 97*Nc + 8*Nc*Ns. W tym pliku są przechowywane wartości rzeczywiste i nie trzeba ich
przez nic mnożyć i niczego dodawać.</p>

<h2>Inne formaty danych</h2>

<p>Program <tt>WINFI32</tt> potrafi odczytać i zapisać jeszcze dwa inne formaty danych:
format tekstowy i format M11.</p>

<p>Format tekstowy jest to plik tekstowy z pomiarami zapisanymi w kolumnach.
W pierwszej kolumnie musi być zapisany czas, w drugiej i kolejnych, pomierzone
wartości. Separatorem kolumn musi być znak tabulatora. Liczby rzeczywiste muszą
mieć kropkę jako separator dziesiętny bez względu na bieżące ustawienia regionalne
w komputerze. Pierwsza kolumna (z czasem) w rzeczywistości nie jest czytana z wyjątkiem
dwóch pierwszych wartości. Ich rónica jest przyjmowana za krok czasowy i na tej podstawie
jest przyjmowana częstotliwość próbkowania. Liczby są traktowane jako liczby
rzeczywiste. Po przeczytaniu pliku, części urojone wszystkich liczb są równe zero.</p>

<p>Format pliku M11 jest potrzebny do generowania fali w kanale falowym. Tłok faloroba
jest sterowany przez program <tt>WS</tt>, który akceptuje tylko pliki w formacie M11.
Bufowa tego pliku jest rekordowa.Każdy rekord ma stałą długość 122 bajtów. Każdy rekord 
ma znacznik typu. Nagłówek pliku składa się z czterech rekordów o typach: 2, 5, 5, 0. 
Po nim następują po 3 rekordy opisujące każdy kanał (typy: 1, 3, 4). Na końcu są rekordy
z danymi (po 15 wartości w każdym rekordzie). Pliki sterujące ruchem tłoka muszą mieć
jeden kanał. Ogólna budowa rekordu jest następująca</p>

<table>
<tr><td>0</td><td>unsigned char</td><td>Type</td><td>znacznik typu rekordu</td></tr>
<tr><td>1</td><td>120 x unsigned char</td><td>Data</td><td>dane zależne od typu</td></tr>
<tr><td>121</td><td>unsigned char</td><td>End</td><td>znacznik końca rekordu zawsze równy 127</td></tr>
</table>

<p>Pierwszy rekord o typie 2 przechowuje informacje o długości pomiaru i kroku czasowym:</p>

<table>
<tr><td>0</td><td>unsigned char</td><td>Type</td><td>wartość 2</td></tr>
<tr><td>1</td><td>unsigned char</td><td></td><td>wartość 1</td></tr>
<tr><td>2</td><td>67 x unsigned char</td><td></td><td>zarezerwowane</td></tr>
<tr><td>69</td><td>unsigned char</td><td></td><td>wartość 2</td></tr>
<tr><td>70</td><td>11 x unsigned char</td><td></td><td>zarezerwowane</td></tr>
<tr><td>81</td><td>double</td><td>Ns</td><td>liczba próbek</td></tr>
<tr><td>89</td><td>double</td><td></td><td>wartość 0,0444375</td></tr>
<tr><td>97</td><td>double</td><td>t0</td><td>czas pierwszej pórbki w sekundach (powinno być 0.0)</td></tr>
<tr><td>105</td><td>double</td><td>dt</td><td>krok czasowy w sekundach</td></tr>
<tr><td>113</td><td>8 x unsigned char</td><td></td><td>zarezerwowane</td></tr>
<tr><td>121</td><td>unsigned char</td><td>End</td><td>wartość 127</td></tr>
</table>

<p>Drugi rekord o typie 5 przechowuje nazwę pomiaru:</p>

<table>
<tr><td>0</td><td>unsigned char</td><td>Type</td><td>wartość 5</td></tr>
<tr><td>1</td><td>68 x char</td><td>Name</td><td>nazwa pomiaru uzupełniona na końcu zerami</td></tr>
<tr><td>69</td><td>unsigned char</td><td></td><td>wartość 2</td></tr>
<tr><td>70</td><td>51 x unsigned char</td><td></td><td>zarezerwowane</td></tr>
<tr><td>121</td><td>unsigned char</td><td>End</td><td>wartość 127</td></tr>
</table>

<p>Trzeci rekord o typie 5 przechowuje nazwę jednostki czasu:</p>

<table>
<tr><td>0</td><td>unsigned char</td><td>Type</td><td>wartość 5</td></tr>
<tr><td>1</td><td>68 x char</td><td>Name</td><td>nazwa jednostki czasu uzupełniona na końcu zerami, powinno być "Sec"</td></tr>
<tr><td>69</td><td>unsigned char</td><td></td><td>wartość 2</td></tr>
<tr><td>70</td><td>51 x unsigned char</td><td></td><td>zarezerwowane</td></tr>
<tr><td>121</td><td>unsigned char</td><td>End</td><td>wartość 127</td></tr>
</table>

<p>Czwarty rekord o typie 0 przechowuje numer typu pliku i nazwę pomiaru:</p>

<table>
<tr><td>0</td><td>unsigned char</td><td>Type</td><td>wartość 0</td></tr>
<tr><td>1</td><td>unsigned short</td><td>Object</td><td>typ obiektu dla sterowania klapą musi być 30000</td></tr>
<tr><td>3</td><td>66 x char</td><td>Name</td><td>nazwa pomiaru uzupełniona na końcu zerami</td></tr>
<tr><td>69</td><td>unsigned char</td><td></td><td>wartość 2</td></tr>
<tr><td>70</td><td>51 x unsigned char</td><td></td><td>zarezerwowane</td></tr>
<tr><td>121</td><td>unsigned char</td><td>End</td><td>wartość 127</td></tr>
</table>

<p>Pierwszy rekord opisujący kanał o typie 1 przechowuje nazwę i statystykę sygnału
zapisanego w tym kanale:</p>

<table>
<tr><td>0</td><td>unsigned char</td><td>Type</td><td>wartość 1</td></tr>
<tr><td>1</td><td>unsigned short</td><td>Object</td><td>typ obiektu dla sterowania klapą musi być 30000</td></tr>
<tr><td>3</td><td>unsigned short</td><td></td><td>wartość 1</td></tr>
<tr><td>5</td><td>41 x char</td><td>Name</td><td>nazwa kanału uzupełniona na końcu zerami</td></tr>
<tr><td>46</td><td>double</td><td>Min</td><td>wartość minimalna</td></tr>
<tr><td>54</td><td>double</td><td>MinPos</td><td>numer próbki, która ma wartość minimalną</td></tr>
<tr><td>62</td><td>double</td><td>Max</td><td>wartość maksymalna</td></tr>
<tr><td>70</td><td>double</td><td>MaxPos</td><td>numer próbki, która ma wartość maksymalną</td></tr>
<tr><td>78</td><td>unsigned char</td><td></td><td>wartość 2</td></tr>
<tr><td>79</td><td>9 x unsigned char</td><td></td><td>zarezerwowane</td></tr>
<tr><td>88</td><td>double</td><td>Mean</td><td>wartość średnia</td></tr>
<tr><td>96</td><td>double</td><td>Var</td><td>wariancja</td></tr>
<tr><td>104</td><td>double</td><td>Acor</td><td>autokorelacja</td></tr>
<tr><td>112</td><td>9 x unsigned char</td><td></td><td>zarezerwowane</td></tr>
<tr><td>121</td><td>unsigned char</td><td>End</td><td>wartość 127</td></tr>
</table>

<p>Drugi rekord opisujący kanał o typie 2 jest niewykorzystany w plikach sterowania tłokiem:</p>

<table>
<tr><td>0</td><td>unsigned char</td><td>Type</td><td>wartość 2</td></tr>
<tr><td>1</td><td>77 x unsigned char</td><td></td><td>zarezerwowane</td></tr>
<tr><td>78</td><td>unsigned char</td><td></td><td>wartość 2</td></tr>
<tr><td>79</td><td>42 x unsigned char</td><td></td><td>zarezerwowane</td></tr>
<tr><td>121</td><td>unsigned char</td><td>End</td><td>wartość 127</td></tr>
</table>

<p>Trzeci rekord opisujący kanał o typie 3 przechowuje tylko skalę czasu:</p>

<table>
<tr><td>0</td><td>unsigned char</td><td>Type</td><td>wartość 3</td></tr>
<tr><td>1</td><td>double</td><td>TimeScale</td><td>skala czasu, zawsze powinno być 1.0</td></tr>
<tr><td>9</td><td>112 x unsigned char</td><td></td><td>zarezerwowane</td></tr>
<tr><td>121</td><td>unsigned char</td><td>End</td><td>wartość 127</td></tr>
</table>

<p>Rekordy z danymi mają typ 7:</p>

<table>
<tr><td>0</td><td>unsigned char</td><td>Type</td><td>wartość 3</td></tr>
<tr><td>1</td><td>15 x double</td><td>Data</td><td>15 kolejnych wartości sygnału</td></tr>
<tr><td>121</td><td>unsigned char</td><td>End</td><td>wartość 127</td></tr>
</table>


</body>
</html>


