我正在使用一种简单的方法在涉及的python步骤中使用FFT找出音符:读取声音文件(.wave)检测文件中的静音(通过计算落在窗口内的输入元素的平方和的平方和)使用从 (2) 中获得的数据检测笔记的位置使用 DFT 计算每个检测到的音符的频率将计算出的频率与音符的标准频率相匹配,以识别正在播放的音符。但是在音符应该是 A4/440hz 的情况下,我得到了巨大的变化(2K Hz)我的方法是否有任何根本性错误?完整的python代码在这里window_size = 2000 # Size of window to be used for detecting silencebeta = 1 # Silence detection parametermax_notes = 100 # Maximum number of notes in file, for efficiencysampling_freq = 44100 # Sampling frequency of audio signalthreshold = 200 # traversing sound_square array with a fixed window_sizewhile(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
2 回答
慕森王
TA贡献1777条经验 获得超3个赞
音高与 FFT 的峰值幅度频率区间不同。音高是人类的心理声学现象。音高声音可能缺少或非常微弱的基音(在某些声音、钢琴和吉他声音中很常见)和/或频谱中大量强大的泛音压倒了音高频率(但仍然可以作为人类听到的音高音符) . 因此,任何 FFT 峰值频率检测器(甚至包括一些窗口和插值,您的代码都没有)都不是一种可靠的音高估计方法。FFT 还会将频率量化为某个 bin 分辨率(可能比您的要求更粗糙),这取决于 FFT(或窗口)长度。
添加回答
举报
0/150
提交
取消