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 если возможно (или вещание в октаве).

Другие вопросы по тегам