【问题标题】:Recognizing notes within recorded sound - Part 2 - Python在录制的声音中识别音符 - 第 2 部分 - Python
【发布时间】:2010-09-15 10:21:17
【问题描述】:

这是这个问题here的延续。

这是我用来获取样本的代码:

spf = wave.open(speech,'r')
sound_info = spf.readframes(-1)
sound_info = fromstring(sound_info, 'Int16')

sound_info的长度为194560,是44100采样率的4.4倍。声音文件的长度是2.2秒,所以sound_info不是应该是两倍的长度吗?

此外,我似乎只能找到足够的信息来说明为什么要使用 FFT 来生成频谱

我想分割声音并分析几分之一秒的频谱,而不是整个声音文件。


非常感谢您的帮助。 :)


这是基本的 sound_info 图

plot(sound_info)

这是 FFT 图

freq = [abs(x.real) for x in fft(sound_info)]
plot(freq)

【问题讨论】:

  • ‘sound_info 的长度不是应该的两倍吗?’:立体声?
  • 感谢 bobince,但我该如何解释 sound_info?因为数据是顺序的

标签: python numpy audio fft computer-science


【解决方案1】:

如果您的 wav 文件有两个通道,则 sound_info 的长度将为 2*sample rate*duration(秒)。通道数据交替出现,因此如果您将所有值放入一维数组data,那么与一个通道关联的值将是data[::2],另一个将是data[1::2]


粗略地说,平滑函数可以表示为正弦波和余弦波的总和(具有不同的幅度和频率)。

FFT(快速傅里叶变换)将函数与这些正弦波和余弦波的系数(幅度)相关联。也就是说,一方面的函数与另一方面的系数序列之间存在一对一的映射。

如果一个声音样本主要由一个音符组成,它的 FFT 将有一个系数非常大(绝对值),而其他系数将非常小。该系数对应于具有特定频率的特定正弦波。这就是音符的频率。

【讨论】:

  • @unutbu 感谢您的精彩回复! :) 你知道为什么 sound_info 是连续的吗?
  • +1:音乐有泛音。其中很多:它们是基频的整数倍。此外,真实仪器包括大量噪声以及时移信号(即多普勒频移),这使得识别基本内容具有挑战性。
  • @S.Lott 谢谢你。有没有办法获得每个样本的频率列表?还是每个样本仅限于一个频率值? :|
  • @RadiantHex:你认为 FFT 能给你什么?它将时域样本转换为频域。请仔细阅读 FFT。
  • @RadiantHex:你可能想看看我对stackoverflow.com/questions/2648151/python-frequency-detection/… 的回答。无论如何,它可能有助于频率检测。此外,如果您真的希望获得特定时间的频率,那么您应该研究短时傅里叶变换。
【解决方案2】:

不要重新发明轮子:)

查看http://librosa.github.io,尤其是关于短时傅里叶变换 (STFT) 的部分,或者在您的情况下,更像是常量 Q 变换 (CQT)。

但首先要做的是: 假设我们有来自音频文件的立体声信号(2 个通道)。现在,我们通过创建一个平均通道(将两个通道相加并除以 2)来丢弃在音频文件的两个通道中编码的空间信息。我们现在有一个单声道(1 个通道)信号。由于我们有一个数字信号,因此每个时间点都称为一个样本。

现在开始有趣的部分,我们通过连续采样(512 或 2 的倍数是标准值)将信号分成小块(称为帧)。 通过对这些帧中的每一帧进行离散傅立叶变换 (DFT),我们得到了一个称为频谱图的时频表示。 任何进一步的概念(重叠等)都可以在每本 DSP 书籍或本实验课程等资源中阅读: https://www.audiolabs-erlangen.de/content/05-fau/professor/00-mueller/02-teaching/2016s_apl/LabCourse_STFT.pdf

请注意,DFT 的频率轴是线性间隔的。在西方音乐系统中,一个八度被分成 12 个半音,其中心频率以对数方式间隔。查看上面的脚本,了解如何从线性 STFT 接收对数间隔的频率轴的分箱策略。 然而,这种方法是非常基础的,还有很多其他可能更好的方法。

现在回到你的笔记识别问题。 第一:这是一个非常艰难的过程。 :) 如上所述,乐器演奏的真实声音包含泛音。 此外,如果您对转录完整乐队演奏的音符感兴趣,您会受到其他音乐家等的干扰。

谈论您可以尝试的方法: 现在很多人使用非负矩阵分解(NMF 或类似的 LDPCA)或神经网络来处理这项任务。 例如,NMF 包含在 scikit-learn 中。 首先,我会推荐 NMF。仅使用单音色声音,即一次演奏一种乐器。用简单的衰减泛音结构初始化模板,看看会发生什么。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-24
  • 2020-01-13
  • 1970-01-01
相关资源
最近更新 更多