声源定位


复刻一下电赛的声源定位

前言

2023年的电子设计竞赛快要开始了,同时我也已经大三下了正在准备找工作,重新做一下2022年的电赛题目声源定位吧,也为电赛和找工作做点准备。

一、题目

设计制作一个声源定位跟踪系统,能够实时显示及指示声源的位置,当声源移动时能够用激光笔动态跟踪声源。声源检测系统测量区域分布俯视如图所示。
在这里插入图片描述

二、设计步骤

1.设计思路

以 k210 单片机为控制核心,由电源模块,音频发生模块,音频接收模块,二维电动云台,激光笔等模块构成。系统通过声源发出一定周期性的音频信号,由 6+1 个 MEMSMic 组成阵列对可移动声源的检测,通过麦克风端接收到的音 频信号,运算后输出电压信号传输到控制端的单片机,单片机使用 PID 算法经串口输出控制信号对电动云台舵机实行控制,使其转向声源方向,以实现对声源的定位追踪过程。

2.声源追踪定位的分析

对声源位置的追踪确过程,本系统采用时间差值法采用麦克风作为声波接收头,音频信号通过空气介质以 340m/s 的速度传播,到达五处麦克风的时间不同,从而不同麦克风接收到音频信号的时间差作为变量,可以推算出可移动声源的具体位置。由于每一个麦克风在接收音频信号的机械特性不一样,对于同一种音频信号的响应时间不用。经过测试,我们发现不同频率的声音在麦克风接受时有不同的效果,通过选用固定频率的声音作为声源信号,可以避免了一般的声音信号的干扰。同时有利于后期滤波程序的编写,软件硬件相结合,更好的克服了在接收音频信号时间差的不确定性。

3.舵机转角的确定

舵机转角,既声源与信号检测装置的连线与中心线 A 的夹角 γ,系统通过声源发出一定周期性的音频信号,由 6+1 个 MEMSMic 组成阵列对可移动声源的检测,通过麦克风端接收到的音频信号,运算后输出电压信号传输到控制端的单片机,单片机通过对各麦克风信号大小的分析,使用 PID 算法经串口输出控制信号
对电动云台舵机实行控制,使其转向声源方向,同时记录此时舵机的所处角度,
与舵机中值进行对比,从而确定舵机转角 γ。示意图如下
(−angle + 90) / 180 ∗ 10 + 2.5
在这里插入图片描述

4.声源距离的计算

声源距离既声源 A 与声源定位检测装置 B 两点间直线距离 γ 通过测量同一
音频信号到达麦克风接收器的时间不同,从而三个接收器接收到音频信号的时
间差作为变量,可以推算出可移动声源的具体方向,从而实现了移动声源的精
确定位。公式如下:
在这里插入图片描述

三、代码编写

声源的代码比较简单,这个难点在于怎么处理杂波,一个是求均值,另一个就是卡尔曼了

1.求均值


##########################求均值##############################
def get_arv(times):
    i=0
    j=0
    angle=[]
    maxAng=-999999
    minAng=999999
    sumAng=0
    while True:
        i=i+1
        Angle=get_mic_dir()
        if(Angle != -1):
            angle.append(Angle)
            j=j+1
            if(j>=times):
                break;
        if(i>2*times+20):
            break;
    if j>2:
        for ang in angle:
            sumAng=sumAng+float(ang)
            if( ang > maxAng):
                maxAng=ang
            if( ang < minAng):
                minAng=ang
        return (sumAng-minAng-maxAng)/(j-2)
    else:
        return -1
##########################求均值##############################

2.卡尔曼滤波


##########################卡尔曼##############################
KF_lastP=1000   #上次的协方差
KF_nowP=0      #本次的协方差
KF_x_hat=0     #卡尔曼滤波的计算值,即为后验最优值
KF_Kg=6000        #卡尔曼增益系数
KF_Q=5         #过程噪声
KF_R=0.01      #测量噪声
def Kalman_Filter(value):
    global KF_lastP        #上次的协方差
    global KF_nowP         #本次的协方差
    global KF_x_hat        #卡尔曼滤波的计算值,即为后验最优值
    global KF_Kg           #卡尔曼增益系数
    global KF_Q            #过程噪声
    global KF_R            #测量噪声
    output=0        #output为卡尔曼滤波计算值
    x_t=KF_x_hat    #当前先验预测值 = 上一次最优值
    KF_nowP=KF_lastP+KF_Q       #本次的协方差矩阵
    KF_Kg=KF_nowP/(KF_nowP+KF_R)#卡尔曼增益系数计算
    output=x_t+KF_Kg*(value-x_t)#当前最优值
    KF_x_hat=output     #更新最优值
    KF_lastP=(1-KF_Kg)*KF_nowP#更新协方差矩阵
    return output
##########################卡尔曼##############################
Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐