Read Physical and Raw Data from MDF Files
This example shows you how to read channel data from an MDF file as physical values and raw values.
Introduction to ASAM MDF Conversion Rules
According to the ASAM MDF standard, a data value encoded in the MDF channel is denoted as a raw value. It can be converted to a physical value with an engineering unit using a conversion rule. Conversion rules are the methods defined at the channel level to convert raw values to physical values.
ASAM MDF V4.2.0 supports the following conversion rules:
No Conversion
CC_Type 0: Identity (“1:1”) conversion
Value to Value Conversions
CC_Type 1: Linear conversion
CC_Type 2: Rational conversion formula
CC_Type 3: Algebraic conversion
CC_Type 4: Value to value tabular look-up with interpolation
CC_Type 5: Value to value tabular look-up without interpolation
CC_Type 6: Value range to value tabular look-up
Value to Text Conversions
CC_Type 7: Value to text/scale conversion tabular look-up
CC_Type 8: Value range to text/scale conversion tabular look-up
Text to Value Conversions
CC_Type 9: Text to value tabular look-up
Text to Text Conversions
CC_Type 10: Text to text tabular look-up
Other Conversion
CC_Type 11: Bitfield text table
The mdfRead
function by default reads physical values from an MDF file, but it also provides the capability to read raw values via the ReadRaw
option.
ReadRaw
isfalse
(default) — Apply all numeric and text conversions (CC_Type 1-10). All data are read as physical values.ReadRaw
istrue
— Do not apply any conversion. All data are read as raw values.
Note that if there is an identity conversion (CC_Type 0), or a none conversion (no conversion rule) in the channel, the data are read as raw values regardless of the ReadRaw
option specified.
View Channel Details
Use the mdfChannelInfo
function to view details about all the channels in MDF_Conversion_Example.mf4
. Specify the AdditionalMetadata
option as true
to include the additional metadata, which contains information about the raw data type in DataType
and NumBits
, as well as conversion rule in ConversionType
.
chanInfo = mdfChannelInfo("MDF_Conversion_Example.mf4", AdditionalMetadata=true)
chanInfo=6×25 table
Name GroupNumber GroupNumSamples GroupAcquisitionName GroupComment GroupSourceName GroupSourcePath DisplayName Unit Comment ExtendedNamePrefix SourceName SourcePath Type SyncType DataType NumBits ComponentType CompositionType ConversionType SourceComment SourceType SourceBusType SourceBusChannelNumber SourceSimulated
______________________________ ___________ _______________ _______________________ ____________ _______________________ _______________________ ___________ ___________ ___________ _______________________ _______________________ _______________________ ______________ ________ ___________________________ _______ _____________ _______________ ______________ _____________ ___________ _____________ ______________________ _______________
"Ambient temperature" 1 5 Signal with conversions <undefined> Signal with conversions Signal with conversions "" °F <undefined> <undefined> <undefined> <undefined> FixedLength None RealLittleEndian 64 None None Unspecified "" Unspecified Unspecified 0 false
"Engine temperature" 1 5 Signal with conversions <undefined> Signal with conversions Signal with conversions "" °C <undefined> <undefined> <undefined> <undefined> FixedLength None IntegerSignedLittleEndian 32 None None Linear "" Unspecified Unspecified 0 false
"Fault code" 1 5 Signal with conversions <undefined> Signal with conversions Signal with conversions "" <undefined> <undefined> <undefined> <undefined> <undefined> VariableLength None StringUTF8 64 None None TextToText "" Unspecified Unspecified 0 false
"Gear position" 1 5 Signal with conversions <undefined> Signal with conversions Signal with conversions "" <undefined> <undefined> <undefined> <undefined> <undefined> FixedLength None IntegerUnsignedLittleEndian 8 None None ValueToText "" Unspecified Unspecified 0 false
"Windshield wiper speed level" 1 5 Signal with conversions <undefined> Signal with conversions Signal with conversions "" <undefined> <undefined> <undefined> <undefined> <undefined> VariableLength None StringUTF8 64 None None TextToValue "" Unspecified Unspecified 0 false
"time" 1 5 Signal with conversions <undefined> Signal with conversions Signal with conversions "" s <undefined> Signal with conversions Signal with conversions Signal with conversions Master Time RealLittleEndian 64 None None Unspecified "" Tool None 0 false
Display only a few relevant variables in the returned table, including Name
, GroupNumber
, GroupNumSamples
, Unit
, DataType
, NumBits
, and ConversionType
.
chanInfo(:, ["Name", "GroupNumber", "GroupNumSamples", "Unit", "DataType", "NumBits", "ConversionType"])
ans=6×7 table
Name GroupNumber GroupNumSamples Unit DataType NumBits ConversionType
______________________________ ___________ _______________ ___________ ___________________________ _______ ______________
"Ambient temperature" 1 5 °F RealLittleEndian 64 Unspecified
"Engine temperature" 1 5 °C IntegerSignedLittleEndian 32 Linear
"Fault code" 1 5 <undefined> StringUTF8 64 TextToText
"Gear position" 1 5 <undefined> IntegerUnsignedLittleEndian 8 ValueToText
"Windshield wiper speed level" 1 5 <undefined> StringUTF8 64 TextToValue
"time" 1 5 s RealLittleEndian 64 Unspecified
Read Data from a Channel with Value to Value Conversion
The channel named "Engine temperature" contains Linear
conversion (CC_Type 1).
chanInfo.ConversionType(chanInfo.Name == "Engine temperature")
ans = ChannelConversionType enumeration Linear
Read data from "Engine temperature". By default, physical values of data type double
are returned.
engTempPhy = mdfRead("MDF_Conversion_Example.mf4", Channel="Engine temperature"); engTempPhy{1}
ans=5×1 timetable
time Engine temperature
________ __________________
0 sec 35
0.25 sec 35.556
0.5 sec 36.111
0.75 sec 36.667
1 sec 37.222
class(engTempPhy{1}.("Engine temperature"))
ans = 'double'
Set option ReadRaw
set to true
to read data from "Engine temperature" as raw values of data type int32
. The raw data type is defined in DataType
as IntegerSignedLittleEndian
(2) and NumBits
as 32.
engTempRaw = mdfRead("MDF_Conversion_Example.mf4", Channel="Engine temperature", ReadRaw=true); engTempRaw{1}
ans=5×1 timetable
time Engine temperature
________ __________________
0 sec 95
0.25 sec 96
0.5 sec 97
0.75 sec 98
1 sec 99
class(engTempRaw{1}.("Engine temperature"))
ans = 'int32'
Read Data from a Channel with Value to Text Conversion
The channel named "Gear position" contains ValueToText
conversion (CC_Type 7).
chanInfo.ConversionType(chanInfo.Name == "Gear position")
ans = ChannelConversionType enumeration ValueToText
Read data from "Gear position". By default, physical values of data type string
are returned.
gearPosPhy = mdfRead("MDF_Conversion_Example.mf4", Channel="Gear position"); gearPosPhy{1}
ans=5×1 timetable
time Gear position
________ _________________
0 sec "Gear position 2"
0.25 sec "Gear position 3"
0.5 sec "Invalid"
0.75 sec "Gear position 2"
1 sec "Gear position 1"
class(gearPosPhy{1}.("Gear position"))
ans = 'string'
Set option ReadRaw
set to true
to read data from "Gear position" as raw values of data type uint8
. The raw data type is defined in DataType
as IntegerUnsignedLittleEndian
(0) and NumBits
as 8.
gearPosRaw = mdfRead("MDF_Conversion_Example.mf4", Channel="Gear position", ReadRaw=true); gearPosRaw{1}
ans=5×1 timetable
time Gear position
________ _____________
0 sec 2
0.25 sec 3
0.5 sec 0
0.75 sec 2
1 sec 1
class(gearPosRaw{1}.("Gear position"))
ans = 'uint8'
Read Data from a Channel with No Conversion
The channel named "Ambient temperature" contains no conversion.
chanInfo.ConversionType(chanInfo.Name == "Ambient temperature")
ans = ChannelConversionType enumeration Unspecified
Read data from "Ambient temperature" both as physical values and raw values. Because the channel has no conversion, the returned physical values are identical to the returned raw values.
Note that the physical values have the same data type, double
, as the raw values. The raw data type is defined in DataType
as RealLittleEndian
(4) and NumBits
as 64.
ambTempPhy = mdfRead("MDF_Conversion_Example.mf4", Channel="Ambient temperature"); ambTempPhy{1}
ans=5×1 timetable
time Ambient temperature
________ ___________________
0 sec 81.7
0.25 sec 81.9
0.5 sec 82
0.75 sec 81.8
1 sec 81.9
class(ambTempPhy{1}.("Ambient temperature"))
ans = 'double'
ambTempRaw = mdfRead("MDF_Conversion_Example.mf4", Channel="Ambient temperature", ReadRaw=true); ambTempRaw{1}
ans=5×1 timetable
time Ambient temperature
________ ___________________
0 sec 81.7
0.25 sec 81.9
0.5 sec 82
0.75 sec 81.8
1 sec 81.9
class(ambTempRaw{1}.("Ambient temperature"))
ans = 'double'
Other Conversion Examples
Two other channels are present in the MDF file.
The channel named "Windshield wiper speed level" contains TextToValue
conversion (CC_Type 9).
chanInfo.ConversionType(chanInfo.Name == "Windshield wiper speed level")
ans = ChannelConversionType enumeration TextToValue
The channel named "Fault code" contains TextToText
conversion (CC_Type 10).
chanInfo.ConversionType(chanInfo.Name == "Fault code")
ans = ChannelConversionType enumeration TextToText
You can try reading data from these channels with different ReadRaw
options.