基于时差(TDOA)与 频差(FDOA) 的无源定位

基于 时差(TDOA)频差(FDOA) 的无源定位是电子侦察与雷达对抗中的核心技术。该方法利用多站接收机 测量信号到达的时间差和频率差,通过双曲线交汇伪线性化算法解算辐射源的位置。

以下是 MATLAB 仿真实现方案,包含几何模型、观测方程、Taylor 级数展开法求解及 GDOP(精度衰减因子)分析。


一、定位原理与数学模型

1、坐标系定义

假设有 MMM 个观测站(已知位置)和 1 个辐射源(未知位置):

符号 含义
u=[xu,yu]T\mathbf{u} = [x_u, y_u]^Tu=[xu,yu]T 辐射源位置
si=[xi,yi]T\mathbf{s}_i = [x_i, y_i]^Tsi=[xi,yi]T 第 iii 个观测站位置
ri=∣u−si∣r_i = |\mathbf{u} - \mathbf{s}_i|ri=∣u−si∣ 辐射源到第 iii 站的距离

2、时差(TDOA)方程

以主站(Master Station, i=1i=1i=1)为参考:
Δri1=ri−r1=c⋅Δti1 \Delta r_{i1} = r_i - r_1 = c \cdot \Delta t_{i1} Δri1=ri−r1=c⋅Δti1

3、频差(FDOA)方程

基于多普勒效应(辐射源速度 v=[vx,vy]T\mathbf{v} = [v_x, v_y]^Tv=[vx,vy]T):
Δfi1=fcc((v−vi)⋅(u−si)ri−(v−v1)⋅(u−s1)r1) \Delta f_{i1} = \frac{f_c}{c} \left( \frac{(\mathbf{v} - \mathbf{v}_i) \cdot (\mathbf{u} - \mathbf{s}_i)}{r_i} - \frac{(\mathbf{v} - \mathbf{v}_1) \cdot (\mathbf{u} - \mathbf{s}_1)}{r_1} \right) Δfi1=cfc(ri(v−vi)⋅(u−si)−r1(v−v1)⋅(u−s1))
(注:若观测站静止,vi=0\mathbf{v}_i = 0vi=0)


二、MATLAB 核心仿真代码

1、参数设置与主脚本

matlab 复制代码
%% 1. 参数初始化
clc; clear; close all;

% 辐射源参数
target_pos = [5000, 3000];   % 目标真实位置 (m)
target_vel = [150, -50];     % 目标速度 (m/s)

% 观测站参数 (3站)
stations = [0, 0;           % 主站
            8000, 0;        % 辅站1
            4000, 7000];    % 辅站2

% 信号参数
c = 3e8;                   % 光速 (m/s)
fc = 1e9;                  % 载频 (Hz)

% 噪声参数 (标准差)
sigma_tdoa = 1e-7;         % 时差测量误差 (s)
sigma_fdoa = 0.5;          % 频差测量误差 (Hz)

%% 2. 生成观测数据
obs = generate_observations(target_pos, target_vel, stations, c, fc, sigma_tdoa, sigma_fdoa);

%% 3. 初始估计 (Fang算法或最小二乘)
initial_guess = mean(stations, 1); % 简单取站址中心

%% 4. Taylor级数展开法求解
[pos_est, vel_est] = taylor_tdoa_fdoa(initial_guess, [0,0], obs, stations, c, fc);

%% 5. 结果显示
fprintf('真实位置: (%.2f, %.2f)\n', target_pos);
fprintf('估计位置: (%.2f, %.2f)\n', pos_est);
fprintf('定位误差: %.2f m\n', norm(pos_est - target_pos));

2、观测数据生成函数

matlab 复制代码
function obs = generate_observations(pos, vel, stations, c, fc, sig_t, sig_f)
    M = size(stations, 1);
    r = sqrt(sum((pos - stations).^2, 2));
    
    % 真实TDOA (相对于主站)
    tdoa_true = (r(2:end) - r(1)) / c;
    
    % 真实FDOA
    fdoa_true = zeros(M-1, 1);
    for i = 2:M
        vec = pos - stations(i,:);
        vec_ref = pos - stations(1,:);
        fdoa_true(i-1) = (fc/c) * (dot(vel, vec)/r(i) - dot(vel, vec_ref)/r(1));
    end
    
    % 添加高斯噪声
    obs.tdoa = tdoa_true + sig_t * randn(M-1, 1);
    obs.fdoa = fdoa_true + sig_f * randn(M-1, 1);
end

3、Taylor 级数展开法(核心算法)

这是解决非线性方程最稳定的方法之一。

matlab 复制代码
function [pos_est, vel_est] = taylor_tdoa_fdoa(init_pos, init_vel, obs, stations, c, fc)
    pos = init_pos;
    vel = init_vel;
    M = size(stations, 1);
    
    for iter = 1:20  % 迭代次数
        % 1. 计算残差
        r = sqrt(sum((pos - stations).^2, 2));
        h_tdoa = (r(2:end) - r(1)) / c - obs.tdoa;
        h_fdoa = zeros(M-1, 1);
        
        for i = 2:M
            vec = pos - stations(i,:);
            vec_ref = pos - stations(1,:);
            h_fdoa(i-1) = (fc/c) * (dot(vel, vec)/r(i) - dot(vel, vec_ref)/r(1)) - obs.fdoa(i-1);
        end
        h = [h_tdoa; h_fdoa];
        
        % 2. 计算雅可比矩阵 G
        G = zeros(2*(M-1), 4);
        for i = 2:M
            idx = i-1;
            % TDOA偏导
            G(idx, 1:2) = (pos - stations(i,:))/r(i) - (pos - stations(1,:))/r(1);
            % FDOA偏导 (对位置)
            G(idx, 1:2) = G(idx, 1:2) * (fc/c) * (-dot(vel, pos-stations(i,:))/(r(i)^3)* (pos-stations(i,:)) + ...
                                                dot(vel, pos-stations(1,:))/(r(1)^3)* (pos-stations(1,:)));
            % FDOA偏导 (对速度)
            G(idx, 3:4) = (fc/c) * ((pos - stations(i,:))/r(i) - (pos - stations(1,:))/r(1));
        end
        
        % 3. 求解增量
        delta = - (G' * G) \ (G' * h);
        
        % 4. 更新状态
        pos = pos + delta(1:2)';
        vel = vel + delta(3:4)';
        
        if norm(delta) < 1e-4
            break;
        end
    end
    pos_est = pos;
    vel_est = vel;
end

三、GDOP(精度衰减因子)分析

GDOP 反映了几何构型对定位精度的影响,是布站优化的核心依据。

matlab 复制代码
function plot_gdop(stations, c, fc)
    [X, Y] = meshgrid(-2000:100:12000, -2000:100:12000);
    gdop = zeros(size(X));
    
    for i = 1:size(X,1)
        for j = 1:size(X,2)
            pos = [X(i,j), Y(i,j)];
            r = sqrt(sum((pos - stations).^2, 2));
            
            % 近似计算Fisher信息矩阵 (FIM)
            G = zeros(2*(size(stations,1)-1), 2);
            for k = 2:size(stations,1)
                G(k-1, :) = (pos - stations(k,:))/r(k) - (pos - stations(1,:))/r(1);
            end
            J = G' * G;
            cov_mat = inv(J);
            gdop(i,j) = sqrt(trace(cov_mat));
        end
    end
    
    figure;
    contourf(X, Y, log10(gdop), 20, 'LineColor', 'none');
    colorbar; title('GDOP分布 (Log Scale)');
    hold on; plot(stations(:,1), stations(:,2), 'ro', 'MarkerSize', 10, 'LineWidth', 2);
    axis equal; grid on;
end

参考代码 时差和频差无源定位方法研究 www.youwenfan.com/contentcsu/63941.html

四、关键工程经验

问题 原因 解决方案
迭代不收敛 初始值离真值太远 先用 Chan 算法或最小二乘提供初值
GDOP 无穷大 目标位于基线延长线上 采用立体布站(非共线)
频差估计不准 相参积累时间不足 增加 FFT 点数或使用相位差分法
速度解算发散 站址误差放大 联合估计站址偏差(Self-Calibration)
相关推荐
_深海凉_1 小时前
LeetCode热题100-回文链表
算法·leetcode·链表
pursuit_csdn1 小时前
力扣周赛 501
算法·leetcode·职场和发展
努力d小白1 小时前
leetcode70.爬楼梯
算法
AbandonForce1 小时前
LeetCode 滑动窗口个人思路详解
算法·leetcode·职场和发展
bnmoel1 小时前
数据结构深度剖析顺序表:结构、扩容与增删查改全解析
c语言·数据结构·算法·顺序表
Liangwei Lin1 小时前
LeetCode 45. 跳跃游戏 II
数据结构·算法·leetcode
啦啦啦_99991 小时前
4. 决策树剪枝
算法·决策树·剪枝
鹿角片ljp2 小时前
全局哈希去重原理与数据集实践
算法·安全·哈希算法
Paranoid-up2 小时前
安全启动和安全固件更新(SBSFU)3:加密基础
算法·安全·哈希算法·iap·安全启动·安全升级·sbsfu