波形频率低于音符频率?

问题描述 投票:0回答:1

我试图从一个mp3文件中提取一个音符的频率,该文件包含一个A3音符的合成样本,应该是220 Hz。

这是我使用librosa获得的波形的一部分:

正如您所看到的,波浪似乎每400个样本重复一次。因此,通过将采样率(22050 Hz)除以400,我应得到波形的频率。但是,我得到55.125赫兹而不是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

python audio waveform
1个回答
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]))

enter image description here

plt.plot(sr*freqs[0:2000],abs(w[0:2000]))

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.