0

我在FFT上真的失败了,现在我需要从我的 Android 耳机插孔与 Arduino 进行通信,目前有一个 Arduino 库(在博客文章中讨论它由 Arduino 提供支持的实时频谱分析仪中讨论它)和一个用于安卓也是!

我应该如何开始?我应该如何构建最终可以转换为 FFT 的音频信号,并且 Arduino 可以使用库对其进行分析并且我可以启动任何东西?

4

1 回答 1

3

您在问一个非常模糊的问题:“我应该如何构建最终可以转换为 FFT 的音频信号,并且 Arduino 可以使用库对其进行分析并且我可以启动任何东西?”。我将帮助您思考问题——问自己正确的问题对于获得任何答案至关重要。

据推测,您的音频信号“来自某个地方”——即它们是声音。这意味着您需要先将它们转换为数字流。

问题 #1:将音频信号转换为数字流

这分解为三个独立的子问题:

  1. 使信号达到正确的幅度
  2. 选择所需的采样率
  3. 数字化和存储数据以供以后处理

项目 (1) 和 (3) 是相关的,因为您需要知道如何将信号数字化,然后才能选择正确的幅度。例如,如果您有一个麦克风作为您的声音输入源,您将需要放大信号(并可能添加一些自动增益控制),然后再将其馈送到具有 5 V 输入范围的 ADC(模数转换器),因为麦克风的输出可能在 mV 范围内。如果没有有关您正在使用的硬件的更多信息,这里没有太多要添加的内容。从您的标签听起来您正试图在 Android 设备内执行此操作 - 在这种情况下,我想知道您打算如何将数字信号移动到 Arduino(通过 USB?)。

第二点,“选择采样率”,其实很重要。声音信号包含许多不同的频率——把它们想象成钢琴上的琴键。为了检测高频,您需要“比变化更快”对信号进行采样。有一个称为“奈奎斯特定理”的正式定理指出,您必须以信号中存在的最高频率的 2 倍进行采样。注意 - 这不仅仅是“你感兴趣的”,而是“存在的”。如果您使用低频采样时钟对高频信号进行采样,它将出现“混叠” - 它会在您的输出中显示为完全不同的东西。所以在你数字化一个信号之前你必须决定感兴趣的频率是什么带过滤器。假设您对高达 500 Hz 的频率感兴趣(大约比钢琴中 C 高 1 个八度)。为了让您的滤波器有机会工作,您可以选择切断所有高于 1 kHz 的频率(滤波器“滚降” - 即它们在一定频率范围内增加强度),并以 2 kHz 采样。这意味着您每秒获得 2000 个样本,并且您需要弄清楚将它们放在 Arduino 上的哪个位置(小板上的内存很快就会填满。)

问题 2:分析信号 假设您以某种方式捕获了数字信号,您的下一个任务是分析它。FFT 基本上是一些巧妙的数学运算,它告诉您,对于给定的声音样本,“钢琴上的哪些键被击中,以及敲击的力度”。它将声音信号分解为一系列频率“箱”,并确定每个箱中有多少能量(它还计算相位,但让我们保持简单)。因此,如果 FFT 算法的输入是声音样本,则输出是一个值数组,告诉您信号中存在哪些频率。这是近似的,因为它会找到“最近的垃圾箱”。坚持同样的类比——如果你弹奏的是走调的钢琴,算法不会返回“走调”,而是“有点 C,有点 C 升”,因为它实际上无法测量介于两者之间的任何东西。FFT 的精度取决于采样频率(它为您提供了可以检测到的频率上限)和采样长度:您“听”的时间越长,您可以“听到”的差异就越细微. 所以你需要考虑另一个权衡:如果你的音频信号变化很快,你必须采样很短的时间(以捕捉快速变化);但是如果你需要一个准确的频率,你就得采样很长时间。例如,如果您正在编写莫尔斯解码器,与“dits”和“dashes”之间的停顿相比,您的采样必须很短 - 否则它们会一起含糊不清。不过,找出一个莫尔斯语调是很容易的,因为会有一个比其他音调大得多的单音(FFT 中的一个 bin)。

究竟如何实现这些东西取决于您的应用程序。第三步,“用它做某事”,需要你决定什么是有意义的信号。同样,如果您正在制作莫尔斯解码器,您可能会在存在单个音调时打开 LED(FFT 中的一个或两个 bin 的值比其他 bin 的平均值大得多),如果不存在(所有噪音 - 大量大小大致相同的垃圾箱)。但是,如果没有您提供的更多信息,就没有更多可以帮助您的信息了。

您可能会从阅读以下文章中学到很多东西:

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/

于 2013-06-01T13:23:39.247 回答