Home » Source Code » mocaptoolbox » readc3d.m

readc3d.m ( File view )

From:mocaptoolbox
  • By mountain 2013-11-27
  • View(s):18
  • Download(s):0
  • Point(s): 1
			function data =readc3d(fname,header)
% This function will read a .C3D file and output the data in a structured
% array
% data = readc3d(fname)
% fname = the c3d file and path (as a string) eg: 'c:\documents\myfile.c3d'
% data is a structured array
% 
% see also writec3d.m
%
% CAUTION: machinetype variable may not be correct for intel or MIPS C3D files.
% This m-file needs to be tested with C3D files of these types.
% This m-file was tested and passed with DEC (VAX PDP-11) C3D files
%
% CAUTION: only character, integer, and real numbers have been tested.
% see http://www.c3d.org/HTML/default.htm for information
%
% CAUTION: residuals of 3D data are not handled
%
%
%Created by JJ Loh  2006/09/10
%Departement of Kinesiology
%McGill University, Montreal, Quebec Canada
%
%updated by JJ loh 2008/03/08
%video channels can handle NaN's
%
%updated by JJ Loh 2008/04/10
%header can be outputed alone
% -------------------------------------------

mtype = getmachinecode(fname);
switch mtype
    case 84  %intel
        machinetype = 'ieee-le';
    case 85 %DEC (VAX PDP-11)
        machinetype = 'vaxd';
    case 86 %MIPS
        machinetype = 'ieee-be';
end
fid=fopen(fname,'r',machinetype);           % if "DEC" selected in export c3d options in IQ you will get an error, change to PC

%--------------------HEADER SECTION----------------------------------------
%  Reading record number of parameter section
pblock=fread(fid,1,'int8');         %getting the 512 block number where the paramter section is located block 1 = first 512 block of the file
fread(fid,1,'int8');           %code for a C3D file

%  Getting all the necessary parameters from the header record
%                                  word     description
H.ParamterBlockNum = pblock;
H.NumMarkers =fread(fid,1,'int16');             %2      number of markers
H.SamplesPerFrame =fread(fid,1,'int16');        %3      total number of analog measurements per video frame
H.FirstVideoFrame =fread(fid,1,'int16');        %4      # of first video frame
% H.EndVideoFrame =fread(fid,1,'int16');        %5      # of last video frame
H.EndVideoFrame =fread(fid,1,'uint16');         % ES: modified to unsigned (size problem large files)
H.MaxIntGap =fread(fid,1,'int16');              %6      maximum interpolation gap allowed (in frame)
H.Scale =fread(fid,1,'float32');                %7-8    floating-point scale factor to convert 3D-integers to ref system units
H.StartRecord =fread(fid,1,'int16');            %9      starting record number for 3D point and analog data
H.SamplesPerChannel =fread(fid,1,'int16');      %10     number of analog samples per channel
H.VideoHZ =fread(fid,1,'float32');              %11-12  frequency of video data
fseek(fid,2*148,'bof');                         %13-147 reserved for future use
H.LablePointer =fread(fid,1,'int16');           %label and range data pointer

if nargin == 2
    data = H;
    return
end

%---------------------PARAMETER SECTION-------------------------------------
fseek(fid,(pblock-1)*512,'bof');  %the start of the parameter block

%parameter header
fseek(fid,2,'cof');  %ignore the first two bytes of the header
numpblocks = fread(fid,1,'uint8'); %number of parameter blocks
processor = fread(fid,1,'uint8'); %processor type 84 = intel, 85 = DEC (VAX PDP-11), 86 = MIPS processor (SGI/MIPS)
switch processor
    case 84 %intel
        machinetype = 'ieee-le';
    case 85 %DEC (VAX PDP-11)
        machinetype = 'vaxd';
    case 86 %MIPS
        machinetype = 'ieee-be';
end
Pheader.NumberOfBlocks = numpblocks;
Pheader.MachineType = processor;
%getting group list
P = struct;
while 1
    numchar = fread(fid,1,'int8');                  %number of characters in the group name
    id = fread(fid,1,'int8');                       %group/parameter id
    gname = char(fread(fid,abs(numchar),'uint8')'); %group/parameter name

    if strcmp(gname,'EndVideoFrame')
        keyboard
    end
    
    
    index = ftell(fid);                             %this is the starting point for the offset
    nextgroup = fread(fid,1,'int16');               %nextgroup = offset to the next group/parameter
    if numchar < 0;                                 %a negative character length means the group is locked
        islock = 1;
    else
        islock = 0;
    end
    fld = [];                                   %fld = structured field to add to the output
    fld.id = id;                                %fld has fields id and description   
    fld.islock = islock;
    
    if id < 0                                       %groups always have id <0 parameters are always >0  
        dnum = fread(fid,1,'uint8');                %number of characters of the desctription
        desc = char(fread(fid,dnum,'uint8')');      %description of the group/parameter
        fld.description = desc;
        P.(gname)=fld;                              %add the field to the variable P
    else %it is a parameter
        dtype = fread(fid,1,'int8');                %what type of data -1 = char 1 = byte  2 = 16 bit integer 3 = 32 bit floating point
        numdim = fread(fid,1,'uint8');              %number of dimensions (0 to 7 dimensions)        
        fld.datatype = dtype;                       %data type of the parameter -1=character, 1=byte, 2=integer, 3= floting point, 4=real
        fld.numberDIM = numdim;                     %number of dimensions (0-7) 0 = scalar, 1=vector, 2=2D matrix,3=3D matrix,...etc 
        fld.DIMsize = fread(fid,numdim,'uint8');    %size of each dimension eg [2,3]= 2d matrix with 2 rows and 3 columns
        dsize = fld.DIMsize';                       %the fread function only reads row vectors
        
        if isempty(dsize)                           %if dsize is empty then we read a scalar
            dsize = 1;
        end            
        if length(dsize) > 2
            dsize = prod(dsize);                    %fread can only handle up to 2 dimensions
        end                                         %if it is greater than 2 dimensions, then just read all data in a single vector.

        switch dtype
            case -1 %character data
                pdata = char(fread(fid,dsize,'uint8'));
            case 1 %byte data  !!!Not tested
                pdata = fread(fid,dsize,'bit8');
            case 2 %16 bit integer
                if strcmp(gname,'FRAMES')
                    pdata = fread(fid,dsize,'uint16',machinetype); % ES: quick and dirty fix for invalid size problem
                else
                    pdata = fread(fid,dsize,'int16',machinetype);
                end
            case 3 %32 bit floating point
                pdata = fread(fid,dsize,'float32',machinetype);
            case 4 %REAL data
                pdata = fread(fid,dsize,'float32',machinetype);
        end
        dnum = fread(fid,1,'uint8');             %number of characters in the description
        desc = char(fread(fid,dnum,'uint8')');      %description string
        fld.description = desc;        
        fld.data = pdata;                            %add data to parameter structured var
        P = setparameter(P,gname,fld);              %add parameter to the appropriate group
    end
    if nextgroup == 0
        break
    end
    fseek(fid,index+nextgroup,'bof');               %go to next group/parameter.

end
data.Header = H;
data.ParameterHeader = Pheader;
data.Parameter = P;

%------------------------3D & Analog DATA SECTION----------------

%first position
fseek(fid,(data.Parameter.POINT.DATA_START.data-1)*512,'bof');
%Analogue data parameters
if isfield(data.Parameter,'ANALOG')
    numAnalogue = data.Parameter.ANALOG.USED.data;
    Alabels = cellstr(data.Parameter.ANALOG.LABELS.data');
    Ascale = data.Parameter.ANALOG.SCALE.data;
   Gscale = data.Parameter.ANALOG.GEN_SCALE.data;
    Aoffset = data.Parameter.ANALOG.OFFSET.data;
%   issigned = data.Parameter.ANALOG.FORMAT.data';            %comment 161, 162,163,164,166 if error
%     if strcmp(issigned,'SIGNED');
%         issigned = 1;
%     else
        issigned = 0;
%   end    



else
    numAnalogue = 0;
    Alabels = [];
    Ascale = [];
    Gscale = 
...
...
(Please download the complete source code to view)
			
...
Expand> <Close

Want complete source code? Download it here

Point(s): 1

Download
0 lines left, continue to read
Sponsored links

File list

Tips: You can preview the content of files by clicking file names^_^
Name Size Date
01.97 kB
License.txt15.84 kB2013-02-12|03:05
01.97 kB
01.97 kB
._License.txt313.00 B2013-02-12|03:05
MCT_manual_v1.4.pdf1.92 MB2013-02-12|04:00
._MCT_manual_v1.4.pdf82.00 B2013-02-12|04:00
01.97 kB
.DS_Store15.00 kB2013-02-11|04:26
01.97 kB
._.DS_Store193.00 B2013-02-11|04:26
contents.m3.85 kB2013-02-12|03:20
._contents.m171.00 B2013-02-12|03:20
Icon^M0.00 B2008-03-04|19:13
._Icon^M43.58 kB2008-03-04|19:13
mc2frontal.m2.02 kB2011-10-18|09:23
._mc2frontal.m82.00 B2011-10-18|09:23
mcanimate.m1.33 kB2011-10-18|09:04
._mcanimate.m266.00 B2011-10-18|09:04
mcbandpass.m3.49 kB2011-10-18|09:01
._mcbandpass.m82.00 B2011-10-18|09:01
mcboundrect.m1.74 kB2011-10-19|08:03
._mcboundrect.m82.00 B2011-10-19|08:03
mcc3d2tsv.m2.70 kB2012-04-16|05:29
._mcc3d2tsv.m82.00 B2012-04-16|05:29
mccenter.m804.00 B2011-10-17|11:55
._mccenter.m82.00 B2011-10-17|11:55
mcconcatenate.m2.70 kB2013-02-12|03:01
._mcconcatenate.m82.00 B2013-02-12|03:01
mccreateconnmatrix.m1.89 kB2011-10-19|09:00
._mccreateconnmatrix.m82.00 B2011-10-19|09:00
mccumdist.m1.17 kB2011-10-19|08:54
._mccumdist.m82.00 B2011-10-19|08:54
mccut.m698.00 B2011-10-18|08:26
._mccut.m82.00 B2011-10-18|08:26
mcdecompose.m1.58 kB2011-10-18|08:20
._mcdecompose.m82.00 B2011-10-18|08:20
mcdemo.m1.82 kB2011-10-14|09:29
._mcdemo.m82.00 B2011-10-14|09:29
mcdemo1.m4.13 kB2012-04-12|05:37
._mcdemo1.m82.00 B2012-04-12|05:37
mcdemo10.m2.27 kB2013-01-29|07:56
._mcdemo10.m82.00 B2013-01-29|07:56
mcdemo11.m1.87 kB2012-04-12|08:04
._mcdemo11.m167.00 B2012-04-12|08:04
mcdemo2.m2.27 kB2008-05-21|00:26
._mcdemo2.m193.00 B2008-05-21|00:26
mcdemo3.m3.46 kB2013-02-11|13:20
._mcdemo3.m82.00 B2013-02-11|13:20
mcdemo4.m3.09 kB2008-05-27|15:53
._mcdemo4.m193.00 B2008-05-27|15:53
mcdemo5.m4.13 kB2013-01-29|07:45
._mcdemo5.m82.00 B2013-01-29|07:45
mcdemo6.m1.28 kB2008-05-21|00:20
._mcdemo6.m82.00 B2008-05-21|00:20
mcdemo7.m1.38 kB2008-05-21|00:20
._mcdemo7.m82.00 B2008-05-21|00:20
mcdemo8.m2.17 kB2010-05-21|10:42
._mcdemo8.m82.00 B2010-05-21|10:42
mcdemo9.m2.86 kB2013-01-29|07:56
._mcdemo9.m82.00 B2013-01-29|07:56
mcdemodata.mat1.27 MB2012-04-16|04:59
._mcdemodata.mat82.00 B2012-04-16|04:59
mceigenmovement.m1.66 kB2011-10-18|08:18
._mceigenmovement.m82.00 B2011-10-18|08:18
mcfillgaps.m5.57 kB2011-10-18|08:15
._mcfillgaps.m167.00 B2011-10-18|08:15
mcfilteremg.m1.32 kB2011-10-18|09:43
._mcfilteremg.m82.00 B2011-10-18|09:43
mcgetmarker.m1.29 kB2013-02-11|04:25
._mcgetmarker.m82.00 B2013-02-11|04:25
mcgetmarkername.m582.00 B2011-10-17|11:43
._mcgetmarkername.m82.00 B2011-10-17|11:43
mcgetsegmpar.m2.73 kB2011-10-18|08:00
._mcgetsegmpar.m82.00 B2011-10-18|08:00
mchilbert.m1.01 kB2011-10-17|11:48
._mchilbert.m82.00 B2011-10-17|11:48
mchilberthuang.m1.43 kB2011-10-18|07:57
._mchilberthuang.m82.00 B2011-10-18|07:57
mcicaproj.m1.59 kB2011-10-18|07:54
._mcicaproj.m82.00 B2011-10-18|07:54
mcinitanimpar.m2.73 kB2011-11-01|11:54
._mcinitanimpar.m266.00 B2011-11-01|11:54
mcinitj2spar.m675.00 B2011-10-17|10:24
._mcinitj2spar.m82.00 B2011-10-17|10:24
mcinitm2jpar.m643.00 B2011-10-17|10:24
._mcinitm2jpar.m82.00 B2011-10-17|10:24
mcinitstruct.m3.75 kB2011-10-18|09:28
._mcinitstruct.m82.00 B2011-10-18|09:28
mcj2s.m2.20 kB2011-10-17|12:28
._mcj2s.m82.00 B2011-10-17|12:28
mckinenergy.m2.08 kB2011-12-12|04:04
._mckinenergy.m82.00 B2011-12-12|04:04
mckurtosis.m791.00 B2011-10-17|12:24
._mckurtosis.m82.00 B2011-10-17|12:24
mcm2j.m1.08 kB2011-10-17|12:28
._mcm2j.m82.00 B2011-10-17|12:28
mcmakedemoparams.m2.39 kB2008-05-13|14:29
._mcmakedemoparams.m82.00 B2008-05-13|14:29
mcmarkerdist.m763.00 B2011-10-17|12:29
._mcmarkerdist.m82.00 B2011-10-17|12:29
mcmean.m623.00 B2011-10-19|08:52
._mcmean.m82.00 B2011-10-19|08:52
mcmerge.m14.48 kB2013-02-12|02:57
._mcmerge.m82.00 B2013-02-12|02:57
mcmissing.m936.00 B2011-10-18|07:41
._mcmissing.m82.00 B2011-10-18|07:41
mcmocapgram.m1.89 kB2013-02-01|16:12
._mcmocapgram.m338.00 B2013-02-01|16:12
mcnorm.m830.00 B2011-10-18|07:41
._mcnorm.m82.00 B2011-10-18|07:41
mcpcaproj.m2.76 kB2013-02-12|03:16
._mcpcaproj.m82.00 B2013-02-12|03:16
mcperiod.m3.21 kB2013-02-12|03:16
._mcperiod.m82.00 B2013-02-12|03:16
mcplotframe.m13.90 kB2013-02-10|11:58
._mcplotframe.m82.00 B2013-02-10|11:58
mcplotphaseplane.m3.38 kB2011-10-18|07:26
._mcplotphaseplane.m82.00 B2011-10-18|07:26
mcplottimeseries.m17.26 kB2013-01-29|08:36
._mcplottimeseries.m82.00 B2013-01-29|08:36
mcplottimeseries_dep.m6.72 kB2013-01-29|08:35
._mcplottimeseries_dep.m82.00 B2013-01-29|08:35
mcpotenergy.m1.69 kB2011-10-18|03:23
._mcpotenergy.m82.00 B2011-10-18|03:23
mcread.m2.44 kB2012-04-13|10:31
._mcread.m312.00 B2012-04-13|10:31
mcreademg.m1.71 kB2011-10-18|03:17
._mcreademg.m331.00 B2011-10-18|03:17
mcreorderdims.m678.00 B2011-10-18|03:04
._mcreorderdims.m82.00 B2011-10-18|03:04
mcresample.m951.00 B2011-10-17|13:01
._mcresample.m82.00 B2011-10-17|13:01
mcrotate.m2.50 kB2011-10-18|03:36
._mcrotate.m330.00 B2011-10-18|03:36
mcs2j.m1.41 kB2011-10-17|13:08
._mcs2j.m82.00 B2011-10-17|13:08
mcs2posture.m541.00 B2011-10-17|13:08
._mcs2posture.m82.00 B2011-10-17|13:08
mcsegmangle.m725.00 B2011-10-17|13:08
._mcsegmangle.m82.00 B2011-10-17|13:08
mcsethares.m3.93 kB2011-10-18|02:59
._mcsethares.m82.00 B2011-10-18|02:59
mcsetmarker.m3.03 kB2013-02-10|11:58
._mcsetmarker.m82.00 B2013-02-10|11:58
mcsimmat.m952.00 B2011-10-18|03:35
._mcsimmat.m82.00 B2011-10-18|03:35
mcskewness.m728.00 B2011-10-19|08:55
._mcskewness.m82.00 B2011-10-19|08:55
mcsmoothen.m3.43 kB2011-10-17|13:17
._mcsmoothen.m82.00 B2011-10-17|13:17
mcspectrum.m1.83 kB2011-10-18|02:53
._mcspectrum.m266.00 B2011-10-18|02:53
mcstatmoments.m707.00 B2011-10-19|08:56
._mcstatmoments.m82.00 B2011-10-19|08:56
mcstd.m649.00 B2011-10-19|08:55
._mcstd.m82.00 B2011-10-19|08:55
mctimeder.m6.67 kB2012-04-12|08:39
._mctimeder.m82.00 B2012-04-12|08:39
mctimeintegr.m1.59 kB2011-10-18|03:37
._mctimeintegr.m82.00 B2011-10-18|03:37
mctranslate.m761.00 B2011-10-17|13:24
._mctranslate.m82.00 B2011-10-17|13:24
mctrim.m2.00 kB2011-10-19|04:44
._mctrim.m82.00 B2011-10-19|04:44
mcvar.m629.00 B2011-10-19|08:56
._mcvar.m82.00 B2011-10-19|08:56
mcvect2grid.m1.38 kB2011-10-19|08:09
._mcvect2grid.m82.00 B2011-10-19|08:09
mcwindow.m3.32 kB2011-10-18|03:37
._mcwindow.m82.00 B2011-10-18|03:37
mcwritetsv.m2.27 kB2012-04-16|05:29
._mcwritetsv.m376.00 B2012-04-16|05:29
01.97 kB
.DS_Store6.00 kB2012-04-12|09:26
01.97 kB
._.DS_Store193.00 B2012-04-12|09:26
dir2quat.m568.00 B2008-01-17|18:16
._dir2quat.m193.00 B2008-01-17|18:16
initemptymc.mat127.62 kB2009-11-29|17:45
makecolumn.m257.00 B2007-09-11|13:58
mcica.m1.04 kB2010-05-07|03:59
._mcica.m193.00 B2010-05-07|03:59
mcpca.m829.00 B2008-12-10|13:09
._mcpca.m82.00 B2008-12-10|13:09
mcreadc3d.m1.21 kB2011-09-07|06:28
._mcreadc3d.m82.00 B2011-09-07|06:28
mcreadmat.m2.00 kB2011-09-07|06:26
._mcreadmat.m312.00 B2011-09-07|06:26
mcreadtsv.m3.50 kB2012-04-13|05:38
._mcreadtsv.m82.00 B2012-04-13|05:38
mcreadwii.m1.02 kB2011-09-07|06:26
._mcreadwii.m171.00 B2011-09-07|06:26
mypca.m507.00 B2008-10-21|15:46
._mypca.m82.00 B2008-10-21|15:46
qinv.m106.00 B2008-01-17|18:02
._qinv.m193.00 B2008-01-17|18:02
quatrot.m618.00 B2008-04-18|18:29
._quatrot.m193.00 B2008-04-18|18:29
readc3d.m12.15 kB2013-01-29|15:11
._readc3d.m341.00 B2013-01-29|15:11
readC3dIDL.m14.27 kB2009-11-30|03:02
smoothderiv.m390.00 B2006-05-21|13:26
._smoothderiv.m82.00 B2006-05-21|13:26
validfield.m464.00 B2007-04-30|11:04
._private193.00 B2013-01-31|03:26
._mocaptoolbox193.00 B2013-02-12|03:16
releasenotes_v1.4.txt5.74 kB2013-02-12|03:10
._releasenotes_v1.4.txt171.00 B2013-02-12|03:10
...
Sponsored links

readc3d.m (3.10 MB)

Need 1 point
Your Point(s)

Your Point isn't enough.

Get point immediately by PayPal

More(Debit card / Credit card / PayPal Credit / Online Banking)

Submit your source codes. Get more point

LOGIN

Don't have an account? Register now
Need any help?
Mail to: support@codeforge.com

切换到中文版?

CodeForge Chinese Version
CodeForge English Version

Where are you going?

^_^"Oops ...

Sorry!This guy is mysterious, its blog hasn't been opened, try another, please!
OK

Warm tip!

CodeForge to FavoriteFavorite by Ctrl+D