Найти Pitch-синхронное управление окнами на основе отслеживания высоты тона

Как видно из ссылки на комментарий, извлекается шаг с помощью робастного алгоритма Талкина для отслеживания высоты тона в голосовой коробке (имя функции - "fxrapt").

http://www.ee.ic.ac.uk/hp/staff/dmb/voicebox/doc/voicebox/fxrapt.html

Однако мне нужно найти импульсы основного тона в сигнале ошибки LP, определяя максимальную амплитуду в каждом периоде основного тона. Для каждого основного тона - окно Хэмминга с двумя периодами основного тона. если T(i-1), T(i), T(i+1) обозначают местоположения трех последовательных импульсов основного тона. Как я могу создать окно анализа для импульса основного тона на отрезках от T (i-1) до T(i+1), как показано на рисунке ниже?

введите описание изображения здесь

Я ищу код MATLAB для него. Я буду очень признателен, если кто-нибудь может мне помочь. Благодарю.

1 ответ

Решение

Шаги:

  • Примените дорожку основного тона, чтобы найти период в каждом кадре, не используйте overalp в дорожке основного тона, это нужно сделать синхронно и линейно.
  • Каждый раз, когда вы находите Period = P, ищите максимальную абсолютную амплитуду сигнала в диапазоне от 1 до P*2.

эти два шага можно сделать так:

while ( (k+Step-1) <= Nsamples )

    frame = x(k:k+steps-1);

    P=PITCHTRACK_FUNCTION_HERE

    [v, l] = max(abs(frame(1:P*2)));

   if count == 1

      marks(count) = l;

   else

     marks(count) = l+k-1;

  count = count +1;

  k=k+Step;

end
  • Теперь у вас есть все метки, относящиеся ко всему сигналу, а затем обойдите векторные метки, чтобы применить окно Хемминга с двумя периодами основного тона!

    test=zeros(length(x),1);
    
    for p=2:length(marks)-2
    
       last=marks(p-1);
    
       next=marks(p+1);
    
    
       test(last:next)=test(last:next) + x(last:next) .*  hamming(length(x(last:next)));
    
    
    
     end
    

PS:

х = ваш сигнал

Nsamples = длина (x)

k = начинается с 1

Шаг = 256 или 512 или 1024 или 2048

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