我正在用javascript进行录音,并将录音存储为带符号的浮动数组。我需要什么来确定(最终调整)阵列的音高?我见过各种C ++算法,但是在我的情况下,它们似乎并不是很有用。我什至下载并尝试了这一步,看看是否可以将其中的一部分转换为javascript:
http://voicerecorder.codeplex.com/SourceControl/latest
但实际上,不管我选择了什么设置,实际上都是使录音更响亮。
最佳答案
在这里,我不会尝试提供详尽的答案,而是要描述我自己在音频编程中遇到类似问题的过程中发现的发现。
音高检测
如果您的声音是单声道的(听起来是基于您对jeff的评论),那么我已经使用自相关技术实现了音高检测,主要是因为与其他音高检测算法相比,它相对简单。
如果您不熟悉,这个想法如下:
在自身上滑动样品(具有预定的窗口大小;以1个样品为增量)
在每个步骤中,计算原始波和滑动窗口之间的绝对差(很难用口头解释)。
滑动窗口时,请记录下(2)中计算出的分数
当波与自身相关时,得分将达到最小值,并且该最小值的时间位置指定了信号的周期性。
在我的实现中,这是唯一运行良好的算法(当输入我的声音样本时;但是我没有尝试各种样本)。
那是对自相关如何工作的粗略解释,本文对不同的音高检测算法进行了很好的比较:
https://ccrma.stanford.edu/~pdelac/154/m154paper.htm
变音
当然,仅通过重采样就可以得到非常便宜的音调转换,但这听起来像是唱片演奏太快,这在许多情况下是不可接受的。
就音高变化而言,在实现过程中我还没有走那么远,但是最后我离开了,我正在考虑将相位声码器作为一种可能的解决方案。困难的是找到一个关于这些算法如何工作的体面的解释,这可以直观地说明它们以其工作方式的原因,而不是仅仅提供抽象的数学方程式。
关于javascript - 浮点数数组上的音高检测,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18159124/