1

我正在用 javascript 进行录音,并将录音存储为签名浮点数组。我需要什么来确定(并最终调整)阵列上的音高?我见过各种 C++ 算法,但它们在我的情况下似乎没有多大帮助。我什至下载并尝试了这个,看看我是否可以将它的一部分转换为 javascript:

http://voicerecorder.codeplex.com/SourceControl/latest

但实际上所做的只是让录音更响亮,不管我选择什么设置。

4

1 回答 1

2

我不打算在这里提供详尽的答案,而是描述我自己在与音频编程中的类似问题搏斗的过程中发现的发现。

音高检测

如果您的声音是单声道的(因为这听起来是基于您对 jeff 的评论),我已经使用自相关技术实现了音高检测,主要是因为与其他音高检测算法相比,它相对简单。

如果您不熟悉,这个想法如下:

  1. 将样本滑过自身(具有预定的窗口大小;以 1 个样本为增量)
  2. 在每一步,计算原始波浪和滑动窗口之间的绝对差异(很难用语言解释)。
    • 滑动窗口时,记录 (2) 中计算的分数
    • 当波与自身相关时,得分将达到最小值,并且该最小值的时间位置指定了信号的周期性。

在我的实现中,这是唯一运行良好的算法(当输入我的声音样本时;但是我没有尝试各种样本)。

这是对自相关如何工作的粗略解释,本文对不同的音高检测算法进行了很好的比较:

https://ccrma.stanford.edu/~pdelac/154/m154paper.htm

音高变换

当然,您可以通过重新采样获得非常便宜的音高转换,但这听起来类似于播放过快的唱片,这在许多情况下是不可接受的。

就音高变换而言,我的实现还没有走那么远,但最后我停下来,我正在寻找相位声码器作为一种可能的解决方案。困难的是找到一个体面的解释来解释这些算法是如何工作的,这提供了一些关于它们为什么以他们的方式工作的原因的直觉,而不是仅仅提供单独的抽象数学方程。

于 2013-08-12T16:38:59.557 回答