用于吉他调音器的Android处理音频

And*_*art 12 audio android signal-processing

处理音频的最佳方法是什么,以便输出正在播放的音符?我正在为大学任务创建一个吉他调音器,我是Android开发的新手.

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

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

一旦我们能够在屏幕上显示正确的频率,我们将完成大部分项目.

谢谢你的帮助.

Bab*_*son 10

如果您从未完成Android开发并且几乎没有数字信号处理和傅里叶变换的经验,那么您正在应对一项艰巨的挑战.

另一方面,如果您可以使用现有的库进行分配,正如anthropomo建议的那样,您可能很有可能将它拉下来.

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

您的程序如何自动查找正在播放的音符的基本频率?看一下播放E2音符的真正古典原声吉他的频率/ frequency_decibelMagnitude图.观察到基频(82.4 Hz)衰减约比一次谐波低17分贝(17 dB)(一次谐波为164.8 Hz).

GuitarE2frequency_decibelMagnitude

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

GuitarE2frequency_decibelMagnitudeCloseup

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

GuitarE2frequency_linearMagnitudeCloseup

你的程序必须自动检测82.4 Hz的17 dB衰减基波,但是如果你的程序不能提前知道用户正在吉他上弹奏的一般情况下你怎么做呢?

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

问题不是微不足道的.问题是你有多少时间完成这项任务,你的教授会认为什么是完成的任务.

该参考文献给出了更深入的理解:乐器光谱达到102.4 KHz

您可以绘制频谱并听到吉他音符E2到Bb5,这里是:乐器谱


hot*_*aw2 5

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

谷歌的"音高检测"和"音高估计"方法.一些可能性包括加权自相关,AMDF,ASDF,倒谱/倒谱分析,谐波产品频谱分析以及RAAPT和YAPT等复合算法.有关这些估算算法的几篇学术论文的参考资料可能会在我的网页上:http://www.nicholson.com/rhn/dsp.html#1


mar*_*rko 1

张纸您可能使用的基音检测算法进行了全面评估。

如前所述,自相关很容易实现,但不是特别准确 - 特别是对于经常缺少基频的现实世界乐器信号。FFT 方法需要大量的后处理。

我怀疑对于大学作业来说,使用一个并不总是准确的完整工作系统会比使用一个不完整的准确系统更好。