【问题标题】:Android process audio for guitar tuner [closed]吉他调音器的Android处理音频[关闭]
【发布时间】:2013-01-22 07:55:00
【问题描述】:

处理音频以便输出正在播放的音符的最佳方法是什么?我正在为大学作业创建吉他调音器,而且我是 Android 开发新手。

我已经看到了关于从 Google API 录制声音的 Android 示例,但我想知道从那里去哪里?

我知道我必须进行傅立叶变换或其他操作才能获得频率,只是想知道是否有人对如何做到这一点有任何建议?

一旦我们可以在屏幕上显示正确的频率,我们就可以完成大部分项目。

感谢您的帮助。

【问题讨论】:

  • C:blog.bjornroche.com/2012/07/…中音高跟踪(带代码)的说明
  • 如果你还不熟悉傅里叶变换,那么我怀疑为这个项目创建/实现算法将远远超出这个项目的范围(除非你有很长时间做这个项目,比如 6 个月,并且有很强的数学背景)。如果您没有那么多时间,那么我会遵循@anthropomo 的建议
  • @BjornRoche 谢谢你,我会看看他们 :) 并感谢 C 代码,应该帮助我。
  • @AndyOHart 请问您的项目结果如何/可行吗?我现在处于类似情况,必须为大学项目做一个 android 应用程序(没有以前的 android 开发经验)并且想做一个吉他调音器,不知道这有多可行

标签: android audio signal-processing


【解决方案1】:

如果您的教练同意您使用库进行音频处理,这里是使用 libpd 的完整 android 吉他调音器应用程序的源代码:

https://github.com/nettoyeurny/Making-Musical-Apps/tree/master/android/GuitarTuner

要使用它,您还需要学习 Pure Data 音频合成编程语言的基础知识。调谐器所需的工具并不太广泛,并在上述应用程序中进行了布局。显然,您需要做一些工作才能使这成为您自己的工作。

这是使用纯数据的一个很好的介绍:

http://en.flossmanuals.net/pure-data/

【讨论】:

  • 据我所知,他可以使用库。非常感谢你,它实际上会帮助我们很多。真的很感谢那个人!
【解决方案2】:

如果您从未进行过 Android 开发,并且在数字信号处理和傅立叶变换方面几乎没有经验,那么您将面临一个艰巨的挑战。

另一方面,如果您可以按照 anthropomo 建议的那样使用现有的库来完成任务,那么您可能会有很好的机会完成它。

但是,如果您的教授不允许您使用现有的图书馆,您需要解决以下难题:

您的程序如何自动找到正在播放的音符的基频?看看这个真正的古典原声吉他演奏 E2 音符的频率/频率分贝幅度图。观察到基频 (82.4 Hz) 比一次谐波(一次谐波为 164.8 Hz)衰减了约 17 分贝 (17 dB)。

下面是同一幅图的特写,您可以更清楚地看到基本峰值:

基频比一次谐波衰减 17 dB,这是一个很大的衰减。下面是相同的 E2 音符频谱,但现在它绘制在线性频率幅度轴上(垂直轴现在是线性频率幅度而不是分贝频率幅度)。现在您可以更清楚地看到基频峰值实际低于一次谐波有多远。

您的程序必须自动检测 82.4 Hz 的 17 dB 衰减基波,但是在您的程序无法提前知道用户在他的吉他上弹奏哪个音符的一般情况下,您如何做到这一点?

上述频谱适用于古典原声吉他上的 E2。钢弦吉他上 E2 的频谱有何不同?放大电吉他上的 E2 怎么样?您的程序将如何处理这些不同光谱之间的差异?

这个问题不是小事。问题是您有多少时间来完成这项作业,以及您的教授认为什么是已完成的作业。

这个参考给出更深的理解:Musical instrument spectra to 102.4 KHz

您可以在此处绘制频谱并听到 E2 到 Bb5 的吉他音符:Musical instrument spectrum

【讨论】:

  • 非常感谢您的意见。我想我们必须在 3 月 22 日之前提交最终项目。我认为这将很难做到,但似乎使用库可能是一种选择!
  • 如果您打算让您的程序自动“猜测”用户在他的吉他上弹奏的音符,以及用户弹奏该音符与完美音高的距离有多远,那么您正在接受一个艰巨的任务。
  • 为什么不显示声音的线性幅度谱,如上图之一所示,让用户输入他正在演奏的音符(例如 E2),将 E2 的基频标记在情节,并让用户调整他的吉他,使来自用户吉他的基频谱线与您的程序显示的 E2 的位置相匹配?这样一来,您就可以充分利用用户的脑力,而您的程序要做的工作就会少得多。
  • 是的,我明白你的意思,不幸的是,在我们的功能规范中,我们已经概述了它是如何工作的。您是否认为我们使用了此处提到的 Pure Data 之类的库,它可以很容易地显示声音。我们计划有一个自动调谐功能来选择用户播放的音符,一个选择调谐音符,用户输入一个要调谐的音符,它会告诉你离你有多远,然后是一个简单的声音音符功能一种 midi 声音,以便用户可以通过耳朵进行调谐。
  • 让我按难度排列你的任务:
【解决方案3】:

吉他特纳应用的好例子。使用 Jtransfrom。

https://github.com/nivwusquorum/Simple-Guitar-Tuner

【讨论】:

    【解决方案4】:

    不要使用裸 FFT 幅度或其他频率峰值估计器。对于大多数吉他的低音弦,它们会给您带来非常糟糕/错误的结果。音高是人类的心理声学感知现象,通常与 FFT 频率不同(纯正弦音除外,不同于真正的弦乐器产生的音)。

    改为使用 Google 的“音高检测”和“音高估计”方法。一些可能性包括加权自相关、AMDF、ASDF、倒谱/倒谱分析、谐波乘积频谱分析以及诸如 RAAPT 和 YAPT 之类的复合算法。关于其中一些估计器算法的几篇学术论文的参考资料可能在我的网页上:http://www.nicholson.com/rhn/dsp.html#1

    【讨论】:

    【解决方案5】:

    paper 对您可能使用的音高检测算法进行了全面评估。

    如前所述,自相关是一种易于实现的方法,但不是特别准确 - 特别是在经常缺少基本信号的实际乐器信号上。 FFT 方法需要大量的后处理。

    我怀疑对于大学作业,你最好使用一个并不总是准确的完整工作系统,而不是一个不完整的准确系统。

    【讨论】:

    • 是的,当然。只要我们能够建立某种系统,让它工作但可能不是 100% 正确就足够了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-29
    • 2017-06-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-01
    • 1970-01-01
    • 2011-02-21
    相关资源
    最近更新 更多