所以我写了一些代码,它接收一个音频文件并分成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));
但是没有运气
答案 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
(或以八度音阶广播)。