言葉で説明されている逆短時間フーリエ変換アルゴリズム


20

順方向および逆方向の短時間フーリエ変換(STFT)が離散時間領域信号に適用されたときに何が起こっているかを概念的に理解しようとしています。Allen and Rabiner(1977)による古典的な論文とWikipediaの記事(link)を見つけました。ここにも良い記事があると思います

Gabor変換の計算に興味がありますが、これはGaussianウィンドウを使用したSTFTに他なりません。

これは私がフォワード STFT について理解していることです

  1. サブシーケンスは、時間領域要素から構成される、信号から選択されます。
  2. サブシーケンスは、時間領域におけるポイントごとの乗算を用いて窓関数が乗算されます。
  3. 乗算されたサブシーケンスは、FFTを使用して周波数領域に取り込まれます。
  4. 連続する重複するサブシーケンスを選択し、上記の手順を繰り返すことにより、mn列のマトリックスを取得します。各列は、特定の時間に計算されたサブシーケンスです。これを使用してスペクトログラムを計算できます。

ただし、 STFTについては、重複する分析セクションの合計について説明しています。ここで実際に何が起こっているのかを視覚化することは非常に難しいと感じています。 STFT を計算できるようにするために何をする必要がありますか(上記のステップバイステップ順)?

フォワードSTFT

私はフォワードSTFTのために何が起こっていると思うかを示す図面を作成しました。私が理解していないのは、各サブシーケンスをどのように組み立てて元のタイムシーケンスを取り戻すかということです。誰かがこの図面を修正するか、サブシーケンスがどのように追加されるかを示す方程式を与えることができますか?前方変換

逆変換

これが逆変換について私が理解していることです。連続する各ウィンドウは、IFFTを使用して時間領域に戻されます。次に、各ウィンドウがステップサイズ分シフトされ、前のシフトの結果に追加されます。次の図は、このプロセスを示しています。合計出力は時間領域信号です。

逆変換

コード例

次のMatlabコードは、合成時間領域信号を生成し、STFTプロセスをテストして、数値丸め誤差内で逆変換が順変換の双対であることを示します。ウィンドウの中心を時間領域信号の最初と最後の要素に配置できるように、信号の開始と終了にはゼロが埋め込まれます。

Allen and Rabiner(1977)によると、周波数応答を変更するために周波数ドメインで乗算が発生する場合、分析ウィンドウの長さはポイント以上でなければなりませんはフィルター応答です。長さはゼロパディングによって拡張されます。テストコードは、逆変換が順変換の双対であることを示しています。循環畳み込みを防ぐために、長さを延長する必要があります。N 0N+N01N0

% The code computes the STFT (Gabor transform) with step size = 1
% This is most useful when modifications of the signal is required in
% the frequency domain

% The Gabor transform is a STFT with a Gaussian window (w_t in the code)

% written by Nicholas Kinar

% Reference:
% [1] J. B. Allen and L. R. Rabiner, 
% “A unified approach to short-time Fourier analysis and synthesis,” 
% Proceedings of the IEEE, vol. 65, no. 11, pp. 1558 – 1564, Nov. 1977.

% generate the signal
mm = 8192;                  % signal points
t = linspace(0,1,mm);       % time axis

dt = t(2) - t(1);           % timestep t
wSize = 101;                % window size


% generate time-domain test function
% See pg. 156
% J. S. Walker, A Primer on Wavelets and Their Scientific Applications, 
% 2nd ed., Updated and fully rev. Boca Raton: Chapman & Hall/CRC, 2008.
% http://www.uwec.edu/walkerjs/primer/Ch5extract.pdf
term1 = exp(-400 .* (t - 0.2).^2);
term2 = sin(1024 .* pi .* t);
term3 = exp(-400.*(t- 0.5).^2);
term4 = cos(2048 .* pi .* t);
term5 = exp(-400 .* (t-0.7).^2);
term6 = sin(512.*pi.*t) - cos(3072.*pi.*t);
u = term1.*term2  + term3.*term4 + term5.*term6; % time domain signal
u = u';

figure;
plot(u)

Nmid = (wSize - 1) / 2 + 1;    % midway point in the window
hN = Nmid - 1;                 % number on each side of center point       


% stores the output of the Gabor transform in the frequency domain
% each column is the FFT output
Umat = zeros(wSize, mm);     


% generate the Gaussian window 
% [1] Y. Wang, Seismic inverse Q filtering. Blackwell Pub., 2008.
% pg. 123.
T = dt * hN;                    % half-width
sp = linspace(dt, T, hN); 
targ = [-sp(end:-1:1) 0 sp];    % this is t - tau
term1 = -((2 .* targ) ./ T).^2;
term2 = exp(term1);
term3 = 2 / (T * sqrt(pi));
w_t = term3 .* term2;
wt_sum = sum ( w_t ); % sum of the wavelet


% sliding window code
% NOTE that the beginning and end of the sequence
% are padded with zeros 
for Ntau = 1:mm

    % case #1: pad the beginning with zeros
    if( Ntau <= Nmid )
        diff = Nmid - Ntau;
        u_sub = [zeros(diff,1); u(1:hN+Ntau)];
    end

    % case #2: simply extract the window in the middle
    if (Ntau < mm-hN+1 && Ntau > Nmid)
        u_sub = u(Ntau-hN:Ntau+hN);
    end

    % case #3: less than the end
    if(Ntau >= mm-hN+1)
        diff = mm - Ntau;
        adiff = hN - diff;
        u_sub = [ u(Ntau-hN:Ntau+diff);  zeros(adiff,1)]; 
    end   

    % windowed trace segment
    % multiplication in time domain with
    % Gaussian window  function
    u_tau_omega = u_sub .* w_t';

    % segment in Fourier domain
    % NOTE that this must be padded to prevent
    % circular convolution if some sort of multiplication
    % occurs in the frequency domain
    U = fft( u_tau_omega );

    % make an assignment to each trace
    % in the output matrix
    Umat(:,Ntau) = U;

end

% By here, Umat contains the STFT (Gabor transform)

% Notice how the Fourier transform is symmetrical 
% (we only need the first N/2+1
% points, but I've plotted the full transform here
figure;
imagesc( (abs(Umat)).^2 )


% now let's try to get back the original signal from the transformed
% signal

% use IFFT on matrix along the cols
us = zeros(wSize,mm);
for i = 1:mm 
    us(:,i) = ifft(Umat(:,i));
end

figure;
imagesc( us );

% create a vector that is the same size as the original signal,
% but allows for the zero padding at the beginning and the end of the time
% domain sequence
Nuu = hN + mm + hN;
uu = zeros(1, Nuu);

% add each one of the windows to each other, progressively shifting the
% sequence forward 
cc = 1; 
for i = 1:mm
   uu(cc:cc+wSize-1) = us(:,i) + uu(cc:cc+wSize-1)';
   cc = cc + 1;
end

% trim the beginning and end of uu 
% NOTE that this could probably be done in a more efficient manner
% but it is easiest to do here

% Divide by the sum of the window 
% see Equation 4.4 of paper by Allen and Rabiner (1977)
% We don't need to divide by L, the FFT transform size since 
% Matlab has already taken care of it 
uu2 = uu(hN+1:end-hN) ./ (wt_sum); 

figure;
plot(uu2)

% Compare the differences bewteen the original and the reconstructed
% signals.  There will be some small difference due to round-off error
% since floating point numbers are not exact
dd = u - uu2';

figure;
plot(dd);

2
すばらしい質問-しかし、どうやってそれらの図をその場で素早く作成したのですか?
...-Spacey

2
図にはAdobe Illustratorを、ギリシャ文字にはMathtypeを使用しました。
ニコラスキナー

1
「Gabor変換の計算に興味がありますが、これはGaussianウィンドウを使用したSTFTにすぎません。」ガボール変換は連続積分であり、ガウスウィンドウは無限に広がることに注意してください。STFTの典型的な実装では、個別の重複したチャンクを使用し、有限長のウィンドウを使用する必要があります。
エンドリス

それを指摘してくれてありがとう、エンドリス。信号処理を行うとき、私は非常に離散的な方法で考える傾向があります。
ニコラス・キナー

回答:


11

STFT変換ペアは、4つの異なるパラメーターによって特徴付けられます。

  1. FFTサイズ(N)
  2. ステップサイズ(M)
  3. 分析ウィンドウ(サイズN)
  4. 合成ウィンドウ(サイズN)

プロセスは次のとおりです。

  1. 現在の入力位置からN(fftサイズ)サンプルを取得します
  2. 分析ウィンドウを適用
  3. FFTを行う
  4. 周波数領域でやりたいことを何でもする
  5. 逆FFT
  6. 合成ウィンドウを適用
  7. 現在の出力場所で出力に追加します
  8. 入力サンプルおよび出力ロケーションをM(ステップサイズ)サンプルで進める

オーバーラップ加算アルゴリズムはその良い例です。この場合、ステップサイズはN、FFTサイズは2 * N、分析ウィンドウはN個の1にN個のゼロが続く長方形で、合成ウィンドウはすべて1です。

他にも多くの選択肢があり、特定の条件下では、順方向/逆方向の転送が完全に再構築されます(つまり、元の信号を戻すことができます)。

ここで重要なのは、各出力サンプルが通常、複数の逆FFTから加法的寄与を受け取ることです。出力は複数のフレームにわたって蓄積する必要があります。寄与しているフレームの数は、FFTサイズをステップサイズで除算することで簡単に与えられます(必要に応じて切り上げられます)。


洞察に満ちた答えをありがとうございます。重複加算法を理解しています。合成ウィンドウには何を使用しますか?方程式はありますか?分析ウィンドウ関数(ガウスウィンドウなど)がわかっている場合、合成ウィンドウを計算するにはどうすればよいですか?畳み込みにオーバーラップ加算法がどのように使用されるかは理解していますが、STFTにどのように使用されるかはわかりません。ステップサイズがstep = 1の場合、フレームを一緒に追加するにはどうすればよいですか?方程式はありますか?
ニコラスキナー

分析ウィンドウ関数がステップサイズstep = 1の各サンプルを中心とする場合、ウィンドウの中央が各サンプル(最初と最後を含む)時間領域シーケンスのサンプル)?
ニコラスキナー

アプリケーションの特定のニーズに応じて、ステップサイズ、fftサイズ、分析お​​よび合成ウィンドウを選択できます。1つの例は、ステップサイズN、FFTサイズ2 * N、分析ハニング、すべて1の合成です。これを分析sqrt(hanning)および合成sqrt(hanning)に変更できます。どちらでも機能します。周波数ドメインで何をするか、時間ドメインエイリアシングなど、どのような種類のアーティファクトを作成するかについて詳しく説明します。
ヒルマー

@Hilmar:信号に周波数領域の変更を加え、IFFTを実行して時間領域の信号を取得できるようにする必要があります。時間領域のエイリアシングを最小限に抑えたい。各サブシーケンスを時間ドメインに戻し、それらを一緒に追加する方法はまだわかりません。
ニコラスキナー

テストコードをいくつか書いてから、元の質問を更新しました。
ニコラスキナー

2

この質問が最初に提起されてから7年後、@ Nicholas Kinarのような混乱に遭遇しました。ここで、個人的な知覚的アイデアと説明を「非公式」と「正確性が完全に保証されていない」いくつか提供したいと思います。

次のステートメントのタイトルは、わかりやすくするために誇張されています。

  1. STFTのフォワードプロセスは、実際には元の信号を保持するためのものではありません。
    • 非自明なウィンドウ(すべてではない)でSTFTを使用する場合、FFTへの入力信号は、元の信号フラグメントのスキュー/ストレッチバージョンです。
    • これは、役に立たない/冗長なデータが除外される特徴抽出に適しています。音節の検出のように、スピーチの特定のトーンを検出するためにすべての一時データが必要なわけではありません。
    • ウィンドウベクトルのピークは、アルゴリズムが注意を払う必要があるオーディオ信号の位置の少数を表します。
  2. したがって、逆STFTの生の結果は、直感的には期待できないものになる可能性があります。
    • STFT機能のifftのように見えるウィンドウ化された信号フラグメントである必要があります。
  3. 元のウィンドウ化されていない信号フラグメントを取得するには、ifftの生の出力に逆ウィンドウを適用できます。
    • ハン/ハミングウィンドウ効果を元に戻すことができるマッピング関数を設計するのは簡単です。
  4. 合成ウィンドウは、一時的な断片化の重複を処理するために含まれます
    • 元のウィンドウ化されていない信号フラグメントはすでに取得されているように見えるため、「遷移重み付け」を使用して、オーバーラップ部分を補間できます。
  5. ウィンドウ化されたスピーチのfftは弱い信号をあまり尊重せず、それらの強力な信号を崇拝する可能性があると考えたい場合、対応する合成ウィンドウを設計する方法があるかもしれません。
  6. また、次の原則を適用することにより、単純な合成ウィンドウ生成アルゴリズムを提供できます。
    • この位置の分析ウィンドウの値が高い場合、この位置とオーバーラップする他のフラグメントと比較して、合成ウィンドウ内の位置を高くします。
    • この位置の分析ウィンドウの値が低い場合、合成ウィンドウ内の位置の重みを低くし、他のオーバーラップフラグメントは、分析ウィンドウの値が大きいほどこの位置を優先します。

1
これらは、STFTについて考えることを確実に促進するのに役立つ興味深い声明です。
ニコラス・キナー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.