声音定位硬件电路
麦克放大电路
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
实验中MIC放大电路
放置在实验面包板上的放大电路元器件及其连线图。
面包板上的实验电路
双通道音频放大电路
将运放修改成双运放,采用低压运算放大器 LMV358。实验所使用的转接小板是为了能够快速在面板板上搭建实验电路。它的管脚功能定义如下:
双运放LMV358实验小板
实验所使用的外部电阻电容取值与前面的单声道电路配置相同。电压增益仍然选择33倍左右。
具体的MM表报电路如下图所示:
搭建完毕的双声道音频放大采集面包板实验电路
错误更正:
后来发现在放大后的信号中存在着比较明显的50Hz及其谐波的干扰,以及受到单片机上的LED闪烁的影响。后来通过对上来电阻上增加一个电阻、电容滤波电路,可以有效的将原来存在的噪声去除。
很重要!!!!
前面增加电源去耦电阻电容
2. 测试双通道接收信号的情况
使用上述电路对
双通道同时接受附近蓝牙音箱发送的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音频信号。
双通道同时接受附近蓝牙音箱发送的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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
采集两个声道的数据算法:
在实验中,会发现通过单片机的调试系统收集数据的时候,往往会出现大概率的丢失数据的现象,所以在下面的代码中,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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
文章来源: zhuoqing.blog.csdn.net,作者:卓晴,版权归原作者所有,如需转载,请联系作者。
原文链接:zhuoqing.blog.csdn.net/article/details/104228214
- 点赞
- 收藏
- 关注作者
评论(0)