MATLAB - окно Хэмминга, перекрытие 50%
Итак, я написал некоторый код, который берет аудиофайл и разбивается на кадры по 320 сэмплов для 16000 Гц.
Я взял окно Хемминга каждого кадра, как показано кодом:
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 ответ
Посмотрите на документацию для buffer
функция.
Первый аргумент - это ваш сигнал (т.е. не окно Хэмминга). Если вы делаете:
Y = buffer (x, 320, 160)
вы получите матрицу Y
где ваш сигнал был разделен на перекрывающиеся кадры; то есть каждый столбец Y
имеет размер 320 (то есть кадр), и последние 160 элементов одного столбца идентичны первым 160 элементам следующего столбца.
Применение выбранного вами окна Хемминга к каждому "кадру" - это простой случай умножения каждого столбца на окно Хэмминга, например
hammed_Y = Y .* repmat (h(:), [1, size(Y, 2)]);
inb4pedants:
repmat
это не самый эффективный способ сделать это, но это самый ясный способ продемонстрировать концепцию. предпочитать bsxfun
если возможно (или вещание в октаве).