高性能代码中的峰值检测

发布于 2024-09-13 03:00:21 字数 276 浏览 8 评论 0原文

我正在寻找使用 HPS 方法在 iphone 中实现语音音高检测。但检测到的音调不是很准确。 Performous 在音调检测方面做得不错。

我查看了代码,但没有完全理解计算背后的理论。 他们使用 FFT 并找到峰值。但他们使用 FFT 输出相位的部分让我感到困惑。我认为他们对语音频率使用了一些启发式方法。

那么,有人可以解释一下 Performous 中用于检测音高的算法吗?

I was looking to implement voice pitch detection in iphone using HPS method. But the detected tones are not very accurate. Performous does a decent job of pitch detection.

I looked through the code but i did not fully get the theory behind the calculations.
They use FFT and find the peaks. But the part where they use the phase of FFT output, got me confused.I figure they use some heuristics for voice frequencies.

So,Could anyone please explain the algorithm used in Performous to detect pitch?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

站稳脚跟 2024-09-20 03:00:21

[Performous][1] 从麦克风中提取音高。而且代码是开源的。以下是该算法的编码人员对该算法功能的描述(irc.freenode.net#performous 上的 Tronic)。

  • PCM 输入(带缓冲)
  • FFT(一次 1024 个样本,之后从缓冲区前面删除 200 个样本)
  • 重新分配方法(相对于之前的 FFT 为 200 个样本)
  • 峰值过滤(这部分可以做得更好,甚至可以做得更好)省略)
  • 将峰值组合成谐波组(我们将组合称为音调)
  • 音调的时间过滤(更新之前检测到的音调集,而不是简单地使用新检测到的音调)
  • 选择最佳的声音音调(频率限制,权重,可以也使用谐波阵列,但我认为我们没有这样做)

我仍然无法从这些信息中找出并实现它。如果有人解决了这个问题,请在此处发布您的结果,并评论此回复,以便 SO 通知我。

任务是围绕此代码创建一个最小的 C++ 包装器。

[Performous][1] extracts pitch from the microphone. Also the code is open source. Here is a description of what the algorithm does, from the guy that coded it (Tronic on irc.freenode.net#performous).

  • PCM input (with buffering)
  • FFT (1024 samples at a time, remove 200 samples from front of the buffer afterwards)
  • Reassignment method (against the previous FFT that was 200 samples earlier)
  • Filtering of peaks (this part could be done much better or even left out)
  • Combining peaks into sets of harmonics (we call the combination a tone)
  • Temporal filtering of tones (update the set of tones detected earlier instead of simply using the newly detected ones)
  • Pick the best vocal tone (frequency limits, weighting, could use the harmonic array also but I don't think we do)

I still wasn't able from this information to figure it out and implement it. If anyone manages this, please please post your results here, and comment this response so that SO notifies me.

The task would be to create a minimal C++ wrapper around this code.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文