このページは機械翻訳を使用して翻訳されました。最新版の英語を参照するには、ここをクリックします。
多数の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'
次に、平均電力とイベント継続時間の関係を見てみましょう。
scatter(eventSummary.MeanPower_KW, minutes(eventSummary.EventDuration)) grid on xlabel 'MeanPower(KW)' ylabel 'Event Duration (minutes)' title 'Mean Power vs. Event Duration'
興味のあるイベントを詳しく調べる
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)