R 自相关法基音计算误差 目标:音高计算

R 自相关法基音计算误差 目标:音高计算,r,audio,signal-processing,pitch,R,Audio,Signal Processing,Pitch,问题:计算的节距与预期节距不匹配。例如,输出约为“D3”,但预期输出为“C5” 声源: 源代码 输出 整个计算在时域中执行。 我目前正在使用自相关作为基础,以了解更多有关基音检测和分析的信息。我试着用“Audacity”分析样本,结果是“C5”。因此,我想知道问题到底在哪里。 你们能帮我找到它吗 此外,还有一些重要的疑问: 我的分析窗口实际应该有多小(20ms,1s,…) 使用AMDF和其他类似算法增强自相关算法是否会使该基音检测模块更加健壮 整个分析似乎都不正确。在时域分析中不应使用窗口 附

问题:计算的节距与预期节距不匹配。例如,输出约为“D3”,但预期输出为“C5”

  • 声源:

  • 源代码 输出 整个计算在时域中执行。 我目前正在使用自相关作为基础,以了解更多有关基音检测和分析的信息。我试着用“Audacity”分析样本,结果是“C5”。因此,我想知道问题到底在哪里。 你们能帮我找到它吗

    此外,还有一些重要的疑问:

  • 我的分析窗口实际应该有多小(20ms,1s,…)
  • 使用AMDF和其他类似算法增强自相关算法是否会使该基音检测模块更加健壮

  • 整个分析似乎都不正确。在时域分析中不应使用窗口

    附上python语言的简短解决方案;您可以将其用作伪代码

    from soundfile import read
    from glob import glob
    from scipy.signal import correlate, find_peaks
    from matplotlib.pyplot import plot, show, xlim, title, xlabel
    import numpy as np
    %matplotlib inline
    
    name = glob('*wav')[0]
    samples, fs = read(name)
    
    corr = correlate(samples, samples)
    corr = corr[corr.size / 2:]
    time = np.arange(corr.size) / float(fs)
    ind = find_peaks(corr[time < 0.002])[0]
    
    plot(time, corr)
    plot(time[ind], corr[ind], '*')
    xlim([0, 0.005])
    title('Frequency = {} Hz'.format(1 / time[ind][0]))
    xlabel('Time [Sec]')
    show()
    
    从声音文件导入读取
    从全局导入全局
    从scipy.signal import correlate中,找到_峰值
    从matplotlib.pyplot导入绘图、显示、xlim、标题、xlabel
    将numpy作为np导入
    %matplotlib内联
    name=glob('*wav')[0]
    样本,fs=read(名称)
    corr=相关(样本,样本)
    corr=corr[corr.size/2:]
    时间=np.arange(校正尺寸)/浮动(fs)
    ind=找到峰值(校正[时间<0.002])[0]
    绘图(时间,corr)
    绘图(时间[ind],更正[ind],“*”)
    xlim([0,0.005])
    标题('Frequency={}Hz'。格式(1/次[ind][0]))
    xlabel('时间[秒]')
    show()
    

    > print(min_index)
    [1] 37
    > fs = 44100                
    > fo = fs/min_index 
    > print(fo)
    [1] 1191.892
    > print(notenames(noteFromFF(fo)))
    [1] "d'''"
    
    from soundfile import read
    from glob import glob
    from scipy.signal import correlate, find_peaks
    from matplotlib.pyplot import plot, show, xlim, title, xlabel
    import numpy as np
    %matplotlib inline
    
    name = glob('*wav')[0]
    samples, fs = read(name)
    
    corr = correlate(samples, samples)
    corr = corr[corr.size / 2:]
    time = np.arange(corr.size) / float(fs)
    ind = find_peaks(corr[time < 0.002])[0]
    
    plot(time, corr)
    plot(time[ind], corr[ind], '*')
    xlim([0, 0.005])
    title('Frequency = {} Hz'.format(1 / time[ind][0]))
    xlabel('Time [Sec]')
    show()