wugfh

sar多子带点目标仿真

参数与初始化

EarthMass = 6e24; %地球质量(kg)
EarthRadius = 6.37e6; %地球半径6371km
Gravitational = 6.67e-11; %万有引力常量
f0 = 5.4e9; % 中心频率
H = 755e3; % 飞行高度
Tr = 20e-6; % 脉冲宽度
Br = 2.8e7; % 子带带宽
Fr = 1.2*Br; % 子带采样率
step_f = Br;
sub_N = 3;
sub_f = f0:step_f:f0+step_f*sub_N;

% sub_f = [sub_f2];
c = 299792458;
Vr = sqrt(Gravitational*EarthMass/(EarthRadius + H));
Vg = Vr;
Vs = Vr;
La = 12;
phi = deg2rad(20); % 俯仰角
incidence = deg2rad(20.5); % 入射角

Kr = Br/Tr;
sub_lambda = c./sub_f;
lambda = c/(f0+step_f*sub_N/2);


R0 = H/cos(phi);
R_eta_c = H/cos(incidence);
theta_rc = acos(R0/R_eta_c);
eta_c = -R_eta_c*sin(theta_rc)/Vr;

sub_fnc = 2*Vr*sin(theta_rc)./sub_lambda;
fnc = 2*Vr*sin(theta_rc)/lambda;
Ta = 0.886*R_eta_c*lambda/(La*Vg*cos(theta_rc));
delta_fdop = 2*0.886*Vs*cos(theta_rc)/La; 
PRF = 1.7*delta_fdop;
% Ka = 2*Vr^2*cos(theta_rc)^3/(lambda*R0);

Nr = 2*ceil(Fr*Tr);
Na = 2*ceil(PRF*Ta);

% 构造距离向与方位向时间与频率
t_tau = 2*R_eta_c/c + (-Nr/2:Nr/2-1)*(1/Fr);
t_eta = eta_c+(-Na/2:Na/2-1)*(1/PRF);


f_tau = fftshift((-Nr/2:Nr/2-1)*(Fr/Nr));
f_eta = fnc+(-Na/2:Na/2-1)*(PRF/Na);

[mat_t_tau, mat_t_eta] = meshgrid(t_tau, t_eta);
[mat_f_tau, mat_f_eta] = meshgrid(f_tau, f_eta);

% 脉内串发,构造偏移时间
step_T = 1/PRF;
sub_t_offset = (0:sub_N-1)*step_T; % 添加保护带,偏移时间为2*T

参数设置这里需要注意精度与测绘宽度之间的协调,不然容易爆内存(如果用自己的电脑仿真)。
距离向精度主要与信号带宽有关,满足

\[\rho_r = \frac{\gamma c}{B_r}\]

这里 $\gamma$ 为展宽,如果没有加窗,设为1就行。距离向的最大测绘宽度主要与脉冲宽度有关,与脉冲宽度成正比。方位向精度为

\[\rho_a \approx \frac{L_a}{2}\]

方位向测绘宽度与目标照射时间有关,如果想不影响方位向精度,调宽度,可以调雷达高度。 子带发射有三种模式

  • 脉间串发:子带偏移时间为 $1/PRF$ 。
  • 脉内串发:子带偏移时间为 $t_{offset} > T_r$
  • 脉内并发:子带同时发射,偏移时间为0。

需要注意的是各个子带的多普勒中心不一样,每个子带的多普勒中心需要单独算。 看完论文,对于成像我大致有两个想法

  1. 距离压缩->子带合成->RCMC->方位压缩
  2. 距离压缩->RCMC->方位压缩->子带合成 这两种,我均有尝试,效果差别很大。

点目标回波产生

pointx = 0;
pointy = 0;
point = [pointx, pointy];

S_echo = zeros(3, Na, Nr);
noisy_A = randn([1,sub_N]);
noisy_P = randn([1,sub_N])*2;
noisy_T = randn([1,sub_N])*5*1e-9;

% noisy_A = zeros(1,sub_N);
% noisy_P = zeros(1,sub_N);
% noisy_T = zeros(1,sub_N); 

for i = 1:sub_N

    mat_t_tau_noisy = mat_t_tau - noisy_T(i);
    mat_t_eta_offset = mat_t_eta+sub_t_offset(i);

    R0_target = sqrt((R0*sin(phi)+point(1))^2+H^2);
    R_eta_target = sqrt(R0_target^2+(point(2)-Vr*mat_t_eta_offset).^2);
    t_etac_target = (point(2)-R0_target*tan(theta_rc))/Vr;

    Wr = (abs(mat_t_tau_noisy-2*R_eta_c/c) < Tr/2);
    % Wa = sinc((La*atan(Vg*(mat_t_eta_offset - t_etac_target)./R0_target)/sub_lambda(i))).^2;
    Wa = abs(mat_t_eta_offset - eta_c - sub_t_offset(i))<Ta/2;
    sub_phase = exp(1j*pi*Kr*(mat_t_tau_noisy-2*R_eta_target/c).^2).*exp(-2j*pi*sub_f(i)*2*R_eta_target/c).*exp(2j*pi*noisy_P(i));

    S_echo(i,:,:) = (1+noisy_A(i))*Wr.*Wa.*sub_phase;
end

在回波产生时,对每个子带添加随机扰动。其他与一般的sar回波产生无区别。

距离压缩->RCMC->方位压缩->子带合成

距离压缩

    sub_S_echo = squeeze(S_echo(i, :, :));
    Hr =  (abs(mat_f_tau)<Br/2).*exp(1j*pi*mat_f_tau.^2/Kr);
    sub_S_ftau_eta = fft(sub_S_echo, Nr, 2);
    sub_S_ftau_eta = sub_S_ftau_eta.*Hr;

对每个子带进行相同的距离压缩操作,没什么需要注意的。需要注意的是后续的对每个子带的补偿操作

    R_eta = sqrt(R0^2+(Vr*(mat_t_eta+sub_t_offset(i))).^2);
    sub_S_ftau_eta = sub_S_ftau_eta.*exp(-2j*pi*2*(R_eta-R_ref)/c.*mat_f_tau);%补偿串发导致的斜距差

    sub_S_tau_eta = ifft(sub_S_ftau_eta, Nr, 2);

    sub_S_tau_eta = sub_S_tau_eta.*exp(2j*pi*(fnc-sub_fnc(i)).*mat_t_eta); %移动多普勒中心

    sub_S_tau_feta = fft(sub_S_tau_eta, Na, 1);
    sub_S_tau_feta = sub_S_tau_feta.*exp(-2j*pi*mat_f_eta*sub_t_offset(i)); %方位向补偿时延

首先需要做的是补偿串发导致的斜距差,斜距差导致时延不同。这里斜距差大致在分米级,如果成像在厘米级,是必须要补偿的。但如果精度为米级,则无需考虑,方位向的时延也类似。 多普勒中心是必须要移动的,保证每个子带的多普勒中心在一个位置,没有可能会加重栅瓣的影响。

有多普勒中心移动

有多普勒中心移动

无多普勒中心移动

无多普勒中心移动

RCMC与方位压缩

对每个子带进行R距离徙动校正与方位压缩。

    mat_f_eta_offset = mat_f_eta;
    delta_R = lambda^2*R0*mat_f_eta_offset.^2/(8*Vr^2);
    G_rcmc = exp(1j*4*pi*mat_f_tau.*delta_R/c);
    sub_S_ftau_feta = fft(sub_S_tau_feta, Nr, 2);

    sub_S_ftau_feta = sub_S_ftau_feta.*G_rcmc;
    sub_S_tau_feta_rcmc = ifft(sub_S_ftau_feta, Nr, 2);

    mat_R0 = (mat_t_tau*c/2)*cos(theta_rc);
    Ka = 2 * Vr^2 * cos(theta_rc)^2 ./ (lambda * mat_R0);
    sub_S_tau_feta = sub_S_tau_feta_rcmc;
    Ha = exp(-1j*pi*mat_f_eta_offset.^2./Ka);
    offset = exp(-1j*2*pi*mat_f_eta_offset.*eta_c);
    sub_S_tau_feta = sub_S_tau_feta.*Ha.*offset;
    target = ifft(sub_S_tau_feta, Na, 1);

这里RCMC直接使用相位补偿,使用sinc进行插值算的比较慢。方位压缩也比较简单。 在频率合成前需要对子带进行升采样,升采样操作可以在时域内插完成,比如内插0或者其他的内插算法。

    sub_S_ftau_eta = fft(target, Nr, 2);
    s_f_upsample = zeros(Na, Nr_up);

    % 不要把0补到频域中间
    [max_value, a_f_pos] = max(max(sub_S_ftau_eta, [], 2));
    [min_value, r_f_pos] = min(sub_S_ftau_eta(a_f_pos, :));
    sub_S_ftau_eta = circshift(sub_S_ftau_eta, -r_f_pos, 2);

    s_f_upsample(:,((Nr_up/2-Nr/2):(Nr_up/2+Nr/2-1))) = sub_S_ftau_eta; 
    % s_f_upsample = fftshift(s_f_upsample);
    target_upsample(i, :, :) = ifft(s_f_upsample, Nr_up, 2);
    subplot(1,sub_N,i);
    imagesc(abs(sub_S_ftau_eta));

我这里是选择在频域补零完成升采样,需要关注的是频域补零的时候不要补到信号频率分量的中间。

合成

S_ftau_eta = zeros(Na, Nr_up);
echo_ref = squeeze(target_upsample((sub_N+1)/2, :, :));
for i = 1:sub_N
    target = squeeze(target_upsample(i, :, :));

    target = target.*(abs(echo_ref)./abs(target));
    perror = angle(echo_ref)-angle(target);
    target = target.*exp(1j*perror);

    tar_ftau_eta = fft(target, Nr_up, 2);
    tar_ftau_eta = tar_ftau_eta.*exp(2j*pi*(i-(sub_N+1)/2)*5.095*(1/(Fr*uprate)).*mat_f_tau_upsample);
    target = ifft(tar_ftau_eta, Nr_up, 2);

    target_shift = target.*exp(2j*pi*(i-(sub_N+1)/2)*step_f.*mat_t_tau_upsample);

    tar_ftau_eta = fft(target_shift, Nr_up, 2);

    S_ftau_eta = tar_ftau_eta+S_ftau_eta;
end

合成前需要补偿仍然存在相位误差,幅度误差与时延误差,同时保证相位的连续性,降低栅瓣。这里我先将所有子带的相位,幅度保持一致,然后对每个子带相位进行微调,完成补偿。我现在的微调操作是手动微调,其实可以加入优化算法,以图像对比度为目标,微调子带相位。

最后是显示

[~, a_f_pos] = max(max(abs(S_ftau_eta), [], 2));
figure("name", "频域");
plot(1:Nr_up, abs(S_ftau_eta(a_f_pos, :)));

S_tau_eta = ifft(S_ftau_eta, Nr_up, 2);

figure('name', "脉冲对比");

target_one = echo_ref;
% target_one = imrotate(target_one, rad2deg(theta_rc), 'bilinear', 'crop');

[~, a_pos] = max(max(abs(target_one), [], 2));
[~, r_pos] = max(max(abs(target_one), [], 1));
plot_range = r_pos-Nr/2:r_pos+Nr/2;
plot_range = plot_range+(max(1-plot_range(1),1));

target_plot = abs(target_one(a_pos, plot_range));
target_plot = (target_plot-min(target_plot))/(max(target_plot)-min(target_plot));

% S_tau_eta =  imrotate(S_tau_eta, rad2deg(theta_rc), 'bilinear', 'crop');
S_tau_eta_plot = abs(S_tau_eta(a_pos, plot_range));
S_tau_eta_plot = (S_tau_eta_plot-min(S_tau_eta_plot))/(max(S_tau_eta_plot)-min(S_tau_eta_plot));

S_tau_eta_db = 20*log10(S_tau_eta_plot);
target_db = 20*log10(target_plot);


plot(plot_range, S_tau_eta_db);
hold on;
plot(plot_range, target_db);
legend("合成带","子带");

figure("name","最终效果");
imagesc(abs(S_tau_eta));

最终结果

无附加的干扰噪声。

子带回波
子带回波

合成频带
合成频带
这里可以看出子带合成的效果不是很好,还可以继续加入算法来实现更好的子带合成效果。

子带与合成带脉冲对比
脉冲对比
这里有比较明显的栅瓣。

点目标成像
最终效果

优化

根据论文,我在子带相位微调那,使用模拟退火进行优化。目标函数为

    function y = syn_and_image(coef, subband, sub_N, Na, Nr_up, mat_f_tau_upsample, mat_t_tau_upsample, step_f, Fr, uprate)
    S_ftau_eta = zeros(Na, Nr_up);

    for i = 1:sub_N
        target = squeeze(subband(i, :, :));

        tar_ftau_eta = fft(target, Nr_up, 2);
        tar_ftau_eta = tar_ftau_eta.*exp(2j*pi*coef(i)*(1/(Fr*uprate)).*mat_f_tau_upsample);
        target = ifft(tar_ftau_eta, Nr_up, 2);

        target_shift = target.*exp(2j*pi*(i-(sub_N+1)/2)*step_f.*mat_t_tau_upsample);

        tar_ftau_eta = fft(target_shift, Nr_up, 2);

        S_ftau_eta = tar_ftau_eta+S_ftau_eta;
    end
    target = ifft(S_ftau_eta, Nr_up, 2);
    y = max(var(20*log10(abs(target))));
    y = -y;
end

将子带数调为3,优化代码为

options = optimoptions('simulannealbnd','PlotFcns',...
          {@saplotbestx,@saplotbestf,@saplotx,@saplotf});  
obj_f = @(coef)syn_and_image(coef, target_upsample, sub_N, Na, Nr_up, mat_f_tau_upsample, mat_t_tau_upsample, step_f, Fr, uprate);

[x,fval,exitFlag,output] = simulannealbnd(obj_f,[-10,0,5],[-10,0,0],[0,0,10],options);

coef = x;

在3个子带时,求解速度缓慢(可能和我的电脑有问题),求解结果为

coef=[-3.0740,0,3.0820];

求解过程
模拟退火
可以看出,局部最优解比较多。

求解效果
模拟退火
优化空间依旧比较多。

距离压缩->子带合成->RCMC->方位压缩

这种我没有成像成功。频移子带时,好像改变的方位向的相位,导致其方位向压缩时处于不同的位置。 最终效果