メインコンテンツ

このページは機械翻訳を使用して翻訳されました。最新版の英語を参照するには、ここをクリックします。

MDF ファイルから有効性データを読み取る

この例では、前処理のために MDF ファイルから有効性データを読み取って使用する方法を示します。

妥当性情報の概要

ASAM MDF 規格によれば、「無効化ビット」は各レコードに少なくとも 1 バイトの追加バイトを必要とするオプションの機能であり、レコード内の信号値を「無効」としてマークするために使用されます。つまり、各チャネルの個々のサンプルには独自の無効化ビットがあります。

mdfRead 関数は、デフォルトで無効化ビットの逆である有効データを返します。つまり、ファイル内の無効化ビットが false としてマークされ、有効なサンプルを示している場合、mdfRead は対応する有効サンプルに対して true 値を返します。

mdfReadValidityRule 名前値引数は、有効性データの処理方法を制御します。

  • "ignore":有効性データを読み取りません。

  • "include" (デフォルト):有効性データを読み取り、timetable の Validity カスタム プロパティに保存します。

  • "replace":有効性データを読み取り、すべての無効なサンプルを MATLAB ® missing 値に置き換えます。(注: 整数チャネルは double に変換されます。

名前値引数なしで有効性データを読み取る

MDF ファイルからすべてのデータを読み取るには、入力引数としてファイル名のみを指定して mdfRead 関数を使用します。デフォルトでは、有効性データが読み取られ、返される timetable のカスタム プロパティに保存されます。各 timetable は特定のチャネル グループのデータに対応し、そのチャネル グループの有効性データを表す関連する timetable が含まれています。次の mdfRead 呼び出しは ValidityRule='include' を指定するのと同じです。

dataWithValidity = mdfRead("VehicleDataWithInvalidSamples.mf4")
Warning: mdfRead returned data that contains invalid samples in channel groups: 1, 2. Get validity data for a channel group from the timetable’s property Properties.CustomProperties.Validity.
dataWithValidity=2×1 cell array
    {100×2 timetable}
    {100×3 timetable}

chanGrp1Data = dataWithValidity{1}
chanGrp1Data=100×2 timetable
         time     Throttle    EngineRPM
        ______    ________    _________

        0 sec          50         0    
        1 sec      53.333         1    
        2 sec      56.667         2    
        3 sec          60         3    
        4 sec      63.333         4    
        5 sec      66.667         4    
        6 sec          70         6    
        7 sec      73.333         7    
        8 sec      76.667         8    
        9 sec          80         9    
        10 sec         80         9    
        11 sec         80         9    
        12 sec         80         9    
        13 sec         80         9    
        14 sec         80         9    
        15 sec         80         9    
      ⋮

mdfRead 呼び出しでスローされた警告は、チャネル グループ 1 と 2 の両方で返されたデータに無効なサンプルが含まれていることを示します。チャネル グループ 1 の有効性データを取得するには、timetable の Validity カスタム プロパティにアクセスします。データ timetable と有効期間 timetable が同じサイズであることに注意してください。有効期間テーブルの各論理値は、データ期間テーブル内の対応するサンプルの有効期間に対応します。

chanGrp1Validity = chanGrp1Data.Properties.CustomProperties.Validity
chanGrp1Validity=100×2 timetable
     time     Throttle    EngineRPM
    ______    ________    _________

    0 sec      true         true   
    1 sec      true         true   
    2 sec      true         true   
    3 sec      true         true   
    4 sec      true         true   
    5 sec      true         false  
    6 sec      true         true   
    7 sec      true         true   
    8 sec      true         true   
    9 sec      true         true   
    10 sec     false        false  
    11 sec     false        false  
    12 sec     false        false  
    13 sec     false        false  
    14 sec     false        false  
    15 sec     false        false  
      ⋮

有効性データを使用して、データ timetable を手動で前処理できます。たとえば、有効性データを使用して、無効なサンプルを含むチャネル グループのすべての行を削除できます。

validSampleRowsMask = all(chanGrp1Validity{:,:} == 1,2);
dataWithInvalidRowsRemoved = chanGrp1Data(validSampleRowsMask, :)
dataWithInvalidRowsRemoved=37×2 timetable
         time     Throttle    EngineRPM
        ______    ________    _________

        0 sec          50         0    
        1 sec      53.333         1    
        2 sec      56.667         2    
        3 sec          60         3    
        4 sec      63.333         4    
        6 sec          70         6    
        7 sec      73.333         7    
        8 sec      76.667         8    
        9 sec          80         9    
        31 sec     63.684        31    
        32 sec     59.474        32    
        33 sec     55.263        33    
        34 sec     51.053        34    
        35 sec     46.842        35    
        36 sec     42.632        36    
        37 sec     38.421        37    
      ⋮

有効性データを無視

解析に有効性データが必要ない場合にメモリと処理時間を節約するには、引数 ValidityRule="ignore" を使用します。

dataValidityIgnored = mdfRead("VehicleDataWithInvalidSamples.mf4", ValidityRule="ignore", GroupNumber=1)
dataValidityIgnored = 1×1 cell array
    {100×2 timetable}

timetable には Validity カスタム プロパティが含まれていないことに注意してください。

dataValidityIgnored{1}.Properties
ans = 
  TimetableProperties with properties:

             Description: ''
                UserData: []
          DimensionNames: {'time'  'Variables'}
           VariableNames: {'Throttle'  'EngineRPM'}
           VariableTypes: ["double"    "double"]
    VariableDescriptions: {'Throttle'  'EngineRPM'}
           VariableUnits: {'*10^2'  '*10^2'}
      VariableContinuity: []
                RowTimes: [100×1 duration]
               StartTime: 0 sec
              SampleRate: 1
                TimeStep: 1 sec
                  Events: [0×8 eventtable]
        CustomProperties: No custom properties are set.
      Use addprop and rmprop to modify CustomProperties.

"replace"で有効性データを読み取る

dataInvalidReplaced = mdfRead("VehicleDataWithInvalidSamples.mf4", ValidityRule="replace", GroupNumber=1)
dataInvalidReplaced = 1×1 cell array
    {100×2 timetable}

すべての無効なサンプルは missing 値に置き換えられました。たとえば、「EngineRPM」チャネルには t = 5 秒の無効なサンプルが含まれているため、値は NaN になります。

dataInvalidReplaced{1}
ans=100×2 timetable
         time     Throttle    EngineRPM
        ______    ________    _________

        0 sec          50          0   
        1 sec      53.333          1   
        2 sec      56.667          2   
        3 sec          60          3   
        4 sec      63.333          4   
        5 sec      66.667        NaN   
        6 sec          70          6   
        7 sec      73.333          7   
        8 sec      76.667          8   
        9 sec          80          9   
        10 sec        NaN        NaN   
        11 sec        NaN        NaN   
        12 sec        NaN        NaN   
        13 sec        NaN        NaN   
        14 sec        NaN        NaN   
        15 sec        NaN        NaN   
      ⋮

データの前処理

MATLAB は、fillmissing のような timetable 内の欠落値を処理するためのさまざまな関数を提供します。塗りつぶし方法が 'linear' に設定されたこの関数は、隣接する欠損していない値 (有効なサンプル) の線形補間を使用して、無効なサンプルに新しい値を設定します。

dataPreprocessed = fillmissing(dataInvalidReplaced{1}, 'linear')
dataPreprocessed=100×2 timetable
         time     Throttle    EngineRPM
        ______    ________    _________

        0 sec          50         0    
        1 sec      53.333         1    
        2 sec      56.667         2    
        3 sec          60         3    
        4 sec      63.333         4    
        5 sec      66.667         5    
        6 sec          70         6    
        7 sec      73.333         7    
        8 sec      76.667         8    
        9 sec          80         9    
        10 sec     82.149        10    
        11 sec     84.298        11    
        12 sec     86.447        12    
        13 sec     88.596        13    
        14 sec     90.746        14    
        15 sec     92.895        15    
      ⋮

プロプロセッシング データの詳細については、データ前処理 を参照してください。

スロットルチャネルの視覚的な比較

ファイル内に存在する元のデータと、無効なサンプルの新しい値で線形補間されたデータの両方について、時間チャネルに対して "Throttle" チャネルをプロットします。

subplot(2, 1, 1)
plot(chanGrp1Data.time, chanGrp1Data.Throttle, "r")
title("Throttle Signal as Represented in the File", "FontWeight", "bold")
xlabel("Timestamp")
ylabel("Throttle")
subplot(2, 1, 2)
plot(dataPreprocessed.time, dataPreprocessed.Throttle, "b")
title("Throttle Signal with Invalid Samples Replaced with Linearly Interpolated Values", "FontWeight", "bold")
xlabel("Timestamp")
ylabel("Throttle")

Figure contains 2 axes objects. Axes object 1 with title Throttle Signal as Represented in the File, xlabel Timestamp, ylabel Throttle contains an object of type line. Axes object 2 with title Throttle Signal with Invalid Samples Replaced with Linearly Interpolated Values, xlabel Timestamp, ylabel Throttle contains an object of type line.

まとめ

必要に応じて ValidityRule オプションを使用します。

  • 有効性データが解析に関係ない場合は、メモリと処理時間を節約するために「ignore」を使用します。

  • 無効なサンプルを手動で処理するには、「include」を使用します。

  • fillmissingrmmissing などの関数を使用して無効なサンプルを処理する場合は、便宜上「replace」を使用します。