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(即一帧),并且一列的最后 160 个元素与下一列的前 160 个元素相同。

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

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


inb4pedants:repmat这不是最有效的方法,但它是最清楚地展示这个概念的方法。如果可能,更喜欢bsxfun(或以八度音阶广播)。

于 2016-10-30T16:32:56.783 回答