Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

dlstft

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

説明

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

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

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

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

[yr,yi,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);

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

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

yr = extractdata(yr);
yi = extractdata(yi);

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

waterfall(f,t,squeeze(hypot(yr,yi))')

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

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

Figure contains an axes object. The axes object 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 を指定します。

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

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

深層学習配列からデータを抽出します。

re = squeeze(extractdata(re));
im = squeeze(extractdata(im));

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

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

z = abs(re + 1j*im);

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 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

出力引数

すべて折りたたむ

短時間フーリエ変換。書式化された 2 つの dlarray (Deep Learning Toolbox) オブジェクトとして返されます。yr には、変換の実数部が含まれます。yi には、変換の虚数部が含まれます。

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

  • x が書式化されていない dlarray または数値配列である場合、yryi は書式化されていない dlarray オブジェクトです。yryi の次元の順序は '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 は、信号上の長さ M"解析ウィンドウ" をスライドして、ウィンドウが適用されたデータの離散フーリエ変換を計算することによって計算されます。ウィンドウは、R サンプルの間隔で元の信号を飛び越えます。ほとんどのウィンドウ関数は、スペクトル リンギングを回避するためにエッジで小さくなります。非ゼロのオーバーラップ長 L が指定されている場合、ウィンドウが適用されたセグメントのオーバーラップ加算がウィンドウ エッジでの信号の減衰を補正します。ウィンドウが適用された各セグメントの DFT は、時間と周波数の各点の振幅と位相を含む行列に対して追加されます。STFT 行列内の列数は次のように求められます。

k=NxLML

ここで、Nx は元の信号 x(n) の長さです。⌊⌋ 記号は床関数を表します。行列内の行数は、中央変換および両側変換の場合は DFT 点の数である NDFT と同じで、片側変換の場合は ⌊NDFT/2⌋ + 1 と同じです。

STFT 行列は、この行列の m 番目の要素が

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

である X(f)=[X1(f)X2(f)X3(f)Xk(f)] によって指定されます。

ここで、

  • g(n) — 長さ M のウィンドウ関数。

  • Xm(f) — 時間 mR 付近を中心としたウィンドウが適用されたデータの DFT。

  • R — 連続する DFT 間のホップ サイズ。ホップ サイズは、ウィンドウの長さ M とオーバーラップ長 L 間の差異です。

STFT の振幅二乗では、関数のパワー スペクトル密度の spectrogram 表現が得られます。

拡張機能

バージョン履歴

R2021a で導入