メインコンテンツ

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

多数のMDFファイルを扱うデータ解析アプリケーション

この例では、さまざまな駆動サイクルにわたって放電モード中の車両バッテリー電力を調査する方法を示します。この解析のデータは、MDF 形式の車両ログ ファイル セットに含まれています。この例では、車両のバッテリーが特定のモードにあることを「検出」できるメカニズムを構築する必要があります。私たちが実際に行っているのは、対象の信号 (この場合はバッテリー電源) が特定の基準を満たしているかどうかを決定するための検出器を構築することです。基準が満たされると、それを「イベント」と呼びます。その後、各イベントは時間制限を課すことによって「資格」が与えられます。つまり、イベントは少なくとも 5 秒間継続すると「適格」となります (このような適格性確認の手順は、ノイズを制限し、過渡現象を除去するのに役立ちます)。この例に示されているしきい値は説明のみを目的としています。

データソースの場所を設定する

解析するファイル セットの場所を定義します。

dataDir = '*.dat';

ファイルセット情報を取得する

解析するすべての MDF ファイルの名前を単一の cell 配列に取得します。

fileList     = dir(dataDir);
fileName     = {fileList(:).name}';
fileDir      = {fileList(:).folder}';
fullFilePath = fullfile(fileDir, fileName)
fullFilePath = 5×1 cell
    {'/tmp/Bdoc25a_2864802_1971459/tpcbc94420/vnt-ex86857001/ADAC.dat' }
    {'/tmp/Bdoc25a_2864802_1971459/tpcbc94420/vnt-ex86857001/ECE.dat'  }
    {'/tmp/Bdoc25a_2864802_1971459/tpcbc94420/vnt-ex86857001/HWFET.dat'}
    {'/tmp/Bdoc25a_2864802_1971459/tpcbc94420/vnt-ex86857001/SC03.dat' }
    {'/tmp/Bdoc25a_2864802_1971459/tpcbc94420/vnt-ex86857001/US06.dat' }

出力データ cell 配列を事前に割り当てる

cell 配列を使用して、各 MDF ファイルの対象となるイベント データを表すミニ テーブルのコレクションをキャプチャします。

numFiles = size(fullFilePath, 1);
eventSet = cell(numFiles, 1)
eventSet=5×1 cell array
    {0×0 double}
    {0×0 double}
    {0×0 double}
    {0×0 double}
    {0×0 double}

イベント検出とチャネル情報基準を定義する

chName = 'Power';         % Name of the signal of interest in the MDF files
thdValue = [5, 55];       % Threshold in KW
thdDuration = seconds(5); % Threshold for event qualification

各MDFファイルをループし、イベント検出関数を適用する

eventSet は、解析された各ファイルの概要テーブルを含む cell 配列です。このテーブルの cell 配列は、すべて同じ形式ですが各ミニテーブルの内容が個々の MDF ファイルに対応するミニテーブルのセットと考えることができます。

この例では、イベント検出器はイベントの開始時刻と終了時刻を報告するだけでなく、イベント自体に関するいくつかの説明的な統計も報告します。この種の集約とレポートは、検出およびトラブルシューティングのアクティビティに役立ちます。MDF ファイルのインターフェイスとデータ処理をより詳しく理解するには、この例の processMDF 関数を開いて調べてください。

データ処理は、各 MDF ファイルがアトミックに解析され、結果の cell 配列の独自のインデックスに返されるように記述されていることに注意してください。これにより、処理関数は parfor による並列計算機能を活用できるようになります。parfor と標準の for は出力の点では互換性がありますが、解析を完了するために必要な処理時間は異なります。並列コンピューティングを試すには、以下の for 呼び出しを parfor に変更して、この例を実行します。

for i = 1:numFiles
    eventSet{i} = processMDF(fullFilePath{i}, chName, thdValue, thdDuration);
end
eventSet{1}
ans=20×8 table
    FileName    EventNumber    EventDuration    EventStart    EventStop     MeanPower_KW    MaxPower_KW    MinPower_KW
    ________    ___________    _____________    __________    __________    ____________    ___________    ___________

    ADAC.dat        2            00:01:22       19.345 sec    101.79 sec       28.456           53.5              5   
    ADAC.dat        3            00:00:08       107.82 sec    116.36 sec       21.295           53.5           5.09   
    ADAC.dat        5            00:00:55        123.8 sec    179.67 sec       28.642           37.2           5.01   
    ADAC.dat        6            00:00:10       189.83 sec    200.36 sec       11.192           54.4            5.1   
    ADAC.dat        8            00:00:40        212.4 sec    252.79 sec       28.539           37.4           5.01   
    ADAC.dat        9            00:00:08       258.76 sec    267.37 sec       21.289           53.7           5.02   
    ADAC.dat        11           00:00:44       274.81 sec    319.79 sec       28.554           37.2           5.08   
    ADAC.dat        12           00:00:08       325.75 sec    334.37 sec       21.279           53.7           5.05   
    ADAC.dat        14           00:00:44       341.81 sec    386.79 sec       28.554           37.2           5.08   
    ADAC.dat        15           00:00:08       392.75 sec    401.37 sec       21.278           53.7           5.04   
    ADAC.dat        17           00:00:44       408.81 sec    453.67 sec       28.579           37.2           5.08   
    ADAC.dat        18           00:00:07       463.77 sec    471.37 sec       11.895         54.676           5.04   
    ADAC.dat        20           00:00:40       483.44 sec    523.79 sec       28.544         37.363         5.0682   
    ADAC.dat        21           00:00:08       529.75 sec    538.37 sec       21.279           53.7           5.05   
    ADAC.dat        23           00:00:44       545.81 sec    590.79 sec       28.553           37.2           5.08   
    ADAC.dat        24           00:00:08       596.75 sec    605.37 sec       21.279           53.7           5.05   
      ⋮

結果を連結する

cell 配列 eventSet の内容を 1 つのテーブルに結合します。これで、後続の解析にテーブル eventSummary を使用できるようになります。head 関数は、テーブル eventSummary の最初の 5 行を表示するために使用されます。

eventSummary = vertcat(eventSet{:});
disp(head(eventSummary, 5))
    FileName    EventNumber    EventDuration    EventStart    EventStop     MeanPower_KW    MaxPower_KW    MinPower_KW
    ________    ___________    _____________    __________    __________    ____________    ___________    ___________

    ADAC.dat         2           00:01:22       19.345 sec    101.79 sec       28.456          53.5              5    
    ADAC.dat         3           00:00:08       107.82 sec    116.36 sec       21.295          53.5           5.09    
    ADAC.dat         5           00:00:55        123.8 sec    179.67 sec       28.642          37.2           5.01    
    ADAC.dat         6           00:00:10       189.83 sec    200.36 sec       11.192          54.4            5.1    
    ADAC.dat         8           00:00:40        212.4 sec    252.79 sec       28.539          37.4           5.01    

要約結果を可視化して次のステップを決定する

イベント期間の概要をご覧ください。

histogram(eventSummary.EventDuration)
grid on
title 'Distribution of Event Duration'
xlabel 'Event Duration (minutes)'
ylabel 'Frequency'

Figure contains an axes object. The axes object with title Distribution of Event Duration, xlabel Event Duration (minutes), ylabel Frequency contains an object of type histogram.

次に、平均電力とイベント継続時間の関係を見てみましょう。

scatter(eventSummary.MeanPower_KW, minutes(eventSummary.EventDuration))
grid on
xlabel 'MeanPower(KW)'
ylabel 'Event Duration (minutes)'
title 'Mean Power vs. Event Duration'

Figure contains an axes object. The axes object with title Mean Power vs. Event Duration, xlabel MeanPower(KW), ylabel Event Duration (minutes) contains an object of type scatter.

興味のあるイベントを詳しく調べる

4 分以上続いたイベントを検査します。まず、関心のあるケースを見つけるためのマスクを作成します。msk は、テーブル eventSummary のどの行が指定された基準を満たすかを示す論理インデックスです。

msk = eventSummary.EventDuration > minutes(4);

指定された条件を満たすテーブル eventSummary の行を抽出し、結果を表示します。

eventOfInterest = eventSummary(msk, :);
disp(eventOfInterest)
    FileName     EventNumber    EventDuration    EventStart    EventStop     MeanPower_KW    MaxPower_KW    MinPower_KW
    _________    ___________    _____________    __________    __________    ____________    ___________    ___________

    HWFET.dat        18           00:04:43       297.22 sec    580.37 sec       12.275          30.2          5.0024   

このイベントをドライブサイクル全体の文脈で可視化する

MDF ファイルからデータを読み取るには、完全なファイル パスとファイル名が必要です。テーブル eventOfInterest にはファイル名が含まれています。これは、ファイル名を記録したためです。そのファイルへの完全なファイル パスがありません。この情報を取得するには、元のファイル名とパスのリストに集合論を少し適用します。まず、目的のファイルの完全なファイル パスを見つけます。

fileMsk = find(ismember(fileName, eventOfInterest.FileName))
fileMsk = 
3

mdfRead を使用して、MDF ファイルから目的のチャネル データを読み取ります。

data = mdfRead(fullFilePath{fileMsk}, Channel=chName)
data = 1×1 cell array
    {79176×1 timetable}

data{1}
ans=79176×1 timetable
            time           Power  
        _____________    _________

        0.0048987 sec            0
        0.0088729 sec            0
        0.01 sec                 0
        0.013223 sec             0
        0.016446 sec             0
        0.019668 sec             0
        0.02 sec                 0
        0.021658 sec      -2.4e-28
        0.023878 sec     -3.42e-15
        0.026098 sec     -1.04e-14
        0.027766 sec      -1.9e-14
        0.029433 sec     -3.14e-14
        0.03 sec         -3.66e-14
        0.031341 sec     -5.14e-14
        0.032681 sec     -6.92e-13
        0.034022 sec     -1.56e-12
      ⋮

カスタムプロット関数を使用して可視化する

カスタム プロット関数は、カプセル化と再利用に役立ちます。ドライブサイクル全体のコンテキストでイベントを可視化します。可視化がどのように作成されたかを理解するには、この例の eventPlotter 関数を開いて調べてください。

eventPlotter(data{1}, eventOfInterest)

Figure contains an axes object. The axes object with title HWFET.dat, xlabel Time (min), ylabel Power (KW) contains 2 objects of type line. One or more of the lines displays its values using only markers These objects represent Raw Signal, Event.