振荡信号的“包络”是一条平滑的曲线,概述了其极端情况。我们可以使用这样的包络来帮助我们控制音频反应产物。
您可能还记得我以前与MEGEQ7相关的专栏文章“与MSGEQ7一起使用的最佳MEMS麦克风”,我们把事情留在了悬崖峭壁上。
我们的想法是,我们要创建动态范围大的音频无反应的工件。让我们假设工件的输出包括闪烁的三色LED(在我的项目中,这是一个相当安全的假设)。如果环境安静,那么理想情况下,只需在房间的一半处单击手指或轻声说话,即可触发明显的响应。或者,如果我们被喧闹的音乐轰炸,那么,不是所有的LED都饱和到全开状态,而是如果系统可以继续以有意义的方式响应,那就太好了。
带有自动增益控制的MAX9814我们最后要看的麦克风是基于Maxim基于MAX9814的驻极体麦克风放大器,带有自动增益控制(AGC)突破板(BOB),Adafruit的价格仅为7.95美元。该BOB的一个小问题是它输出具有1.25V直流偏置的2V峰峰值(Vpp)信号,如下所示。
典型的MAX9814输出(来源:Max Maxfield,来自picture.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)的途中。
拟议的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,其中0-V至5-V模拟值映射到0至1023的数字等效值。执行后,这将导致Arduino从如下所示波形中的某处“看到”一个样本:
已处理的MAX9814输出(来源:Max Maxfield,来自picture.com的波形)
这里的问题是仅凭一个样本是不够的。Arduino可以在大声序列的中间随机击中一个狭窄的倾角,也可以在另外一段安静的音乐中发生的狭窄尖峰中击中一个较高的值。
这里的一种解决方案是在一定时间范围内进行一系列采样。根据我们要执行的操作(即,我们试图产生的效果),我们可以查找采样期间发生的最小值和最大值,或者可以计算平均值,或者…有很多事情我们可以在这里做。
一方面,我喜欢在软件中做事的想法,因为它消除了对其他组件的需求,并且使事情在进行过程中易于更改。另一方面,我喜欢使用Arduino Nano,Uno和Mega板,但是它们的8位处理器仅在16 MHz上运行,如果我们将它们负担过多的任务,它们可能很快就会耗尽精力。因此,另一种基于硬件的解决方案将取代我们的“电路”。带有“包络”生成电路的模块,如下所述。
包络生成电路
在物理学和工程学中,振荡信号的“包络”是一条平滑的曲线,概述了其极端情况。因此,包络概括了恒定振幅的概念。因此,我们要做的是创建一个电路,将来自麦克风BOB的音频信号作为输入,然后输出对应于上包络线的电压,如下所示:
原始波形,带有上,下包络线(顶部)和仅上包络线(底部)(来源:Max Maxfield,来自picture.com)
请记住,上面的插图只是我在Visio中放在一起的东西-实际版本可能看起来略有不同。我们想要的是选择用于创建电路的组件值,以使其响应速度足够慢,以平滑任何窄的正向或负向尖峰,同时仍然设法快速响应,从而为我们提供“感觉”发生的事情。
我之前已经说过,我会再说一遍:我是一名行业的数字硬件设计工程师,所以摇摆不定的模拟信号和电路会使我不知所措。因为我不喜欢被搞乱了(我不像年轻时那样我曾经是),我就打电话给我EEWeb专家密友彼得“Traneus雷克斯”安德森来帮助反弹一些想法左右。
彼得开始尝试“使用电容器和两个二极管的半波倍频器”,但我开始感到头晕,因此我们决定最简单的选择是将单个二极管用作半波整流器,然后再使用RC过滤器,如下所示(已选择组件标识符R3a,R3b,R3c和C3的名称,以便它们不会与我们之前的任何电路发生冲突):
音频包络发生器的拟议实现方式(来源:Max Maxfield)
现在,请记住,MAX9814 BOB输出上的直流偏置为1.25V。1N4001二极管上的压降为1.1 V,因此即使没有音频信号,二极管的输出也将为1.25 V-1.1 V = 0.15 V,因此,这是电容器要充电的基值。
高于DC偏置的任何音频信号都将通过由电阻器R3a和电容器C3形成的RC滤波器为电容器充电。同时,当音频信号的强度下降时,电阻器R3c用于使电容器放电。最后但并非最不重要的一点是,我们添加了电阻R3b以保护Arduino的输入。
结合使用我们的MAX9814 BOB和我们的包络生成电路,我们期望看到的信号将被呈现给Arduino的模拟输入,看起来应该像下面这样:
信号源为MAX9814 BOB的包络发生器的输出(来源:Max Maxfield)
当然,如果需要,我们可以消除软件中残留的0.15-VDC偏置。另外,如果需要,我们可以在软件中重新缩放信号(尽管这样做没有任何意义)。
当然,我们仍然会在信封中看到“峰值”和“谷”,因此我们可能希望通过每毫秒左右的采样来保持“滚动平均值”,但至少所有“ spikey”都具有已被删除。
因此,我敢打赌,您想问一下我们如何得出信封生成器中显示的组件值。实际上,这非常容易,而且丝毫没有让我感到疲倦。这种工作方式是我对彼得说的:“我们应该使用哪些组件值?”他回答说:“让我们从1kΩ的R3a和R3b,100kΩ的R3C,0.47μF的C3开始,看看我们如何去那里-我们以后可以随时对其进行调整。”我不了解您,但我很难对这样一个合理的论点提出异议。
那么接下来会发生什么呢?
显而易见的下一步是将电路实际放在一起-包括分压器和包络发生器在内的整个enchilada-看看会发生什么(不要忘记,MSGEQ7需要更多的电阻和电容,如我在“MSGEQ7技巧和窍门”列):
完整的辣酱玉米饼馅(来源:Max Maxfield)
一如既往的问题是,我迫切需要时间。令人高兴的是,来自孟加拉国达卡的EEWeb社区成员Nazmul Hasan也正在玩这种事情(我们一直在交换想法和建议的电子邮件)。
纳兹穆尔(Nazmul)从Adafruit订购了MAX9814 BOB,他很乐意进行一些实验,包括在包络发生器中试用组件值,并捕获示波器的屏幕截图,以向我们展示其余情况。
时间充裕……
您还记得我的“用爱迪生灯泡点亮您的言语”专栏吗?我的想法是,我希望能够将爱迪生灯泡的强度调节为语音的函数(使用声卡或我自己讲话)。好吧,我只是在想这个包络发生器会提供一个很好的起点-我可以使用Arduino来监视包络并驱动控制电路,但现在恐怕这个事不宜人了(太多有趣的事情了)要做的事情,没有足够的时间来全部完成)。
同时,我认为构建一个集成了MEGEQ7和包络发生器功能的小型电路板将是很棒的。可能是我们还在其中添加了MAX9814 BOB功能。这样,我们将拥有一块单板,可以与我们选择的微控制器一起使用,以在将来驱动我们所有的音频反应工件。
编辑
-
放大器
+关注
关注
143文章
13546浏览量
213091 -
mems
+关注
关注
129文章
3896浏览量
190337 -
麦克风
+关注
关注
15文章
632浏览量
54765 -
振荡信号
+关注
关注
0文章
22浏览量
7253
发布评论请先 登录
相关推荐
评论