声音定位硬件电路

举报
tsinghuazhuoqing 发表于 2021/12/27 00:03:36 2021/12/27
【摘要】 麦克放大电路 1. 单声道的放大电路 单通道声音放大电路的原理图。同相放大电路,电压增益: G ...

麦克放大电路

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放大电路

实验中MIC放大电路

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

面包板上的实验电路

面包板上的实验电路

双通道音频放大电路

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

双运放LMV358实验小板

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

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

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

错误更正:

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

很重要!!!!
前面增加电源去耦电阻电容

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

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

使用上述电路对
双通道同时接受附近蓝牙音箱发送的Chirp信号

双通道同时接受附近蓝牙音箱发送的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信号

双通道同时接受附近蓝牙音箱发送的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

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。