我正在尝试从mp3文件中提取音符的频率,该文件包含一个A3音符的合成样本,应为220 Hz。
这是我使用librosa
获得的波形的一部分:
如您所见,该波似乎每400个样本重复一次。因此,通过将22050 Hz的采样率除以400 I,可以得到波形的频率。但是,我得到的是55.125 Hz(而不是220),我是否缺少某些东西或犯了一个错误?
编辑:这是我正在使用的代码
import librosa
from matplotlib import pyplot as plt
import numpy as np
%matplotlib notebook
y, sr = librosa.load("Simple_synth/A3-saw.mp3")
plt.figure(figsize=(18,6))
plt.plot(y[2000:3000])
note_freq = sr/400
链接到音频文件: https://www.filefactory.com/file/7aqmrvq375n9/A3-saw.mp3
答案 0 :(得分:0)
对于给定的音频样本
import librosa
from matplotlib import pyplot as plt
import numpy as np
y, sr = librosa.load("A3-saw.mp3")
可以计算傅立叶变换(请参见how to extract frequency associated with fft values in python)
# calculate fast fourier transform
w = np.fft.fft(y)
# frequencies associated to the fourier transform
freqs = np.fft.fftfreq(len(y))
然后在傅立叶变换中找到最高峰,其频率以Hz为单位
idx = np.argmax(np.abs(w))
freq = freqs[idx]
freq_in_hertz = abs(freq * sr)
print(freq_in_hertz)
54.90196078431373
样品中还包含更高的谐波,可以通过绘制更多的峰来看到
plt.plot(sr*freqs[0:500],abs(w[0:500]))
plt.plot(sr*freqs[0:2000],abs(w[0:2000]))