我有一个音高检测函数
在这里,但至少需要
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:
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)):
pitch_freq_vector.append(max_index)
else:
pitch_freq_vector.append(-1)
return pitch_freq_vector