我真的在FFT失败了,现在我需要从Android的耳机插孔到Arduino进行通信,目前有一个Arduino的库(在博客文章中讨论它 {{ 3}} )也适用于Android!
我应该如何开始?我应该如何构建最终可以转换为FFT的音频信号,Arduino可以使用库对其进行分析,我可以启动什么?
答案 0 :(得分:3)
你问的是一个非常模糊的问题:"我应该如何构建最终可以转换为FFT的音频信号,而Arduino可以使用库分析它,我可以启动任何东西?"。我将帮助您思考问题 - 问自己正确的问题对于获得任何答案至关重要。
据推测,您的音频信号来自某个地方" - 即他们是健全的。这意味着您需要先将它们转换为数字流。
问题#1:将音频信号转换为数字流
这分为三个独立的子问题:
项目(1)和(3)是相关的,因为在选择正确的幅度之前,您需要知道如何将信号数字化。例如,如果您将麦克风作为声音输入源,则需要放大信号(并可能添加一些自动增益控制),然后将其输入到具有5 V输入范围的ADC(模数转换器)中,因为麦克风可能具有mV范围内的输出。如果没有关于您正在使用的硬件的更多信息,那么在这里添加的内容并不多。从你的标签中听到你试图在Android设备中做到这一点 - 在这种情况下我想知道你打算如何将数字信号移动到Arduino(通过USB?)。
第二点,"选择采样率",实际上非常重要。声音信号包含许多不同的频率 - 将它们视为钢琴上的键。为了检测高频率,您需要对信号进行采样,并且比更改频率更快。有一个称为"奈奎斯特定理的正式定理"这表明你必须以信号中出现的最高频率的2倍进行采样。注意 - 它不只是"您感兴趣的是",但是"存在"。如果您使用低频采样时钟采样高频信号,它将出现"别名" - 它会在你的输出中显示为完全不同的东西。因此,在对信号进行数字化处理之前,您必须使用滤波器确定感兴趣的频率,并删除所有较高频率。让我们说你对高达500赫兹的频率感兴趣(钢琴中间C大约1个八度)。为了让您的滤波器有机会工作,您可以选择切断1 kHz以上的所有频率(滤波器"滚降" - 即它们在一定频率范围内增加强度),并以2 kHz采样。这意味着你每秒可以得到2000个样本,你需要弄清楚它们放在你的Arduino上的位置(内存在小板上快速填满。)
问题#2:分析信号 假设您以某种方式捕获了数字信号,您的下一个任务就是分析它。 FFT基本上是一些聪明的数学,告诉你,对于给定的声音样本,"钢琴上的哪些键被击中,以及有多难?"。它将声音信号分解为一系列频率" bs",并确定每个箱中有多少能量(它还计算相位,但让它保持简单)。因此,如果FFT算法的输入是声音样本,则输出是一组值,告诉您信号中存在哪些频率。这是近似,因为它会找到"最近的bin"。坚持使用相同的类比 - 如果你击中一架不合时宜的钢琴,那么算法就不会回归"失调"而是#34;一点C还有一点C sharp",因为它实际上无法测量它们之间的任何东西。 FFT的精确度取决于采样频率(它为您提供可检测频率的上限)和采样长度:您收听的时间越长"所以样本,你可以听到更多的微妙差异"听到"。因此,您需要考虑另一个权衡:如果您的音频信号快速变化,您必须在短时间内进行采样(以捕捉快速变化);但如果你需要一个准确的频率,你必须长时间采样。例如,如果您正在编写一个莫尔斯解码器,那么您的采样必须比“#d; dits"和"破折号" - 或者他们会在一起。确定莫尔斯音调存在非常简单,因为会有一个音调(FFT中的一个音箱)比其他音调大得多。
具体如何实现这些东西取决于您的应用程序。第三步,"用它做某事",要求你决定什么是有意义的信号。同样,如果您正在制作莫尔斯解码器,您可能会在存在单音时将LED打开(FFT中的一个或两个箱的值比其他箱的平均值大得多),而当它不是时则关闭(所有噪音 - 大量大小相同的箱子)。但是,如果没有更多来自您的信息,那么可以说有更多信息可以帮助您。
您可以从阅读以下文章中学到很多东西:
http://www.arduinoos.com/2010/10/sound-capture/
http://www.arduinoos.com/2010/10/fast-fourier-transform-fft/
http://interface.khm.de/index.php/lab/experiments/frequency-measurement-library/