我正在使用一种简单的方法在涉及的python步骤中使用FFT找出音符:
读取声音文件(.wave)
检测文件中的静音(通过计算落在窗口内的输入元素的平方和的平方和)
使用从 (2) 中获得的数据检测笔记的位置
使用 DFT 计算每个检测到的音符的频率
将计算出的频率与音符的标准频率相匹配,以识别正在播放的音符。
但是在音符应该是 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
慕森王
相关分类