MATLAB - 汉明 window,重叠 50%

MATLAB - Hamming window, overlap 50%

所以我写了一些代码,将一个音频文件分成 16000hz 的 320 个样本的帧。

我已经对每一帧进行了海明window,如代码所示:

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

然后如何将汉明 windows 重叠 50%? 我在 SO 上看到了其他问题并看到了这样的答案:

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

但是运气不好

查看 buffer 函数的文档。

第一个参数是你的信号(即不是汉明window).如果你这样做:

Y = buffer (x, 320, 160)

您将得到一个矩阵 Y,其中您的信号已拆分为重叠的帧;也就是说,Y 的每一列的大小为 320(即一帧),并且一列的最后 160 个元素与下一列的前 160 个元素相同。

将您选择的汉明 window 应用于每个 'frame' 就是将每列与汉明 window 相乘的简单情况,例如

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


inb4pedants:repmat 不是执行此操作的最有效方法,但它是展示概念的最清晰方法。如果可能,最好选择 bsxfun,(或八度广播)。