麦克放大电路
1. 单声道的放大电路
单通道声音放大电路的原理图。同相放大电路,电压增益:
实验中的麦克放大电路及其相关参数
放置在实验面包板上的放大电路元器件及其连线图。
面包板上的实验电路
双通道音频放大电路
将运放修改成双运放,采用低压运算放大器 LMV358。实验所使用的转接小板是为了能够快速在面板板上搭建实验电路。它的管脚功能定义如下:
双运放LMV358实验小板
实验所使用的外部电阻电容取值与前面的单声道电路配置相同。电压增益仍然选择33倍左右。
具体的MM表报电路如下图所示:
搭建完毕的双声道音频放大采集面包板实验电路
2. 测试双通道接收信号的情况
使用上述电路对
双通道同时接受附近蓝牙音箱发送的Chirp信号
处不测试,两个声道的音频放大倍数不相同。左右两个声道输出的方差分别是79748, 23134,相差四倍左右,对应的峰峰值相差2倍左右。
将左声道的运放放大倍数,增加。即将原来电路中的
由原来的4.7k
,减少到2.2k
,此时它的放大倍数在:
下面是修改后重新采集到的双声道接收到的Chirp音频信号。
双通道同时接受附近蓝牙音箱发送的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