浮点数数组上的间距检测



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

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

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

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

俯仰检测

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

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

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

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

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

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

变桨

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

就音高偏移而言,我的实现还没有走那么远,但上次我停止了,我正在考虑将相位声码器作为一种可能的解决方案。很难找到一个合理的解释来解释这些算法是如何工作的,从而提供一些直觉来解释它们为什么以这种方式工作,而不仅仅是提供简单抽象的数学方程。

相关内容

  • 没有找到相关文章

最新更新