У меня есть функция определения высоты тона, написанная здесь, но ей нужно numpy
по крайней мере, я думаю, вам следует немного изменить его. Он не сильно зависит от этой библиотеки. Просто для более быстрого результата.
Вот код, эта функция, как видите, не сдвигает окно по размеру, а сдвигает окно с некоторым перекрытием. вы должны настроить эти конкретные коды. есть некоторое использование модуля numpy
, который я мог бы легко изменить, но я оставляю это вам.
В обработке сигналов есть много правил, и я реализовал некоторые из них. например, если энергии кадра недостаточно, у него нет высоты тона, и это отображается отправкой -1 вместо высоты тона.
import numpy as np
def pitch_detection(self, frame_matrix, frame_number, lag_vector, frequency):
np.seterr(divide='ignore', invalid='ignore')
pitch_freq_vector = []
for frame in range(frame_number):
ccf = []
frame_expand_1 = frame_matrix[frame-1, :]
frame_expand_2 = frame_matrix[frame-2, :]
temp_corr_1 = frame_matrix[frame, :]
temp_corr_2 = np.append(frame_expand_1[256:], temp_corr_1, axis=0)
temp_corr_2 = np.append(frame_expand_2[192:256], temp_corr_2, axis=0)
len_tc2 = len(temp_corr_2)
for lag in lag_vector: #pitch is the highest correlation in lag vector
ccf.append(np.sum(temp_corr_1*temp_corr_2[len_tc2-lag-512:len_tc2-lag]))
max_index, max_value = max(enumerate(ccf), key=operator.itemgetter(1))
if max(ccf) > 0.3*np.sum(np.power(temp_corr_1, 2)): #if more than 30 detect pitch
pitch_freq_vector.append(max_index)
else:
pitch_freq_vector.append(-1)
return pitch_freq_vector
person
Sadegh
schedule
05.03.2021