猿问

我的笔记检测算法在少数情况下失败了?

我正在使用一种简单的方法在涉及的python步骤中使用FFT找出音符:

  1. 读取声音文件(.wave)

  2. 检测文件中的静音(通过计算落在窗口内的输入元素的平方和的平方和)

  3. 使用从 (2) 中获得的数据检测笔记的位置

  4. 使用 DFT 计算每个检测到的音符的频率

  5. 将计算出的频率与音符的标准频率相匹配,以识别正在播放的音符。

但是在音符应该是 A4/440hz 的情况下,我得到了巨大的变化(2K Hz)我的方法是否有任何根本性错误?

完整的python代码在这里


window_size = 2000    # Size of window to be used for detecting silence

beta = 1   # Silence detection parameter

max_notes = 100    # Maximum number of notes in file, for efficiency

sampling_freq = 44100   # Sampling frequency of audio signal

threshold = 200



 # traversing sound_square array with a fixed window_size

while(i<=len(sound_square)-window_size):

    s = 0.0

    j = 0

    while(j<=window_size):

        s = s + sound_square[i+j]

        j = j + 1   

        # detecting the silence waves

    if s < threshold:

        if(i-k>window_size*4):

            dft = np.array(dft) # applying fourier transform function

            dft = np.fft.fft(sound[k:i])

            dft = np.argsort(dft)


            if(dft[0]>dft[-1] and dft[1]>dft[-1]):

                i_max = dft[-1]

            elif(dft[1]>dft[0] and dft[-1]>dft[0]):

                i_max = dft[0]

            else :  

                i_max = dft[1]

                        # claculating frequency             

            frequency.append((i_max*sampling_freq)/(i-k))

            dft = []

            k = i+1

    i = i + window_size


慕标5832272
浏览 152回答 2
2回答

慕森王

音高与 FFT 的峰值幅度频率区间不同。音高是人类的心理声学现象。音高声音可能缺少或非常微弱的基音(在某些声音、钢琴和吉他声音中很常见)和/或频谱中大量强大的泛音压倒了音高频率(但仍然可以作为人类听到的音高音符) .&nbsp;因此,任何 FFT 峰值频率检测器(甚至包括一些窗口和插值,您的代码都没有)都不是一种可靠的音高估计方法。FFT 还会将频率量化为某个 bin 分辨率(可能比您的要求更粗糙),这取决于 FFT(或窗口)长度。
随时随地看视频慕课网APP

相关分类

Python
我要回答