Найти 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