1

そこで、オーディオ ファイルを取り、16000hz の 320 サンプルのフレームに分割するコードを書きました。

コードで示されているように、各フレームのハミング ウィンドウを取得しました。

fs=16000;
[x,fs] = audioread('01.wav');

%Pre-emphasis filter (Y[n]=X [n]-0.95x[n - 1])
b = [1 -0.95];
y = filter(b,1,x);

%windowing
numSamples = length(y);
frameLength = 320;
numFrames = floor(numSamples/frameLength);
for frame = 1:numFrames,
   firstSample = (frame * frameLength) - (frameLength - 1);
   lastSample = (frame * frameLength);

   shortTimeFrame = y(firstSample:lastSample);
   h = hamming(320);

   hs = h.*shortTimeFrame;
   plot(hs, 'r');
end

ハミング ウィンドウを 50% オーバーラップさせるにはどうすればよいでしょうか。SO に関する他の質問を見て、次のような回答を見ました。

y = buffer(h, 1, floor(64 * 0.5));

しかし、それで運がなかった

4

1 に答える 1

1

関数のドキュメントを参照してくださいbuffer

最初の引数はシグナルです (つまり、ハミング ウィンドウではありません)。もしあなたがそうするなら:

Y = buffer (x, 320, 160)

Y信号が重複するフレームに分割されたマトリックスを取得します。つまり、 のすべての列のYサイズは 320 (フレーム) であり、1 つの列の最後の 160 要素は、次の列の最初の 160 要素と同じです。

選択したハミング ウィンドウを各「フレーム」に適用するのは、各列にハミング ウィンドウを乗算する単純なケースです。

hammed_Y = Y .* repmat (h(:), [1, size(Y, 2)]);


inb4pedants:repmatこれを行うには最も効率的な方法ではありませんが、概念を示すには最も明確です。bsxfun可能であれば優先します (またはオクターブでブロードキャストします)。

于 2016-10-30T16:32:56.783 に答える