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
,(或八度广播)。
所以我写了一些代码,将一个音频文件分成 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
,(或八度广播)。