Main Content

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

labeledSignalSet

ラベル付き信号セットの作成

説明

labeledSignalSet を使用して、ラベル付き信号をラベル定義と共に保存します。signalLabelDefinition を使用して、信号ラベル定義を作成します。

作成

説明

lss = labeledSignalSet は、空のラベル付き信号セットを作成します。セットに信号を追加するには、addMembers を使用します。セットにラベル定義を追加するには、addLabelDefinitions を使用します。

lss = labeledSignalSet(src) は、入力データ ソース src のラベル付き信号セットを作成します。セットにラベル定義を追加するには、addLabelDefinitions を使用します。

lss = labeledSignalSet(src,lbldefs) は、信号ラベル定義 lbldefs を使用して入力データ ソース src のラベル付き信号セットを作成します。信号ラベル定義を作成するには、signalLabelDefinition を使用します。

lss = labeledSignalSet(src,lbldefs,'MemberNames',mnames) は、入力データ ソース src のラベル付き信号セットを作成して、セットのメンバーの名前を指定します。setMemberNames を使用して、メンバー名を変更します。lbldefs はオプションです。

lss = labeledSignalSet(src,lbldefs,Name,Value) は、名前と値の引数を使用してプロパティを設定します。複数の名前と値の引数を指定できます。各プロパティ名を引用符で囲みます。lbldefs はオプションです。

入力引数

すべて展開する

入力データ ソース。行列、cell 配列、timetable、signalDatastore オブジェクト、または audioDatastore (Audio Toolbox) オブジェクトとして指定します。src は、セットのメンバー数、各メンバーの信号数、および各信号のデータを暗黙的に指定します。

例: {randn(10,3),randn(17,9)} には、2 つのメンバーがあります。最初のメンバーには、10 サンプルの信号が 3 つ含まれています。2 番目のメンバーには、17 サンプルの信号が 9 つ含まれています。

例: {{randn(10,1)},{randn(17,1),randn(27,1)}} には、2 つのメンバーがあります。最初のメンバーには、10 サンプルの信号が 1 つ含まれています。2 番目のメンバーには、17 サンプルの信号が 1 つと、27 サンプルの信号が 1 つ含まれています。

例: {{timetable(seconds(1:10)',randn(10,3)),timetable(seconds(1:7)',randn(7,2))},{timetable(seconds(1:3)',randn(3,1))}} には、2 つのメンバーがあります。最初のメンバーには、1 Hz で 10 秒間サンプリングされた信号が 3 つと、1 Hz で 7 秒間サンプリングされた信号が 2 つ含まれています。2 番目のメンバーには、1 Hz で 3 秒間サンプリングされた信号が 1 つ含まれています。

例:ファイルを示す signalDatastore オブジェクト

MATLAB® に MAT ファイルとして含まれているサンプル音声信号セットへのパスを指定します。各ファイルには、信号変数とサンプル レートが格納されています。ファイル名をリストします。

folder = fullfile(matlabroot,"toolbox","matlab","audiovideo");
lst = dir(append(folder,"/*.mat"));
nms = {lst(:).name}'
nms = 7x1 cell
    {'chirp.mat'   }
    {'gong.mat'    }
    {'handel.mat'  }
    {'laughter.mat'}
    {'mtlb.mat'    }
    {'splat.mat'   }
    {'train.mat'   }

指定したフォルダーを示す信号データストアを作成します。サンプル レート変数名を Fs に設定します。これは、すべてのファイルで共通です。ファイル mtlb.mat を除くデータストアのサブセットを生成します。これは、信号変数が y と呼ばれないという点で他のファイルとは異なっています。

sds = signalDatastore(folder,"SampleRateVariableName","Fs");
sdss = subset(sds,~strcmp(nms,"mtlb.mat"));

サブセット データストアを labeledSignalSet オブジェクトのソースとして使用します。

lss = labeledSignalSet(sdss)
lss = 
  labeledSignalSet with properties:

             Source: [1x1 signalDatastore]
         NumMembers: 6
    TimeInformation: "inherent"
             Labels: [6x0 table]
        Description: ""

 Use labelDefinitionsHierarchy to see a list of labels and sublabels.
 Use setLabelValue to add data to the set.

ラベル定義。signalLabelDefinition オブジェクトのベクトルとして指定します。

メンバー名。文字ベクトル、string スカラー、文字ベクトルの cell 配列、または string 配列として指定します。

例: labeledSignalSet({randn(100,1) randn(10,1)},'MemberNames',{'llama' 'alpaca'}) は、2 つのメンバー、'llama' および 'alpaca' をもつランダム信号のセットを指定します。

プロパティ

すべて展開する

ラベル付き信号セットの説明。文字ベクトルまたは string スカラーとして指定します。

例: 'Description','Sleep test patients by sex and age'

データ型: char | string

この プロパティ は読み取り専用です。

サンプル レート値。正のスカラーまたはベクトルとして指定します。このプロパティは、データ ソースに固有の時間情報が含まれていない場合にのみ有効です。

  • ラベル付きセットのすべての信号に同じサンプル レートを指定するには、SampleRate を正の数値スカラーに設定します。

  • ラベル付きセットの各メンバーが、メンバーごとに異なるサンプル レートでサンプリングされた信号を持つように指定するには、SampleRate をベクトルに設定します。このベクトルの要素数は、セットのメンバー数と等しくなければなりません。セットのメンバーが異なるサンプル レートの信号を持つ場合は、timetable を使用してサンプル レートを指定します。

例: 'SampleRate',[1e2 1e3] は、セットの最初のメンバーの信号が 100 Hz のレートでサンプリングされ、2 番目のメンバーの信号が 1 kHz でサンプリングされることを指定します。

この プロパティ は読み取り専用です。

サンプル時間値。正のスカラー、ベクトル、duration スカラー、または duration ベクトルとして指定します。このプロパティは、データ ソースに固有の時間情報が含まれていない場合にのみ有効です。

  • ラベル付きセットのすべての信号に同じサンプル時間を指定するには、SampleTime を数値スカラーまたは duration スカラーに設定します。

  • ラベル付きセットの各メンバーがサンプル間の時間間隔が等しい信号を持ち、メンバーごとに間隔が異なることを指定するには、SampleTime を数値ベクトルまたは duration ベクトルに設定します。このベクトルの要素数は、セットのメンバー数と等しくなければなりません。セットのメンバーが異なるサンプル時間の信号を持つ場合は、timetable を使用してサンプル時間を指定します。

例: 'SampleTime',seconds([1e-2 1e-3]) は、セットの最初のメンバーの信号はサンプル間の間隔が 0.01 秒で、2 番目のメンバーの信号はサンプル間の間隔が 1 ミリ秒であることを指定します。

この プロパティ は読み取り専用です。

時間値。ベクトル、duration ベクトル、行列、または cell 配列として指定します。このプロパティは、データ ソースに固有の時間情報が含まれていない場合にのみ有効です。時間値は一意で、増加しなければなりません。

  • ラベル付きセットのすべての信号に同じ時間値を指定するには、TimeValues を数値ベクトルまたは duration ベクトルに設定します。ベクトルはセット内のすべての信号と同じ長さでなければなりません。

  • ラベル付きセットの各メンバーが同じ時間値の信号を持ち、メンバーごとに時間値が異なることを指定するには、TimeValues を数値行列または duration 行列または cell 配列に設定します。

    • TimeValues が行列の場合は、列数がセットのメンバー数と等しくなければなりません。セット内のすべての信号は、長さが行列の行数と等しくなければなりません。

    • TimeValues が cell 配列の場合は、含まれるベクトル数がセットのメンバー数と等しくなければなりません。メンバー内のすべての信号は、長さが cell 配列内の対応するベクトルの要素数と等しくなければなりません。

セットのメンバーが異なる時間値の信号を持つ場合は、timetable を使用して時間値を指定します。

例: 'TimeValues',[1:1000;0:1/500:2-1/500]' は、セットの最初のメンバーの信号が 1 Hz で 1000 秒間サンプリングされることを指定します。2 番目のメンバーの信号は、500 Hz で 2 秒間サンプリングされます。

例: 'TimeValues',seconds([1:1000;0:1/500:2-1/500]') は、セットの最初のメンバーの信号が 1 Hz で 1000 秒間サンプリングされることを指定します。2 番目のメンバーの信号は、500 Hz で 2 秒間サンプリングされます。

例: 'TimeValues',{1:1000,0:1/500:2-1/500} は、セットの最初のメンバーの信号が 1 Hz で 1000 秒間サンプリングされることを指定します。2 番目のメンバーの信号は、500 Hz で 2 秒間サンプリングされます。

例: 'TimeValues',{seconds(1:1000),seconds(0:1/500:2-1/500)} は、セットの最初のメンバーの信号が 1 Hz で 1000 秒間サンプリングされることを指定します。2 番目のメンバーの信号は、500 Hz で 2 秒間サンプリングされます。

この プロパティ は読み取り専用です。

セット内のメンバー数。正の整数として指定します。

この プロパティ は読み取り専用です。

ラベル テーブル。MATLAB® の table として指定します。Labels の各変数は、セットに定義されたラベルに対応しています。Labels の各行は、データ ソースのメンバーに対応しています。Labels の行名は、メンバー名です。

データ型: table

ソースの時間情報。次のいずれかに指定します。

  • 'none' — ソース内の信号に時間情報がありません。

  • 'sampleRate' — ソース内の信号は、指定されたレートでサンプリングされます。

  • 'sampleTime' — ソース内の信号は、指定されたサンプル間の時間間隔を持ちます。

  • 'timeValues — ソース内の信号は、各サンプルに対応する時間値を持ちます。

  • 'inherent' — ソース内の信号に、固有の時間情報が含まれます。このような信号の例には、MATLAB の timetable があります。

データ型: char | string

この プロパティ は読み取り専用です。

ラベル付き信号セットのデータ ソース。行列、timetable、cell 配列、またはオーディオ データストアとして指定します。

  • Source が数値行列の場合、ラベル付き信号セットには、行列の列数に等しい信号数を含む 1 つのメンバーがあります。

    例: labeledSignalSet(randn(10,3)) では、10 サンプルの信号を 3 つ含む 1 つのメンバーがあります。

  • Source が行列の cell 配列の場合、ラベル付き信号セットのメンバー数は、cell 配列内の行列数と等しくなります。各メンバーには、対応する行列の列数に等しい信号数が含まれます。

    例: labeledSignalSet({randn(10,3),randn(17,9)}) には、2 つのメンバーがあります。最初のメンバーには、10 サンプルの信号が 3 つ含まれています。2 番目のメンバーには、17 サンプルの信号が 9 つ含まれています。

  • Source が cell 配列で、cell 配列の各要素が数値ベクトルの cell 配列である場合、ラベル付き信号セットのメンバー数は、cell 配列の要素数と等しくなります。メンバー内の各信号は、任意の長さを持つことができます。

    例: labeledSignalSet({{randn(10,1)},{randn(17,1),randn(27,1)}}) には、2 つのメンバーがあります。最初のメンバーには、10 サンプルの信号が 1 つ含まれています。2 番目のメンバーには、17 サンプルの信号が 1 つと、27 サンプルの信号が 1 つ含まれています。

  • Source が数値を含む変数を持つ timetable の場合、ラベル付き信号セットには、変数の数に等しい信号数を含む 1 つのメンバーがあります。timetable の時間値は、型が duration で、一意であり、増加しなければなりません。

    例: labeledSignalSet(timetable(seconds(1:10)',randn(10,3))) では、1 Hz で 10 秒間サンプリングされた信号を 3 つ含む 1 つのメンバーがあります。

  • Source が timetable の cell 配列で、各 timetable が任意の数の数値を持つ変数を持つ場合、ラベル付き信号セットのメンバー数は、timetable の数と等しくなります。各メンバーには、対応する timetable の変数の数に等しい信号数が含まれます。

    例: labeledSignalSet({timetable(seconds(1:10)',randn(10,3)),timetable(seconds(1:5)',randn(5,13))}) には、2 つのメンバーがあります。最初のメンバーには、1 Hz で 10 秒間サンプリングされた信号が 3 つ含まれています。2 番目のメンバーには、1 Hz で 5 秒間サンプリングされた信号が 13 個含まれています。

  • Source が cell 配列で、cell 配列の各要素が timetable の cell 配列である場合、ラベル付き信号セットのメンバー数は、cell 配列の要素数と等しくなります。各メンバーは任意の数の timetable を持つことができ、メンバー内の各 timetable は任意の数の変数を持てます。

    例: labeledSignalSet({{timetable(seconds(1:10)',randn(10,3)),timetable(seconds(1:7)',randn(7,2))},{timetable(seconds(1:3)',randn(3,1))}}) には、2 つのメンバーがあります。最初のメンバーには、1 Hz で 10 秒間サンプリングされた信号が 3 つと、1 Hz で 7 秒間サンプリングされた信号が 2 つ含まれています。2 番目のメンバーには、1 Hz で 3 秒間サンプリングされた信号が 1 つ含まれています。

  • 入力データ ソース src がオーディオ データストアの場合、ラベル付き信号セットのメンバー数は、データストアが示すファイルの数と等しくなります。Source プロパティには、ファイル名を持つ文字ベクトルの cell 配列が含まれます。各メンバーには、対応するデータストア ファイルの読み取りによって返されたすべての信号が含まれます。

オブジェクト関数

addLabelDefinitionsラベル付き信号セットへのラベル定義の追加
addMembersラベル付き信号セットへのメンバーの追加
countLabelValuesラベル値のカウント
createDatastores信号およびラベル データを指すデータストアの作成
createFeatureDataCreate feature table or matrix and response vectors
editLabelDefinitionラベル定義のプロパティの編集
getAlternateFileSystemRootsGet alternate file system roots when data source of labeled signal set is a datastore
getLabelDefinitionsラベル付き信号セットのラベル定義の取得
getLabeledSignalラベル付き信号セットからのラベル付き信号の取得
getLabelIndicesGet label indices pointing to label definitions in labeled signal set
getLabelNamesラベル付き信号セットのラベル名の取得
getLabelValuesラベル付き信号セットからのラベル値の取得
getMemberNamesラベル付き信号セットのメンバー名の取得
getSignalラベル付き信号セットからの信号の取得
headラベル テーブルの先頭の行の取得
labelDefinitionsHierarchyラベル名とサブラベル名の階層リストの取得
labelDefinitionsSummary信号ラベル定義の概要テーブルの取得
merge2 つ以上のラベル付き信号セットのマージ
removeLabelDefinitionラベル付き信号セットからのラベル定義の削除
removeMembersラベル付き信号セットからのメンバーの削除
removePointValue点ラベルからの行の削除
removeRegionValueROI ラベルからの行の削除
resetLabelValues既定値へのラベルのリセット
setAlternateFileSystemRootsSet alternate file system roots when data source of labeled signal set is a datastore
setLabelValueラベル付き信号セットのラベル値の設定
setMemberNamesラベル付き信号セットのメンバー名の設定
subsetメンバーのサブセットを持つ新しいラベル付き信号セットの取得

すべて折りたたむ

クジラの声の録音のセットについて考えてみましょう。録音されたクジラの声は、ふるえ声とうめき声で構成されています。"ふるえ声" の音声は一連のクリックに似ています。"うめき声" は、船の警笛による音声に似た低周波数の鳴き声です。各信号を確認してラベルを付けて、クジラの種類、ふるえ声の領域、およびうめき声の領域を識別します。また、ふるえ声の各領域では、特定のしきい値よりも高い信号ピークにラベルを付けます。

信号ラベル定義

クジラの種類を格納する属性ラベルを定義します。使用するカテゴリは、blue whale、humpback whale、および white whale です。

dWhaleType = signalLabelDefinition('WhaleType',...
   'LabelType','attribute',...
   'LabelDataType','categorical',...
   'Categories',{'blue','humpback','white'},...
   'Description','Whale type'); 

うめき声の領域を取得するための関心領域 (ROI) ラベルを定義します。ふるえ声の領域を取得するための別の ROI ラベルを定義します。

dMoans = signalLabelDefinition('MoanRegions',...
   'LabelType','roi',...
   'LabelDataType','logical',...
   'Description','Regions where moans occur');

dTrills = signalLabelDefinition('TrillRegions',...
   'LabelType','roi',...
   'LabelDataType','logical',...
   'Description','Regions where trills occur');        

最後に、ふるえ声のピークを取得するための点ラベルを定義します。このラベルは、dTrills 定義のサブラベルとして設定します。

dTrillPeaks = signalLabelDefinition('TrillPeaks',...
   'LabelType','point',...
   'LabelDataType','numeric',...
   'Description','Trill peaks');

dTrills.Sublabels = dTrillPeaks;

ラベル付き信号セット

クジラの信号とラベル定義を使用して、labeledSignalSet を作成します。クジラの種類、うめき声とふるえ声の領域、およびふるえ声のピークを識別するためのラベル値を追加します。

load labelwhalesignals
lbldefs = [dWhaleType dMoans dTrills];

lss = labeledSignalSet({whale1 whale2},lbldefs,'MemberNames',{'Whale1','Whale2'}, ...
   'SampleRate',Fs,'Description','Characterize whale song regions');     

labelDefinitionsHierarchy および labelDefinitionsSummary を使用して、ラベル階層とラベルのプロパティを可視化します。

labelDefinitionsHierarchy(lss)
ans = 
    'WhaleType
       Sublabels: []
     MoanRegions
       Sublabels: []
     TrillRegions
       Sublabels: TrillPeaks
     '

labelDefinitionsSummary(lss)
ans=3×9 table
      LabelName        LabelType     LabelDataType     Categories     ValidationFunction    DefaultValue             Sublabels             Tag            Description         
    ______________    ___________    _____________    ____________    __________________    ____________    ___________________________    ___    ____________________________

    "WhaleType"       "attribute"    "categorical"    {3x1 string}       {["N/A"   ]}       {0x0 double}    {0x0 double               }    ""     "Whale type"                
    "MoanRegions"     "roi"          "logical"        {["N/A"   ]}       {0x0 double}       {0x0 double}    {0x0 double               }    ""     "Regions where moans occur" 
    "TrillRegions"    "roi"          "logical"        {["N/A"   ]}       {0x0 double}       {0x0 double}    {1x1 signalLabelDefinition}    ""     "Regions where trills occur"

読み込まれたデータの信号は、2 匹のシロナガスクジラの歌に対応しています。両方の信号に 'WhaleType' 値を設定します。

setLabelValue(lss,1,'WhaleType','blue');
setLabelValue(lss,2,'WhaleType','blue');

'Labels' プロパティを可視化します。この table には、両方の信号に新しく追加された 'WhaleType' 値が含まれています。

lss.Labels      
ans=2×3 table
              WhaleType    MoanRegions    TrillRegions
              _________    ___________    ____________

    Whale1      blue       {0x2 table}    {0x3 table} 
    Whale2      blue       {0x2 table}    {0x3 table} 

領域ラベルの可視化

クジラの歌を可視化して、ふるえ声とうめき声の領域を特定します。

subplot(2,1,1)
plot((0:length(whale1)-1)/Fs,whale1)
ylabel('Whale 1')

subplot(2,1,2)
plot((0:length(whale2)-1)/Fs,whale2)
ylabel('Whale 2')

Figure contains 2 axes objects. Axes object 1 with ylabel Whale 1 contains an object of type line. Axes object 2 with ylabel Whale 2 contains an object of type line.

うめき声の領域は持続した低周波数のうめき声です。

  • whale1 には約 7 秒、12 秒、17 秒で中央揃えされたうめき声があります。

  • whale2 には約 3 秒、7 秒、16 秒で中央揃えされたうめき声があります。

ラベル付きセットにうめき声の領域を追加します。秒単位の ROI 範囲とラベル値を指定します。

moanRegionsWhale1 = [6.1 7.7; 11.4 13.1; 16.5 18.1];
mrsz1 = [size(moanRegionsWhale1,1) 1];
setLabelValue(lss,1,'MoanRegions',moanRegionsWhale1,true(mrsz1));

moanRegionsWhale2 = [2.5 3.5; 5.8 8; 15.4 16.7];
mrsz2 = [size(moanRegionsWhale2,1) 1];
setLabelValue(lss,2,'MoanRegions',moanRegionsWhale2,true(mrsz2));

ふるえ声の領域にはサイレンスで区切られた異なるバーストの音声があります。

  • whale1 には約 2 秒で中央揃えされたふるえ声があります。

  • whale2 には約 12 秒で中央揃えされたふるえ声があります。

ラベル付きセットにふるえ声の領域を追加します。

trillRegionWhale1 = [1.4 3.1];
trsz1 = [size(trillRegionWhale1,1) 1];
setLabelValue(lss,1,'TrillRegions',trillRegionWhale1,true(trsz1));

trillRegionWhale2 = [11.1 13];
trsz2 = [size(trillRegionWhale1,1) 1];
setLabelValue(lss,2,'TrillRegions',trillRegionWhale2,true(trsz2));

各クジラの歌についてsignalMaskオブジェクトを作成し、それを使用してさまざまな領域を可視化してラベルを付けます。より見やすくなるように、ラベル値を logical から categorical に変更します。

mr1 = getLabelValues(lss,1,'MoanRegions');
mr1.Value = categorical(repmat("moan",mrsz1));
tr1 = getLabelValues(lss,1,'TrillRegions');
tr1.Value = categorical(repmat("trill",trsz1));

msk1 = signalMask([mr1;tr1],'SampleRate',Fs);

subplot(2,1,1)
plotsigroi(msk1,whale1)
ylabel('Whale 1')
hold on

mr2 = getLabelValues(lss,2,'MoanRegions');
mr2.Value = categorical(repmat("moan",mrsz2));
tr2 = getLabelValues(lss,2,'TrillRegions');
tr2.Value = categorical(repmat("trill",trsz2));

msk2 = signalMask([mr2;tr2],'SampleRate',Fs);

subplot(2,1,2)
plotsigroi(msk2,whale2)
ylabel('Whale 2')
hold on

Figure contains 2 axes objects. Axes object 1 with xlabel Seconds, ylabel Whale 1 contains 3 objects of type line. Axes object 2 with xlabel Seconds, ylabel Whale 2 contains 3 objects of type line.

点ラベルの可視化

ふるえ声の各領域の 3 つのピークにラベルを付けます。点ラベルでは、点の位置とラベル値を指定します。この例では、点の位置は秒単位です。

peakLocsWhale1 = [1.553 1.626 1.7];
peakValsWhale1 = [0.211 0.254 0.211];

setLabelValue(lss,1,{'TrillRegions','TrillPeaks'}, ...
   peakLocsWhale1,peakValsWhale1,'LabelRowIndex',1);

subplot(2,1,1)
plot(peakLocsWhale1,peakValsWhale1,'v')
hold off

peakLocsWhale2 = [11.214 11.288 11.437];
peakValsWhale2 = [0.119 0.14 0.15];

setLabelValue(lss,2,{'TrillRegions','TrillPeaks'}, ...
   peakLocsWhale2,peakValsWhale2,'LabelRowIndex',1);

subplot(2,1,2)
plot(peakLocsWhale2,peakValsWhale2,'v')
hold off

Figure contains 2 axes objects. Axes object 1 with xlabel Seconds, ylabel Whale 1 contains 4 objects of type line. One or more of the lines displays its values using only markers Axes object 2 with xlabel Seconds, ylabel Whale 2 contains 4 objects of type line. One or more of the lines displays its values using only markers

ラベル値の確認

getLabelValues を使用してラベル値を確認します。

getLabelValues(lss)
ans=2×3 table
              WhaleType    MoanRegions    TrillRegions
              _________    ___________    ____________

    Whale1      blue       {3x2 table}    {1x3 table} 
    Whale2      blue       {3x2 table}    {1x3 table} 

ラベル付きセットの最初のメンバーのうめき声の領域を取得します。

getLabelValues(lss,1,'MoanRegions')
ans=3×2 table
     ROILimits      Value
    ____________    _____

     6.1     7.7    {[1]}
    11.4    13.1    {[1]}
    16.5    18.1    {[1]}

2 番目の出力引数を使用して、ラベルのサブラベルを一覧表示します。

[value,valueWithSublabel] = getLabelValues(lss,1,'TrillRegions')
value=1×2 table
    ROILimits     Value
    __________    _____

    1.4    3.1    {[1]}

valueWithSublabel=1×3 table
    ROILimits     Value     Sublabels 
                           TrillPeaks 
    __________    _____    ___________

    1.4    3.1    {[1]}    {3x2 table}

サブラベル内の値を取得するには、ラベル名を 2 要素の配列として表します。

getLabelValues(lss,1,{'TrillRegions','TrillPeaks'})
ans=3×2 table
    Location      Value   
    ________    __________

     1.553      {[0.2110]}
     1.626      {[0.2540]}
       1.7      {[0.2110]}

セットの 2 番目のメンバーに対応する、3 番目のふるえ声のピークの値を検索します。

getLabelValues(lss,2,{'TrillRegions','TrillPeaks'}, ...
    'LabelRowIndex',1,'SublabelRowIndex',3)
ans=1×2 table
    Location      Value   
    ________    __________

     11.437     {[0.1500]}

MATLAB® に MAT ファイルとして含まれているオーディオ信号セットへのパスを指定します。各ファイルには、信号変数とサンプル レートが格納されています。ファイル名をリストします。

folder = fullfile(matlabroot,"toolbox","matlab","audiovideo");
lst = dir(append(folder,"/*.mat"));
nms = {lst(:).name}'
nms = 7x1 cell
    {'chirp.mat'   }
    {'gong.mat'    }
    {'handel.mat'  }
    {'laughter.mat'}
    {'mtlb.mat'    }
    {'splat.mat'   }
    {'train.mat'   }

指定したフォルダーを示す信号データストアを作成します。サンプル レート変数名を Fs に設定します。これは、すべてのファイルで共通です。ファイル mtlb.mat を除くデータストアのサブセットを生成します。サブセット データストアをlabeledSignalSetオブジェクトのソースとして使用します。

sds = signalDatastore(folder,"SampleRateVariableName","Fs");
sds = subset(sds,~strcmp(nms,"mtlb.mat"));
lss = labeledSignalSet(sds);

信号にラベルを付けるために、次の 3 つのラベル定義を作成します。

  • 人間の声を含む信号を真とする論理属性ラベルを定義。

  • 各信号の最大値の位置と振幅を示す数値ポイント ラベルを定義。

  • 各信号にオーバーラップのない、長さが均一なランダム領域を選択するためのカテゴリカル関心領域 (ROI) ラベルを定義。

この信号ラベルの定義をラベル付き信号セットに追加します。

vc = signalLabelDefinition("Voice",'LabelType','attribute', ...
    'LabelDataType','logical','DefaultValue',false);
mx = signalLabelDefinition("Maximum",'LabelType','point', ...
    'LabelDataType','numeric');
rs = signalLabelDefinition("RanROI",'LabelType','ROI', ...
    'LabelDataType','categorical','Categories',["ROI" "other"]);
addLabelDefinitions(lss,[vc mx rs])

信号にラベルを付けます。

  • 人間の声を含むものとして、'handel.mat''laughter.mat' にラベルを付けます。

  • 関数islocalmaxを使用して、各信号の最大値を求めます。その位置と値にラベルを付けます。

  • 関数 randROI を使用して、領域間の最小間隔が N/6 サンプルの場合に長さ N の信号に収まるだけの長さ N/10 サンプルの領域を生成します。それらの位置にラベルを付け、ROI カテゴリに割り当てます。

点と領域にラベルを付けるときに、サンプル値を時間値に変換します。MATLAB® 配列のインデックス付けを考慮して 1 を減算し、サンプル レートで除算します。

kj = 1;
while hasdata(sds)
    
    [sig,info] = read(sds);
    fs = info.SampleRate;

    [~,fn] = fileparts(info.FileName);
    if fn=="handel" || fn=="laughter"
        setLabelValue(lss,kj,"Voice",true)
    end
    
    xm = find(islocalmax(sig,'MaxNumExtrema',1));
    setLabelValue(lss,kj,"Maximum",(xm-1)/fs,sig(xm))

    N = length(sig);
    rois = randROI(N,round(N/10),round(N/6));
    setLabelValue(lss,kj,"RanROI",(rois-1)/fs,repelem("ROI",size(rois,1)))

    kj = kj+1;
    
end

2 つの信号にのみ音声が含まれていることを確認します。

countLabelValues(lss,"Voice")
ans=2×3 table
    Voice    Count    Percent
    _____    _____    _______

    false      4      66.667 
    true       2      33.333 

この 2 つの信号の最大振幅が 1 であることを確認します。

countLabelValues(lss,"Maximum")
ans=5×4 table
           Maximum            Count    Percent    MemberCount
    ______________________    _____    _______    ___________

    0.80000000000000004441      1      16.667          1     
    0.89113331915798421612      1      16.667          1     
    0.94730769230769229505      1      16.667          1     
    1                           2      33.333          2     
    1.0575668990330560071       1      16.667          1     

各信号に、オーバーラップのない 4 つのランダムな関心領域があることを確認します。

countLabelValues(lss,"RanROI")
ans=2×4 table
    RanROI    Count    Percent    MemberCount
    ______    _____    _______    ___________

    ROI        24        100           6     
    other       0          0           0     

ラベル付き信号セットのデータを使用して 2 つのデータストアを作成します。

  • signalDatastoreオブジェクト sd には信号データが格納される。

  • arrayDatastoreオブジェクト ld にはラベル付け情報が格納される。作成したすべてのラベルに対応する情報を含めるように指定します。

[sd,ld] = createDatastores(lss,["Voice" "RanROI" "Maximum"]);

データストアの情報を使用して、信号をプロットし、それらのラベルを表示します。

  • signalMaskオブジェクトを使用して、関心領域を青色で強調表示。

  • 最大値の位置を示すために黄色の線をプロット。

  • 人間の声を含む信号に対して赤色の軸ラベルを追加。

tiledlayout flow

while hasdata(sd)

    [sg,nf] = read(sd);
    
    lbls = read(ld);
    
    nexttile
    
    msk = signalMask(lbls{:}.RanROI{:},'SampleRate',nf.SampleRate);    
    plotsigroi(msk,sg)
    colorbar off
    xlabel('')
    
    xline(lbls{:}.Maximum{:}.Location, ...
        'LineWidth',2,'Color','#EDB120')
    
    if lbls{:}.Voice{:}
        ylabel('VOICED','Color','#D95319')
    end

end

Figure contains 6 axes objects. Axes object 1 contains 4 objects of type line, constantline. Axes object 2 contains 4 objects of type line, constantline. Axes object 3 with ylabel VOICED contains 4 objects of type line, constantline. Axes object 4 with ylabel VOICED contains 4 objects of type line, constantline. Axes object 5 contains 4 objects of type line, constantline. Axes object 6 contains 4 objects of type line, constantline.

function roilims = randROI(N,wid,sep)

num = floor((N+sep)/(wid+sep));
hq = histcounts(randi(num+1,1,N-num*wid-(num-1)*sep),(1:num+2)-1/2);
roilims = (1 + (0:num-1)*(wid+sep) + cumsum(hq(1:num)))' + [0 wid-1];

end

バージョン履歴

R2018b で導入

参考

アプリ

オブジェクト