浮点数数组的音高检测
Posted
技术标签:
【中文标题】浮点数数组的音高检测【英文标题】:Pitch detection on array of floating point numbers 【发布时间】:2013-08-10 06:00:49 【问题描述】:我正在用 javascript 进行录音,并将录音存储为签名浮点数组。我需要什么来确定(并最终调整)阵列上的音高?我见过各种 C++ 算法,但它们在我的情况下似乎没有多大帮助。我什至下载并尝试了这个,看看我是否可以将它的一部分转换为 javascript:
http://voicerecorder.codeplex.com/SourceControl/latest
但实际上所做的只是让录音更响亮,不管我选择什么设置。
【问题讨论】:
您查看过 PitchShifter.cs 文件吗? voicerecorder.codeplex.com/SourceControl/… 我看了看,但在实践中,它不起作用。我检查了控制台,它检测到了 0mhz 的所有样本。我的声音不可能这么低。既然如此,我真的不认为我应该移植非工作软件。 【参考方案1】:我不打算在这里提供详尽的答案,而是描述我自己在与音频编程中的类似问题搏斗的过程中发现的发现。
音高检测
如果您的声音是单声道的(听起来是基于您对 jeff 的评论),我已经使用自相关技术实现了音高检测,主要是因为它比较简单到其他音高检测算法。
如果你不熟悉,这个想法如下:
-
在自身上滑动一个样本(使用预定的窗口大小;以 1 个样本为增量)
在每一步,计算原始波和滑动窗口之间的绝对差(很难用语言解释)。
滑动窗口时,记录 (2) 中计算的分数
当波与自身相关时,分数将达到最小值,该最小值的时间位置指定了信号的周期性。
在我的实现中,这是唯一运行良好的算法(当输入我的语音样本时;但是我没有尝试各种样本)。
这是对自相关工作原理的粗略解释,本文对不同的音高检测算法进行了很好的比较:
https://ccrma.stanford.edu/~pdelac/154/m154paper.htm
音高变换
当然,您可以通过重新采样获得非常便宜的音高转换,但这听起来类似于播放过快的唱片,这在许多情况下是不可接受的。
就音高shifting 而言,我的实现还没有走那么远,但最后我停下来,我正在寻找相位声码器作为一种可能的解决方案。很难找到关于这些算法如何工作的体面解释,从而提供一些关于它们以它们的方式工作的原因的直觉,而不是仅仅提供单独的抽象数学方程。
【讨论】:
以上是关于浮点数数组的音高检测的主要内容,如果未能解决你的问题,请参考以下文章