处理音频的最佳方法是什么,以便输出正在播放的音符?我正在为大学任务创建一个吉他调音器,我是Android开发的新手。
我已经看过关于从Google API录制声音的Android示例,但我想知道从那里去哪里?
我知道我必须进行傅里叶变换,或其他什么来获得频率,只是想知道是否有人对如何做到这一点有任何建议?
一旦我们能够在屏幕上显示正确的频率,我们将完成大部分项目。
感谢您的帮助。
答案 0 :(得分:10)
如果您从未完成过Android开发,并且对数字信号处理和傅里叶变换几乎没有经验,那么您将面临一项艰巨的挑战。
另一方面,如果您可以使用现有的图书馆进行作业,正如anthropomo建议的那样,您可能很有可能将其拉下来。
但是,如果您的教授不允许您使用现有的库,则需要解决以下难题:
您的程序如何自动查找正在播放的音符的基本频率?看一下播放E2音符的真正古典原声吉他的频率/ frequency_decibelMagnitude图。观察到基频(82.4 Hz)衰减大约低于一次谐波的17分贝(17 dB)(一次谐波为164.8 Hz)。
下面是同一情节的特写,您可以更清楚地看到基本峰值:
衰减比一次谐波低17 dB的基频是一个很大的衰减。下面是相同的E2音符频谱,但现在它绘制在线性频率幅度轴上(垂直轴现在是线性频率幅度而不是分贝频率幅度)。现在你可以更清楚地看到基频峰值真正低于一次谐波的程度。
你的程序必须自动检测82.4 Hz的17 dB衰减基波,但是如果你的程序不能提前知道用户正在弹吉他的那个音符,你怎么做?< / p>
以上频谱适用于经典原声吉他上的E2。钢弦吉他上E2的频谱有何不同?在放大的电吉他上E2怎么样?您的程序将如何处理这些不同光谱之间的差异?
问题并非无足轻重。问题是你有多少时间完成这项任务,你的教授会认为什么是完成的任务。
此参考文献提供了更深入的理解:Musical instrument spectra to 102.4 KHz
您可以绘制频谱并听到吉他音符E2到Bb5,在这里:Musical instrument spectrum
答案 1 :(得分:5)
请勿使用裸FFT幅度或其他频率峰值估算器。对于大多数吉他的低音符串,它们会给你非常糟糕/错误的结果。音乐音调是一种人类心理声学感知现象,通常与FFT频率不同(纯正弦音不同于纯正弦音调)。
谷歌“音高检测”和“音高估计”方法。一些可能性包括加权自相关,AMDF,ASDF,倒谱/倒谱分析,谐波产品频谱分析以及RAAPT和YAPT等复合算法。关于某些估算算法的几篇学术论文的参考资料可能会在我的网页上:http://www.nicholson.com/rhn/dsp.html#1
答案 2 :(得分:4)
如果您的导师可以使用库进行音频处理,这里是使用libpd的完整Android吉他调谐器应用程序的来源:
https://github.com/nettoyeurny/Making-Musical-Apps/tree/master/android/GuitarTuner
要使用它,您还需要学习Pure Data音频合成编程语言的基础知识。调谐器所需的工具不是太广泛,并在上面的应用程序中列出。显然你需要做一些工作来使这成为你自己的工作。
以下是使用Pure Data的非常好的介绍:
答案 3 :(得分:2)
吉他调谐器应用的好例子。使用Jtransform。
答案 4 :(得分:1)
此paper可对您可能使用的音高检测算法进行全面评估。
如上所述,自相关很容易实现,但不是特别准确 - 特别是对于经常缺少基础的现实世界的乐器信号。 FFT方法需要大量的后处理。
我怀疑大学的任务,你会因为一个并不总是准确的完整工作系统而不是一个不完整的准确工作系统而感觉更好。