メインコンテンツ

transform

信号データストアの変換

説明

transformDatastore = transform(sds,@fcn) は、関数 read からの出力を変換する新しいデータストアを作成します。

transformDatastore = transform(sds,@fcn,'IncludeInfo',infoIn) には、sds の読み取りで返された情報が含まれます。

すべて折りたたむ

sample_chirps フォルダーには、Signal Processing Toolbox™ に含まれるサンプル ファイルが格納されています。各ファイルには、チャープと 100 ~ 150 Hz の範囲のランダム サンプル レート fs が含まれます。sample_chirps 内の 4 つのファイルを指す信号データストアを作成し、サンプル レート変数の名前を指定します。

addpath("sample_chirps")
files = ["chirp_1.mat","chirp_4.mat","chirp_9.mat","chirp_10.mat"];
sds = signalDatastore(files,SampleRateVariableName="fs");

関数 read の出力を取得し以下を計算して返す関数を定義します。

  • チャープのスペクトログラム。

  • ウィンドウ セグメントの中心に対応する時点のベクトル。

  • 推定値に対応する周波数。

function [dataOut,infoOut] = extractSpectrogram(dataIn,info)
    [dataOut,F,T] = pspectrum(dataIn,info.SampleRate,"spectrogram",...
                              TimeResolution=0.25,...
                              OverlapPercent=40,Leakage=0.8);
    infoOut = info;
    infoOut.CenterFrequencies = F;
    infoOut.TimeInstants = T;
end

関数 transform を呼び出し、定義した関数を使用して各チャープのスペクトログラムを計算するデータストアを作成します。

sdsNew = transform(sds,@extractSpectrogram,IncludeInfo=true);

変換したデータストアに読み取られていないファイルがある場合、新しいデータストアから読み取って、3 次元空間でスペクトログラムを可視化します。

t = tiledlayout("flow");
while hasdata(sdsNew)
    nexttile
    [sig,infoOut] = read(sdsNew);
    waterfall(infoOut.TimeInstants,infoOut.CenterFrequencies,sig)
    xlabel("Frequency (Hz)")
    ylabel("Time (S)")
    view([30 70])
end

Figure contains 4 axes objects. Axes object 1 with xlabel Frequency (Hz), ylabel Time (S) contains an object of type patch. Axes object 2 with xlabel Frequency (Hz), ylabel Time (S) contains an object of type patch. Axes object 3 with xlabel Frequency (Hz), ylabel Time (S) contains an object of type patch. Axes object 4 with xlabel Frequency (Hz), ylabel Time (S) contains an object of type patch.

MATLAB® に含まれる 4 つの信号へのパスを指定します。これらの信号は、鳥の鳴き声、銅鑼、汽車、およびスプラット (ペチャッという音) の録音です。すべての信号は、8192 Hz でサンプリングされます。

folder = fullfile(matlabroot,'toolbox','matlab','audiovideo', ...
         ["chirp.mat","gong.mat","train.mat","splat.mat"]);

指定したファイルを示す信号データストアを作成します。各ファイルには、サンプル レートを示す変数 Fs が含まれています。

sds1 = signalDatastore(folder,'SampleRateVariableName','Fs');

関数 read の出力を取得し、少なくとも 80 サンプル単位に分割された局地的最大値に対してスプライン内挿を使用して信号の上側包絡線と下側包絡線を計算する関数を定義します。この関数はさらに、各信号のサンプル時間を返します。

function [dataOut,infoOut] = signalEnvelope(dataIn,info)
    [dataOut(:,1),dataOut(:,2)] = envelope(dataIn,80,'peak');
    infoOut = info;
    infoOut.TimeInstants = (0:length(dataOut)-1)/info.SampleRate;
end

関数 transform を呼び出して、2 番目のデータストア sds2 を作成します。このデータストアでは、定義した関数を使用して信号の包絡線を計算します。

sds2 = transform(sds1,@signalEnvelope,"IncludeInfo",true);

sds1sds2 を結合して 3 番目のデータストアを作成します。結合したデータストアに対して関数 read を呼び出すたびに、次の 3 列をもつ行列が返されます。

  • 1 列目は元の信号に対応します。

  • 2 列目と 3 列目は、それぞれ上側包絡線と下側包絡線に対応します。

sdsCombined = combine(sds1,sds2);

結合したデータストアから、元のデータと上側包絡線および下側包絡線を読み取って表示します。関数extractBetweenを使用して、ファイル パスからファイル名を抽出します。

tiledlayout('flow')
while hasdata(sdsCombined)
    [dataOut,infoOut] = read(sdsCombined);
    ts = infoOut{2}.TimeInstants;
    nexttile
    hold on
    plot(ts,dataOut(:,1),'Color','#DCDCDC','LineStyle',':')
    plot(ts,dataOut(:,2:3),'Linewidth',1.5)
    hold off
    xlabel('Time (s)')
    ylabel('Signal')
    title(extractBetween(infoOut{:,2}.FileName,'audiovideo\','.mat'))
end

Figure contains 4 axes objects. Axes object 1 with xlabel Time (s), ylabel Signal contains 3 objects of type line. Axes object 2 with xlabel Time (s), ylabel Signal contains 3 objects of type line. Axes object 3 with xlabel Time (s), ylabel Signal contains 3 objects of type line. Axes object 4 with xlabel Time (s), ylabel Signal contains 3 objects of type line.

入力引数

すべて折りたたむ

sdssignalDatastore オブジェクトとして指定します。

データを変換する関数。関数ハンドルとして指定します。関数のシグネチャは、IncludeInfo パラメーターによって異なります。

  • IncludeInfofalse (既定値) に設定されている場合、関数は read からの信号出力を変換します。read からの info 出力は変換されません。

    変換関数には以下のシグネチャがなければなりません。

    function dataOut = fcn(dataIn)
    ...
    end

  • IncludeInfotrue に設定されている場合、関数は read からの信号出力を変換し、read から返される情報を使用または変更することができます。

    変換関数には以下のシグネチャがなければなりません。

    function [dataOut,infoOut] = fcn(signal,infoIn)
    ...
    end

カスタマイズされた関数 read 経由で情報を渡します。true または false として指定します。true の場合、変換関数は、read から取得した情報を使用または変更することができます。IncludeInfo を指定しない場合、既定で false になります。

データ型: logical

出力引数

すべて折りたたむ

カスタマイズされた read をもつ新しいデータストア。sds に設定された UnderlyingDatastoresfcn に設定された Transforms、および true または false に設定された IncludeInfo をもつ TransformedDatastore として返されます。

バージョン履歴

R2020a で導入