随着我们的音频反应项目越来越复杂,我们可能决定用一个提供自动增益控制的简单的 MEMS 麦克风和放大器来代替。
这是我之前与 MSGEQ7 相关的专栏的后续文章:“使用 MSGEQ7 频谱分析仪的提示和技巧”和“使用 MSGEQ7 音频频谱分析仪时处理噪音”。
您可能还记得,MSGEQ7 是一款便宜且令人愉悦的八针设备,它接受音频信号并将其分成与以 63 Hz、160 Hz、400 Hz、1,000 Hz、2,500 Hz 为中心的七个频段相关的幅度、6,250 赫兹和 16,000 赫兹。然后我们可以使用这个频率信息来做一些事情,比如控制闪光灯。
事实上,我最近的Awesome Audio-Reactive Artifact项目包含一个 Arduino 微控制器、一个 MSGEQ7 和一个 MEMS 麦克风和放大器分线板 (BOB)。
我现在正在努力解决的问题是确定用于任何未来音频反应项目的最佳麦克风 BOB。
遗憾的是,MSGEQ7 数据表并没有人们希望的那么有用,但这意味着该设备需要一个具有 0.3-Vpp(即 300-mV 峰峰值)摆幅的音频输入。这意味着您必须相应地选择您的麦克风。
INMP401 MEMS 麦克风 BOB
在我的 Awesome Audio-Reactive Artifact 的情况下,我目前正在使用基于 ADMP401 的INMP401 MEMS 麦克风 BOB,售价 10.95 美元,来自 SparkFun 的男士和女士。该 BOB 被描述为当麦克风保持一臂距离并以正常的会话音量水平被交谈时,其峰峰值输出约为 200 mV。当播放响亮的音乐时,我实际上并没有测量输出(当我有空的时候我真的需要这样做),但一切似乎都很好地结合在一起。
INMP401 MEMS 麦克风 BOB:麦克风是右侧图像中的小黑点。(来源:SparkFun)
此 BOB 的主要优势之一是底部端口输入。这意味着麦克风的 1 毫米直径输入可以与项目的外壳齐平。BOB 的输出具有 VCC/2 的 DC 偏置,这意味着当没有声音被拾取时,信号将浮动在 2.5 V。
MSGEQ7 数据表建议使用由 22kΩ 电阻器和 0.1μF 电容器与音频输入串联形成的滤波器。已选择这些值来传递音频信号,同时消除直流偏置。
请注意,使用 R2 和 C2 注释(与 R1 和 C1 相对)的原因是为了使此原理图与我之前的专栏中的电路匹配。将这款麦克风 BOB 与 MSGEQ7 一起使用非常简单。您所要做的就是连接电源 (VCC) 和接地 (GND) 线(在我的情况下为 5 V 和 0 V)并将音频 (AUD) 输出连接到 22-kΩ 电阻器(示例 Arduino 代码在我的上述文章)。
我不得不说我对 INMP401 MEMS 麦克风 BOB 非常满意,我会向任何人推荐它。在我的 Awesome Audio-Reactive Artifact 的情况下,当音乐以合理的音量播放时,这个 BOB 工作得非常好,但是 - 理想情况下,如果有选择的话,如果推来推去 - 我想要更多的动态范围。
假设我坐在离工件有一段距离的一个非常安静的房间里。如果我发出像点击手指或说“你好”这样的低级声音,我希望这个神器能以明亮的显示闪烁起来,但我很幸运看到的不仅仅是闪烁。如果事情已经安静了一段时间,我想我可以通过执行某种滚动平均并增强任何低电平信号来在软件中纠正这个问题,但我现在感觉有点懒惰。
或者,假设音乐变得非常响亮。在这种情况下,我当前的系统趋于饱和,导致所有 LED 长时间完全打开。我仍然可以听到音乐中的基本节奏以及频谱各个部分的活动,因此我希望我的音频反应神器以某种方式调整其灵敏度以反映当前的音量。
驻极体麦克风放大器 — 具有自动增益控制功能的 MAX9814
因此,我们来到了基于 Maxim MAX9814 的具有自动增益控制功能的驻极体麦克风放大器BOB,Adafruit 的男士和女士仅售 7.95 美元。
根据它的数据表,这个小美女可以在 2.7 V 到 5.5 V 的电源电压下工作。除了电源 (VDD) 和接地 (GND) 端子(在我的情况下为 5 V 和 0 V)外,我们还有一个音频输出 (OUT)、增益控制输入 (GAIN) 和启动/释放比控制输入 (AR)。
对于 AR 引脚,不连接意味着我们使用默认的攻击/释放比率 1:4,000。将此引脚拉至 VDD 或 GND 允许我们将启动/释放比率分别更改为 1:2,000 或 1:500。但是,因为我实际上不知道攻击/释放比率是什么或它的作用(我是一名数字硬件设计工程师),我认为我们将其保留为默认/未连接设置。
稍后我们将返回考虑 GAIN 输入,但首先,我们需要考虑“房间里的大象”,即这个 BOB 输出 2-Vpp(即 2,000-mVpp)信号和 1.25 -VDC 偏置。这将完全淹没 MSGEQ7,因此我们需要以某种方式将此 2,000-mVpp 信号转换为 MSGEQ7 所需的相应 300-mVpp 信号。
再一次,我是一个数字人,这意味着模拟领域摇摆不定的方面往往会让我头疼,所以我打电话给 EEWeb 模拟专家Peter “Traneus Rex” Anderson寻求建议,他指导我如下.
Peter 首先指出,通常有无数种模拟方式可以做事,但最简单的一种是使用分压器。
在这种情况下,我们纯粹根据分压器使用信号名称 Vin 和 Vout。解决这个问题的一种方法是用无单位的术语和/或比率来思考事物。我们知道,如果我们的 BOB 输出其最大值 Vin = 2,000 mVpp,那么我们希望电容器看到的 Vout 信号(并通过电容器到 MSGEQ7)为 300 mVpp。即使是我糟糕的数学也告诉我 2,000/300 = 6.66。这意味着如果我们说 R2b = 1R(无论“R”是什么),那么我们知道 R2a 必须等于 6.66R - 1R = 5.66R。
另一种方法是注意我们的分压器的等式是 Vout = Vin * (R2b / (R2a + R2b))。如果我们将 R2b = 1R 和 R2a = 5.66R 的值代入,我们得到 Vout = Vin * (1R / (5.66R + 1R)) = Vin * (1R / 6.66R) = Vin/6.66。当然,如果 Vout = Vin/6.66,则 Vin/Vout = 6.66,这使我们回到了开始的地方。
请注意,我们只是在考虑看待同一事物的不同方式,因为有些人发现一种方式比另一种更有意义。
下一部分是有趣的地方,因为我们希望电容器“看到” 22 kΩ 的值。问题在于——由于彼得讨论它们时似乎有道理但我发现在这里难以表达的原因——电容器实际上“看到” R2a 和 R2b 是并联的。反过来,这意味着电容器看到的电阻将为 (R2a * R2b) / (R2a + R2b)。
Peter 还指出 (a) 两个并联电阻的总值低于每个单独的电阻,并且 (b) R2a 的值明显大于 R2b 的值。基于此,他建议我们首先考虑如果我们首先将 R2b 的值设置为比我们正在寻找的 22-kΩ 值(例如 25kΩ)大一点会发生什么,然后从那里开始。
使用标准 1% (E96) 电阻器作为基础,我最终使用各种电阻器值运行计算。最终,我最终将 R2b 设置为 26.1 kΩ。反过来,这意味着我们理想情况下希望 R2a 为 5.66 * 26.1 kΩ = 147.72 kΩ,但最接近此值的实际值为 147 kΩ。如果我们将这些值代入我们的“两个并联电阻”方程,那么电容器将看到 (26.1 * 147) / (26.1 + 147) = 22.16 kΩ 的电阻,这“对于政府工作来说足够接近”,因为它们说。
因此,假设我们使用 Arduino Uno 微控制器开发板作为我们的主处理器。
现在,请记住 MAX9814 具有自动增益控制 (AGC)。这是指闭环反馈系统,其目的是在其输出端保持合适的信号幅度,尽管输入端的信号幅度发生变化。平均或峰值输出信号电平用于动态调整放大器的增益,从而使电路能够在更大范围的输入信号电平下令人满意地工作。
这意味着上述电路可以很好地完成我们的音频反应项目所需的一切(一旦我开始尝试它,我将在以后的专栏中报告)。然而,除了其内部 AGC 功能外,BOB 还具有 GAIN 输入。如果我们不连接此引脚,则默认增益将为 60 dB (1,000);如果我们将此引脚连接到 GND (0 V),增益将为 50 dB (~316);如果我们使用 Arduino 将此引脚拉至 VDD (5 V),增益将为 40 dB (100)。
如果我们希望永久使用 50-dB 或 40-dB 设置,我们可以将 GAIN 输入分别硬接线至 0 V 或 5 V。或者,我们可以将 GAIN 输入连接到 Arduino 的数字输入/输出 (I/O) 引脚之一。在这种情况下,如果我们告诉 Arduino 将此引脚用作输入,则 BOB 上的 GAIN 输入将看到高阻抗 Z 状态,因此默认为 60-dB 增益值。或者,如果我们告诉 Arduino 将此引脚用作输出,我们可以将其驱动为低电平或高电平,以使 BOB 分别使用其 50-dB 或 40-dB 增益设置。
因此,除了 BOB 的内部 AGC 之外,我们现在还能够应用更高级别的增益控制。我们可以从 50-dB 增益设置开始,我们可以使用 Arduino 来监控来自 BOB 的音频信号。如果我们意识到这个信号在很长一段时间内一直处于全强度状态(其中“持续”的含义尚未定义),那么我们可以将增益降低到 40 dB。或者,如果我们意识到信号在一段时间内一直很低(其中“真的”和“一些”的含义尚未定义),那么我们可以将增益提高到 60 dB。此外,我们可以根据需要继续在 40 dB、50 dB 和 60 dB 之间切换主增益。
这里唯一棘手的是标有“?电路?”的块。请记住,BOB 的输出可以是 0 mVpp 到 2,000 mVpp 之间的任何值,均以 1.25-VDC 偏压为中心。我想我们可以将此信号直接输入到 Arduino 的模拟输入之一,并在 Arduino 内部进行所有处理,但我更喜欢让我的生活保持简单。
什么是理想的?电路?取 BOB 的 0-mVpp 到 2,000-mVpp 信号,进行滚动平均,输出 0V 到 2V(或 0V 到 5V)之间的直流电压来反映滚动值。也许这就像缓冲音频信号一样简单(以免影响电路的其余部分),对其进行整流,并将其馈入电阻电容电路以平滑所有内容并生成平均值。
最后一个想法是,我已经考虑用数字控制的等效电阻替换电阻 R2a 和 R2b,其值可以由 Arduino 通过其 I2C 总线设置,但也许我们应该再讨论一天。
同时,当谈到“电路”时,我担心这就是摇摆不定的模拟考虑再次发挥作用的地方。我必须承认我在这里有点超出我的深度,所以我将把它交给 EEWeb 专家和其他任何想插话的人。
审核编辑 黄昊宇
评论
查看更多