带有自动增益控制的 MAX9814 我们终选择的麦克风是基于 Maxim MAX9814 的驻极体麦克风
放大器,带有自动增益控制(AGC) 分线板 (BOB),Adafruit 的售价仅为 7.95 美元。该 BOB 的一个小问题是,它输出具有 1.25-VDC 偏置的 2 伏峰峰值 (Vpp) 信号,如下图所示。
与 MSGEQ7 配合使用的音频包络生成电路
典型的 MAX9814 输出(Max Maxfield,波形来自 pixabay.com)
之所以出现这个问题,是因为我们使用的 MSGEQ7 音频频谱分析仪芯片更喜欢 300 mVpp 信号。我们解决这个问题的方法是向 MSGEQ7 的输入添加一个分压器。 我们接下来要考虑的是,除了MAX9814的AGC功能外,MAX9814 BOB还具有主GAIN输入。使用此输入,我们的 Arduino(或您选择的微控制器)可以指示 BOB 将其主增益设置为 60 dB (1,000)、50 dB (~316) 或 40 dB (100)。为了知道如何以及何时执行此操作,Arduino 必须了解正在发生的情况。因此,除了将 MAX9814 BOB 的输出馈送到分压器的输入之外,我们还建议通过一个未定义的“黑匣子”(我们称之为“电路”)馈送它。正在前往 Arduino 的模拟输入之一(下图中的输入 A2)。
与 MSGEQ7 配合使用的音频包络生成电路
提议的 MAX9814 BOB 和 MSGEQ7 实现(Max Maxfield)
这里的想法是,我们需要某种方式让 Arduino 计算出来自麦克风 BOB 的信号有多大。如果 BOB 设置为 40 dB,并且其输出在一段时间内处于较低水平(实际持续时间待确定),则 Arduino 可以决定将增益提高到 50 dB 或 60 dB。相比之下,如果 BOB 设置为 60 dB 并且其输出在一段时间内全开,则 Arduino 可以决定将增益降至 50 dB 或 40 dB。
那么Arduino是如何判断发生了什么事情的呢?好吧,我们可以替换我们的“?电路?” 用一根简单的电线进行阻挡,并在软件中完成所有这些。如果我们假设在代码中将模拟引脚 A2 称为“PinMicBob”,那么我们可以执行以下操作:
aSig = analogRead(PinMicBob);
aSig = abs(aSig - DC_OFFSET); 在这种情况下,DC_OFFSET 先前被定义为 256,相当于 Arduino 模拟输入上的 1.25 V,其中 0V 到 5V 模拟值映射到 0 到 1023 的数字等效值。取决于读取的时间执行后,这将导致 Arduino 从下面所示的波形中的某个位置“看到”样本:
与 MSGEQ7 配合使用的音频包络生成电路
处理后的 MAX9814 输出(Max Maxfield,波形来自 pixabay.com)
这里的问题是单个样本是不够的。Arduino 可以随机地击中响亮序列中间的狭窄下沉,或者可以击中安静音乐片段中出现的狭窄尖峰中间的高值。
这里的一个解决方案是在一段时间内采集一系列样本。根据我们想要做什么(即我们试图产生什么效果),我们可以寻找样本期间出现的值和值,或者我们可以计算平均值,或者......有很多事情我们可以在这里做。
一方面,我确实喜欢在软件中执行操作的想法,因为它消除了对额外组件的需求,并且使事情可以在您进行过程中轻松更改。另一方面,我喜欢使用 Arduino Nano、Uno 和 Mega 板,但它们的 8 位处理器仅以 16 MHz 运行,如果我们给它们加载太多任务,它们很快就会失去动力。因此,另一种基于硬件的解决方案是取代我们的“?电路?” 具有“包络”生成电路的块,如下所述。
包络生成电路 在物理学和工程学中,振荡信号的“包络”是一条描绘其极值的平滑曲线。因此,包络概括了恒定幅度的概念。因此,我们想要做的是创建一个电路,接受来自麦克风 BOB 的音频信号作为输入,然后输出与上包络相对应的电压,如下图所示:
与 MSGEQ7 配合使用的音频包络生成电路
带有上下包络的原始波形(上)和仅上包络(下)(Max Maxfield,波形来自 pixabay.com)
请记住,上面的插图只是我在 Visio 中拼凑而成的内容 - 现实世界的版本可能看起来略有不同。我们想要的是选择用于创建电路的元件值,使其响应足够慢,以平滑任何狭窄的正向或负向尖峰,同时仍然设法足够快地响应,为我们提供如下的“感觉”:发生的事情。
我以前说过,现在我再说一遍:我是一名数字硬件设计工程师,因此不稳定的模拟信号和电路往往会让我感到混乱。因为我不喜欢混乱(我不像以前那么年轻了),所以我打电话给我的EEWeb 好友Peter “Traneus Rex”Anderson来帮助讨论一些想法。 彼得开始胡言乱语地尝试“使用
电容器和两个
二极管的半波倍频器”,但我开始感到头晕,所以我们决定简单的选择是使用单个二极管作为半波整流器,然后RC 滤波器,如下图所示(已选择组件标识符 R3a、R3b、R3c 和 C3 的名称,以便它们不会与我们之前的任何电路发生冲突):
与 MSGEQ7 配合使用的音频包络生成电路
音频包络生成器的拟议实现(Max Maxfield)
现在,请记住,MAX9814 BOB输出上的直流偏置为1.25 V。1N4001二极管上的压降为1.1 V,因此即使没有音频信号,二极管的输出也将为1.25 V ? 1.1 V = 0.15 V,因此,这是电容器充电的基值。
任何高于直流偏置的音频信号都会通过
电阻器 R3a 和电容器 C3 形成的 RC 滤波器对电容器充电。同时,电阻器R3c用于在音频信号强度下降时对电容器进行放电。但并非不重要的一点是,我们添加了电阻器 R3b 来保护 Arduino 的输入。 将 MAX9814 BOB 与包络生成电路结合使用,我们期望看到的 Arduino 模拟输入信号应如下所示:
与 MSGEQ7 配合使用的音频包络生成电路
包络发生器的输出,以 MAX9814 BOB 作为信号源(Max Maxfield)
当然,如果我们愿意,我们可以在软件中消除残留的 0.15-VDC 偏置。另外,如果我们愿意的话,我们可以在软件中重新调整信号的大小(尽管这样做确实没有任何意义)。
当然,我们仍然会在信封中看到“峰”和“谷”,因此我们可能希望通过每毫秒左右采样来保持“滚动平均值”,但至少所有“尖峰东西”都有已被删除。
所以我打赌您想问我们如何得出包络生成器中显示的组件值。事实上,这出奇地简单,而且一点也不让我感到疲倦。我对彼得说,“我们应该使用什么组件值?” 他回答说:“让我们从 R3a 和 R3b 为 1 kΩ、R3C 为 100 kΩ、C3 为 0.47 μF 开始,看看我们如何从那里开始 - 我们可以随时调整它们。” 我不了解你的情况,但我发现很难反驳这样一个合理的论点。
那么接下来会发生什么呢?
显而易见的下一步是实际将这个电路组合在一起 - 完整的 enchilada,包括分压器和包络发生器 - 看看会发生什么(不要忘记 MSGEQ7 需要更多的电阻器和电容器,正如我的“ MSGEQ7 提示和技巧》专栏): 与 MSGEQ7 配合使用的音频包络生成电路
与以往一样,问题是我的时间非常紧迫。令人高兴的是,来自孟加拉国达卡的EEWeb 社区成员Nazmul Hasan也在玩这类事情(我们不断地通过
电子邮件交换想法和建议)。