我正在使用一种简单的方法来找出在python步骤中使用FFT的音乐音符:
但是当音符应该是A4/440 Hz时,我得到了一个巨大的变化(2KHz),在我的方法中有什么基本的错误吗?
更新:我如何将我的audio.wav文件传递给这个频率估计器?
完整的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
发布于 2018-11-16 16:33:39
基音与FFT的峰值频域不一样。基音是人类的一种心理声学现象。音高可能有一个缺失或非常微弱的基本音(在一些声音,钢琴和吉他声音中常见)和/或在其频谱中的许多强大的暗示,压倒音高的频率(但仍然听到的音高音符,由一个人)。因此,任何FFT峰值频率检测器(甚至包括一些加窗和插值,而你的代码没有)将不是一个稳健的方法,音乐音高估计。FFT还会将频率量化到取决于FFT (或窗口)长度的二进制分辨率(可能比您的要求更粗)。
对这种堆叠溢出问题的回答包括一些估计音调的替代方法的列表,这些方法可能会产生更好的结果。
发布于 2018-12-02 02:16:38
基音跟踪在librosa.piptrack https://librosa.github.io/librosa/generated/librosa.core.piptrack.html#librosa.core.piptrack中实现
https://stackoverflow.com/questions/53299627
复制相似问题