声音定位硬件电路

麦克放大电路

1. 单声道的放大电路

单通道声音放大电路的原理图。同相放大电路,电压增益: G a i n = 1 + R 6 R 4 = 1 + 150 4.7 = 32.9 Gain = 1 + {{R_6 } \over {R_4 }} = 1 + {{150} \over {4.7}} = 32.9 Gain=1+R4R6=1+4.7150=32.9

声音定位硬件电路_第1张图片

实验中MIC放大电路

放置在实验面包板上的放大电路元器件及其连线图。

声音定位硬件电路_第2张图片

面包板上的实验电路

双通道音频放大电路

将运放修改成双运放,采用低压运算放大器 LMV358。实验所使用的转接小板是为了能够快速在面板板上搭建实验电路。它的管脚功能定义如下:
声音定位硬件电路_第3张图片

双运放LMV358实验小板

实验所使用的外部电阻电容取值与前面的单声道电路配置相同。电压增益仍然选择33倍左右。
具体的MM表报电路如下图所示:

声音定位硬件电路_第4张图片

搭建完毕的双声道音频放大采集面包板实验电路

错误更正:

后来发现在放大后的信号中存在着比较明显的50Hz及其谐波的干扰,以及受到单片机上的LED闪烁的影响。后来通过对上来电阻上增加一个电阻、电容滤波电路,可以有效的将原来存在的噪声去除。

很重要!!!!
声音定位硬件电路_第5张图片

前面增加电源去耦电阻电容

2. 测试双通道接收信号的情况

使用上述电路对
声音定位硬件电路_第6张图片

双通道同时接受附近蓝牙音箱发送的Chirp信号

处不测试,两个声道的音频放大倍数不相同。左右两个声道输出的方差分别是79748, 23134,相差四倍左右,对应的峰峰值相差2倍左右。

V a c _ L = 15 m V ,       V a c _ R = 25 m V V_{ac\_L} = 15mV,\,\,\,\,\,V_{ac\_R} = 25mV Vac_L=15mV,Vac_R=25mV

将左声道的运放放大倍数,增加。即将原来电路中的 R 4 R_4 R4由原来的4.7k Ω \Omega Ω,减少到2.2k Ω \Omega Ω,此时它的放大倍数在: G a i n = 1 + R 6 R 4 = 1 + 150 2.2 = 69.18 Gain = 1 + {{R_6 } \over {R_4 }} = 1 + {{150} \over {2.2}} = 69.18 Gain=1+R4R6=1+2.2150=69.18
下面是修改后重新采集到的双声道接收到的Chirp音频信号。
声音定位硬件电路_第7张图片

双通道同时接受附近蓝牙音箱发送的Chirp信号

3. 处理左右声道声音延迟的算法

AMBIENT_TEMPERATURE = 27.7

def soundspeed(temperature = 25):
    return 331.4+0.6*temperature

def procdatafftinterpolation(send, rece, interptime):
    sm = mean(send)
    rm = mean(rece)
    send = [d - sm for d in send]
    rece = [d - rm for d in rece]

    datalen = len(send)
    sendspace = zeros(datalen*2)
    sendspace[0:datalen] = send
    recespace = zeros(datalen*2)
    recespace[0:datalen] = rece

    tempfft = fft.fft(sendspace) * conj(fft.fft(recespace))
    expandfft = zeros(datalen*2*interptime, dtype=complex64)
    expandfft[0:datalen] = tempfft[0:datalen]
    expandfft[-datalen:] = tempfft[datalen:]
    cor = list(fft.ifft(expandfft).real)
    maxpos = cor.index(max(cor))
    return (4096 * interptime - maxpos) / interptime * soundspeed(AMBIENT_TEMPERATURE) * 0.1e-3
#    return maxpos

采集两个声道的数据算法:
在实验中,会发现通过单片机的调试系统收集数据的时候,往往会出现大概率的丢失数据的现象,所以在下面的代码中,getdist2()函数中,对于双通道的数据通过函数 stm32cmdata(…)接受数据的时候,需要通过100次的循环,接收,直道接收到的数据的长度等于2048(这是在单片机程序中设定的数据缓存区的长度)。

senddata = tspload('senddata', 'senddata')

def getdist2():

    stm32cmd('initf 250 2000')
    time.sleep(1)
    for i in range(100):
        data1 = stm32cmdata('data1', wait=1750)
        if len(data1) == 2048: break

    for i in range(100):
        data2 = stm32cmdata('data', wait=1750)
        if len(data2) == 2048: break


    #tspsave('senddata', senddata=senddata)

    delaytime1 = procdatafftinterpolation(senddata, data1, 20)
    delaytime2 = procdatafftinterpolation(senddata, data2, 20)
#    printff(delaytime1, delaytime2)
    return delaytime1, delaytime2, senddata, data1, data2

你可能感兴趣的:(教学,电子模块实验,基础电子)