一、TDOA算法原理概述

到達時間差(Time Difference of Arrival, TDOA) 是一種基於多傳感器協同的定位技術,通過測量信號到達不同傳感器的時間差,結合傳感器位置信息,反推信號源(如聲源、無線發射源)的空間座標。其核心原理是:信號源到兩個傳感器的距離差為常數時,信號源位於以這兩個傳感器為焦點的雙曲線上,多個雙曲線的交點即為信號源位置。

1. 數學模型

設二維平面內有 \(N\)個傳感器(\(N≥3\)),座標為 \(S_i(x_i,y_i)\)\((i=1,2,...,N)\),信號源座標為 \(P(x,y)\),信號傳播速度為 \(c\)(如聲速 340m/s)。信號到達傳感器 S_i的時間為 t_i,則時差 \(τ_{ij}\)=\(t_i−t_j\),對應距離差:

\(cτ_{ij}=d_i−d_j\)其中\(d_i=\sqrt{(x−x_i)^2+(y−y_i)^2}\)

以傳感器 \(S_1\)為參考,對其他傳感器 \(S_i(i=2,3,...,N)\),可得:

\(d_i−d_1=cτi1⟹d_i=d_1+cτi1\)

平方後消去二次項,整理得線性方程組,通過最小二乘法或Chan算法求解 \(P(x,y)\)。

二、MATLAB實現步驟

1. 場景設置

  • 傳感器佈局:4個傳感器(S1,S2,S3,S4),座標分別為 (0,0)、(100,0)、(0,100)、(100,100)(單位:米)。
  • 信號源真實位置:Ptrue(50,30)(單位:米)。
  • 傳播速度:聲速 c=340m/s。
  • 噪聲模擬:測量時差加入高斯噪聲(標準差 σ=0.001s)。

2. 完整MATLAB代碼

% TDOA算法MATLAB實現:二維定位
% 日期:2025年10月

clear; clc; close all;

%% ==================== 1. 參數設置 ====================
% 傳感器座標 (x,y),單位:米
S = [0, 0;       % S1
     100, 0;     % S2
     0, 100;     % S3
     100, 100];  % S4 (冗餘傳感器,提高精度)
N = size(S, 1);  % 傳感器數量

% 信號源真實位置 (x,y),單位:米
P_true = [50; 30];  

% 傳播速度 (聲速,m/s)
c = 340;  

% 噪聲參數 (高斯白噪聲標準差,s)
sigma = 0.001;  

%% ==================== 2. 計算理論時差 ====================
% 計算信號源到各傳感器的真實距離
d_true = vecnorm(S' - P_true, 2, 1);  % d_true(i):信號源到Si的距離

% 以S1為參考,計算理論時差 τi1 = (di - d1)/c (i=2,3,4)
tau_true = (d_true(2:end) - d_true(1)) / c;  

%% ==================== 3. 模擬帶噪聲的測量時差 ====================
tau_meas = tau_true + sigma * randn(size(tau_true));  % 加入噪聲

%% ==================== 4. TDOA定位算法 (最小二乘法) ====================
% 輸入:傳感器座標S,測量時差tau_meas (相對於S1),傳播速度c
% 輸出:估計的信號源位置P_est (x,y)
P_est = tdoa_localization(S, tau_meas, c);

%% ==================== 5. 結果評估與可視化 ====================
% 計算定位誤差
error = norm(P_est - P_true);
fprintf('真實位置: (%.2f, %.2f) m\n', P_true(1), P_true(2));
fprintf('估計位置: (%.2f, %.2f) m\n', P_est(1), P_est(2));
fprintf('定位誤差: %.4f m\n', error);

% 可視化
figure;
plot(S(:,1), S(:,2), 'ro', 'MarkerSize', 10, 'MarkerFaceColor', 'r'); hold on;
plot(P_true(1), P_true(2), 'gp', 'MarkerSize', 12, 'MarkerFaceColor', 'g');
plot(P_est(1), P_est(2), 'bx', 'MarkerSize', 12, 'LineWidth', 2);
legend('傳感器', '真實位置', '估計位置');
xlabel('X (m)'); ylabel('Y (m)');
title('TDOA定位結果');
grid on; axis equal;


%% ==================== TDOA定位核心函數 (最小二乘法) ====================
function P_est = tdoa_localization(S, tau_meas, c)
    % S: 傳感器座標矩陣 (N×2),N≥3
    % tau_meas: 測量時差向量 (N-1)×1,相對於第1個傳感器
    % c: 信號傳播速度 (m/s)
    % P_est: 估計的信號源位置 (2×1)
    
    N = size(S, 1);  % 傳感器數量
    if N < 3
        error('至少需要3個傳感器進行二維定位!');
    end
    
    % 提取參考傳感器S1和其他傳感器Si (i=2..N)
    S1 = S(1,:)';       % 參考傳感器座標 (2×1)
    Si = S(2:end,:)';   % 其他傳感器座標 (2×(N-1))
    tau = tau_meas;     % 時差向量 ((N-1)×1)
    
    % 構造線性方程組 Ax = b (偽線性化)
    A = [];
    b = [];
    for i = 1:size(Si, 2)
        xi = Si(1,i); yi = Si(2,i);
        Ai = [xi-2*S1(1), yi-2*S1(2), c^2*tau(i)^2 - (xi^2 + yi^2) + (S1(1)^2 + S1(2)^2)];
        bi = c^2 * tau(i)^2;
        A = [A; Ai];
        b = [b; bi];
    end
    
    % 最小二乘求解:x = (A^T A)^-1 A^T b
    x = pinv(A) * b;  % x = [x; y; d1^2],其中d1是信號源到S1的距離
    
    % 提取估計位置 (x,y)
    P_est = x(1:2);
end

三、進階:Chan算法實現(高精度閉式解)

上述最小二乘法為簡化版,實際應用中常用Chan算法(適用於高斯噪聲,閉式解,精度更高)。以下是Chan算法的MATLAB實現:

function P_est = tdoa_chan(S, tau_meas, c, sigma)
    % Chan算法:TDOA高精度定位 (二維)
    % 輸入:傳感器座標S(N×2),時差tau_meas((N-1)×1),傳播速度c,噪聲標準差sigma
    % 輸出:估計位置P_est(2×1)
    
    N = size(S, 1);
    if N < 3, error('至少需要3個傳感器!'); end
    
    % 步驟1:計算距離差向量和傳感器間距離
    d1 = vecnorm(S(2:end,:) - S(1,:), 2, 2);  % 參考傳感器S1到其他傳感器的距離
    r = c * tau_meas;  % 距離差向量 (d_i - d_1)
    
    % 步驟2:構造矩陣G和h
    G = [-d1, ones(N-1,1)];
    h = 0.5 * (r.^2 - d1.^2);
    
    % 步驟3:第一次最小二乘求解中間變量
    z = pinv(G) * h;  % z = [x; y; d1^2] (簡化形式)
    d1_est = sqrt(z(3));  % 估計d1
    
    % 步驟4:構造協方差矩陣和加權矩陣
    Q = (sigma^2) * eye(N-1);  % 噪聲協方差
    W = inv(G' * inv(Q) * G);   % 加權矩陣
    
    % 步驟5:第二次最小二乘求解最終位置
    A = [];
    b = [];
    for i = 1:N-1
        xi = S(i+1,1); yi = S(i+1,2);
        Ai = [(xi-S(1,1))/d1_est, (yi-S(1,2))/d1_est, 1];
        bi = 0.5 * ((xi^2 + yi^2 - S(1,1)^2 - S(1,2)^2)/d1_est - r(i)^2/d1_est + d1_est^2);
        A = [A; Ai];
        b = [b; bi];
    end
    P_est = pinv(A' * W * A) * A' * W * b;
end

四、關鍵問題與優化

1. 傳感器佈局優化

  • 避免共線:傳感器儘量不共線,否則雙曲線退化,定位精度下降。
  • 對稱佈局:如正方形或正三角形佈局,可提高定位穩定性。

2. 噪聲處理

  • 濾波預處理:對測量時差進行卡爾曼濾波或中值濾波,降低噪聲影響。
  • 冗餘傳感器:增加傳感器數量(如4個以上),通過多餘觀測提高精度(代碼中已加入S4作為冗餘)。

3. 三維擴展

若需三維定位,傳感器座標為 \((x_i,y_i,z_i)\),信號源座標 \((x,y,z)\),時差方程擴展為:

\(\sqrt{(x−x_i)^2+(y−y_i)^2+(z−z_i)^2}−\sqrt{(x−x_1)^2+(y−y_1)^2+(z−z_1)^2}=cτi1\)

定位算法類似,需至少4個傳感器。

參考代碼 TDOA算法的matlab實現 www.youwenfan.com/contentcnn/82961.html

五、應用場景

  1. 聲源定位:麥克風陣列定位説話人、機器異響源。
  2. 無線定位:UWB(超寬帶)室內定位、基站定位手機。
  3. 雷達與聲吶:目標跟蹤、水下探測。
  4. 地震監測:震源定位。

六、總結

TDOA算法通過多傳感器時差測量實現定位,MATLAB實現需重點關注:

  • 模型建立:距離差與時差的轉換關係;
  • 噪聲模擬:通過高斯噪聲貼近實際場景;
  • 算法選擇:最小二乘法(簡單)或Chan算法(高精度)。