声源定位
文章目录
- 声源定位
- 前言
- 一、题目
- 二、设计步骤
- 1.设计思路
- 2.声源追踪定位的分析
- 3.舵机转角的确定
- 4.声源距离的计算
- 三、代码编写
- 1.求均值
- 2.卡尔曼滤波
复刻一下电赛的声源定位
前言
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
##########################卡尔曼##############################