2016-10-30 2 views
1

Итак, я написал код, который принимает аудиофайл и разбивается на кадры из 320 образцов для 16000 Гц.MATLAB - окно Хэмминга, перекрытие 50%

Я взял в окно Хэмминга каждого кадра, как показано в коде:

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

+0

так что Y = буфер отсутствует вне цикла for и находится hammed_Y? Я не знаю, что такое repmat, я новичок в matlab – user3667111

+0

'repmat' повторяет матрицу вдоль измерения. В моем примере 'h (:)' гарантирует, что 'h' находится в форме столбца, а' repmat' повторяет его один раз вдоль строк (т. Е. Не повторяет) и 'size (Y, 2)' times вдоль столбцов , Это дает вам матрицу того же размера, что и «Y», где все столбцы идентичны (т. Е. Ваш «h»), поэтому вы можете выполнить «элементарное» простое умножение с Y «векторизованным» способом. Нет необходимости в петлях. –

+0

Есть ли способ, которым я мог бы построить всю форму волны с перекрытием? – user3667111

 Смежные вопросы

  • Нет связанных вопросов^_^