メインコンテンツ

createDatastores

信号およびラベル データを指すデータストアの作成

R2021a 以降

    説明

    [sigData,lblData] = createDatastores(lss,lblNames) は、信号メンバー データとラベル データを含むデータストア sigDatalblData を作成します。

    • createDatastores 関数は、ラベル付き信号セット lss、および lblNames で指定されたラベルから、データストアを作成します。

    • createDatastores はサブラベルには適用されません。lblNames に 1 つ以上の親ラベル名を設定して、親ラベルおよびそれに対応するサブラベル値を取得します。

    [sigData,lblData] = createDatastores(lss,lblNames,Name=Value) は、名前と値の引数を使用して追加オプションを指定します。

    • この構文を使用するには、lblNamesroiTimeFrequency のラベルの定義を指定しなければなりません。ラベル付き信号セット lss 内でどのラベルの定義が roiTimeFrequency であるかを確認するには、getLabelDefinitions(lss,LabelType="roiTimeFrequency") と入力します。

    • 複数の名前と値の引数を指定できます。以下に例を示します。

      [sigData,lblData] = createDatastores(lss,"Atom", ...
          TimeFrequencyMapFormat="image",TimeFrequencyLabelFormat="mask")
      ラベル付き信号セット lss、および時間-周波数 ROI のラベルの定義 "Atom" から、データストアを作成します。createDatastores 関数は、sigData に時間-周波数マップ イメージを返し、lblData に ROI 時間-周波数ラベル マスクを返します。

    (R2025a 以降)

    すべて折りたたむ

    クジラの歌の録音を含むラベル付き信号セットを読み込みます。

    load whales
    lss
    lss = 
      labeledSignalSet with properties:
    
                 Source: {2×1 cell}
             NumMembers: 2
        TimeInformation: "sampleRate"
             SampleRate: 4000
                 Labels: [2×3 table]
            Description: "Characterize wave song regions"
    
     Use labelDefinitionsHierarchy to see a list of labels and sublabels.
     Use setLabelValue to add data to the set.
    
    

    セットの最初のメンバーのラベルを表示します。

    lss.Labels(1,:)
    ans=1×3 table
                     WhaleType    MoanRegions    TrillRegions
                     _________    ___________    ____________
    
        Member{1}      blue       {3×2 table}    {1×3 table} 
    
    

    セット内のラベルの名前を取得します。信号情報を使用して信号データストアを作成し、ラベル情報を使用して配列データストアを作成します。

    lbls = getLabelNames(lss);
    [sgd,lbd] = createDatastores(lss,lbls)
    sgd = 
      signalDatastore with properties:
    
                    MemberNames:{
                                'Member{1}';
                                'Member{2}'
                                }
                  Members: {2×1 cell}
                 ReadSize: 1
               SampleRate: 4000
           OutputDataType: "same"
        OutputEnvironment: "cpu"
    
    
    lbd = 
      ArrayDatastore with properties:
    
                  ReadSize: 1
        IterationDimension: 1
                OutputType: "cell"
    
    

    セットの最初のメンバーのラベルを表示します。

    lbls = read(lbd);
    lbls{:}
    ans=1×3 table
        WhaleType    MoanRegions    TrillRegions
        _________    ___________    ____________
    
          blue       {3×2 table}    {1×3 table} 
    
    

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

    folder = fullfile(matlabroot,"toolbox","matlab","audiovideo");
    lst = dir(append(folder,"/*.mat"));
    nms = {lst(:).name}'
    nms = 7×1 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

    R2025a 以降

    時間-周波数関心領域 (ROI) ラベルの定義、およびスペクトログラム オプションを使用して、時間-周波数領域でガウス原子にラベルを付けます。

    信号の生成とスペクトログラムの可視化

    電圧制御発振器と 4 つのガウス原子で構成される信号を生成します。この信号は 14 kHz で 2 秒間サンプリングされます。信号のスペクトログラムをプロットします。

    Fs = 14000;
    t = (0:1/Fs:2)';
    st = 0.01;
    gaussFun = @(A,x,mu,f) exp(-(x-mu).^2/(2*st^2)).*sin(2*pi*f.*x)*A';
    atomTimeCenters = [0.2 0.5 1 1.75];
    atomFreqCenters = [2 6 2 5]*1000;
    s = gaussFun([1 1 1 1]/10,t,atomTimeCenters,atomFreqCenters);
    x = vco(chirp(t+.1,0,t(end),3).*exp(-2*(t-1).^2),[0.1 0.4]*Fs,Fs);
    s = s/10+x;
    
    bt = 0.2;
    tr = 0.05;
    op = 99;
    pspectrum(s,Fs,"spectrogram", ...
        Leakage=bt,TimeResolution=tr,OverlapPercent=op)

    Figure contains an axes object. The axes object with title Fres = 64.5333 Hz, Tres = 50 ms, xlabel Time (s), ylabel Frequency (kHz) contains an object of type image.

    このスペクトログラムには、ガウス原子に対応する時間-周波数領域の 4 つのパッチが表示されます。すべての原子の時間と周波数を定義します。

    atomTimes = atomTimeCenters'+[-st st]*5.5;
    atomFreqs = atomFreqCenters'+[-1 1]*200;

    時間-周波数領域における信号へのラベル付け

    ガウス原子にラベルを付けるため、logical の時間-周波数 ROI ラベルの定義を作成します。漏れ特性をもつスペクトログラム オプションを指定します。

    opts = labelSpectrogramOptions("leakage", ...
        Leakage=40*(1-bt),Overlap=op, ...
        TimeResolutionMode="specify",TimeResolution=tr);
    
    lblDef = signalLabelDefinition("Atom", ...
        LabelDataType="logical", ...
        LabelType="roiTimeFrequency",TimeFrequencyOptions=opts);

    信号と時間-周波数 ROI ラベルの定義からラベル付き信号セットを作成します。

    lss = labeledSignalSet(s,lblDef,SampleRate=Fs);

    時間-周波数領域で 4 つの原子にラベルを付けます。ラベルの値を true に設定します。

    setLabelValue(lss,1,"Atom",atomTimes,atomFreqs,true(1,4))

    時間-周波数イメージとラベル マスクの可視化

    時間-周波数 ROI ラベルのラベル付き信号セットからデータストアを作成します。

    imSize = [512 768];
    [sds,ads] = createDatastores(lss,"Atom", ...
        TimeFrequencyMapFormat="image", ...
        TimeFrequencyImageSize=imSize, ...
        TimeFrequencyLabelFormat="mask", ...
        TimeFrequencyMaskPriority=true);

    時間-周波数イメージを読み取って表示します。

    imagesc(read(sds))

    Figure contains an axes object. The axes object contains an object of type image.

    ラベル マスクを読み取り、時間-周波数イメージの上に表示します。

    lbl = read(ads);
    im = zeros([imSize 3]);
    im(:,:,1) = lbl{1};
    hold on
    imagesc(im,AlphaData=0.5*lbl{1})
    hold off

    Figure contains an axes object. The axes object contains 2 objects of type image.

    入力引数

    すべて折りたたむ

    ラベル付き信号セット。labeledSignalSet オブジェクトとして指定します。

    例: labeledSignalSet({randn(100,1) randn(10,1)},signalLabelDefinition("female")) は、属性 "female" を含むランダム信号の 2 つのメンバーのセットを指定します。

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

    データ型: char | string

    名前と値の引数

    すべて折りたたむ

    オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで、Name は引数名で、Value は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。

    例: [sds,ads] = createDatastores(lss,"Atom",TimeFrequencyMapFormat="image",TimeFrequencyLabelFormat="mask") は、ラベル付き信号セット lss、および時間-周波数 ROI のラベルの定義 "Atom" から、データストアを作成します。createDatastores 関数は、sds に時間-周波数マップ イメージを返し、ads に ROI 時間-周波数ラベル マスクを返します。

    時間-周波数マップの形式。次のいずれかの値として指定します。

    • "map"createDatastores は、メンバー信号を MN 列の行列として格納します。ここで、M は周波数ビンの数、N は時間ウィンドウの数です。各行列は、スペクトログラムの振幅を dB 単位で表したグレースケール マップを表します。

    • "image"createDatastores は、メンバー信号を M×N×3 の配列として格納します。ここで、M は周波数ビンの数、N は時間ウィンドウの数です。各配列は、スペクトログラムの振幅のイメージを dB 単位で表します。各配列の 3 番目の次元は、赤、緑、および青の色の強度を表します。

    TimeFrequencyMapFormat を指定すると、createDatastores は、いずれかの形式オプションをもつ TransformedDatastore オブジェクトとして sigData を返します。TimeFrequencyImageSize でこれらの次元を指定しない限り、この関数は MN を自動的に選択します。

    この入力引数を使用するには、lblNamesroiTimeFrequency のラベルの定義を指定しなければなりません。

    データ型: char | string

    時間-周波数イメージのサイズ。正の整数の 2 要素ベクトルとして指定します。

    TimeFrequencyImageSize をベクトル [M N] として指定した場合、createDatastores は、TimeFrequencyMapFormat"image" として設定し、メンバー信号を M×N×3 の配列として格納します。ここで、M は周波数ビンの数、N は時間ウィンドウの数です。各配列は、スペクトログラムの振幅のイメージを dB 単位で表します。各配列の 3 番目の次元は、赤、緑、および青の色の強度を表します。

    この入力引数を使用するには、lblNamesroiTimeFrequency のラベルの定義を指定しなければなりません。

    データ型: double | single

    時間-周波数ラベルの形式。次のいずれかの値として指定します。

    • "mask"createDatastores は、メンバー信号のラベルを MN 列の行列として格納します。ここで、M は周波数ビンの数、N は時間ウィンドウの数です。各行列の各値は、対応する信号の時間-周波数マップと同じインデックスのラベル値を表します。

    • "xywh"createDatastores は、メンバー信号のラベルを、ラベル値の各インスタンスを記述する 4 要素ベクトル [x y w h] として格納します。ここで、次のようになります。

      • x はラベル行列の開始列を表します。

      • y はラベル行列の開始行を表します。

      • w はラベルが何列にわたるかを表します。

      • h はラベルが何行にわたるかを表します。

    • "xyMinMax"createDatastores は、メンバー信号のラベルを、ラベル値の各インスタンスを記述する 4 要素ベクトル [xMin xMax yMin yMax] として格納します。ここで、次のようになります。

      • xMin は、時間-周波数マップの x 軸の単位における x の最小値を表します。

      • xMax は、時間-周波数マップの x 軸の単位における x の最大値を表します。

      • yMin は、時間-周波数マップの y 軸の単位における y の最小値を表します。

      • yMax は、時間-周波数マップの y 軸の単位における y の最大値を表します。

    TimeFrequencyMapFormat を指定すると、この関数は、いずれかの形式オプションをもつ arrayDatastore オブジェクトとして lblData を返します。

    この入力引数を使用するには、lblNamesroiTimeFrequency のラベルの定義を指定しなければなりません。

    データ型: char | string

    時間-周波数マップのマスク優先度。truefalse"ascending""descending"、string のベクトル、または文字ベクトルの cell 配列として指定します。TimeFrequencyMaskPriority は、重なり合うラベルの階層構造を指定します。

    lss で指定されたラベル付き信号セットのラベルのデータ型に応じて、TimeFrequencyMaskPriority の値を指定します。

    • lss.LabelDataType"logical" である場合、TimeFrequencyMaskPriority を次のいずれかの値として指定します。

      • true — この関数は、値が "false" であるラベルよりも値が "true" であるラベルを優先します。

      • false — この関数は、値が "true" であるラベルよりも値が "false" であるラベルを優先します。

    • lss.LabelDataType"numeric" である場合、TimeFrequencyMaskPriority を次のいずれかの値として指定します。

      • "ascending" — この関数は、数値が大きいラベルよりも数値が小さいラベルを優先します。

      • "descending" — この関数は、数値が小さいラベルよりも数値が大きいラベルを優先します。

    • lss.LabelDataType"categorical" である場合、ラベルの定義に関するカテゴリ値のセット全体を含む string のベクトルまたは文字ベクトルの cell 配列として、TimeFrequencyMaskPriority を指定します。このベクトルまたは配列によって優先順位が指定され、最初のカテゴリの優先順位が最も高くなります。

    • lss.LabelDataType"string" である場合、TimeFrequencyMaskPriority を次のいずれかの値として指定します。

      • "ascending" — この関数は、アルファベット順で後になるラベルよりも、アルファベット順で先になるラベルを優先します。

      • "descending" — この関数は、アルファベット順で先になるラベルよりも、アルファベット順で後になるラベルを優先します。

    この入力引数を使用するには、次を行わなければなりません。

    データ型: char | string | logical

    時間-周波数マップに部分的なビンを含めるオプション。1 (true) または 0 (false) として指定します。TimeFrequencyIncludePartialBins を指定すると、createDatastores は、時間-周波数マップのピクセルに時間と周波数のビンの全体を含めなければならないかどうかを決定します。

    この入力引数を使用するには、lblNamesroiTimeFrequency のラベルの定義を指定しなければなりません。

    データ型: double | single | logical

    出力引数

    すべて折りたたむ

    信号データ。signalDatastore オブジェクト、audioDatastore (Audio Toolbox) オブジェクト、または TransformedDatastore オブジェクトとして返されます。

    ラベル データ。arrayDatastore オブジェクトとして返されます。

    バージョン履歴

    R2021a で導入

    すべて展開する