声音在我们的日常生活中广泛存在,我们可以使用声音来制作许多互动控制,例如走廊上的声控灯。通过声音传感器,在黑色检测头(麦克风)前拍手或大声说话,您就可以通过声音控制灯光。声音传感器相当于一个麦克风。它可以感应声音并将感应到的声音转换成相应的模拟信号输出出来。

}

麦克风是换能器的一个例子,换能器是一种将信息从一种形式转换为另一种形式的设备。声音信息以气压的形式存在,麦克风将这些信息转换成电流模式。大多数麦克风采用光调制、压电产生、电容变化和电磁感应等技术,从机械振动中产生电压信号。不同类型的麦克风使用不同的方法来转换能量。然而,所有的类型都包括一个隔膜,这是一个薄的材料,当它被声波击中时振动。振膜的振动引起麦克风周围部件的振动,这些振动的转换以声音信号的形式传递。在日常生活中,最常用的麦克风是动圈式麦克风和电容式麦克风。

1)动圈式麦克风(Dynamic Microphone)

动圈式麦克风的工作原理是电磁感应,基本的构造包含线圈、振膜、永久磁铁三部分。它是多功能的,用途非常广泛。当声波进入麦克风时,声波触发薄金属隔膜和连接在其上的线圈的运动。麦克风内的磁铁反过来在线圈周围产生磁场,根据法拉第定律以及楞次定律,线圈在磁场中的运动使电流流动。其原理与公共服务企业的发电原理相同,只是实现的规模是口袋大小。重要的是要记住,电流是由隔膜的运动产生的,而电流的大小是由运动的速度决定的。

动圈式麦克风主要处理的是没有失真的高亮声音,并不适合远距离或者音量小的声音源。动圈式麦克风因为含有线圈和磁铁,不能做的像电容式麦克风那样轻便,并且灵敏度较低,在高低频响应表现较差,因此不适合用于弦乐。优点是声音较为柔润,适合用来收录人声。

2)电容式麦克风(Condenser Microphone)

电容式麦克风的工作原理是静电场。它并没有线圈及磁铁,靠的是电容两片隔板间距离的改变来产生电压变化。一个典型的电容式麦克风将包括一个有两个极板的电容器,在它们之间施加电压。两个极板中的一个往往很轻,充当隔膜。当隔膜被声波击中时,它就开始振动。结果,两个极板之间的距离改变,从而改变了电容。根据电容的特性C ∝ A/d (A是隔板面积,d为极板距离)。当两块极板距离发生变化时,电容值C会产生改变,在经由Q = C∙V(Q为电量,在电容式麦克风中电容极板电压会维持一个定值)可知,当C改变时,就会造成电量Q的改变。当极板靠近时电容值C增加,就会产生电流。当极板进一步分开时,电容值C减小并形成放电电流。因为在电容式麦克风中需要维持固定的极板电压V,所以此类型麦克风需要额外的电源才能运作,一般用电池或幻象电源(Phantom Power)供电。

电容式麦克风振膜轻薄,灵敏度高,对高频响应表现好,因此适合收录弦乐以及远距离或者音量小的声音源,常用于高品质录音;电容式麦克风因为不含线圈和磁铁,所以可以做到小体积。但由于极头的电容C很小,输出阻抗很高,所以一般需要前置放大器电路,形成阻抗转换器,将高阻抗转变为低阻抗输出。电容式麦克风工艺复杂,牢靠性差,需要较好的防震防摔,且需要较高的直流偏置电压,所以也存在待机功耗。

3)驻极体麦克风(Electret microphone)

驻极体麦克风这种设计是电容式麦克风的一种常见变体,它是一种基于静电电容的麦克风,它通过使用永久带电的材料消除了对极化电源的需要。驻极体是一种稳定的介电材料,具有永久嵌入的静电偶极矩(由于材料的高电阻和化学稳定性,它在数百年内不会衰减)。这个名字来自于静电和磁铁;通过在一块铁中排列磁域来类比磁铁的形成。驻极体通常是先熔化合适的介电材料,如含有极性分子的塑料或蜡,然后让它在强大的静电场中重新凝固。电介质的极性分子与静电场的方向对齐,产生永久的静电“偏压”。目前常用驻极体材料有聚丙烯(PP)、聚全氟乙丙烯(FEP)等。聚丙烯(PP)有较高的电荷密度,但耐潮性差。聚全氟乙丙烯(FEP)具有较高电荷密度,且稳定性好,耐高温,所以被广泛应用于电声器件中。

与电容式麦克风类似,声波振动会引起驻极体薄膜振动,进而产生位移,位移的变化其实是改变了电容两个极板之间的距离,引起了电容的容量发生变化。而驻极体上的电荷数量始终保持恒定,根据公式Q = C∙V,我们可以知道,电容器两端的电压U会随电容容量实时变化,从而实现了声-电的变换。 并且,它的电容器的容量也很小,输出阻抗很高,因此为提高带负载能力也许要连接一个阻抗变换器,通常会内置一个场效应管电路进行阻抗变换。因此仍需以低电压供电(常规电压是1.0V-10V),下图是一个经典的驻极体麦克风前置放大电路。

双端驻极体胶囊包含一个场效应管,必须由外部电源电压V+供电。电阻器设置增益和输出阻抗。音频信号出现在输出端,经过直流阻塞电容。此种麦克风目前广泛使用在消费电子产品之中。

4)微机电麦克风(MEMS Microphone)

微机电麦克风指使用微机电(MEMS,MicroElectrical-Mechanical System)技术做成的麦克风,也称麦克风芯片(microphone chip)或硅麦克风(silicon microphone)。MEMS麦克风在同一半导体晶圆上包含电子元件和机械元件。它有一个传感器和一个专用集成电路(ASIC)集成到一个由机械罩保护的单一组件。在外壳或基础PCB上的一个小孔允许声音进入麦克风。它是顶部端口或底部端口,取决于孔是否在顶盖或PCB上。微机电麦克风的压力感应膜是以微机电技术直接蚀刻在硅芯片上,此集成电路芯片通常也集成入一些相关电路,如前置放大器。大多数微机电麦克风的设计,在基本原理上是属于电容式麦克风的一种变型,因此工作原理也为电容值的变化。

微机电麦克风又可以分为数字和模拟两种类型,下图为两种类型的内部比较。

micro_mems.png

首先说一下数字麦克风,内部框图如下图所示。

如上图所示,微机电麦克风常内置模拟数码转换器,ADC的数字输出可以有两种可能的格式:脉冲密度调制(PDM)或I2S。PDM麦克风只需要一个时钟和数据线,而I2S麦克风包含PDM麦克风中的所有数字电路,还包含抽取滤波器和串口。数字麦克风与PDM是最常见的接口。原始数字音频信号直接输出到主控芯片,设计信号链的复杂性将大大降低,从而使产品在尺寸、成本、功耗和抗干扰方面保持优势。

再来说一下模拟麦克风,如下图所示,该电路本质上是一个放大器,具有用于模拟麦克风的特定输出阻抗。

微机电麦克风主要应用于部分的手机、PDA等小型移动产品,此类小型麦克风以往使用的几乎均是驻极体电容麦克风。微机电麦克风吸取了半导体技术的优点,结合了制作重复性高、声音性能优异、扩展性强等特点。因此,可以充满信心地说,在不久的将来,传统的ECM(驻极体电容传声器)将被低成本、高性能的MEMS所取代。

5)小结

除了上述介绍的麦克风之外,还有像如铝带式麦克风(Ribbon Microphone)、碳式麦克风(Carbon Microphone)等各种各样的麦克风,它们的工作原理可能各有不同,但是根本目的就是将声音信号转换为电流信号。

动圈式,电容式,铝带式麦克风主要应用于日常生活中的声音录制。

动圈式最为常见,比较适合于录制鼓和电吉他,如上图所示。

电容式麦克风主要负责在录音室等安静环境下录制人声,如上图所示。

铝带式麦克风可以同时感知正反两个方向的声压,所以可以仅用一个麦克风就可以清晰的同时录制吉他和人声(两个方向)的声音,如上图所示。

动圈式,碳式和电容式麦克风不是板级麦克风传感器,而MEMS,驻极体和压电麦克风由于其微型结构而用于pcb,因此后者更适用于消费电子产品的板级麦克风传感器,因此,下面来着重探讨用于消费电子产品的板级麦克风传感器。

下图为MEMS和驻极体麦克风对比。

MEMS和其他板级麦克风传感器在各种消费,商业和工业产品中都有应用。

  • 便携式消费设备,如智能手机,平板电脑,智能手表,智能家居助手,电视和遥控器
  • 音频处理设备
  • 无线传感器网络
  • 助听器
  • 生物医学仪器
  • 工业传感器领域的预测性维护
  • 声源定位
  • 语音识别技术

选择合适的元件是设计电子电路的必要步骤。然而,不适当的部件选择可能导致性能问题,甚至在极端情况下烧坏。板级麦克风也是如此。因此,产品设计师在选择板级麦克风进行电子电路设计时必须考虑几个因素。

以MEMS麦克风为例的一些基本特征和因素如下:

信噪比(SNR)

信噪比是指麦克风的灵敏度与其本底噪声之间的比率,是选择麦克风时最重要的考虑因素之一。典型MEMS麦克风的信噪比范围在55dB到66dB之间。

灵敏度(Sensitivity)

灵敏度,定义为模拟输出电压或数字输出值与输入压力之比,是任何麦克风的基本特征。MEMS麦克风能检测到的最低声压级是它的灵敏度。对MEMS传声器在1kHz频率和1Pa声压下的灵敏度进行了测试。模拟MEMS麦克风的灵敏度以mVRMS/Pa或dBV/Pa表示,表达式如下图所示。

其中OutputAREF为1000mv /Pa (1v /Pa)参考输出比。

而数字MEMS麦克风的灵敏度以dBFS表示(相对于满量程输出)。如下图所示。

其中OutputpREF是满量程数字输出电平。需要注意的是,数字麦克风的灵敏度——以dBFS(相对于数字满量程的分贝)为单位,并没有那么简单。单位的不同指向一个微妙的对比数字麦克风和模拟麦克风的灵敏度定义。对于具有电压输出的模拟麦克风,对输出信号大小的唯一限制是系统电压电源的实际限制。虽然它可能不适合大多数设计,但是没有物理原因解释为什么模拟麦克风不能有20dBV的灵敏度,10V输出信号作为参考电平输入信号。只要放大器、转换器和其他电路能够支持所需的信号电平,这种灵敏度就可以实现。数字麦克风的灵敏度不太灵活;它取决于一个单一的设计参数,最大声学输入。只要全量程数字映射到麦克风的最大声学输入(合理的映射),灵敏度必须简洁表示为是这个最大声学信号和94dBSPL参考之间的差。因此,如果一个数字麦克风的最大声压级是120dB,那么它的灵敏度将是26dBFS (94dB-120dB)。对于给定的声学输入,没有办法调整设计以使数字输出信号更高,除非最大声学输入降低相同的量。 高灵敏度麦克风并不总是优于低灵敏度麦克风。灵敏度表示麦克风的特性,但不一定表示其质量。 本文了解麦克风的灵敏度解释了在麦克风选择过程中,了解麦克风灵敏度对于任何工程都是至关重要的。

功耗(Power consumption)

功耗是最关键的设计考虑因素之一,特别是对于便携式和手持电子设备。因此,选择高能效的MEMS麦克风至关重要。与传统麦克风相比,MEMS麦克风功耗更低,因为所有电路都被封装在一个IC封装中。此外,模拟MEMS传感器具有更少的层级,所以模拟MEMS传感器比数字传感器消耗更少的能量。

噪声基线(Noise floor)

噪声、EMI和嗡嗡声是高频电子电路中最大的挑战。输出信号的失真会导致错误的结果和较差的质量。在安静的环境中,输出信号中的噪声量被称为麦克风的噪声底。噪声水平直接影响麦克风的信噪比。模拟麦克风比数字麦克风更容易受到噪声的影响。MEMS麦克风具有片上信号调理电路,以尽量减少噪音和干扰。

失真(Distortion)

总谐波失真(THD)是指信号与其实际波形的偏差。音频系统中的信号失真会导致声音质量差和用户体验差。信号失真最常见的原因是各种各样的噪声和干扰。

频率响应(Frequency response)

频率响应是麦克风在不同频率下灵敏度的变化。如果一个麦克风要用于讲话,一个语音麦克风,它必须有很大的低音增益,因为人类的声音是在低频。如果麦克风要用来录制音乐,它必须从低音到高音有很大的增益,因为音乐通常有从低到高的所有音调。这就是为什么麦克风频率响应运行。下面是在两个耳机上执行的麦克风频率响应示例图。

基于这些数据,我们现在可以看到麦克风在从20Hz到20KHz的所有频率下产生的增益。我们看到,NC-250(蓝线)在带宽范围内的所有频率(20Hz至30Hz和1.5KHz至约4KHz)都具有优于通用耳机(红线)的增益。所以除了那些非常低的频率和中频,NC-250比普通耳机有更好的增益。

如上图所示,通常情况下,麦克风频率响应所期望的是平坦响应。在这种响应中,麦克风对低频和高频产生大致相同的增益。为什么要这样做呢?因为当我们处理音频时,比如音乐,它包含低音和高音,我们不希望在我们通过扬声器听音乐时,其中一个播放的声音比另一个大,或者在我们录制音乐时,录制的声音比另一个大。如果麦克风放大低音比高音更大,它将以更大的音量录制低音。这会产生不平衡的录音。MEMS传感器工作满意的典型频率范围在100Hz和10khz之间。因此,高性能MEMS麦克风在整个可听范围内(即20 Hz至20 kHz)提供平坦的频率响应。

电源抑制(Power supply rejection)

PSR是选择MEMS麦克风的另一个关键因素。麦克风抑制电源噪声的能力被称为PSR。在质量较差的麦克风中,电源噪声经常出现在输出信号中,从而导致失真和音质问题。

方向性(Directionality)

板级麦克风可以是全方位的,也可以是单向的。单向麦克风只能从一个特定的方向收集声音,而全向麦克风可以从任何方向接收声音。因此,麦克风的方向性是选择特定应用的关键因素。

楼氏电子(Knowles Electronics):Knowles Electronics

TDK InvenSense:TDK

英飞凌科技(Infineon Technologies):Infineon Technologies

意法半导体(STMicroelectronics):STMicroelectronics

亚德诺半导体(Analog Devices):Analog Devices

原理框图:

microphone_框图.png

采用RP2040设计了一个检测声音的装置,通过电位计调节蜂鸣器来模拟声音,如果声音超过阈值那么开发板周围12个ws2812 RGB灯亮红色,并将声音显示在oled屏幕上。

连接图:

程序:

from machine import ADC, Pin, PWM,Timer
from board import pin_cfg
import framebuf
from time import sleep, sleep_us
from oled import oled
import random
import array
from fft import fft, f_peaks, f_peaks_amp, out_real_amp
import ws2812b 
from ws2812b import PixelDisplay
import _thread

flag = 0

value_average = 0
class Sound_Oled():
    def __init__(self,oled):
        self.oled = oled
        self.adc1 = ADC(Pin(pin_cfg.adc1))
        self.buf  = array.array("H", [0 for _ in range(180)])
        self.fb   = framebuf.FrameBuffer(bytearray(128 * 64), 128, 64, framebuf.MONO_HLSB)
    def thumb_filter(self, d):
        if(d < 0):
            d = 0
        if(d > 65535):
            d = 65535
        return int(d / 65535 * 63)
    
    def shift_buffer(self):
        buf = self.buf
        for i in range(180 - 6):
            buf[i] = buf[i + 6]
            
    def capture_tick(self):
        buf = self.buf
        adc1 = self.adc1
        global flag
        self.shift_buffer()
        
        for i in range(174, 180):
            buf[i] = self.thumb_filter(adc1.read_u16())
            if buf[i]>32 or buf[i]<30:
                flag = 1
            sleep_us(6)
        print(flag)
        
    def draw(self):
        buf = self.buf
        fb  = self.fb
        fb.fill(0)
        for i in range(128):
            if(i >= 1):
                fb.line(i - 1, buf[i - 1 + 30], i, buf[i + 30], 1)
        self.oled.blit(fb, 0, 20, 0)

        
    def fft(self):
        global peak
        v = memoryview(self.buf)
        fft(v[30:158], 128, 100)
        peak = int(f_peaks_amp[1])
        if peak < 30:
            peak = 0

    

temp = 0
adc2 = ADC(Pin(pin_cfg.adc2))
pwm0 = PWM(Pin(pin_cfg.buzzer))
pwm0.duty_u16(0)
pwm0.freq(1000)

sound_oled = Sound_Oled(oled)

tick = 0
f_peaks_2 = 0
f_peaks_amp_2 = 0
oled.fill(0)
pd = PixelDisplay()
tick = 0

while True:
    oled.fill(0)

    sound_oled.capture_tick()

    if tick % 8 == 0:
        if (flag == 1) :
            for i in range(12):
                pd.set_color(i + 1,(255,0,0) )
                pd.render()
            flag = 0
        else :
            for i in range(12):
                pd.set_color(i + 1, (0,0,0))
                pd.render()
                
    sound_oled.draw()       
    oled.show()
    
    tick = (tick + 1) % 65536
    sleep(0.04)