20901|92

693

帖子

7

TA的资源

版主

楼主
 

信标导航声音定位与识别——声源定位算法分析 [复制链接]

 

一、TDOA(时间差法)原理分析

声音定位的一种常用的方法(时间差法): 通过测量声音信号到达两个不同锚节点(声音接收模块)的时间差来计算未知节点(声响模块)位置。原理如图下:

其中,r12表示未知节点到达锚节点1的距离与未知节点到达锚节点2的距离差;r23示未知节点到达锚节点2的距离与未知节点到达锚节点3的距离差;假设三个锚节点的坐标与未知节点坐标分别为:

锚节点1:(x1,y1)

锚节点2:(x2,y2)

锚节点3:(x3,y3)

未知节点坐标:(x0,y0)

未知节点到达锚节点的时间为t1t2t3,则未知节点与锚节点的距离差分别为:

r12=r1-r2=c*t1-c*t2=c(t1- t2)

r23=r2-r3=c*t2-c*t3=c(t2- t3)

上式中c为声音在空气中的传播速度,一般为340m/s.由此可以建立双曲线方程组,如公式如下所示:

通过数学的方法求解双曲线方程组可以得到未知节点的置(r12 和 r23 的交点)。

r12 和 r23 的距离根据时间差和声音传播速度来计算,如何实现测量时间差ΔT1=t1- t2, ΔT1=t2- t3 呢?就要根据信标声音发射装置来确定了。

但是此种方法的定位精度和抗干扰能力不能达到最高最强,还需要优化。

 

二、H车模与信标场地实际场景应用分析

  信标主要通过Chirp声音和RF信号导引,Chirp信号是像鸭子叫的一样不会连续的频谱信号 chirps声音_鹰短尾_ 啁啾03.mp3 (520.69 KB, 下载次数: 84)

信标场地如下:

 

车模使用麦克纳姆轮的H车模,车模尺寸不超过30cm见方,假设安装线性麦克风阵列,麦克风阵列见声音定位——麦克风阵列。假设我们搭建的车模是这样的:

 

则可通过上述算法锁定声源的位置,麦克纳姆轮更多的控制算法就是逆运动算法,线性麦克风阵列可以控制小车转向,RF信号可以用接收机来拟合距离控制小车的速度。

三、TDOA(时间差法程序代码

通过上述算法TDOA(时间差法)线性麦克风阵列定位效果请戳大佬视频:线性麦克风阵列定位效果

定位算法代码:

 if(INT1==1&&INT2==1&&INT3==1)
			   {
				
					printf("TimeDelay1=%.8f\t",TimeDelay1);
					printf("TimeDelay2=%.8f\t",TimeDelay2);
					printf("TimeDelay3=%.8f\t",TimeDelay3);
			/**************声源模块距离接受模块2最远时算法如下*********************/
					if(TimeDelay2>TimeDelay1&&TimeDelay2>TimeDelay3)
					{
						printf("接受模块2最远\n");
						d1=(TimeDelay2-TimeDelay1)*V;
						d2=(TimeDelay2-TimeDelay3)*V;
						printf("d1=%f\t",d1);
						printf("d2=%f\t",d2);
						A=4*(pow(d2,2)-pow(d1,2)-pow(a,2));
						printf("A=%f\t",A);
						B=4*(d2*pow(a,2)-pow(d2,3)+d1*pow(a,2)-pow(d1,3));
						printf("B=%f\t",B);
						C=pow((pow(a,2)-pow(d2,2)),2)-pow((pow(a,2)-pow(d1,2)),2);
						printf("C=%f\t",C);
					     X1=(-B+sqrt(pow(B,2)-4*A*C))/2.0*A;
						 X2=(-B-sqrt(pow(B,2)-4*A*C))/2.0*A;
											 	
						 if(X1>0)
						 { 	printf("X1=%d\t",X1);
						   sin=(pow(X1,2)+pow(a,2)-pow((X1-d1),2))/(2*a*X1);
						   printf("sin=%f\t",sin);
						   cos=(pow(X1,2)+pow(a,2)-pow((X1-d2),2))/(2*a*X1);
						   printf("cos=%f\t",cos);
						   x=X1*cos;
						   y=X1*sin;
						 }

						 if(X2>0)
						 {		
						    printf("X2=%d\t",X2);
						 	sin=(pow(X2,2)+pow(a,2)-pow((X2-d1),2))/(2*a*X2);
							printf("sin=%f\t",sin);
						    cos=(pow(X2,2)+pow(a,2)-pow((X2-d2),2))/(2*a*X2);
							printf("cos=%f\t",cos);
						 	x=X2*cos;
						    y=X2*sin;
						 }
					}
			 /**************声源模块距离接受模块2最近时算法如下*********************/
			  	if(TimeDelay2<TimeDelay1&&TimeDelay2<TimeDelay3)
					{
						printf("接受模块2最近\n");
						d1=(TimeDelay1-TimeDelay2)*V;
						d2=(TimeDelay3-TimeDelay2)*V;
						printf("d1=%f\t",d1);
						printf("d2=%f\t",d2);
						A=4*(pow(d2,2)-pow(d1,2)-pow(a,2));
						printf("A=%f\t",A);
						B=4*(d2*pow(a,2)+pow(d2,3)+d1*pow(a,2)+pow(d1,3));
						printf("B=%f\t",B);
						C=pow((pow(a,2)-pow(d2,2)),2)-pow((pow(a,2)-pow(d1,2)),2);
						printf("C=%f\t",C);
					    X1=(-B+sqrt(pow(B,2)-4*A*C))/2.0*A;
						X2=(-B-sqrt(pow(B,2)-4*A*C))/2.0*A;
//						 printf("X1=%d\t",X1);
//						 printf("X2=%d\t",X2);					 	 
						 if(X1>0)
						 {		 
						   sin=(pow(X1,2)+pow(a,2)-pow((X1+d1),2))/(2*a*X1);
						   printf("sin=%f\t",sin);
						   cos=(pow(X1,2)+pow(a,2)-pow((X1+d2),2))/(2*a*X1);
						   printf("cos=%f\t",cos);
						   x=X1*cos;
						   y=X1*sin;
						 }

						 if(X2>0)
						 {	 
						 	
						 	sin=(pow(X2,2)+pow(a,2)-pow((X2-d1),2))/(2*a*X2);
							printf("sin=%f\t",sin);
						    cos=(pow(X2,2)+pow(a,2)-pow((X2-d2),2))/(2*a*X2);
							printf("cos=%f\t",cos);
						 	x=X2*cos;
						    y=X2*sin;
						 }
					}
			 	 /**************声源模块距离接受模块1最近 接受模块3最远时算法如下*********************/
				  if(TimeDelay2>TimeDelay1&&TimeDelay2<TimeDelay3)
				  {
				    printf("接受模块3最远\t");
				  	d1=(TimeDelay2-TimeDelay1)*V;
				    d2=(TimeDelay3-TimeDelay2)*V;
					printf("d1=%f\t",d1);
					printf("d2=%f\t",d2);
			   	    B=4*(d2*pow(a,2)+pow(d2,3)+d1*pow(a,2)-pow(d1,3));
					printf("B=%f\t",B);
					A=4*(pow(d2,2)-pow(d1,1)-pow(a,2));
					printf("A=%f\t",A);
					C=pow((pow(a,2)-pow(d2,2)),2)-pow((pow(a,2)-pow(d1,2)),2);
					printf("C=%f\t",C);
					X1=((-B)+sqrt(pow(B,2)-(4*A*C)))/2.0*A;
					X2=((-B)-sqrt(pow(B,2)-(4*A*C)))/2.0*A;
									 
					
					if(X1>0)
					{		
					    printf("X1=%d\t",X1);	
					    sin=(pow(X1,2)+pow(a,2)-pow((X1-d1),2))/(2*a*X1);
						printf("sin=%f\t",sin);
					    cos=(pow(X1,2)+pow(a,2)-pow((X1+d2),2))/(2*a*X1);
						printf("cos=%f\t",cos);
						x=X1*cos;
						y=X1*sin;
					}
					 if(X2>0)
					 {	printf("X2=%d\t",X2);
					 	sin=(pow(X1,2)+pow(a,2)-pow((X1-d1),2))/(2*a*X1);
						printf("sin=%f\t",sin);
					    cos=(pow(X1,2)+pow(a,2)-pow((X1+d2),2))/(2*a*X1);
						printf("cos=%f\t",cos);
						x=X2*cos;
						y=X2*sin;
					 }
			   	   }
				/**************声源模块距离接受模块1最远 接受模块3最近时算法如下*********************/
					if(TimeDelay2>TimeDelay3&&TimeDelay2<TimeDelay1)
				  {
				  	printf("接受模块1最远\t");
				  	d1=(TimeDelay1-TimeDelay2)*V;
				    d2=(TimeDelay2-TimeDelay3)*V;
					printf("d1=%f\t",d1);
					printf("d2=%f\t",d2);
			   	    B=4*(d2*pow(a,2)-pow(d2,3)+d1*pow(a,2)+pow(d1,3));
					printf("B=%f\t",B);
					A=4*(pow(d2,2)-pow(d1,1)-pow(a,2));
					printf("A=%f\t",A);
					C=pow((pow(a,2)-pow(d2,2)),2)-pow((pow(a,2)-pow(d1,2)),2);
					printf("C=%f\t",C);
					X1=(-B+sqrt(pow(B,2)-4*A*C))/2.0*A;
					X2=(-B-sqrt(pow(B,2)-4*A*C))/2.0*A;
										 
					
					if(X1>0)
					{  	printf("X1=%d\t",X1);
					    sin=(pow(X1,2)+pow(a,2)-pow((X1+d1),2))/(2*a*X1);
						printf("sin=%f\t",sin);
					    cos=(pow(X1,2)+pow(a,2)-pow((X1-d2),2))/(2*a*X1);
						printf("cos=%f\t",cos);
						x=X1*cos;
						y=X1*sin;
					}
					 if(X2>0)
					 {	printf("X2=%d\t",X2);
					 	sin=(pow(X1,2)+pow(a,2)-pow((X1+d1),2))/(2*a*X1);
							printf("sin=%f\t",sin);
					    cos=(pow(X1,2)+pow(a,2)-pow((X1-d2),2))/(2*a*X1);
							printf("cos=%f\t",cos);
						x=X2*cos;
						y=X2*sin;
					 }
			   	   }
		  printf("横坐标X=%f\t",x);
		  printf("纵坐标Y=%f\t",y);
	                 INT1= INT2=INT3=0;
					 TimeDelay3=TimeDelay2=TimeDelay1=0;
					 Flag=0;
			   }

代码运行环境为KEIL5,C语言,如果需要完整工程,请留下邮箱一起交流学习。

此帖出自创意市集论坛

最新回复

前辈,我想看下您完整的工程学习一下,我的邮箱是hekuan88888@163.com  详情 回复 发表于 2024-5-5 16:11
点赞(3) 关注(7)
 
 

回复
举报

1

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

大神,今年菜鸡入坑,请指导:rshjh@qq.com,谢谢!

此帖出自创意市集论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

神,今年菜鸡入坑,请指导:761490193@qq.com,谢谢!

此帖出自创意市集论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

4
 

前辈 你好 我想学习下您的代码,如果方便交流的话可以将您的工程发我一份吗?这是我的邮箱319024367@qq.com

此帖出自创意市集论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

5
 
能给一下完整的工程吗?
此帖出自创意市集论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

6
 
前辈我的邮箱是2634655801@qq.com
此帖出自创意市集论坛
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

7
 
大佬,可以发一下工程学习学习吗,874818045@qq.com,谢谢大佬
此帖出自创意市集论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

8
 
大佬,可以给我发完整的工程吗,我的邮箱是1873619703@qq.com
此帖出自创意市集论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

9
 

谢谢大佬的分享,我的邮箱是865439320@qq.com,希望大佬能发一份工程给我交流学习谢谢

此帖出自创意市集论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

10
 

可以发一下完整的代码工程吗 2090147256@qq.com 谢谢

此帖出自创意市集论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

11
 

前辈 你好 我想学习下您的代码,如果方便交流的话可以将您的工程发我一份吗?这是我的邮箱285619046@qq.com

此帖出自创意市集论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

12
 

前辈可以探讨一下吗,我的邮箱是56672035@qq.com,最近的项目也是卡在了这个问题上,感谢前辈的指导了

 

此帖出自创意市集论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

13
 

您好,最近也在研究信标组的声源定位,非常感谢您给出的这份思路,希望和您交流学习一下,谢谢!mi985211211100c@163.com

此帖出自创意市集论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

14
 

前辈,我想学习下这个声音定位,我的邮箱1776111872@qq.com

此帖出自创意市集论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

15
 

冒昧的问一下,文中的“未知节点”指的是信标位置吗,“锚节点”是麦克风位置吗?如果是的话,为什么要计算r12和r23啊?

此帖出自创意市集论坛

点评

“未知节点”指的是信标位置,“锚节点”是麦克风位置。通过r12和r23求解信标的坐标  详情 回复 发表于 2020-3-13 09:42
 
 
 

回复

183

帖子

12

TA的资源

一粒金砂(高级)

16
 

感谢楼主分享核心算法。先学习一下。

此帖出自创意市集论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

17
 
您好,可以分享一下完整工程么2591081434@qq.com,有兴趣交流的话也可以加波好友
此帖出自创意市集论坛
 
 
 

回复

693

帖子

7

TA的资源

版主

18
 
拾一号 发表于 2020-3-12 20:30 冒昧的问一下,文中的“未知节点”指的是信标位置吗,“锚节点”是麦克风位置吗?如果 ...

“未知节点”指的是信标位置,“锚节点”是麦克风位置。通过r12和r23求解信标的坐标

此帖出自创意市集论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

19
 
前辈,您好,我的邮箱是1964624254@qq.com ,谢谢您,很需要您的完整工程
此帖出自创意市集论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

20
 

前辈,您好,很需要您的完整工程,我的邮箱是1964624254@qq.com,谢谢您

此帖出自创意市集论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表