Main Content

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

dlstft

深層学習の短時間フーリエ変換

R2021a 以降

説明

y = dlstft(x) は、x の深層学習短時間フーリエ変換 (STFT) を返します。dlstft には Deep Learning Toolbox™ が必要です。

y = dlstft(x,fs) は、x がレート fs でサンプリングされたと仮定して、深層学習 STFT を返します。

y = dlstft(x,ts) は、x がサンプル時間 ts でサンプリングされたと仮定して、深層学習 STFT を返します。

y = dlstft(___,Name,Value) は、名前と値の引数を使用して追加オプションを指定します。オプションには、スペクトル ウィンドウ、FFT 長などがあります。これらの引数を前の入力構文のいずれかに追加できます。たとえば、'DataFormat','CBT' は、x のデータ形式を CBT として指定します。

[y,f,t] = dlstft(___) は、深層学習 STFT が計算される周波数 f と時間 t を返します。

すべて折りたたむ

600 Hz で 2 秒間サンプリングされた信号を生成します。この信号は、正弦関数的に変化する周波数成分をもつチャープで構成されます。

fs = 6e2;
t = 0:1/fs:2;
x = vco(sin(2*pi*t),[0.1 0.4]*fs,fs);

信号を、書式化されていない深層学習配列に格納します。信号の短時間フーリエ変換を計算します。サンプル時間を duration スカラーとして入力します。(または、サンプル レートを数値スカラーとして入力します。)入力配列が 'CTB' 形式であることを指定します。

dlx = dlarray(x);

[y,f,t] = dlstft(dlx,seconds(1/fs),'DataFormat','CTB');

出力を数値配列に変換します。短時間フーリエ変換の振幅を計算し、それをウォーターフォール プロットとして表示します。

y = extractdata(y);
f = extractdata(f);
t = seconds(t);

waterfall(f,t,squeeze(abs(y))')

ax = gca;
ax.XDir = 'reverse';
view(30,45)

ylabel('Time (s)')
xlabel('Frequency (Hz)')
zlabel('Magnitude')

Figure contains an axes object. The axes object with xlabel Frequency (Hz), ylabel Time (s) contains an object of type patch.

3 チャネル、160 サンプルの正弦波信号を 1 バッチ含む 3×160 (×1) 配列を生成します。正規化された正弦波の周波数は、π/4 ラジアン/サンプル、π/2 ラジアン/サンプル、および 3π/4 ラジアン/サンプルです。次元を順に指定して、信号を dlarray として保存します。dlarray は、配列の次元を、深層学習ネットワークが期待する 'CBT' 形状に並べ替えます。配列の次元サイズを表示します。

x = dlarray(cos(pi.*(1:3)'/4*(0:159)),'CTB');
[nchan,nbtch,nsamp] = size(x)
nchan = 3
nbtch = 1
nsamp = 160

信号の深層学習の短時間フーリエ変換を計算します。64 サンプルの箱型ウィンドウと、FFT 長 1024 を指定します。

[y,f,t] = dlstft(x,'Window',rectwin(64),'FFTLength',1024);

dlstft は、'T' 次元に沿って変換を計算します。出力配列は、'SCBT' 形式です。'S' 次元は、短時間フーリエ変換の周波数に相当します。深層学習配列からデータを抽出します。

y = extractdata(y);
f = extractdata(f);
t = extractdata(t);

短時間フーリエ変換の振幅を計算します。振幅をチャネルごとに分けてウォーターフォール プロットにプロットします。

z = abs(squeeze(y));

for kj = 1:nchan
    subplot(nchan,1,kj)
    waterfall(f/pi,t,squeeze(z(:,kj,:))')
    view(30,45)
end

xlabel('Frequency (\times\pi rad/sample)')
ylabel('Samples')

Figure contains 3 axes objects. Axes object 1 contains an object of type patch. Axes object 2 contains an object of type patch. Axes object 3 with xlabel Frequency (\times\pi rad/sample), ylabel Samples contains an object of type patch.

入力引数

すべて折りたたむ

入力配列。書式化されていない dlarray (Deep Learning Toolbox) オブジェクト、'CBT' 形式で書式化された dlarray オブジェクト、または数値配列として指定します。x が書式化されていない dlarray または数値配列である場合は、'DataFormat''CBT' をいずれかの順列で指定しなければなりません。

例: dlarray(cos(pi./[4;2]*(0:159)),'CTB')dlarray(cos(pi./[4;2]*(0:159))','TCB') はどちらも、2 チャネル正弦波の 1 つのバッチ観測値を 'CBT' 形式で指定します。

サンプル レート。正の数値スカラーとして指定します。

サンプル時間。duration スカラーとして指定します。ts の指定は、サンプル レート fs = 1/ts の設定と等価です。

例: seconds(1) は、連続する信号サンプル間の 1 秒間の時間差を表す duration スカラーです。

名前と値の引数

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

R2021a より前では、コンマを使用して名前と値をそれぞれ区切り、Name を引用符で囲みます。

例: 'Window',hamming(100),'OverlapLength',50,'FFTLength',128 は、隣接するセグメント間で 50 サンプルがオーバーラップし 128 点の FFT をもつ 100 サンプルのハミング ウィンドウを使用してデータをウィンドウ処理します。

入力のデータ形式。文字ベクトルまたは string スカラーとして指定します。この引数は、x が書式化されていない場合にのみ有効です。

この引数内の各文字は次のラベルのいずれかでなければなりません。

  • C — チャネル

  • B — バッチ観測値

  • T — 時間

関数 dlstft は、'CBT' がどのような順列であっても受け入れます。CBT のラベルは、それぞれ最大で 1 回指定できます。

この引数の各要素が、x の一致する次元のラベルになります。引数がここに挙げた順序 ('C' の後ろに 'B' と続く順序) になっていない場合、dlstft は、順序が一致するように引数とデータの両方を暗黙的に並べ替えます。ただし、データの格納方法は変わりません。

例: 'CBT'

スペクトル ウィンドウ。ベクトルとして指定します。ウィンドウを指定しない場合、またはウィンドウを空として指定する場合、関数は長さが 128 のハン ウィンドウを使用します。'Window' の長さは 2 以上でなければなりません。

利用可能なウィンドウのリストについては、ウィンドウを参照してください。

例: hann(N+1)(1-cos(2*pi*(0:N)'/N))/2 は、いずれも長さ N + 1 のハン ウィンドウを指定します。

データ型: double | single

オーバーラップするサンプルの数。'Window' の長さより小さな非負の整数として指定します。'OverlapLength' を省略するか、空として指定する場合、ウィンドウの長さが 75% より少ない最大整数に設定されます。これは、既定のハン ウィンドウの 96 サンプルです。

データ型: double | single

正の整数として指定する DFT 点の数。この値は、ウィンドウの長さ以上でなければなりません。入力信号の長さが DFT 長より小さい場合、データにはゼロがパディングされます。

データ型: double | single

出力引数

すべて折りたたむ

短時間フーリエ変換。書式化された、または書式化されていない dlarray (Deep Learning Toolbox) オブジェクトとして返されます。

  • x が書式化された dlarray の場合、y'SCBT' で書式化された dlarray オブジェクトになります。'S' 次元は、短時間フーリエ変換の周波数に相当します。

  • x が書式化されていない dlarray または数値配列の場合、y は書式化されていない dlarray オブジェクトになります。y の次元の順序は 'SCBT' です。

時間情報が指定されていない場合、STFT の計算は、'FFTLength' が偶数であればナイキスト範囲 [0, π] で行われ、'FFTLength' が奇数であれば [0, π) で行われます。時間情報を指定すると、計算区間はそれぞれ [0, fs/2][0, fs/2) となります。ここで、fs は有効なサンプル レートです。

深層学習 STFT が計算される周波数。dlarray オブジェクトとして返されます。

  • 入力配列に時間情報が含まれない場合、周波数は正規化された単位のラジアン/サンプルで表されます。

  • 入力配列に時間情報が含まれる場合、f は Hz 単位で表される周波数を含みます。

深層学習 STFT が計算される時間。dlarray オブジェクトまたは duration 配列として返されます。

  • 時間情報を指定しない場合、t にはサンプル数が含まれます。

  • サンプル レートを指定した場合、t には時間値 (秒単位) が含まれます。

  • サンプル時間を指定した場合、t は、x と同じ時間形式をもつ duration 配列となります。

詳細

すべて折りたたむ

短時間フーリエ変換

短時間フーリエ変換 (STFT) を使用して、非定常信号の周波数成分が時間の経過と共に変化する様子を解析します。STFT の振幅の 2 乗は、信号の "スペクトログラム" 時間-周波数表現と呼ばれます。スペクトログラムの詳細や、関数 Signal Processing Toolbox™ を使用したスペクトログラムの計算方法については、Signal Processing Toolbox を使用したスペクトログラムの計算を参照してください。

信号の STFT は、信号上の長さ M の "解析ウィンドウ" g(n) をスライドして、ウィンドウが適用されたデータの各セグメントの離散フーリエ変換 (DFT) を計算することによって算出されます。ウィンドウは、R サンプルの間隔で元の信号を飛び越えます。これは、隣り合ったセグメント間の L = M – R 個のサンプルのオーバーラップに相当します。ほとんどのウィンドウ関数は、スペクトル リンギングを回避するためにエッジで小さくなります。ウィンドウが適用された各セグメントの DFT は、時間と周波数の各点の振幅と位相を含む複素数値行列に対して追加されます。STFT 行列は次の列数をもちます。

k=NxLML

ここで、Nx は信号 x(n) の長さです。⌊⌋ 記号は床関数を表します。行列内の行数は、中央変換および両側変換の場合は DFT 点の数である NDFT と同じで、実数値信号の片側変換の場合は NDFT/2 に近い奇数に等しくなります。

STFT 行列 X(f)=[X1(f)X2(f)X3(f)Xk(f)] の m 番目の列には、時間 mR 付近を中心としたウィンドウが適用されたデータの DFT が含まれます。

Xm(f)=n=x(n)g(nmR)ej2πfn.

  • 短時間フーリエ変換は可逆変換です。逆変換プロセスは、ウィンドウが適用されたセグメントのオーバーラップ加算により、ウィンドウ エッジでの信号の減衰を補正します。詳細については、逆短時間フーリエ変換を参照してください。

  • 関数 istft は、信号の STFT の逆変換を行います。

  • 特定の条件下では、信号の "完全再構成" を実現することができます。詳細については、完全再構成を参照してください。

  • 関数 stftmag2sig は、STFT の振幅から再構成された信号の推定を返します。

拡張機能

バージョン履歴

R2021a で導入

すべて展開する