1

对于我的声音处理项目(特别是音高检测),我需要实现一个互相关函数,但结果有问题,我有 400 帧,所有帧都有 512 个样本,帧有 50% 重叠这是公式互相关 我已经尝试了很多方法来正确但我不能在这里是我的最后一个代码:

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

问题是最大值总是在最后一个参数中,ccf但它应该在不同的帧中有所不同。请注意,人类的音高频率在 50-400 之间变化,矢量索引稍后会映射到这些频率,对于没有音高的帧,-1将附加到列表中

实现工作正常 它应该用于帧矩阵输入希望你喜欢它

4

0 回答 0