【电子战】第07篇:多普勒测向【含matlab代码】

第07篇:多普勒测向

一、作用:用"动"来测方向

前两篇中,我们介绍了基于幅度(Watson-Watt)和相位(干涉仪)的测向方法。它们共同的前提是:接收天线在空间上分开排布。通过比较不同位置上天线收到的信号,反推出辐射源的方位。

但如果只有一个天线呢?或者说,天线处于运动状态(如机载、星载平台)呢?

多普勒测向(Doppler DF) 利用了另一种物理效应:当接收机(或天线)相对辐射源运动时,接收信号的频率会发生多普勒频移,频移量与运动方向和来波方向的夹角直接相关 。如果让天线做匀速圆周运动(机械旋转或电子切换),多普勒频移就会呈现一条确定的正弦曲线,其相位正是辐射源的方位角。

多普勒测向的典型应用:

  • 机载 ESM:飞机飞行时,机身周围环形排布多个天线,通过"电子旋转"产生多普勒调制
  • UHF/VHF 监测:用一个机械旋转的八木天线测向
  • 卫星被动定位:利用卫星轨道运动产生的多普勒差反推地面辐射源位置

本篇核心作用:从多普勒调制的物理机理出发,推导"频率-角度"的映射关系,实现一个完整的估计器,并用蒙特卡洛验证其性能是否达到 CRLB。

二、原理:数学上发生了什么?

2.1 圆周运动下的多普勒调制

假设一个天线在水平面内做匀速圆周运动,半径 RRR,角频率 ωr=2πfr\omega_r = 2\pi f_rωr=2πfr。在时刻 ttt,天线位置为:

p(t)=(Rcos⁡ωrt, Rsin⁡ωrt)\mathbf{p}(t) = (R\cos\omega_r t, \ R\sin\omega_r t)p(t)=(Rcosωrt, Rsinωrt)

辐射源位于远场,方位角 ψ\psiψ(相对 x 轴)。天线到辐射源方向上的径向投影 为:

r(t)=Rcos⁡(ωrt−ψ)r(t) = R\cos(\omega_r t - \psi)r(t)=Rcos(ωrt−ψ)

因此,接收信号的相位相对于静止状态多了一项:

φdop(t)=2πfc⋅R⋅cos⁡(ωrt−ψ)=Adopcos⁡(ωrt−ψ)\varphi_{dop}(t) = \frac{2\pi f}{c} \cdot R \cdot \cos(\omega_r t - \psi) = A_{dop} \cos(\omega_r t - \psi)φdop(t)=c2πf⋅R⋅cos(ωrt−ψ)=Adopcos(ωrt−ψ)

其中 Adop=2πfR/cA_{dop} = 2\pi f R / cAdop=2πfR/c 是多普勒调制深度 。对应的瞬时频率偏移为:

fd(t)=−fRcωrsin⁡(ωrt−ψ)f_d(t) = -\frac{f R}{c} \omega_r \sin(\omega_r t - \psi)fd(t)=−cfRωrsin(ωrt−ψ)

注意:调制深度 AdopA_{dop}Adop 与频率 fff、半径 RRR 成正比调制相位就是 −ψ-\psi−ψ。这就是多普勒测向的物理基础。

2.2 估计方法:DFT 提取相位

设参考信号(如机内同步信号)为 r(t)r(t)r(t),接收信号为 x(t)=r(t)exp⁡(jφdop(t))x(t) = r(t)\exp(j\varphi_{dop}(t))x(t)=r(t)exp(jφdop(t))。

计算 去调制信号

z(t)=x(t)⋅r∗(t)=∣r(t)∣2⋅exp⁡(jAdopcos⁡(ωrt−ψ))z(t) = x(t) \cdot r^*(t) = |r(t)|^2 \cdot \exp(j A_{dop} \cos(\omega_r t - \psi))z(t)=x(t)⋅r∗(t)=∣r(t)∣2⋅exp(jAdopcos(ωrt−ψ))

单位化后得到纯相位调制信号:

u(t)=z(t)∣z(t)∣≈exp⁡(jAdopcos⁡(ωrt−ψ))u(t) = \frac{z(t)}{|z(t)|} \approx \exp(j A_{dop} \cos(\omega_r t - \psi))u(t)=∣z(t)∣z(t)≈exp(jAdopcos(ωrt−ψ))

对 u(t)u(t)u(t) 在 ωr\omega_rωr 处做 DFT(等价于提取一阶谐波):

U=∑n=0M−1u(tn)⋅e−jωrtnU = \sum_{n=0}^{M-1} u(t_n) \cdot e^{-j\omega_r t_n}U=n=0∑M−1u(tn)⋅e−jωrtn

利用 Bessel 函数的傅里叶展开(Jacobi-Anger 展开),当采样点数 MMM 覆盖完整周期时:

U≈j⋅M⋅J1(Adop)⋅e−jψU \approx j \cdot M \cdot J_1(A_{dop}) \cdot e^{-j\psi}U≈j⋅M⋅J1(Adop)⋅e−jψ

因此方位角估计式为:

ψ^=π2−∠(U)\hat{\psi} = \frac{\pi}{2} - \angle(U)ψ^=2π−∠(U)

关键优势 :这个估计器不需要相位展开,对噪声鲁棒,计算量小(一次 DFT)。

2.3 CRLB

Fisher 信息量为:

I(ψ)=2ξ∑n=0M−1(∂φdop∂ψ)2=2ξ⋅Adop2⋅∑n=0M−1sin⁡2(ωrtn−ψ)I(\psi) = 2\xi \sum_{n=0}^{M-1} \left( \frac{\partial \varphi_{dop}}{\partial \psi} \right)^2 = 2\xi \cdot A_{dop}^2 \cdot \sum_{n=0}^{M-1} \sin^2(\omega_r t_n - \psi)I(ψ)=2ξn=0∑M−1(∂ψ∂φdop)2=2ξ⋅Adop2⋅n=0∑M−1sin2(ωrtn−ψ)

当 MMM 足够大、采样覆盖完整周期时,∑sin⁡2=M/2\sum \sin^2 = M/2∑sin2=M/2,因此:

I(ψ)=ξMAdop2I(\psi) = \xi M A_{dop}^2I(ψ)=ξMAdop2

σψ2≥1ξMAdop2=1ξM(2πfR/c)2\sigma_\psi^2 \geq \frac{1}{\xi M A_{dop}^2} = \frac{1}{\xi M \left( 2\pi f R / c \right)^2}σψ2≥ξMAdop21=ξM(2πfR/c)21

这表明测向精度

  • 与积累点数 MMM 成反比 (σψ∝1/M\sigma_\psi \propto 1/\sqrt{M}σψ∝1/M )
  • 与 SNR 成反比
  • 载波频率 fff旋转半径 RRR 的乘积成反比------这是多普勒测向的关键设计参数 (类似干涉仪的 d/λd/\lambdad/λ 基线)

三、完整代码(可直接运行)

matlab 复制代码
%% ========================================================================
% 第07篇:多普勒测向
% 基于:ch7_drawFigures(图7.8b、7.10)
% ========================================================================

clear; close all; clc;

%% ==================== 图1:多普勒频率随时间变化 ====================

M_vis = 128;
phi0_vis = 5*pi/3;
fd_norm = cos((1:M_vis)/M_vis*2*pi + phi0_vis);
f0_norm = 2.5;

figure;
plot(1:M_vis, f0_norm*ones(size(fd_norm)), 'b-', 'LineWidth', 2, ...
     'DisplayName', '参考频率 f_0');
hold on;
plot(1:M_vis, f0_norm + fd_norm, 'r-', 'LineWidth', 2, ...
     'DisplayName', '接收频率 f_0 + f_d(t)');
xlabel('时间采样点 n');
ylabel('归一化频率');
title('多普勒测向:瞬时频率随天线旋转而变化');
grid on;
legend('Location', 'northwest');
ylim([1.5, 3.8]);

% 标注多普勒调制
text(0.35*M_vis, f0_norm - 0.5, 'f_d(t) = \propto \sin(\omega_r t - \psi)', ...
     'FontSize', 11, 'Color', 'r');
text(0.8*M_vis, f0_norm + 0.15, 'f_0', 'FontSize', 11, 'Color', 'b');

% 标注旋转周期
fd_desc = fd_norm;
fd_desc(fd_norm(2:end) > fd_norm(1:end-1)) = Inf;
[~, idx_cycle] = min(abs(fd_desc));
plot(idx_cycle*[1 1], f0_norm + [min(fd_norm), 0], 'k--', 'LineWidth', 1);
text(idx_cycle + 2, f0_norm - 0.7, '旋转周期 T_r = 1/f_r', 'FontSize', 10);

%% ==================== 图2:单次估计演示 ====================

fprintf('======= 多普勒测向单次估计演示 =======\n');

% 信号参数
theta_true_deg = 45;
psi_true = deg2rad(theta_true_deg);
A = 1;
phi0 = 2*pi*rand();
f = 1e9;               % 载波 1 GHz
c = 3e8;
lam = c/f;

% 天线参数
M_demo = 256;
ts_demo = 1/(5*f);     % 采样间隔
R_demo = lam / 2;      % 旋转半径 = λ/2(与书中一致)
fr_demo = 1/(ts_demo*M_demo);   % 旋转频率:M 点覆盖一个完整周期

% 生成信号
t_demo = ts_demo*(0:M_demo-1).';
r_demo = A*exp(1i*phi0)*exp(1i*2*pi*f*t_demo);
A_dop_demo = 2*pi*f*R_demo/c;
x_demo = r_demo .* exp(1i*A_dop_demo*cos(2*pi*fr_demo*t_demo - psi_true));

% 加噪声(SNR = 10 dB)
SNR_demo_dB = 10;
noise_pwr_demo = 10^(-SNR_demo_dB/10);
r_demo_n = r_demo + sqrt(noise_pwr_demo/2)*(randn(M_demo,1) + 1i*randn(M_demo,1));
x_demo_n = x_demo + sqrt(noise_pwr_demo/2)*(randn(M_demo,1) + 1i*randn(M_demo,1));

% 估计
psi_est_demo = doppler_df_est(r_demo_n, x_demo_n, ts_demo, f, R_demo, fr_demo);

fprintf('真实角度: %.4f°\n', theta_true_deg);
fprintf('估计角度: %.4f°\n', rad2deg(psi_est_demo));
fprintf('误差   : %.4f°\n', rad2deg(psi_est_demo) - theta_true_deg);

% 可视化去调制信号
z_demo = x_demo_n .* conj(r_demo_n);
zn_demo = z_demo ./ (abs(z_demo) + eps);

figure;
subplot(2, 1, 1);
plot(1:M_demo, angle(z_demo), 'b.', 'MarkerSize', 3);
hold on;
plot(1:M_demo, angle(zn_demo), 'r-', 'LineWidth', 1);
xlabel('采样点 n'); ylabel('相位 [rad]');
title('去调制信号的相位(蓝点=原始,红线=单位化)');
grid on; xlim([1, M_demo]);
legend('原始相位', '单位化相位', 'Location', 'northwest');

subplot(2, 1, 2);
plot(1:M_demo, angle(zn_demo), 'b-', 'LineWidth', 1, 'DisplayName', '单位化相位');
hold on;
ref_theory = A_dop_demo * cos(2*pi*fr_demo*t_demo - psi_true);
plot(1:M_demo, ref_theory, 'r--', 'LineWidth', 1.5, ...
     'DisplayName', '真实相位调制(无噪)');
xlabel('采样点 n'); ylabel('相位 [rad]');
title(sprintf('相位调制的正弦曲线 (真实 \\psi = %d°)', theta_true_deg));
grid on; xlim([1, M_demo]);
legend('Location', 'northwest');

%% ==================== 图3:蒙特卡洛验证 vs CRLB ====================

fprintf('\n执行多普勒测向蒙特卡洛仿真...\n');

% 参数
theta_true_mc_deg = 45;
psi_true_mc = deg2rad(theta_true_mc_deg);
A_mc = 1;
phi0_mc = 2*pi*rand();
f_mc = 1e9;
c = 3e8;
lam = c/f_mc;
ts_mc = 1/(5*f_mc);

% 半径设置:对比 R = λ/2 和 R = 2λ
R_set = [lam/2, 2*lam];

% 蒙特卡洛扫描
M_vec = [10, 100, 1000];
snr_db_vec = -10:2:30;
num_mc = 500;

rmse_all = cell(numel(R_set), numel(M_vec));
crlb_all = cell(numel(R_set), numel(M_vec));

for idx_R = 1:numel(R_set)
    R = R_set(idx_R);
    fprintf('\t 计算 R = %.2f*λ ...\n', R/lam);
    
    for idx_M = 1:numel(M_vec)
        M = M_vec(idx_M);
        
        % 时间向量和信号
        t_vec = ts_mc*(0:M-1).';
        r0 = A_mc*exp(1i*phi0_mc)*exp(1i*2*pi*f_mc*t_vec);
        fr = 1/(ts_mc*M);
        A_dop = 2*pi*f_mc*R/c;
        x0 = r0 .* exp(1i*A_dop*cos(2*pi*fr*t_vec - psi_true_mc));
        
        % 预生成噪声
        noise_base_r = sqrt(A_mc/2)*(randn(M, num_mc)+1i*randn(M, num_mc));
        noise_base_x = sqrt(A_mc/2)*(randn(M, num_mc)+1i*randn(M, num_mc));
        
        rmse_vec = zeros(size(snr_db_vec));
        crlb_vec = zeros(size(snr_db_vec));
        
        for idx_snr = 1:numel(snr_db_vec)
            snr_db = snr_db_vec(idx_snr);
            noise_pwr = 10.^(-snr_db/10);
            
            % 加噪
            r = r0 + noise_base_r*sqrt(noise_pwr);
            x = x0 + noise_base_x*sqrt(noise_pwr);
            
            % 估计
            psi_est = zeros(1, num_mc);
            for idx_mc = 1:num_mc
                psi_est(idx_mc) = doppler_df_est(r(:,idx_mc), x(:,idx_mc), ...
                                                 ts_mc, f_mc, R, fr);
            end
            
            % 卷绕处理
            err = psi_est - psi_true_mc;
            err = mod(err + pi, 2*pi) - pi;
            rmse_vec(idx_snr) = sqrt(mean(err.^2));
            
            % CRLB
            crlb_vec(idx_snr) = sqrt(doppler_crlb(snr_db, M, f_mc, R));
        end
        
        rmse_all{idx_R, idx_M} = rmse_vec;
        crlb_all{idx_R, idx_M} = crlb_vec;
    end
end

fprintf('仿真完成!\n');

% 绘制结果
figure;
colors = lines(numel(M_vec));
for idx_R = 1:numel(R_set)
    subplot(1, 2, idx_R); hold on;
    for idx_M = 1:numel(M_vec)
        % CRLB
        semilogy(snr_db_vec, rad2deg(crlb_all{idx_R, idx_M}), ...
                 '-', 'Color', colors(idx_M,:), 'LineWidth', 2, ...
                 'DisplayName', sprintf('M=%d (CRLB)', M_vec(idx_M)));
        % 蒙特卡洛
        semilogy(snr_db_vec, rad2deg(rmse_all{idx_R, idx_M}), ...
                 'o--', 'Color', colors(idx_M,:), 'LineWidth', 1, ...
                 'MarkerSize', 5, 'HandleVisibility', 'off');
    end
    xlabel('SNR \xi [dB]'); ylabel('RMSE [度]');
    title(sprintf('多普勒测向性能 (R = %.2f\\lambda)', R_set(idx_R)/lam));
    grid on; legend('Location', 'southwest');
    xlim([-10, 30]); ylim([0.01, 100]);
end
sgtitle('不同 R/λ 和 M 下的测向精度(实线=CRLB,虚线+圈=蒙特卡洛)', ...
        'FontSize', 13, 'FontWeight', 'bold');

%% ==================== 图4:CRLB 与设计参数的关系 ====================

% 展示 CRLB 随 SNR、M、R 的关系(等值线)
figure;
[M_grid, SNR_grid] = meshgrid(10:10:1000, -10:1:30);

subplot(1, 3, 1);
R_fix = lam/2;
CRLB_1 = rad2deg(sqrt(doppler_crlb(SNR_grid, M_grid, f_mc, R_fix)));
imagesc(10:10:1000, -10:1:30, CRLB_1);
colorbar; set(gca, 'ydir', 'normal');
xlabel('积累点数 M'); ylabel('SNR \xi [dB]');
title(sprintf('CRLB [度], R = 0.5\\lambda'));

subplot(1, 3, 2);
R_fix = 2*lam;
CRLB_2 = rad2deg(sqrt(doppler_crlb(SNR_grid, M_grid, f_mc, R_fix)));
imagesc(10:10:1000, -10:1:30, CRLB_2);
colorbar; set(gca, 'ydir', 'normal');
xlabel('积累点数 M'); ylabel('SNR \xi [dB]');
title(sprintf('CRLB [度], R = 2\\lambda'));

subplot(1, 3, 3);
R_vec = linspace(0.1, 5, 100) * lam;
M_fix = 100; SNR_fix = 10;
CRLB_R = rad2deg(sqrt(doppler_crlb(SNR_fix, M_fix, f_mc, R_vec)));
semilogy(R_vec/lam, CRLB_R, 'b-', 'LineWidth', 2);
xlabel('旋转半径 R/\lambda'); ylabel('CRLB [度]');
title(sprintf('CRLB vs R (M=%d, SNR=%ddB)', M_fix, SNR_fix));
grid on;

sgtitle('多普勒测向精度与设计参数的关系', 'FontSize', 13, 'FontWeight', 'bold');

%% ==================== 函数定义 ====================

function psi_est = doppler_df_est(r, x, ts, f, R, fr)
    % 多普勒测向估计算法(DFT 相位提取法)
    % 输入:
    %   r  : M×1 参考信号(复向量)
    %   x  : M×1 接收信号(复向量)
    %   ts : 采样间隔 [s]
    %   f  : 载波频率 [Hz]
    %   R  : 旋转半径 [m]
    %   fr : 旋转频率 [Hz]
    % 输出:
    %   psi_est : 方位角估计 [rad]
    
    M = length(r);
    
    % 计算去调制信号并单位化
    z = x .* conj(r);
    zn = z ./ (abs(z) + eps);
    
    % 时间索引
    n = (0:M-1).';
    
    % DFT 提取 fr 频率处分量
    kernel = exp(-1i*2*pi*fr*ts*n);
    U = sum(zn .* kernel);
    
    % 由 Bessel 展开:U ∝ j * J_1(A_dop) * exp(-j*psi)
    % 所以角度 = pi/2 - psi,推出 psi = pi/2 - angle(U)
    psi_est = pi/2 - angle(U);
end

function crlb = doppler_crlb(snr_db, M, f, R)
    % 多普勒测向的克拉美-罗下限(psi 的方差)
    c = 3e8;
    snr = 10.^(snr_db/10);
    A_dop = 2*pi*f*R/c;
    crlb = 1 ./ (snr .* M .* A_dop.^2);
end

四、代码讲解:为什么这么写?

4.1 为什么用 DFT 提取 fr 频率处分量,而不是直接相位展开?

去调制信号 z(t)=x(t)⋅r∗(t)z(t) = x(t) \cdot r^*(t)z(t)=x(t)⋅r∗(t) 的相位是 Adopcos⁡(ωrt−ψ)A_{dop}\cos(\omega_r t - \psi)Adopcos(ωrt−ψ)。如果 Adop>πA_{dop} > \piAdop>π,相位就会出现卷绕 (例如 Adop=2πA_{dop} = 2\piAdop=2π 时相位跨越 −π,π-\\pi, \\pi−π,π 两次)。用 unwrap 处理卷绕在噪声下极易出错。

改用 DFT 直接对单位化复数信号提取一阶谐波:

matlab 复制代码
zn = z ./ (abs(z) + eps);
U = sum(zn .* exp(-1i*2*pi*fr*ts*n));

这里隐含使用了 Jacobi-Anger 展开 (Bessel 函数的傅里叶级数):

ejAcos⁡θ=∑k=−∞∞jkJk(A)ejkθe^{jA\cos\theta} = \sum_{k=-\infty}^{\infty} j^k J_k(A) e^{jk\theta}ejAcosθ=k=−∞∑∞jkJk(A)ejkθ

只有 k=1k=1k=1 的分量在乘以 e−jωrte^{-j\omega_r t}e−jωrt 后成为常数,被 DFT 相干积累;其他 kkk 分量在求和后相互抵消。这样估计器不需要知道 AdopA_{dop}Adop 的具体数值,只要求 ωr\omega_rωr 已知,非常实用。

4.2 为什么要设置 fr = 1/(ts*M)

DFT 提取的前提是采样点覆盖完整周期 ,否则会引入"频谱泄漏"。设定 fr⋅M⋅ts=1f_r \cdot M \cdot t_s = 1fr⋅M⋅ts=1 保证了一个周期恰好被 MMM 个采样点完整覆盖,这时 k=1k=1k=1 的谐波正好落在 DFT 的第 1 个 bin 上,没有泄漏、没有栅栏效应

这也是原书代码中 fr = 1/(ts*M) 的由来。

4.3 psi_est = pi/2 - angle(U) 的推导来源

让我们仔细推导一遍:对于无噪声单位化信号

u(t)=exp⁡(jAdopcos⁡(ωrt−ψ))u(t) = \exp(j A_{dop} \cos(\omega_r t - \psi))u(t)=exp(jAdopcos(ωrt−ψ))

用 Bessel 展开:

u(t)=∑kjkJk(Adop)ejk(ωrt−ψ)u(t) = \sum_k j^k J_k(A_{dop}) e^{jk(\omega_r t - \psi)}u(t)=k∑jkJk(Adop)ejk(ωrt−ψ)

对 u(t)u(t)u(t) 乘以 e−jωrte^{-j\omega_r t}e−jωrt 后求和(离散化后等价于提取 k=1k=1k=1 分量):

U≈M⋅jJ1(Adop)⋅e−jψU \approx M \cdot j J_1(A_{dop}) \cdot e^{-j\psi}U≈M⋅jJ1(Adop)⋅e−jψ

因为 j=ejπ/2j = e^{j\pi/2}j=ejπ/2,M⋅J1(Adop)M \cdot J_1(A_{dop})M⋅J1(Adop) 是正实数,所以:

∠U=π/2−ψ  ⟹  ψ=π/2−∠U\angle U = \pi/2 - \psi \implies \psi = \pi/2 - \angle U∠U=π/2−ψ⟹ψ=π/2−∠U

这就是代码中 psi_est = pi/2 - angle(U) 的来源。注意这个公式只对 J1(Adop)>0J_1(A_{dop}) > 0J1(Adop)>0 成立 ------当 AdopA_{dop}Adop 过大(例如 Adop>3.83A_{dop} > 3.83Adop>3.83,即 J1J_1J1 的第一个零点)时,相位会翻转。所以实际系统中 AdopA_{dop}Adop 通常被限制在 J1J_1J1 的第一个峰值附近(Adop≈1.84A_{dop} \approx 1.84Adop≈1.84)。

4.4 CRLB 为什么与 (fR)2(f R)^2(fR)2 成反比?

从公式:

σψ2=1ξM(2πfR/c)2\sigma_\psi^2 = \frac{1}{\xi M \left(2\pi f R / c\right)^2}σψ2=ξM(2πfR/c)21

  • fff 越大(载波频率高):单位时间内相位变化越快,角度信息越丰富 → 精度越高。
  • RRR 越大(旋转半径大):多普勒调制深度越大 → 精度越高。

这与干涉仪中"基线 d/λd/\lambdad/λ 越长精度越高"的规律本质相同------都是利用更长的空间/时间尺度积累角度信息 。但代价是多普勒测向需要时间积累一个完整旋转周期,无法瞬时给出结果

4.5 蒙特卡洛中的两套参数

代码对 R/λ=0.5R/\lambda = 0.5R/λ=0.5 和 R/λ=2R/\lambda = 2R/λ=2 两种情况分别仿真:

  • R/λ=0.5R/\lambda = 0.5R/λ=0.5 :与干涉仪无模糊基线等价,Adop=πA_{dop} = \piAdop=π,是"标准"配置。
  • R/λ=2R/\lambda = 2R/λ=2 :多普勒调制深度更大,精度提高约 4 倍(∝R\propto R∝R)。

从仿真结果看,R/λ=2R/\lambda = 2R/λ=2 的曲线比 R/λ=0.5R/\lambda = 0.5R/λ=0.5 左移约 12 dB ------完全符合理论预测的 4 倍提升(20log⁡104≈1220\log_{10}4 \approx 1220log104≈12 dB)。

五、运行结果解读

运行后你会看到 4 张图:

  1. 图1(频率-时间曲线) :蓝色是参考频率 f0f_0f0,红色是包含多普勒调制的 f0+fd(t)f_0 + f_d(t)f0+fd(t)。fd(t)f_d(t)fd(t) 呈现一条完整的正弦曲线,其相位即 −ψ-\psi−ψ,这就是待估参数。

  2. 图2(去调制信号相位) :上图展示原始相位与单位化后的相位,下图叠加了理论正弦曲线。真实 ψ=45°\psi = 45°ψ=45° 时,红蓝完全重合,验证去调制正确。

  3. 图3(蒙特卡洛 vs CRLB) :每个子图(对应一个 R/λR/\lambdaR/λ)有 3 组曲线(M=10,100,1000M=10, 100, 1000M=10,100,1000)。蒙卡 RMSE 紧密贴合 CRLB ,且 MMM 越大精度越高(约 M\sqrt{M}M 提升)。R/λ=2R/\lambda = 2R/λ=2 的整体曲线明显优于 R/λ=0.5R/\lambda = 0.5R/λ=0.5。

  4. 图4(CRLB 与设计参数关系) :左中两张热力图直观展示 CRLB 随 SNR 和 MMM 的等值线分布;右图显示 CRLB 随 R/λR/\lambdaR/λ 快速下降,验证 σψ∝1/R\sigma_\psi \propto 1/Rσψ∝1/R。

六、延伸思考

6.1 多普勒测向 vs 干涉仪:谁更强?

单看精度公式:

  • 干涉仪:σψ=1/(2πdλcos⁡ψ⋅2Mξ)\sigma_\psi = 1/(2\pi \frac{d}{\lambda}\cos\psi \cdot \sqrt{2M\xi})σψ=1/(2πλdcosψ⋅2Mξ )
  • 多普勒:σψ=1/(2πRλ⋅Mξ)\sigma_\psi = 1/(2\pi \frac{R}{\lambda} \cdot \sqrt{M\xi})σψ=1/(2πλR⋅Mξ )

分母上多了一个 2\sqrt{2}2 的差距------干涉仪精度高约 3 dB。但多普勒测向只需要一个接收通道(不需要多天线相位同步),硬件成本低,在小型无人机、便携设备上很有优势。

6.2 与"多普勒差测向"的区别

本篇讨论的是单天线圆周运动 产生的多普勒调制(Doppler DF)。另一种相关技术是多普勒频差(FDOA) ------利用两个运动平台的接收频率差来定位,属于地理定位范畴,将在第12篇详细介绍。

6.3 工程实践中的陷阱
  • 旋转机构的机械误差 :如果 RRR 或 frf_rfr 有抖动,会产生额外的相位噪声,破坏 CRLB。
  • AdopA_{dop}Adop 超出 J1J_1J1 线性区 :当 Adop≈3.83A_{dop} \approx 3.83Adop≈3.83 时 J1J_1J1 过零,估计器失效。实际系统需自适应选择 RRR 或下变频频率
  • 多目标场景:多个辐射源会同时产生多组多普勒调制,需要用 FFT 分离。这与第09篇的阵列信号处理思路相通。

下一篇预告(第08篇):多普勒测向的工程实现与优化

我们从理论到代码完整走通了多普勒测向。下一篇将聚焦工程实现 :如何用 FFT 批量处理、如何估计未知 AdopA_{dop}Adop、如何用"双旋转率"消除 J1J_1J1 符号模糊,以及如何在全频段(UHF 到 X 波段)进行自适应参数配置。敬请期待!

相关推荐
szarron2 小时前
HTOOL‑SA12 + HT06 近场探头组合实操|手持设备工位 EMI 预兼容排查完整流程
运维·服务器·开发语言·网络·射频工程·频谱仪
Wang's Blog2 小时前
Java框架快速入门: Spring Security+OAuth2之跨域处理
java·开发语言·spring
雪芽蓝域zzs2 小时前
第四十二节:全局字典封装(后端字典,下拉选择复用)
开发语言·前端·javascript
可编程芯片开发2 小时前
基于压电能量收集和MPPT最大功率跟踪算法的IoT压力传感器电源系统Simulink建模与仿真
物联网·matlab·simulink·mppt·压电能量收集·iot压力传感器
样子20182 小时前
Js 之根据白名单过滤 HTML(防止 XSS 攻击)
android·前端·javascript·html·xss
InsightCore2 小时前
别再往 Skill 里塞一切:我们如何重新思考 AI Debug Engineer
android·debug
老王爱玩车2 小时前
第2讲:C语言数据类型和变量
c语言·开发语言
菜鸟~noob2332 小时前
【电子战】第12篇:TDOA 定位——双曲线与等时差线【含matlab代码】
开发语言·matlab