【声纳成像】基于滑动子孔径与加权拼接的条带式多子阵SAS连续成像(MATLAB仿真)
文章目录
- 【声纳成像】基于滑动子孔径与加权拼接的条带式多子阵SAS连续成像(MATLAB仿真)
-
- [1. 前言与背景](#1. 前言与背景)
- [2. 核心原理解析](#2. 核心原理解析)
-
- [2.1 为什么需要滑动子孔径?](#2.1 为什么需要滑动子孔径?)
- [2.2 如何实现无缝拼接(Mosaicking)?](#2.2 如何实现无缝拼接(Mosaicking)?)
- [2.3 精确双基站非停走模型](#2.3 精确双基站非停走模型)
- [3. MATLAB 完整仿真代码](#3. MATLAB 完整仿真代码)
- [4. 结果分析与解读](#4. 结果分析与解读)
-
- [4.1 全流程可视化解读](#4.1 全流程可视化解读)
- [4.2 成像结果分析](#4.2 成像结果分析)
- [5. 总结](#5. 总结)
1. 前言与背景
合成孔径声纳(Synthetic Aperture Sonar, SAS)通过虚拟合成大孔径天线,能够实现与距离无关的高方位分辨率。然而,许多初学者在学习SAS时,往往只接触到 "固定场景的单次成像" (即停在某处对一块方形区域成像),这与实际工程中水下航行器(AUV/UUV)连续直线航行、扫测出一条无限长条带(Stripmap) 的工作模式存在脱节。
本文将在基础SAS后向投影(TBP)算法的基础上,扩展实现条带式连续移动成像。核心引入了两大工程实用技术:
- 滑动子孔径处理(Sliding Sub-aperture)
- Hanning窗加权无缝图像拼接(Mosaicking)
完整MATLAB代码支持R2018a及以上版本,开箱即用。
2. 核心原理解析
2.1 为什么需要滑动子孔径?
在条带SAS中,平台是一直在运动的。如果我们要对长达几十米的轨迹一次性做全局TBP,不仅内存吃不消,计算量也是天文数字。
工程上的做法是:设定一个固定长度的"子孔径窗口"(例如6米),让这个窗口沿着航迹一步步滑动。 每次只处理落在该窗口内的回波数据,生成局部的子图像(Sub-Image),最后将这些子图像拼起来。
2.2 如何实现无缝拼接(Mosaicking)?
如果直接把相邻的子图像"硬拼接",由于波束截断效应,图像边缘会出现明显的亮暗接缝(Seam)。
本程序采用Hanning窗二维加权累积算法:
- 相邻的子孔径窗口存在高度重叠(本程序设定75%重叠率)。
- 对每一帧子图像,在方位向施加一个中心处为1、边缘衰减至0的Hanning窗。
- 将加权后的子图像累加起来,同时累加权重。
- 最终图像 =
累加图像 / 累加权重。
这种方法可以完美消除拼接缝隙,使整个长条带目标的能量均匀、背景平滑。
2.3 精确双基站非停走模型
为了保证成像质量,仿真数据生成阶段摒弃了简单的"停走停"(Stop-and-Go)假设,严格求解一元二次方程计算收发双基站的真实时延,模拟了平台在脉冲飞行期间的真实运动。
3. MATLAB 完整仿真代码
以下是完整的MATLAB仿真脚本。您可以直接复制并在本地运行:
matlab
% =========================================================================
% 条带式多子阵合成孔径声纳 (Stripmap SAS) 连续移动成像仿真程序
% 在原始SAS程序基础上扩展: 滑动子孔径处理 + 加权图像拼接
%
% 核心新增技术:
% 1. 扩展场景 (多目标散布于长条带范围)
% 2. 滑动子孔径 (Sliding Sub-aperture) 波束形成
% 3. Hanning 加权图像拼接 (无缝Mosaicking)
% 4. 条带成像可视化 (分步显示每个子孔径结果 + 最终拼接图)
%
% 原理说明:
% 条带SAS = 在平台连续直线运动过程中,以固定长度的合成孔径窗口
% 沿轨迹方向滑动, 每次处理窗口内的回波数据形成局部聚焦图像,
% 相邻窗口大量重叠后加权叠加, 最终拼接出覆盖整条轨迹的长条带图像.
%
% MATLAB版本: R2018a+
% =========================================================================
clear; clc; close all;
%% =========================================================================
%% 第一部分: 系统参数设置
%% =========================================================================
%% 1.1 声学与信号参数 (与原程序保持一致)
c = 1500; % 声速 (m/s)
v = 1; % 平台速度 (m/s)
fc = 150e3; % 载频 (150 kHz)
B = 40e3; % 信号带宽 (40 kHz)
Tp = 0.004; % 脉冲宽度 (4 ms)
Fs = 600e3; % 采样率 (600 kHz)
PRF = 5; % 脉冲重复频率 (Hz)
%% 1.2 阵列参数
Dtx = 0.15; % 发射阵长度 (m)
Drx = 0.0375; % 接收单阵元长度 (m)
N_rx = 40; % 接收阵元数
d_rx = 0.0375; % 阵元间距 (m)
% 接收阵元偏移量 (相对于发射阵相位中心)
dx_rx = -(Dtx/2 + Drx/2 + (0:N_rx-1)*d_rx);
%% 1.3 基本电磁/声学参数
lambda = c / fc; % 波长 = 0.01 m
theta_bw_tx = lambda / Dtx; % 发射波束宽度 (弧度) ≈ 0.1 rad
K = B / Tp; % LFM调频斜率
%% =========================================================================
%% 第二部分: 条带成像专用参数 (核心新增)
%% =========================================================================
%% 2.1 距离向参数
R_min = 195; % 最近距离 (m)
R_max = 205; % 最远距离 (m)
R_ref = (R_min + R_max) / 2; % 参考距离 = 200 m
%% 2.2 子孔径参数
% ------------------------------------------------------------------
% 【原理】条带SAS理论合成孔径长度:
% L_sa_theory = 2 * lambda * R_ref / Dtx
% = 2 * 0.01 * 200 / 0.15 = 26.7 m
%
% 达到 Dtx/2 = 0.075 m 的极限方位分辨率需要26.7m孔径.
% 实际中为实现"滑动", 使用较短子孔径 L_sa=6m:
% 方位分辨率 δ_x ≈ lambda * R_ref / L_sa = 0.01*200/6 ≈ 0.33 m
% ------------------------------------------------------------------
L_sa = 6; % 实际使用的子孔径长度 (m)
N_aper = round(L_sa * PRF / v); % 每个子孔径包含的ping数
% 滑动步长 (相邻窗口重叠率 = 1 - N_step/N_aper)
N_step = round(N_aper / 4); % 步长=15 pings → 75% 重叠率
fprintf('=== 条带SAS参数 ===\n');
fprintf(' 波长 λ = %.4f m\n', lambda);
fprintf(' 理论合成孔径长度 L_sa_theory = %.1f m\n', 2*lambda*R_ref/Dtx);
fprintf(' 实际子孔径长度 L_sa = %.1f m\n', L_sa);
fprintf(' 子孔径ping数 N_aper = %d\n', N_aper);
fprintf(' 滑动步长 N_step = %d pings\n', N_step);
fprintf(' 实际方位分辨率 δx ≈ %.3f m\n', lambda*R_ref/L_sa);
%% 2.3 成像网格
dx_img = 0.05; % 方位向像素间距 (m)
dy_img = 0.05; % 距离向像素间距 (m)
%% 2.4 扩展条带场景 (多目标分布在整条轨迹范围内)
% 方位向范围从原来的 ±4m 扩展到 ±12m, 覆盖 24m 条带
X_start = -12;
X_end = 12;
% 7个目标点 [方位向X (m), 距离向Y (m)]
targets = [ -9, 200;
-6, 198;
-3, 202;
0, 200;
3, 199;
6, 201;
9, 200 ];
N_targets = size(targets, 1);
%% 2.5 平台轨迹
L_plat = X_end - X_start;
N_pings = floor(L_plat / v * PRF) + 1; % 总ping数 = 241
t_ping = (0:N_pings-1) / PRF;
tx_pos_x = X_start + v * t_ping;
N_windows = floor((N_pings - N_aper) / N_step) + 1; % 子孔径总数
fprintf(' 总ping数 N_pings = %d\n', N_pings);
fprintf(' 子孔径总数 N_windows = %d\n', N_windows);
fprintf('==================\n\n');
%% 2.6 快速时间轴
t_fast_start = 2 * R_min / c;
t_fast_end = 2 * R_max / c + Tp;
t_fast = (t_fast_start : 1/Fs : t_fast_end - 1/Fs)';
N_samples = length(t_fast);
%% =========================================================================
%% 第三部分: 原始数据生成 (ADC回波仿真)
%% =========================================================================
disp('【步骤1/4】正在生成ADC原始回波数据...');
raw_data = zeros(N_samples, N_rx, N_pings);
for p = 1:N_pings
tx_x = tx_pos_x(p);
for n = 1:N_rx
rx_dx = dx_rx(n);
for k = 1:N_targets
Xt = targets(k, 1);
Yt = targets(k, 2);
% 波束范围外快速跳过 (加速计算)
if abs(Xt - tx_x) > 1.5 * (theta_bw_tx/2) * Yt
continue;
end
% 精确双基站时延计算 (非停走模型)
R_tx = sqrt((Xt - tx_x)^2 + Yt^2);
X_rel = Xt - tx_x - rx_dx;
A_eq = c^2 - v^2;
B_eq = 2 * (v * X_rel - c * R_tx);
C_eq = R_tx^2 - X_rel^2 - Yt^2;
tau_d = (-B_eq + sqrt(B_eq^2 - 4*A_eq*C_eq)) / (2*A_eq);
t_delay = t_fast - tau_d;
valid_idx = (t_delay >= -Tp/2) & (t_delay <= Tp/2);
if any(valid_idx)
pulse = cos(2*pi*fc*t_delay(valid_idx) + pi*K*t_delay(valid_idx).^2);
raw_data(valid_idx, n, p) = raw_data(valid_idx, n, p) + pulse;
end
end
end
if mod(p, 60) == 0
fprintf(' 生成回波: %d/%d pings (%.0f%%)\n', p, N_pings, 100*p/N_pings);
end
end
%% =========================================================================
%% 第四部分: 解调 + 匹配滤波
%% =========================================================================
disp('【步骤2/4】正在解调与匹配滤波...');
% 下变频至基带
baseband_data = raw_data .* exp(-1j * 2*pi*fc * t_fast);
% 低通滤波器 (截止频率略高于信号带宽一半)
[b_lpf, a_lpf] = butter(4, (B/2 * 1.2) / (Fs/2));
% 参考信号 (带Hanning窗以压制距离向旁瓣)
t_ref = (-Tp/2 : 1/Fs : Tp/2 - 1/Fs)';
ref_sig = exp(1j * pi * K * t_ref.^2) .* hanning(length(t_ref));
mf_data = zeros(size(baseband_data));
for p = 1:N_pings
for n = 1:N_rx
tmp = filtfilt(b_lpf, a_lpf, baseband_data(:, n, p));
mf_data(:, n, p) = conv(tmp, flipud(conj(ref_sig)), 'same');
end
if mod(p, 60) == 0
fprintf(' 匹配滤波: %d/%d pings (%.0f%%)\n', p, N_pings, 100*p/N_pings);
end
end
%% =========================================================================
%% 第五部分: 条带成像核心 - 滑动子孔径波束形成 + 加权拼接
%% =========================================================================
disp('【步骤3/4】正在进行条带成像 (滑动子孔径TBP)...');
% ------------------------------------------------------------------
% 【条带成像原理】
%
% 传统单孔径SAS: 固定一段轨迹数据, 对一块场景做相干聚焦.
% 条带SAS (Stripmap SAS):
% ┌─────────────────────────────────────────────────────────┐
% │ 平台运动方向 ──────────────────────────────► │
% │ │
% │ 子孔径窗口1: [p=1..N_aper] → SubImage_1 │
% │ 子孔径窗口2: [p=N_step+1..] → SubImage_2 │
% │ 子孔径窗口k: [p=(k-1)*N_step+1..] → SubImage_k │
% │ │
% │ 各子图像用 Hanning 窗加权后叠加 → 无缝条带图像 │
% └─────────────────────────────────────────────────────────┘
%
% 拼接公式:
% Image_final(x,y) = Σ_k [SubImage_k(x,y) × w_k(x)]
% ─────────────────────────────────
% Σ_k w_k(x)
%
% 其中 w_k(x) = Hanning 加权窗 (在子孔径方位中心最强, 边缘归零)
% ------------------------------------------------------------------
x_grid = (X_start : dx_img : X_end);
y_grid = (R_min : dy_img : R_max);
[X_img, Y_img] = meshgrid(x_grid, y_grid);
Image_mosaic = zeros(size(X_img)); % 加权累积图像 (分子)
Weight_mosaic = zeros(size(X_img)); % 权重累积 (分母)
% 保存部分子孔径图像用于可视化 (每隔若干窗口保存一帧)
save_interval = max(1, round(N_windows / 4));
saved_subimgs = {};
saved_xcenter = [];
win_idx = 1;
for w_start = 1 : N_step : N_pings - N_aper + 1
w_end = min(w_start + N_aper - 1, N_pings);
w_center = round((w_start + w_end) / 2);
% 本子孔径的方位中心与半宽
x_aper_center = tx_pos_x(w_center);
x_aper_lo = tx_pos_x(w_start);
x_aper_hi = tx_pos_x(w_end);
aper_half = (x_aper_hi - x_aper_lo) / 2;
SubImage = zeros(size(X_img));
%% ---- 子孔径内逐ping波束形成 (TBP) ----
for p = w_start : w_end
tx_x = tx_pos_x(p);
% 发射角 & 主瓣掩模
theta_tx = atan2(X_img - tx_x, Y_img);
norm_theta = theta_tx / (theta_bw_tx / 2);
valid_mask = abs(norm_theta) <= 1;
if ~any(valid_mask(:)), continue; end
X_t = X_img(valid_mask);
Y_t = Y_img(valid_mask);
R_tx = sqrt((X_t - tx_x).^2 + Y_t.^2);
% 方位向Hanning平滑权重 (抑制波束边缘截断旁瓣)
azi_w = 0.5 + 0.5 * cos(pi * norm_theta(valid_mask));
% 发射阵物理方向性 (Sinc)
Tx_dir = sinc((Dtx/lambda) * sin(theta_tx(valid_mask)));
for n = 1:N_rx
rx_dx = dx_rx(n);
X_rel = X_t - tx_x - rx_dx;
theta_rx = atan2(X_rel, Y_t);
Rx_dir = sinc((Drx/lambda) * sin(theta_rx));
total_weight = Tx_dir .* Rx_dir .* azi_w;
% 精确非停走双基站时延
A_eq = c^2 - v^2;
B_eq = 2 * (v * X_rel - c * R_tx);
C_eq = R_tx.^2 - X_rel.^2 - Y_t.^2;
tau_d = (-B_eq + sqrt(B_eq.^2 - 4.*A_eq.*C_eq)) / (2.*A_eq);
idx = (tau_d - t_fast_start) * Fs + 1;
valid_idx2 = (idx >= 1) & (idx <= N_samples);
if any(valid_idx2)
val = interp1(1:N_samples, mf_data(:,n,p), ...
idx(valid_idx2), 'spline', 0);
phase_comp = exp(1j * 2*pi*fc * tau_d(valid_idx2));
temp = SubImage(valid_mask);
temp(valid_idx2) = temp(valid_idx2) ...
+ val .* phase_comp .* total_weight(valid_idx2);
SubImage(valid_mask) = temp;
end
end % n
end % p (子孔径内ping循环)
%% ---- 方位向 Hanning 拼接权重 ----
% 在子孔径方位中心权重=1, 向两端平滑降至0, 消除拼接边界
x_dist = x_grid - x_aper_center;
taper = zeros(1, length(x_grid));
in_win = abs(x_dist) <= aper_half;
taper(in_win) = 0.5 + 0.5 * cos(pi * x_dist(in_win) / aper_half);
W_2d = repmat(taper, length(y_grid), 1);
% 加权累积 (分子 & 分母分开存储)
Image_mosaic = Image_mosaic + SubImage .* W_2d;
Weight_mosaic = Weight_mosaic + W_2d;
% 保存部分子孔径图像供可视化
if mod(win_idx-1, save_interval) == 0 || win_idx == N_windows
saved_subimgs{end+1} = SubImage;
saved_xcenter(end+1) = x_aper_center;
end
fprintf(' 子孔径 %3d/%3d | 方位中心: %+.1f m | pings: %d-%d\n', ...
win_idx, N_windows, x_aper_center, w_start, w_end);
win_idx = win_idx + 1;
end
%% ---- 归一化: 加权平均 ----
valid_w = Weight_mosaic > (max(Weight_mosaic(:)) * 0.05);
Image_final = zeros(size(Image_mosaic));
Image_final(valid_w) = Image_mosaic(valid_w) ./ Weight_mosaic(valid_w);
disp('条带成像完成!');
%% =========================================================================
%% 第六部分: 结果可视化
%% =========================================================================
disp('【步骤4/4】正在生成可视化图像...');
% --- 辅助函数: 转换为dB ---
to_db = @(x) 20*log10(abs(x) / max(abs(x(:))) + eps);
%% 图1: 成像全流程概览
figure('Name', '条带SAS连续移动成像 - 全流程', ...
'Position', [30, 30, 1400, 960]);
% (a) 场景示意图 (目标分布 + 子孔径覆盖示意)
subplot(2,3,1);
hold on; grid on;
% 绘制轨迹
plot(tx_pos_x, zeros(1,N_pings), 'k-', 'LineWidth', 1.5);
plot(tx_pos_x(1), 0, 'g^', 'MarkerFaceColor','g', 'MarkerSize',10);
plot(tx_pos_x(end), 0, 'rs', 'MarkerFaceColor','r', 'MarkerSize',10);
% 绘制目标
for k = 1:N_targets
plot(targets(k,1), -targets(k,2), 'b*', 'MarkerSize',12, 'LineWidth',2);
text(targets(k,1)+0.2, -targets(k,2)+1, sprintf('T%d',k), 'FontSize',8);
end
% 绘制几个子孔径覆盖示意
colors_sa = lines(length(saved_xcenter));
for i = 1:length(saved_xcenter)
xc = saved_xcenter(i);
x1 = xc - aper_half; x2 = xc + aper_half;
ylo = -R_max*1.01; yhi = 0;
patch([x1 x2 x2 x1], [yhi yhi ylo ylo], colors_sa(i,:), ...
'FaceAlpha', 0.15, 'EdgeColor', colors_sa(i,:), 'LineWidth',1.5);
end
xlabel('方位向 (m)'); ylabel('距离向 (m, 负值=远离平台)');
title('条带成像场景与子孔径覆盖示意');
legend('平台轨迹','起点','终点','目标', 'Location','best');
set(gca,'YDir','normal'); xlim([X_start-1 X_end+1]); ylim([-R_max*1.02 2]);
% (b) 原始ADC数据 (中间ping)
subplot(2,3,2);
mid_ping = round(N_pings/2);
imagesc(t_fast*c/2, 1:N_rx, real(raw_data(:,:,mid_ping))');
title(sprintf('ADC原始数据 (Ping #%d, 方位=%.1fm)', mid_ping, tx_pos_x(mid_ping)));
xlabel('距离 (m)'); ylabel('阵元编号');
colormap(gca,'gray'); axis xy; colorbar;
% (c) 匹配滤波后数据
subplot(2,3,3);
imagesc(t_fast*c/2, 1:N_rx, abs(mf_data(:,:,mid_ping))');
title(sprintf('匹配滤波后数据 (Ping #%d)', mid_ping));
xlabel('距离 (m)'); ylabel('阵元编号');
colormap(gca,'hot'); axis xy; colorbar;
% (d) 子孔径成像示例 (显示第1个和最后1个保存的子孔径)
subplot(2,3,4);
if ~isempty(saved_subimgs)
img_show = to_db(saved_subimgs{1});
imagesc(x_grid, y_grid, img_show);
caxis([-35 0]); colormap(gca,'jet'); colorbar; axis xy;
hold on;
for k = 1:N_targets
plot(targets(k,1), targets(k,2), 'w+', 'MarkerSize',10, 'LineWidth',1.5);
end
title(sprintf('子孔径#1 局部图像 (方位中心=%.1fm)', saved_xcenter(1)));
xlabel('方位向 (m)'); ylabel('距离向 (m)');
plot([saved_xcenter(1)-aper_half, saved_xcenter(1)-aper_half], ylim, 'w--', 'LineWidth',1);
plot([saved_xcenter(1)+aper_half, saved_xcenter(1)+aper_half], ylim, 'w--', 'LineWidth',1);
end
% (e) 权重图 (展示子孔径覆盖密度)
subplot(2,3,5);
imagesc(x_grid, y_grid, Weight_mosaic);
colormap(gca,'hot'); colorbar; axis xy;
hold on;
for k = 1:N_targets
plot(targets(k,1), targets(k,2), 'c+', 'MarkerSize',10, 'LineWidth',1.5);
end
title('子孔径覆盖权重 (重叠度图)');
xlabel('方位向 (m)'); ylabel('距离向 (m)');
% (f) 最终条带拼接图像
subplot(2,3,6);
img_final_db = to_db(Image_final);
imagesc(x_grid, y_grid, img_final_db);
caxis([-35 0]); colormap(gca,'jet'); colorbar; axis xy;
hold on;
for k = 1:N_targets
plot(targets(k,1), targets(k,2), 'w+', 'MarkerSize',12, 'LineWidth',2);
end
title('条带SAS最终成像 (滑动子孔径拼接)');
xlabel('方位向 (m)'); ylabel('距离向 (m)');
annotation('textbox',[0,0.93,1,0.06],'String','条带式SAS连续移动成像完整流程',...
'EdgeColor','none','HorizontalAlignment','center','FontSize',14,'FontWeight','bold');
%% 图2: 条带图像详细分析
figure('Name', '条带SAS成像结果详细分析', 'Position', [50, 50, 1400, 500]);
% (a) 最终图像 (大图)
subplot(1,3,[1 2]);
imagesc(x_grid, y_grid, img_final_db);
caxis([-35 0]); colormap(gca,'jet'); colorbar; axis xy;
hold on;
for k = 1:N_targets
plot(targets(k,1), targets(k,2), 'w+', 'MarkerSize',14, 'LineWidth',2.5);
text(targets(k,1)+0.2, targets(k,2)+0.3, sprintf('T%d',k), ...
'Color','white', 'FontSize', 9, 'FontWeight','bold');
end
title('条带SAS最终成像结果 (24m条带 × 10m距离窗)', 'FontSize',12);
xlabel('方位向 (m)'); ylabel('距离向 (m)');
% (b) 方位向成像剖面 (R=200m截面)
subplot(1,3,3);
[~, ridx] = min(abs(y_grid - R_ref));
azi_profile = 20*log10(abs(Image_final(ridx,:)) / max(abs(Image_final(ridx,:))) + eps);
plot(x_grid, azi_profile, 'b-', 'LineWidth',1.5);
hold on; grid on;
for k = 1:N_targets
if abs(targets(k,2) - R_ref) < 1.5
plot([targets(k,1), targets(k,1)], [-50 5], 'r--', 'LineWidth',1.2);
text(targets(k,1)+0.1, -46, sprintf('T%d',k), 'Color','r', 'FontSize',8);
end
end
plot([X_start X_end], [-13 -13], 'k:', 'LineWidth',1);
text(X_end-0.5, -11, '−13dB', 'FontSize',8);
ylim([-50 5]); xlim([X_start X_end]);
xlabel('方位向 (m)'); ylabel('幅度 (dB)');
title(sprintf('方位向剖面 (R = %dm截面)', R_ref), 'FontSize',11);
legend('成像幅度', '目标位置', 'Location','best');
annotation('textbox',[0,0.93,1,0.06],'String','条带SAS连续成像 - 性能分析',...
'EdgeColor','none','HorizontalAlignment','center','FontSize',13,'FontWeight','bold');
fprintf('\n=== 仿真完成 ===\n');
fprintf(' 条带覆盖范围: 方位 [%.0f, %.0f] m × 距离 [%.0f, %.0f] m\n', ...
X_start, X_end, R_min, R_max);
fprintf(' 理论方位分辨率 (子孔径): %.3f m\n', lambda*R_ref/L_sa);
fprintf(' 理论距离向分辨率: %.3f m\n', c/(2*B));
fprintf(' 共成像目标数: %d\n', N_targets);
(注:为适应网页阅读,上述代码略微精简了部分绘图指令,但保留了最核心的物理与算法逻辑。)
4. 结果分析与解读
运行上述代码后,会输出极具工程参考价值的可视化图表。


4.1 全流程可视化解读
系统模拟了7个点目标散布在方位向 [-12m, +12m],总长达 24 米的条带区域内。
- 左上图展示了声纳平台的移动轨迹以及局部子孔径的覆盖范围(不断向前滑动)。
- 原始数据与脉冲压缩:展示了非停走模型下的多阵元双曲线数据特征。
- 重叠度权重图(Weight_mosaic):这张图非常直观地展示了图像中间区域由于子孔径频繁滑过、重叠累加,导致其权重值最高(红色),而两端数据较少(偏蓝)。这种"加权平均"机制保证了目标跨越窗口边界时不会产生相位断裂。
4.2 成像结果分析
在拼接后的最终图像中:
- 全景聚焦:7个分散的点目标在 24m 的条带内均获得了良好的聚焦效果,没有出现传统单孔径边缘散焦的问题。
- 分辨率与旁瓣:得益于子孔径的Hanning切趾加权(Apodization),观察方位向剖面图可以发现,点目标的方位向旁瓣被压制到了极低水平(<-30dB左右),主瓣极其尖锐。
- 消除接缝:整个背景底噪极其平滑,肉眼完全看不出子孔径之间的硬拼接痕迹。
5. 总结
条带模式(Stripmap)是现代高分辨率合成孔径声纳的标配工作模式。本文通过MATLAB实现:
- 分块化降维:用固定长度窗口代替全局积分,大大降低计算内存需求。
- 加权马赛克:完美解决图像边界的波束截断突变问题。
💡 进阶思考:
如果平台运动存在轨迹误差(即不沿完美的直线航行),在此滑动子孔径框架下,该如何加入 自聚焦(Autofocus, 如PGA或DCE算法) 呢?