Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

振動と電気信号を使用した、交流誘導モーターの破損した回転子の故障検出

この例では、交流誘導モーターにおける故障を検出する方法を説明します。通常、AC モーターは、三相電力コンバーターまたは産業用電源によって駆動されます。モーターの回転子バーの故障は、三相それぞれの電圧と電流、半径方向、軸方向、接線方向の加速度信号と速度信号など、システムから収集されたさまざまな電気信号および振動信号に現れる可能性があります。ここでは、これらの信号の一部を "診断特徴デザイナー" アプリで使用して特徴を抽出し、それを使ってモーターの破損した回転子バーの数を特定します。

データ セット

実験用ワークベンチは、負荷トルクをシミュレーションする発電機として機能する直流機に結合された三相誘導モーターで構成され、回転トルク メーターを含むシャフトで接続されています。ワークベンチ装置の詳細については、IEEE Broken Rotor Bar Database を参照してください。

データ セットには、図に示す実験装置を使用した三相誘導モーターの実験から得られた電気信号と機械信号が含まれています。

電気信号と振動信号は、次の健康状態と負荷状態でシステムから収集されました。

  • 健康状態として、0、1、2、3、および 4 の破損した回転子バー

  • 負荷状態として、0.5、1.0、1.5、2.0、2.5、3.0、3.5、および 4.0 Nm のトルク

健康状態と負荷状態の組み合わせごとに 10 回の実験を行いました。各実験では、以下の信号を取得しました。

  • 各相の電圧 (VaVbVc)

  • 各相の電流 (IaIbIc)

  • ハウジング (Vib carc) と底面 (Vib base) の接線方向の機械的振動速度

  • 駆動側の軸方向の機械的振動速度 (Vib axial)

  • 駆動側 (Vib acpi) と非駆動側 (Vib acpe) の半径方向の機械的振動速度

完全なデータ セットを使う場合は、IEEE Broken Rotor Bar Database のリンクからリポジトリ全体を ZIP ファイルとしてダウンロードし、このライブ スクリプトと同じディレクトリに保存します。

% Remove this comment when using the original data set.
% filename = "banco de dados experimental.zip";

あるいは、MathWorks リポジトリからデータ量を減らしたデータ セットを使用することもできます。このデータ セットには、動作状態ごとに 2 つの実験が含まれています。

% Comment out this section when using the original data set.
filename = "experimental_database_short.zip";
if ~exist(filename,'file')
  url = "https://ssd.mathworks.com/supportfiles/predmaint/broken-rotor-bar-fault-data/" + filename;
  websave(filename,url);
end

圧縮データ ファイルを現在のフォルダーに解凍します。

unzip(filename)

アンサンブル メンバー データの抽出

健康状態、負荷トルク、および実験指標のすべての組み合わせについて、元のモーター データ ファイルを個々のアンサンブル メンバー データ ファイルに変換します。ファイルはターゲット フォルダーに保存され、"診断特徴デザイナー" アプリの fileEnsembleDatastore オブジェクトでデータ処理と特徴抽出に使用されます。

アンサンブル データで使用する動作状態ごとの実験の量を変更できます。データ量を減らしたデータ セットを使用する場合は、2 つの実験を使用します。それ以外の場合は、最大 10 個まで使用できます。

numExperiments = 2; % Up to a maximum of 10 if using the original data set

元のデータ セットの解凍されたファイルは、さまざまな数の破損した回転子バーに関連付けられています。ブックキーピング変数を作成して、元のデータ ファイルを対応する破損した回転子バーの数に関連付けます。

% Names of the original data files restored from the zip archive.
files = [ ...
  "struct_rs_R1.mat", ...
  "struct_r1b_R1.mat", ...
  "struct_r2b_R1.mat", ...
  "struct_r3b_R1.mat", ...
  "struct_r4b_R1.mat", ...
  ];

% Rotor conditions (that is, number of broken bars) corresponding to original data files.
health = [
  "healthy", ...
  "broken_bar_1", ...
  "broken_bar_2", ...
  "broken_bar_3", ...
  "broken_bar_4", ...
  ];

Fs_vib = 7600; % Sampling frequency of vibration signals in Hz.
Fs_elec = 50000; % Sampling frequency of electrical signals in Hz.

次に生成するアンサンブル メンバー データ ファイルを格納するターゲット フォルダーを作成します。

folder = 'data_files';
if ~exist(folder, 'dir')
  mkdir(folder);
end

元のデータ ファイルを反復処理します。各ファイルは指定された数の破損した回転子バーに対応し、負荷と破損した回転子バーの数の組み合わせごとに個別のアンサンブル メンバー データ ファイルを作成します。

% Iterate over the number of broken rotor bars.
for i = 1:numel(health)
  fprintf('Processing data file %s\n', files(i))

  % Load the original data set stored as a struct.
  S = load(files(i));
  fields = fieldnames(S);
  dataset = S.(fields{1});

  loadLevels = fieldnames(dataset);
  % Iterate over load (torque) levels in each data set.
  for j = 1:numel(loadLevels)
    experiments = dataset.(loadLevels{j});
    data = struct;

    % Iterate over the given number of experiments for each load level.
    for k = 1:numExperiments
      signalNames = fieldnames(experiments(k));
      % Iterate over the signals in each experimental data set.
      for l = 1:numel(signalNames)
        % Experimental (electrical and vibration) data
        data.(signalNames{l}) = experiments(k).(signalNames{l});
      end

      % Operating conditions
      data.Health = health(i);
      data.Load = string(loadLevels{j});

      % Constant parameters
      data.Fs_vib = Fs_vib;
      data.Fs_elec = Fs_elec;

      % Save memberwise data.
      name = sprintf('rotor%db_%s_experiment%02d',  i-1, loadLevels{j}, k);
      fprintf('\tCreating the member data file %s.mat\n', name)
      filename = fullfile(pwd, folder, name);
      save(filename, '-v7.3', '-struct', 'data'); % Save fields as individual variables.
    end
  end
end
Processing data file struct_rs_R1.mat
	Creating the member data file rotor0b_torque05_experiment01.mat
	Creating the member data file rotor0b_torque05_experiment02.mat
	Creating the member data file rotor0b_torque10_experiment01.mat
	Creating the member data file rotor0b_torque10_experiment02.mat
	Creating the member data file rotor0b_torque15_experiment01.mat
	Creating the member data file rotor0b_torque15_experiment02.mat
	Creating the member data file rotor0b_torque20_experiment01.mat
	Creating the member data file rotor0b_torque20_experiment02.mat
	Creating the member data file rotor0b_torque25_experiment01.mat
	Creating the member data file rotor0b_torque25_experiment02.mat
	Creating the member data file rotor0b_torque30_experiment01.mat
	Creating the member data file rotor0b_torque30_experiment02.mat
	Creating the member data file rotor0b_torque35_experiment01.mat
	Creating the member data file rotor0b_torque35_experiment02.mat
	Creating the member data file rotor0b_torque40_experiment01.mat
	Creating the member data file rotor0b_torque40_experiment02.mat
Processing data file struct_r1b_R1.mat
	Creating the member data file rotor1b_torque05_experiment01.mat
	Creating the member data file rotor1b_torque05_experiment02.mat
	Creating the member data file rotor1b_torque10_experiment01.mat
	Creating the member data file rotor1b_torque10_experiment02.mat
	Creating the member data file rotor1b_torque15_experiment01.mat
	Creating the member data file rotor1b_torque15_experiment02.mat
	Creating the member data file rotor1b_torque20_experiment01.mat
	Creating the member data file rotor1b_torque20_experiment02.mat
	Creating the member data file rotor1b_torque25_experiment01.mat
	Creating the member data file rotor1b_torque25_experiment02.mat
	Creating the member data file rotor1b_torque30_experiment01.mat
	Creating the member data file rotor1b_torque30_experiment02.mat
	Creating the member data file rotor1b_torque35_experiment01.mat
	Creating the member data file rotor1b_torque35_experiment02.mat
	Creating the member data file rotor1b_torque40_experiment01.mat
	Creating the member data file rotor1b_torque40_experiment02.mat
Processing data file struct_r2b_R1.mat
	Creating the member data file rotor2b_torque05_experiment01.mat
	Creating the member data file rotor2b_torque05_experiment02.mat
	Creating the member data file rotor2b_torque10_experiment01.mat
	Creating the member data file rotor2b_torque10_experiment02.mat
	Creating the member data file rotor2b_torque15_experiment01.mat
	Creating the member data file rotor2b_torque15_experiment02.mat
	Creating the member data file rotor2b_torque20_experiment01.mat
	Creating the member data file rotor2b_torque20_experiment02.mat
	Creating the member data file rotor2b_torque25_experiment01.mat
	Creating the member data file rotor2b_torque25_experiment02.mat
	Creating the member data file rotor2b_torque30_experiment01.mat
	Creating the member data file rotor2b_torque30_experiment02.mat
	Creating the member data file rotor2b_torque35_experiment01.mat
	Creating the member data file rotor2b_torque35_experiment02.mat
	Creating the member data file rotor2b_torque40_experiment01.mat
	Creating the member data file rotor2b_torque40_experiment02.mat
Processing data file struct_r3b_R1.mat
	Creating the member data file rotor3b_torque05_experiment01.mat
	Creating the member data file rotor3b_torque05_experiment02.mat
	Creating the member data file rotor3b_torque10_experiment01.mat
	Creating the member data file rotor3b_torque10_experiment02.mat
	Creating the member data file rotor3b_torque15_experiment01.mat
	Creating the member data file rotor3b_torque15_experiment02.mat
	Creating the member data file rotor3b_torque20_experiment01.mat
	Creating the member data file rotor3b_torque20_experiment02.mat
	Creating the member data file rotor3b_torque25_experiment01.mat
	Creating the member data file rotor3b_torque25_experiment02.mat
	Creating the member data file rotor3b_torque30_experiment01.mat
	Creating the member data file rotor3b_torque30_experiment02.mat
	Creating the member data file rotor3b_torque35_experiment01.mat
	Creating the member data file rotor3b_torque35_experiment02.mat
	Creating the member data file rotor3b_torque40_experiment01.mat
	Creating the member data file rotor3b_torque40_experiment02.mat
Processing data file struct_r4b_R1.mat
	Creating the member data file rotor4b_torque05_experiment01.mat
	Creating the member data file rotor4b_torque05_experiment02.mat
	Creating the member data file rotor4b_torque10_experiment01.mat
	Creating the member data file rotor4b_torque10_experiment02.mat
	Creating the member data file rotor4b_torque15_experiment01.mat
	Creating the member data file rotor4b_torque15_experiment02.mat
	Creating the member data file rotor4b_torque20_experiment01.mat
	Creating the member data file rotor4b_torque20_experiment02.mat
	Creating the member data file rotor4b_torque25_experiment01.mat
	Creating the member data file rotor4b_torque25_experiment02.mat
	Creating the member data file rotor4b_torque30_experiment01.mat
	Creating the member data file rotor4b_torque30_experiment02.mat
	Creating the member data file rotor4b_torque35_experiment01.mat
	Creating the member data file rotor4b_torque35_experiment02.mat
	Creating the member data file rotor4b_torque40_experiment01.mat
	Creating the member data file rotor4b_torque40_experiment02.mat

ファイル アンサンブル データストアの構成

MAT ファイルに保存されたデータ用にファイル アンサンブル データストアを作成し、データストアからの読み取りとデータストアへの書き込みを行うようソフトウェアを操作する関数で構成します。

location = fullfile(pwd, folder);
ens = fileEnsembleDatastore(location,'.mat');

アンサンブル内のデータを操作するには、その前に、MATLAB ワークスペースに変数を読み取り、データをファイルに書き戻すためのデータ ファイルの処理方法をソフトウェアに指示する関数を作成しなければなりません。この例では、指定された以下の関数を使用します。

  • readMemberData — ファイルに保存されている要求された変数を抽出します。関数は、要求された各変数に対して 1 つの table 変数を含む table 行を返します。

  • writeMemberData — 構造体を受け入れて、その変数を個々の格納された変数としてデータ ファイルに書き込みます。

ens.ReadFcn = @readMemberData;
ens.WriteToMemberFcn = @writeMemberData;

最後に、データ変数、状態変数、読み取るために選択した変数を識別するようにアンサンブルのプロパティを設定します。これらの変数には、元のデータ セットには含まれず、readMemberData で指定および構築した変数が含まれています。バンドパス フィルター処理後の半径方向の振動信号 Vib_acpi_env と、一相電流信号のバンドパス フィルター処理後の包絡線スペクトル Ia_env_ps です。"診断特徴デザイナー" は、このような合成信号も読み取ることができます。

ens.DataVariables = [...
  "Va"; "Vb"; "Vc"; "Ia"; "Ib"; "Ic"; ...
  "Vib_acpi"; "Vib_carc"; "Vib_acpe"; "Vib_axial"; "Vib_base"; "Trigger"];
ens.ConditionVariables = ["Health"; "Load"];
ens.SelectedVariables = ["Ia"; "Vib_acpi"; "Health"; "Load"];

% Add synthetic signals and spectra generated directly in the readMemberData
% function.
ens.DataVariables = [ens.DataVariables; "Vib_acpi_env"; "Ia_env_ps"];
ens.SelectedVariables = [ens.SelectedVariables; "Vib_acpi_env"; "Ia_env_ps"];

アンサンブルを確認します。関数と変数名が適切なプロパティに割り当てられています。

ens
ens = 
  fileEnsembleDatastore with properties:

                 ReadFcn: @readMemberData
        WriteToMemberFcn: @writeMemberData
           DataVariables: [14×1 string]
    IndependentVariables: [0×0 string]
      ConditionVariables: [2×1 string]
       SelectedVariables: [6×1 string]
                ReadSize: 1
              NumMembers: 80
          LastMemberRead: [0×0 string]
                   Files: [80×1 string]

アンサンブルのメンバーを調べて、目的の変数が読み取られているか生成されていることを確認します。

T = read(ens)
T=1×6 table
            Ia                  Vib_acpi            Vib_acpi_env          Ia_env_ps         Health         Load   
    ___________________    __________________    __________________    ________________    _________    __________

    {50001×1 timetable}    {7601×1 timetable}    {7601×1 timetable}    {25001×2 double}    "healthy"    "torque05"

振動信号の 1 つである Vib_acpi のパワー スペクトルから、[900 1300] Hz 領域に対象の周波数成分があることがわかります。これらの成分は、readMemberData を使用してバンドパス フィルター処理された変数 (Vib_acpi_envIa_env_ps) を計算する主な理由です。

% Power spectrum of vibration signal, Vib_acpi
vib = T.Vib_acpi{1};
pspectrum(vib.Data, Fs_vib);
annotation("textarrow", [0.45 0.38], [0.65 0.54], "String", "Fault frequency region of interest")

バンドパス フィルター処理後の信号の包絡線から、システムの健全性に関連する動作を含む復調信号を明らかにできます。

% Envelop of vibration signal
y = bandpass(vib.Data, [900 1300], Fs_vib);
envelope(y)
axis([0 800 -0.5 0.5])

診断特徴デザイナー アプリへのデータのインポート

次のコマンドを使用して、"診断特徴デザイナー" アプリを開きます。

app = diagnosticFeatureDesigner;

その後、[新規セッション] ボタンをクリックし、リストから変数 ens を選択することで、ファイル アンサンブル データストアをアプリにインポートできます。

アプリで事前のデータを読み取ってから、新しい特徴やデータをアンサンブル メンバー ファイルに書き戻さない場合は、[ファイル アンサンブルへのデータの追加] オプションをオフにしてください。この例の小さいデータ セットを使用している場合は、新しい特徴を直接メモリ内で生成する方が速いため、このオプションをオフにしてください。

または、データ セット全体がコンピューター メモリに収まるほど小さい場合は、次のコマンドを使用して table オブジェクトに読み込み、そのテーブルをアプリに直接インポートできます。

% Working with in-memory data in the app. This may take a couple of minutes to
% run.
T = readall(ens)
T=80×6 table
            Ia                  Vib_acpi            Vib_acpi_env          Ia_env_ps         Health         Load   
    ___________________    __________________    __________________    ________________    _________    __________

    {50001×1 timetable}    {7601×1 timetable}    {7601×1 timetable}    {25001×2 double}    "healthy"    "torque05"
    {50001×1 timetable}    {7601×1 timetable}    {7601×1 timetable}    {25001×2 double}    "healthy"    "torque05"
    {50001×1 timetable}    {7601×1 timetable}    {7601×1 timetable}    {25001×2 double}    "healthy"    "torque10"
    {50001×1 timetable}    {7601×1 timetable}    {7601×1 timetable}    {25001×2 double}    "healthy"    "torque10"
    {50001×1 timetable}    {7601×1 timetable}    {7601×1 timetable}    {25001×2 double}    "healthy"    "torque15"
    {50001×1 timetable}    {7601×1 timetable}    {7601×1 timetable}    {25001×2 double}    "healthy"    "torque15"
    {50001×1 timetable}    {7601×1 timetable}    {7601×1 timetable}    {25001×2 double}    "healthy"    "torque20"
    {50001×1 timetable}    {7601×1 timetable}    {7601×1 timetable}    {25001×2 double}    "healthy"    "torque20"
    {50001×1 timetable}    {7601×1 timetable}    {7601×1 timetable}    {25001×2 double}    "healthy"    "torque25"
    {50001×1 timetable}    {7601×1 timetable}    {7601×1 timetable}    {25001×2 double}    "healthy"    "torque25"
    {50001×1 timetable}    {7601×1 timetable}    {7601×1 timetable}    {25001×2 double}    "healthy"    "torque30"
    {50001×1 timetable}    {7601×1 timetable}    {7601×1 timetable}    {25001×2 double}    "healthy"    "torque30"
    {50001×1 timetable}    {7601×1 timetable}    {7601×1 timetable}    {25001×2 double}    "healthy"    "torque35"
    {50001×1 timetable}    {7601×1 timetable}    {7601×1 timetable}    {25001×2 double}    "healthy"    "torque35"
    {50001×1 timetable}    {7601×1 timetable}    {7601×1 timetable}    {25001×2 double}    "healthy"    "torque40"
    {50001×1 timetable}    {7601×1 timetable}    {7601×1 timetable}    {25001×2 double}    "healthy"    "torque40"
      ⋮

包絡線信号データ

[新規セッション] ダイアログのツリー ビューで、インポートする時間領域信号を選択します。ここでは、合成信号のみを使用するため、IaVib_acpi をオフにします。駆動側の半径方向の振動速度の包絡線 Vib_acpi_env はオンのままにしてください。それ以外の場合は変更する必要はありません。

包絡線スペクトル データ

インポートする周波数領域データを選択します。A 相電流 Ia_env_ps の包絡線スペクトルを選択したままにして、その [変数の型]Spectrum に変更します。

Col1 を、対応する 50 kHz のサンプリング周波数をもつ独立 (周波数) 変数として指定します。

状態変数

最後に、故障分類の対象となる状態変数は変数 Health であり、これは実験内の破損した回転子バーの数に対応します。その [変数の型]Condition Variable であることを確認してください。

最終的なアンサンブルの指定内容を確認し、[インポート] をクリックします。

ファイル アンサンブルがインポートされると、[信号トレース] プロットを作成し、実験データの"健康" 状態に基づいてプロットの色をグループ化することで、データを可視化できます。ファイル アンサンブルのすべてのメンバーを読み取ってプロットを生成し、データを処理するには、読み取る必要があるデータ ファイルのサイズと数によっては時間がかかる場合があることに注意してください。

readMemberData で使用される関数 getSignal は、モーターの起動による初期の過渡現象が収まった後で、各メンバー ファイルから信号の一部を読み取ることに注意してください。この場合、関数は 10.0 ~ 11.0 秒の間のデータのみを読み込みます。

予測的特徴の生成

[自動特徴] オプションは、利用可能な信号から多数の特徴を作成し、さまざまな健康クラスを分離する能力に従ってそれらをすばやくランク付けする方法です。インポートされた時間領域信号 Vib_acpi_env の場合、[データ ブラウザー] ツリーで信号を選択し、[特徴デザイナー] タブの [自動特徴] をクリックして、[自動特徴] オプションを適用します。

[計算] をクリックすると、多数の特徴が自動生成され、"1 因子 ANOVA" 基準に関する重要度に従ってランク付けされます。この計算の実行には数分かかる場合があります。

包絡線スペクトル データから特徴を生成する場合、より手動に近いアプローチの方がさらに正確な結果を得られます。[データ ブラウザー] で Ia_env_ps 信号を選択し、[波数領域の特徴] メニューで [カスタムの故障の特徴] を選択します。包絡線スペクトルのスペクトル ピークの大部分をカバーできるように、故障帯域として 60 Hz の基本周波数とその最初の 6 つの高調波を中心に、30 Hz の側波帯もあわせて選択します。10 Hz の故障帯域幅を使用します。[適用] をクリックして特徴を生成します。

これで、AC モーター システムのさまざまな電気信号と振動信号から多数の特徴が生成されました。

特徴のランク付け

このプロセスにより、手動と自動の両方で約 150 個の特徴をすばやく作成できます。最終的なランク付け table は、"1 因子 ANOVA" によるランク付けに基づく最初の 10 ~ 15 個の特徴が、破損した回転子バーの数に従ったモーターの分類に役立つことを示しています。

故障帯域とそれに対応する名前を特定するのが難しい場合は、[ピーク周波数] という特徴を使用して、対応する故障帯域の周波数/領域を特定します。

分類学習器アプリへの特徴のエクスポートとツリー モデルの構築

[特徴のランク付け] タブの、[エクスポート][特徴を分類学習器にエクスポート] を使用して、"診断特徴デザイナー" アプリから上位の特徴をエクスポートします。[上位の特徴の選択] を 10 に変更します。

[エクスポート] をクリックして、"分類学習器" アプリを起動します。[ファイルからの新規セッション] ダイアログが正しく事前設定されているので、[セッションの開始] をクリックして特徴データをアプリに読み込みます。

[分類学習器] タブの [すべてを学習] をクリックすると、アプリにインポートされた 10 個の特徴を使用してモーターの故障 (つまり、破損した回転子バーの数) を約 94% の精度で分類するツリー モデルが取得できます。

"モデル" ギャラリーから [すべてのクイック学習] を選択して生成するには、[すべてを学習] をクリックします。図中の重み付き KNN (モデル番号 2.9) は、約 98% の精度で破損した回転子の故障を分類できます。

サポート関数

fileEnsembleDatastore オブジェクトの WriteToMemberFcn プロパティは、アンサンブルの各メンバーに新しいデータを追加する役割をもつ関数のハンドルを保存します。"診断特徴デザイナー" アプリは、この関数を使用して、新しい処理されたデータと抽出された特徴を保存します。

function writeMemberData(filename, data)
% Write data into the fileEnsembleDatastore.
%
% Inputs:
%  filename - a string for the file name to write
%  data     - a data structure to write to the file

% Save fields as individual variables.
save(filename, '-append', '-struct', 'data');
end

fileEnsembleDatastore オブジェクトの ReadFcn プロパティに保存されている関数は、アンサンブル メンバー ファイルからメンバー データを読み取ります。"診断特徴デザイナー" アプリは、この関数を使用して、信号、スペクトル、特徴を読み取ります。この関数を使用して、アプリで使用できる合成信号を実行中に作成することもできます。

function T = readMemberData(filename, variables)
% Read variables from a fileEnsembleDatastore
%
% Inputs:
%  filename  - file to read, specified as a string
%  variables - variable names to read, specified as a string array
%              Variables must be a subset of SelectedVariables specified in
%              the fileEnsembleDatastore.
% Output:
%  T         - a table with a single row

mfile = matfile(filename); % Allows partial loading

% Read condition variables directly from the top-level structure fields
T = table();
for i = 1:numel(variables)
  var = variables(i);

  switch var
    case {'Health', 'Load'}
      % Condition variables
      val = mfile.(var);
    case {'Va', 'Vb', 'Vc', 'Ia', 'Ib', 'Ic'}
      % Electrical signals
      val = getSignal(mfile, var, mfile.Fs_elec);
    case {'Vib_acpi', 'Vib_carc', 'Vib_acpe', 'Vib_axial', 'Vib_base', 'Trigger'}
      % Vibration signals
      val = getSignal(mfile, var, mfile.Fs_vib);
    case {'Vib_acpi_env'}
      % Synthetic envelope signals for vibration data
      sig = regexprep(var, '_env', '');
      TT = getSignal(mfile, sig, mfile.Fs_vib);
      % Envelope of band-pass filtered signal
      y = bandpass(TT.Data, [900 1300], mfile.Fs_vib);
      yUpper = envelope(y);
      val = timetable(yUpper, 'VariableNames', "Data", 'RowTimes', TT.Time);
    case {'Ia_env'}
      % Synthetic envelope signals for electrical data
      sig = regexprep(var, '_env', '');
      TT = getSignal(mfile, sig, mfile.Fs_elec);
      % Envelope of band-pass filtered signal
      y = bandpass(TT.Data, [900 1300], mfile.Fs_elec);
      yUpper = envelope(y);
      val = timetable(yUpper, 'VariableNames', "Data", 'RowTimes', TT.Time);
    case {'Ia_env_ps'}
      % Synthetic envelope spectra for electrical data
      sig = regexprep(var, '_env_ps', '');
      TT = getSignal(mfile, sig, mfile.Fs_elec);
      % Envelope spectrum of band-pass filtered signal
      [ES,F] = envspectrum(TT, 'Method', 'hilbert', 'Band', [900 1300]);
      val = [F,ES];
    otherwise
      % Other features and signals.
      val = mfile.(var);
  end

  if numel(val) > 1
    val = {val};
  end

  % Add the data to the output table, using the variable name.
  T.(var) = val;
end
end

元の信号が、そこから有用な特徴を抽出するのに必要な長さよりも長い場合、次の補助関数を使用して、メンバー データから完全な信号の短い部分を抽出できます。

function TT = getSignal(mfile, signame, Fs)
% Extract a 1.0 second portion of the signal after 10 seconds of measurements.
signame = char(signame);
n = size(mfile, signame, 1);
t = (0:n-1)' / Fs;
I = find((t >= 10.0) & (t <= 11.0)); % 1.0 sec of data
TT = timetable(mfile.(signame)(I,1), 'VariableNames', "Data", 'RowTimes', seconds(t(I)));
end

参考文献

  1. Treml, Aline Elly, Rogério Andrade Flauzino, Marcelo Suetake, and Narco Afonso Ravazzoli Maciejewski."Experimental database for detecting and diagnosing rotor broken bar in a threephase induction motor."IEEE Dataport, updated September 24, 2020, https://dx.doi.org/10.21227/fmnm-bn95.

参考

| |

関連するトピック