TDOA(Time Difference of Arrival)是一种无线定位技术,是通过检测TDOA(Time Difference of Arrival)是一种无线定位技术,是通过检测信号到达两个基站的绝对时间差来确定移动台的位置,而不是到达的飞行时间。采用三个不同的基站可以测到两个TDOA,移动站位于两个TDOA决定的双曲线的交点上。
TDOA相比TOA,尽管需要多一个基站,但是却有着更低的复杂度与更高的精度,因此目前TDOA定位的应用非常广泛。
例如,目前有三个站点接收信号,站点1坐标(0,0),站点2坐标(100,0),站点3坐标(0,100),可以看出三个站点的位置刚好构成一个等腰直角三角形,此时可以列方程来求到各个站点的时间差来计算辐射源的具体位置。
例如:
站点1(x1,y1)→(0,0);
站点2(x2,y2)→(100,0);
站点3(x3,y3)→(0,100);
到达站点1的时间差τ1,到达站点2的时间差τ2,到达站点3的时间差τ3。
此时列出方程式:
//d1、d2、d3为辐射源到站点1、2、3的距离,C为无线电的传播速度,约为光速
d1 = t1 * C;
d2 = t2 * C;
d3 = t3 * C;
d1² = (x0 - x1)² + (y0 - y1)² = (t1*C)²;
d2² = (x0 - x2)² + (y0 - y2)² = (t2*C)²;
d3² = (x0 - x3)² + (y0 - y3)² = (t3*C)²;
然后在草稿纸上解出这些计算式,并且将各个站点的坐标的值带入,就可以解得x0和y0的值
根据这些原理,可以列出这样的C语言代码:
此时我设站点1的坐标为原点,站点2的坐标为1光秒的距离,站点3的坐标也是1光秒的距离,分别在x轴和y轴。
设置的辐射源的坐标在x轴和y轴的负1光秒的距离,位置大概是这样的:
#include <stdio.h>
#include <math.h>
#define c 299792458// 定义无线电速度(光速)为 299,792,458 m/s
// 定义站点结构体
typedef struct
{
double x; // 站点的 x 坐标
double y; // 站点的 y 坐标
} Station;
// 计算两点之间的距离
double distance(Station a, Station b)
{
return sqrt(pow(a.x - b.x, 2) + pow(a.y - b.y, 2));
}
// 判断函数,用来判断时延计算的距离与两点之间的距离是否在误差范围 1 内
int just(Station st1, Station st2, double num)
{
int result;
if(distance(st1, st2) <= num * c + 1) // 判断距离是否在误差范围 1 内
{
if(num * c - 1 <= distance(st1, st2)) // 判断距离是否在误差范围 1 外
result = 1;
else
result = 0;
}
else
result = 0;
return result;
}
// TDOA基于三个站点的辐射源定位
void tdoa_based_positioning(Station st1, Station st2, Station st3, double delay1, double delay2, double delay3)
{
// 根据时延计算出辐射源距离各个站点的距离 d1、d2、d3
double d1 = delay1 * c; // 辐射源到站点1的距离
double d2 = delay2 * c; // 辐射源到站点2的距离
double d3 = delay3 * c; // 辐射源到站点3的距离
// 计算辐射源坐标
Station st0;
st0.x = (pow(d1, 2) - pow(d2, 2) + pow(st2.x, 2)) / (2 * st2.x); // 辐射源的 x 坐标
st0.y = (pow(d1, 2) - pow(d3, 2) + pow(st3.y, 2)) / (2 * st3.y); // 辐射源的 y 坐标
// 判断这样的时延情况中点存不存在
double just_result;
if(just(st0, st1, delay1)) // 判断辐射源坐标是否满足到站点1的距离时延要求
{
if(just(st0, st2, delay2)) // 判断辐射源坐标是否满足到站点2的距离时延要求
{
if(just(st0, st3, delay3)) // 判断辐射源坐标是否满足到站点3的距离时延要求
just_result = 1; // 辐射源存在
else
just_result = 0; // 辐射源不存在
}
else
just_result = 0; // 辐射源不存在
}
else
just_result = 0; // 辐射源不存在
// 如果点存在,则输出点的坐标; 不存在则输出“无解”
if (just_result == 0)
{
printf("无解");
}
else
{
double x = st0.x; // 辐射源的 x 坐标
double y = st0.y; // 辐射源的 y 坐标
printf("辐射源位置:(%lf, %lf)", x, y);
}
}
int main()
{
// 定义站点的坐标
Station st1 = {0, 0}; // 站点1的坐标
Station st2 = {299792458, 0}; // 站点2的坐标
Station st3 = {0, 299792458}; // 站点3的坐标
// 定义辐射源到各个站点的时延
double delay1 = sqrt(2); // 辐射源到站点1的时延
double delay2 = sqrt(5); // 辐射源到站点2的时延
double delay3 = sqrt(5); // 辐射源到站点3的时延
// 计算出辐射源的位置
tdoa_based_positioning(st1, st2, st3, delay1, delay2, delay3);
return 0;
}
由运算结果可以看出,得到的辐射源坐标,刚好是在x坐标和y坐标的负1光秒的位置。结果成立。