MATLAB - 汉明窗口,重叠50%

时间:2016-10-30 16:16:03

标签: matlab hamming-window

所以我写了一些代码,它接收一个音频文件并分成320个样本的帧,用于16000hz。

我已经拍摄了每帧的汉明窗口,如代码所示:

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

但是没有运气

1 个答案:

答案 0 :(得分:1)

查看buffer函数的文档。

第一个参数是你的信号(即 汉明窗口)。如果你这样做:

Y = buffer (x, 320, 160)

你会得到一个矩阵Y,你的信号被分成重叠的帧;也就是说,Y的每一列的大小为320(即一个帧),一列的最后160个元素与下一列的前160个元素相同。

将您选择的汉明窗口应用于每个“帧”,这是将每列与汉明窗口相乘的简单情况,例如

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

<小时/> inb4pedants:repmat不是最有效的方法,但它是最明显的概念。如果可能,请选择bsxfun(或以八度音阶广播)。