Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 高频时stft倒谱的基频(峰值、基音)不准确_Python_Audio Processing - Fatal编程技术网

Python 高频时stft倒谱的基频(峰值、基音)不准确

Python 高频时stft倒谱的基频(峰值、基音)不准确,python,audio-processing,Python,Audio Processing,我试图探测声音的基频 我用倒谱来寻找频率 除了高频率外,它工作得很好 我想检测钢琴的最高频率,C8(4186Hz) 然而,要检测采样率为44100的4186Hz,我需要quefrency 10.5,这是不可能的,因为quefrency是样本数 所以我得到10个频率,44100/10=4410Hz,接近C#8(4435Hz) 我应该如何检测准确的基频 编辑: samplerate, samples = wav.read(audiopath) print "samplerate= " + str(s

我试图探测声音的基频

我用倒谱来寻找频率

除了高频率外,它工作得很好

我想检测钢琴的最高频率,C8(4186Hz)

然而,要检测采样率为44100的4186Hz,我需要quefrency 10.5,这是不可能的,因为quefrency是样本数

所以我得到10个频率,44100/10=4410Hz,接近C#8(4435Hz)

我应该如何检测准确的基频

编辑:

samplerate, samples = wav.read(audiopath)
print "samplerate= " + str(samplerate)
samples = (samples[:, 0] + samples[:, 1]) / 2
overlapFac = 0.9
s = stft(samples, binsize, overlapFac)

break_flag = False
fund_freq_list = []
for i in range(len(s)):
    ceps = np.fft.irfft(np.power(np.log(np.abs(s[i])), 2))      
    for nan in np.isnan(ceps):      
        if nan:
            break_flag = True
            break

    if break_flag:
        break

    plt.plot(ceps)


    ignore_begin = int(samplerate/4500 - 2)
    ceps = ceps[ignore_begin:]


    for under_zero in ceps:
        if under_zero < 0:
            under_zero = np.where(ceps == under_zero)[0][0]
            break


    print "under_zero = " + str(under_zero+ignore_begin)


    ceps = ceps[under_zero:int(samplerate/27.5 + 2)]
    hertz = str(samplerate/float(ceps.argmax() + under_zero + ignore_begin))
    print "hertz = " + hertz
    print "sec = %3.3f ~ %3.3f" % (float((binsize*i*(1-overlapFac)))/float((samplerate)), float((binsize*(i+1)*(1-overlapFac)))/float((samplerate)))
    print "val = " + str(ceps.max())
    print "--------------------"

    fund_freq_list.append({'s_num': i, 'hertz': float(hertz)})
samplerate,samples=wav.read(音频路径)
打印“samplerate=”+str(samplerate)
样本=(样本[:,0]+样本[:,1])/2
重叠fac=0.9
s=stft(样本、料仓大小、重叠FAC)
break_flag=False
基金频率列表=[]
对于范围内的i(len(s)):
ceps=np.fft.irfft(np.power(np.log(np.abs(s[i])),2))
对于np.isnan中的nan(CEP):
如果nan:
break_flag=True
打破
如果断开标志:
打破
plt.绘图(ceps)
忽略_begin=int(samplerate/4500-2)
ceps=ceps[忽略开始:]
对于CEP中的零下值:
如果低于_零<0:
在零下=np,其中(ceps==零下)[0][0]
打破
打印“在零下=”+str(在零下+忽略开始)
ceps=ceps[零下:int(samplerate/27.5+2)]
赫兹=str(采样器/浮点(ceps.argmax()+零下+忽略开始))
打印“赫兹=+赫兹
打印“sec=%3.3f~%3.3f”%(float((binsize*i*(1-overlapFac)))/float((samplerate)),float((binsize*(i+1)*(1-overlapFac))/float((samplerate)))
打印“val=“+str(ceps.max())
打印“----------------------”
追加({'s_num':i,'hertz':float(hertz)})

您应该添加代码作为一个整体。通常,倒谱方法在较高音频基音估计时不如其他基音估计方法准确。@hotpaw2对于高频,我可以使用哪些其他基音估计方法?