【问题标题】:Waveform frequency lower than musical note frequency?波形频率低于音符频率?
【发布时间】:2023-03-31 22:23:01
【问题描述】:

我正在尝试从包含 A3 音符的合成样本的 mp3 文件中提取音符的频率,该频率应为 220 Hz。

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

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

【问题讨论】:

  • 您好,请提供一些代码,以便我们提供帮助!考虑阅读:MCVE 以获取有关构建好问题的建议。
  • 那么它是不是频率为 55 Hz 的 A1 音符而不是频率为 220 Hz 的 A3 音符?
  • 应该是A3。听起来绝对不像 A1
  • 可以上传音频文件吗?
  • 在不完全正弦的波形中,也有影响声音的高次谐波。

标签: python audio waveform


【解决方案1】:

对于给定的音频样本

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]))

【讨论】:

  • 谢谢!我想我将不得不寻找其他音高检测方法
猜你喜欢
  • 2017-03-04
  • 2019-12-11
  • 1970-01-01
  • 2016-01-12
  • 2013-08-22
  • 2011-02-06
  • 2014-08-29
  • 1970-01-01
  • 2016-01-15
相关资源
最近更新 更多